소스 검색

Merge branch 'master' into feature/v1.5.77

123456 1 년 전
부모
커밋
6f16f5e1c1

+ 4 - 0
src/App.vue

@@ -98,4 +98,8 @@ export default {
     color: #9B9CA3 !important;
   }
 }
+.monitor-popover {
+  border-radius: 12px!important;
+  border: 1px solid #ececec!important;
+}
 </style>

+ 10 - 0
src/api/modules/public.js

@@ -149,3 +149,13 @@ export function editUserIdentity (data) {
     data
   })
 }
+// 业主监控采购单位已读接口
+export function setReadStatus (data) {
+  // data = qs.stringify(data)
+  return request({
+    baseURL: '/publicapply',
+    url: '/customer/read',
+    method: 'POST',
+    data
+  })
+}

BIN
src/assets/fonts/iconfont.ttf


BIN
src/assets/fonts/iconfont.woff


BIN
src/assets/fonts/iconfont.woff2


+ 6 - 0
src/assets/js/selector.js

@@ -606,6 +606,12 @@ export const pushFunctionData = [
     desc: '关注项目如有动态变更,将为您推送。',
     showEdit: true
   },
+  {
+    type: 'o_owner_monitor',
+    name: '业主监控',
+    desc: '监控业主一旦发布与“我的订阅”相关的招标动态,会推送业主的招标项目、时间等公告信息。',
+    showEdit: true
+  },
   {
     type: 'o_follow_ent',
     name: '企业情报监控-企业中标动态',

+ 23 - 3
src/assets/style/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 624651 */
-  src: url('../fonts/iconfont.woff2?t=1693274055824') format('woff2'),
-       url('../fonts/iconfont.woff?t=1693274055824') format('woff'),
-       url('../fonts/iconfont.ttf?t=1693274055824') format('truetype');
+  src: url('../fonts/iconfont.woff2?t=1706074759422') format('woff2'),
+       url('../fonts/iconfont.woff?t=1706074759422') format('woff'),
+       url('../fonts/iconfont.ttf?t=1706074759422') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,26 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-jiankong:before {
+  content: "\e6f8";
+}
+
+.icon-yijiankong:before {
+  content: "\e6f9";
+}
+
+.icon-shenfenweihu:before {
+  content: "\e6f7";
+}
+
+.icon-a-Property1shujudingzhiProperty2normal-wodezichan:before {
+  content: "\e645";
+}
+
+.icon-a-Property1shufuProperty2grey:before {
+  content: "\e644";
+}
+
 .icon-renwuguanli:before {
   content: "\e6f3";
 }

+ 24 - 3
src/components/collect-info/CollectInfo.vue

@@ -381,10 +381,24 @@ export default {
         pc_index_bottom_adv: '请留下联系方式,我们会尽快联系您体验:市场分析周报/月报、竞对实时监控和分析、业主采购趋势/客户分析等',
         month_: '请留下联系方式,我们会尽快联系您!体验市场分析周报/月报!',
         week_: '请留下联系方式,我们会尽快联系您!体验市场分析周报/月报!',
-        article_collection: '重要项目一键创建标签收藏!请完善个人信息,为您匹配精准服务'
+        article_collection: '重要项目一键创建标签收藏!请完善个人信息,为您匹配精准服务',
+        pc_buyer_monitor_more: '请升级大会员,可实时监控最多500个业主采购动态,洞察潜在商机。',
+        pc_buyer_monitor_freeuser: '您当前权限不足,请升级【大会员】,可实时监控最多500个业主采购动态,洞察潜在商机。',
+        pc_list_monitor_more: '请升级大会员,可实时监控最多500个业主采购动态,洞察潜在商机。',
+        pc_buyer_monitor_limit: '监控业主数量已达上限,请升级大会员,可实时监控最多500个业主采购动态,洞察潜在商机。'
+      },
+      sourceDescMap: {
+        pc_buyer_monitor_more: '采购单位画像页-超级订阅用户申请监控更多业主',
+        pc_buyer_monitor_freeuser: '采购单位画像页-免费用户申请监控业主',
+        pc_list_monitor_more: '业主监控页-超级订阅用户申请监控更多业主',
+        pc_buyer_monitor_limit: '采购单位画像页-超级订阅申请监控更多业主(已达上限)'
       },
       sourceTitleTopMap: {
-        article_collection: '为给您匹配精准的推荐信息,请完善个人信息'
+        article_collection: '为给您匹配精准的推荐信息,请完善个人信息',
+        pc_buyer_monitor_more: '申请监控更多业主',
+        pc_buyer_monitor_freeuser: '申请业主监控权限',
+        pc_list_monitor_more: '申请监控更多业主',
+        pc_buyer_monitor_limit: '申请监控更多业主'
       },
       isRefresh: false
     }
@@ -433,10 +447,16 @@ export default {
           text = '企业中标分析'
         } else if (this.source.indexOf('article_attach') > -1) {
           text = '附件下载'
+        } else if (this.source === 'pc_buyer_monitor_freeuser') {
+          return '已收到您提交的升级大会员申请,我们会尽快联系您并预约演示时间。'
         } else {
           return '我们会尽快联系您并预约演示时间,请耐心等待~您将获得免费体验大会员全部功能!'
         }
         return '恭喜您,成功解锁【' + text + '】权益1次。如需查看更多,请开通超级订阅,为您提供最新的商业情报,抢占先机。'
+      } else if (this.source === 'pc_list_monitor_more') {
+        return '已收到您提交的升级大会员申请,我们会尽快联系您并预约演示时间。'
+      } else if (this.source === 'pc_buyer_monitor_limit' || this.source === 'pc_buyer_monitor_more') {
+        return '已收到您提交的升级大会员申请,我们会尽快联系您并预约演示时间。'
       } else {
         return '我们会尽快联系您并预约演示时间,请耐心等待~您将获得免费体验大会员全部功能!'
       }
@@ -596,7 +616,8 @@ export default {
         workScope: this.form.business,
         partnerNeeds: this.form.need,
         agree: this.form.agreeChecked,
-        branch: this.form.branch.indexOf('总裁') > -1 || this.form.branch.indexOf('总经理') > -1 ?  '' : this.form.branch
+        branch: this.form.branch.indexOf('总裁') > -1 || this.form.branch.indexOf('总经理') > -1 ?  '' : this.form.branch,
+        source_desc: this.sourceDescMap[source]
       }
       var _this = this
       $.ajax({

+ 4 - 1
src/components/common/Dialog.vue

@@ -33,7 +33,7 @@ export default {
     // 是否显示弹窗
     centerDialogVisible: {
       type: Boolean,
-      default: true
+      default: false
     },
     // 标题:标题为空则不显示头部标签
     title: {
@@ -97,14 +97,17 @@ export default {
   methods: {
     // 确认
     setConfirm () {
+      console.log('setConfirm')
       this.$emit('setConfirm')
     },
     // 取消,关闭弹窗
     setCancel () {
+      console.log('setCancel')
       this.$emit('setCancel')
     },
     // 关闭前的回调, 暂停关闭
     beforeClose () {
+      console.log('beforeClose')
       this.$emit('beforeClose')
     }
   }

+ 117 - 0
src/components/common/Monitor.vue

@@ -0,0 +1,117 @@
+<template>
+  <div class="monitor-page">
+    <ul class="monitor-ul">
+      <li :class="{'first-bottom': showList.length && showList.includes(1)}" v-show="showList.length && showList.includes(1)">监控业主一旦发布与“我的订阅”相关的招标动态,会推送业主的招标项目、时间等公告信息。</li>
+      <li :class="{'border-2': !showList.includes(1)}" v-show="showList.length && showList.includes(2)" @click="$emit('monitorStatus')">查看监控动态</li>
+      <li v-show="showList.length && showList.includes(3)">
+        <div class="list-top" @click="monitorList">
+          <span>查看监控列表</span>
+          <i class="el-icon-arrow-right"></i>
+        </div>
+        <div class="list-center">
+          已监控 <span style="color: #2ABED1;font-weight: 700;">{{alreadyNum}}</span> 个,剩余 <span style="color: #2ABED1;font-weight: 700;">{{remainNum}}</span> 个
+        </div>
+        <div class="list-bottom" @click="monitorApply">申请监控更多业主></div>
+      </li>
+      <li @click="$emit('monitorCancel')" v-show="showList.length && showList.includes(4)">取消监控</li>
+    </ul>
+  </div>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+export default {
+  props: {
+    showList: {
+      type: Array,
+      default: () => [1]
+    },
+    alreadyNum: {
+      type: Number,
+      default: 0
+    },
+    // 剩余
+    remainNum: {
+      type: Number,
+      default: 0
+    }
+  },
+  data () {
+    return {
+      monitor: {
+      }
+    }
+  },
+  computed: {
+    ...mapState({
+      info: state => state.user.info
+    })
+  },
+  mounted () {
+  },
+  methods: {
+    // 查看监控列表
+    monitorList () {
+      window.open('/swordfish/page_big_pc/my_client')
+    },
+    // 申请监控更多业主
+    monitorApply () {
+      if (this.info.vipStatus > 0) {
+        this.$emit('showNeedSubmit')
+      } else {
+        this.$emit('show')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.monitor-page{
+  .monitor-ul{
+    li {
+      padding: 12px 0;
+      border-top: 1px solid #ECECEC;
+      font-size: 16px;
+      color: #1D1D1D;
+      cursor: pointer;
+      &:first-child{
+        border: none;
+        padding: 0 0 12px;
+        font-size: 14px;
+        color: #686868;
+      }
+      &.first-bottom{
+        padding: 0;
+      }
+      &:last-child{
+        padding: 12px 0 0;
+      }
+      &.border-2{
+        border: none;
+      }
+      .list-top{
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        color: #2ABED1;
+      }
+      .list-center {
+        margin: 8px 0;
+        color: #686868;
+        font-size: 14px;
+      }
+      .list-bottom {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 100%;
+        height: 32px;
+        color: #2ABED1;
+        font-size: 14px;
+        background-color: #EAF8FA;
+      }
+    }
+  }
+}
+</style>

+ 31 - 3
src/components/common/TabHeader.vue

@@ -7,19 +7,29 @@
       </div>
       <div class="tab-content" v-else-if="actived === 'cor' || actived === 'client'">
         <router-link class="tab-link" :class="actived === 'cor' ? 'active' : ''" to="" @click.native="toPotential" replace>潜在客户挖掘</router-link>
-        <router-link class="tab-link" :class="actived === 'client' ? 'active' : ''" to="/my_client" replace>客户监控</router-link>
+        <router-link class="tab-link" :class="actived === 'client' ? 'active' : ''" to="/my_client" replace>业主监控</router-link>
       </div>
     </div>
+    <common-dialog @close="showNoPower7 = false" :show-close="true" center custom-class="monitor-class" width="380px" :visible="showNoPower7" title="暂无权限">
+      <template #footer>
+        <button class="action-button confirm" @click="getMoreInfo">了解更多</button>
+      </template>
+      结合历史招标采购信息、用户业务范围,生成潜在客户名录,获取销售机会。
+    </common-dialog>
   </div>
 </template>
 
 <script>
 // import { MessageBox } from 'element-ui'
+import commonDialog from '@/components/dialog/Dialog.vue'
 import { mixinNoPowerMessageTip } from '@/utils/mixins/no-power-message-box'
 import { mapState } from 'vuex'
 export default {
   name: 'bid-tab-header',
   mixins: [mixinNoPowerMessageTip],
+  components: {
+    commonDialog
+  },
   props: {
     actived: {
       type: String
@@ -31,9 +41,15 @@ export default {
     })
   },
   data () {
-    return {}
+    return {
+      showNoPower7: false
+    }
   },
   methods: {
+    getMoreInfo () {
+      this.showNoPower7 = false
+      location.href = '/big/page/yw'
+    },
     goPotentialR () {
       if (this.power.indexOf(8) === -1) {
         this.showNoPowerMessageTip()
@@ -53,7 +69,8 @@ export default {
     },
     toPotential () {
       if (this.power.indexOf(7) === -1) {
-        this.showNoPowerMessageTip()
+        // this.showNoPowerMessageTip()
+        this.showNoPower7 = true
       } else {
         if (this.actived === 'cor') return
         this.$router.replace('/potential_rival_list/c')
@@ -62,7 +79,18 @@ export default {
   }
 }
 </script>
+<style lang="scss" scoped>
+::v-deep{
+  .dialog-footer{
+    justify-content: center;
+  }
+}
 
+.action-button.confirm{
+  flex: none;
+  width: 132px;
+}
+</style>
 <style lang="scss">
 .bid-tab-header{
   position: absolute;

+ 105 - 8
src/components/push-list/PotentialList.vue

@@ -38,10 +38,17 @@
             <span  @click.stop="changeDelete(item)">不是我的潜在竞争对手/合作伙伴</span>
           </div>
           <div class="pcor-right-group flex-c-c right" v-else-if="filters.pcor === 'C'">
-            <div class="flex-r-c center" @click.stop="changeFollow(item)">
-              <i :class="'el-icon-jy-heart_' + (item.follow ? 'solid' : 'stroke')"></i>
-              <span>{{item.follow ? '已' : ''}}关注</span>
-            </div>
+            <el-popover
+              placement="left"
+              width="224"
+              trigger="hover"
+            >
+              <div slot="reference" class="flex-r-c center" @click.stop="changeFollow(item)">
+                <i class="icon iconfont" :class="{ 'icon-yijiankong': item.follow, 'icon-jiankong': !item.follow }"></i>
+                <span>{{item.follow ? '取消' : ''}}监控</span>
+              </div>
+              <monitor-com  @showNeedSubmit="showNeedSubmit" @show="monitorInfo.showD4 = true" :already-num="monitorInfo.alreadyNum" :remain-num="monitorInfo.remainNum" :show-list="monitorInfo.showList"></monitor-com>
+            </el-popover>
             <span  @click.stop="changeDelete(item)">不是我的客户</span>
           </div>
         </div>
@@ -88,15 +95,27 @@
         <div slot="header">选择分组</div>
       </GroupCard>
     </el-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD4" title="申请监控更多业主">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('4')">联系客服</button>
+        <button class="action-button cancel" @click="setMonitorCancel('4')">返回</button>
+      </template>
+      您可联系客服,申请升级产品套餐,监控更多业主
+    </common-dialog>
+    <CollectInfo ref="collectRef"></CollectInfo>
   </el-card>
 </template>
 
 <script>
-import { Pagination, Card, Button, Dialog } from 'element-ui'
+import '@/assets/style/iconfont.css'
+import commonDialog from '@/components/dialog/Dialog.vue'
+import CollectInfo from '@/components/collect-info/CollectInfo.vue'
+import { Pagination, Card, Button, Dialog, Popover } from 'element-ui'
 import Empty from '@/components/common/Empty.vue'
 import GroupCard from '@/components/selector/GroupSelector.vue'
+import monitorCom from '@/components/common/Monitor.vue'
 import { moneyUnit } from '@/utils/'
-import { getCorList } from '@/api/modules/'
+import { getCorList, getStatusCustomer } from '@/api/modules/'
 
 export default {
   name: 'potential-list',
@@ -105,8 +124,12 @@ export default {
     [Card.name]: Card,
     [Button.name]: Button,
     [Dialog.name]: Dialog,
+    [Popover.name]: Popover,
     Empty,
-    GroupCard
+    GroupCard,
+    monitorCom,
+    CollectInfo,
+    commonDialog
   },
   filters: {
     formatMoney (value) {
@@ -170,11 +193,43 @@ export default {
         group: 'A', // 当前点击编辑的分组信息
         fid: ''
       },
-      selectItem: {}
+      selectItem: {},
+      monitorInfo: {
+        showList: [1, 3],
+        remainNum: 0,
+        alreadyNum: 0,
+        showD1: false,
+        showD2: false,
+        showD3: false,
+        showD4: false
+      }
     }
   },
   created () {},
   methods: {
+    setMonitorConfirm (data) {
+      switch (data) {
+        case '4':
+          this.contactCustomer(this)
+          this.monitorInfo.showD4 = false
+          break
+        default:
+          break
+      }
+    },
+    setMonitorCancel (data) {
+      switch (data) {
+        case '4':
+          this.monitorInfo.showD4 = false
+          break
+        default:
+          break
+      }
+    },
+    // 显示留资弹窗
+    showNeedSubmit () {
+      this.$refs.collectRef.noCallApiFn('pc_buyer_monitor_more', true)
+    },
     changeFollow (item) {
       this.selectItem = item
       this.cur.fid = item.entId
@@ -190,6 +245,7 @@ export default {
         this.$emit(item.follow ? 'remove' : 'follow', item)
         setTimeout(() => {
           item.follow = !item.follow
+          this.getListStatus()
         }, 1000)
         this.$forceUpdate()
       }
@@ -269,12 +325,31 @@ export default {
       this.listState.loaded = true
       if (res.error_code === 0) {
         this.listState.total = res.data.total
+        this.getListStatus(res.data.list)
         this.listState.list = res.data.list || []
       } else {
         this.listState.total = 0
         this.listState.list = []
       }
     },
+    // 获取监控数量
+    async getListStatus (list) {
+      const nameList = []
+      if (!list) return
+      list.forEach((v, i) => {
+        if (i === 0) {
+          nameList.push(v.Buyer)
+        }
+      })
+      const { error_code: code, data } = await getStatusCustomer({ name_list: nameList })
+      if (code === 0) {
+        this.monitorInfo.alreadyNum = data.count.use
+        this.monitorInfo.remainNum = data.count.surplus
+        if (data.count.surplus === 0) {
+          this.$emit('show', this.monitorInfo)
+        }
+      }
+    },
     onPageChange (p) {
       this.listState.pageNum = p
       // this.getList()
@@ -295,6 +370,14 @@ export default {
   @include diy-icon('icon-company', 24, 24);
   @include diy-icon('heart_stroke', 18, 18);
   @include diy-icon('heart_solid', 18, 18);
+  .icon-yijiankong {
+    font-size: 20px;
+    color: #FF9F40;
+  }
+  .icon-jiankong {
+    font-size: 20px;
+    color: #9B9CA3;
+  }
   ::v-deep .el-icon-jy-icon-company {
     margin-right: 8px;
   }
@@ -325,6 +408,20 @@ export default {
       }
     }
   }
+  ::v-deep{
+    .monitor-class {
+      padding: 32px;
+      .el-dialog__header {
+        padding: 0;
+      }
+      .el-dialog__body {
+        padding: 20px 0 32px;
+      }
+      .el-dialog__footer{
+        padding: 0;
+      }
+    }
+  }
   .sub-manager {
     display: flex;
     align-items: center;

+ 1 - 1
src/router/router-interceptors.js

@@ -27,7 +27,7 @@ const powerCheckWhiteList = [
   'workspace_dashboard',
   'report_analysis',
   'pro_follow_detail', // 项目详情
-  'my_client', // 客户监控
+  'my_client', // 业主监控
   'config',
   'coupon',
   'datapack_buy',

+ 1 - 1
src/router/routers.js

@@ -163,7 +163,7 @@ export default [
     name: 'my_client',
     component: () => import('@/views/ent-intel/MyClient.vue'),
     meta: {
-      title: '客户监控'
+      title: '业主监控'
     }
   },
   // 项目进度监控

+ 78 - 4
src/views/PotentialList.vue

@@ -37,17 +37,35 @@
         <div class="content-list-box">
           <potential-list @goDetail="goDetail"
                           @follow="changeFollow"
+                          @show="showMonitorDialog"
                           @remove="changeRemove"
                           @delete="changeDelete"
                           :title="getTopInfo.desc || getTopInfo.text" :filters="filters" ref="pushList" :showMore="false"></potential-list>
         </div>
       </div>
     </forLayOut>
+    <common-dialog custom-class="monitor-class" width="380px" :visible="monitorInfo.showD1" title="监控成功">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('1')">去开启</button>
+        <button class="action-button cancel" @click="setMonitorCancel('1')">暂不开启</button>
+      </template>
+      您可前往“工作台-商机-业主监控”查看业主最新招标动态。为保证您能及时获取新增监控信息推送,请前往开启推送提醒。
+    </common-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD3" title="监控业主个数已达上限">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('3')">联系客服</button>
+        <button class="action-button cancel" @click="setMonitorCancel('3')">返回</button>
+      </template>
+      您最多可监控{{monitorInfo.remainNum + monitorInfo.alreadyNum}}个业主,可联系客服,申请监控更多业主
+    </common-dialog>
+    <CollectInfo ref="collectRef"></CollectInfo>
   </div>
 </template>
 
 <script>
+import CollectInfo from '@/components/collect-info/CollectInfo.vue'
 import PotentialList from '@/components/push-list/PotentialList.vue'
+import commonDialog from '@/components/dialog/Dialog.vue'
 import AreaSelector from '@/components/selector/AreaSelector.vue'
 import IndustrySelector from '@/components/selector/IndustrySelector.vue'
 import BuyerclassSelector from '@/components/selector/BuyerclassSelector.vue'
@@ -65,7 +83,9 @@ export default {
     BuyerclassSelector,
     BusinessScopeSelector,
     forLayOut,
-    TabHeader
+    TabHeader,
+    commonDialog,
+    CollectInfo
   },
   data () {
     return {
@@ -91,18 +111,71 @@ export default {
         pcor: this.$route.params.type.toLocaleUpperCase(),
         searchbool: 1,
         listKey: new Date().getTime()
+      },
+      monitorInfo: {
+        showD1: false,
+        showD3: false,
+        alreadyNum: 0,
+        remainNum: 0
       }
     }
   },
   methods: {
+    showMonitorDialog (data) {
+      const { remainNum, alreadyNum } = data
+      this.monitorInfo.remainNum = remainNum
+      this.monitorInfo.alreadyNum = alreadyNum
+    },
+    setMonitorConfirm (data) {
+      switch (data) {
+        case '1':
+          window.open('/swordfish/page_big_pc/push_setting')
+          this.monitorInfo.showD1 = false
+          break
+        case '3':
+          this.contactCustomer(this)
+          this.monitorInfo.showD3 = false
+          break
+        default:
+          break
+      }
+    },
+    setMonitorCancel (data) {
+      switch (data) {
+        case '1':
+          this.monitorInfo.showD1 = false
+          break
+        case '3':
+          this.monitorInfo.showD3 = false
+          break
+        default:
+          break
+      }
+    },
     changeFollow (item) {
       if (this.filters.pcor === 'C') {
         // 潜在客户挖掘--关注
         setStatusCustomer({ name: item.Buyer, province: item.WProvince, city: item.WCity, b: false }).then(res => {
-          if (!(res && res.error_code === 0 && res.data)) {
-            this.$toast(res.error_msg)
+          if (res && res.error_code === 0) {
+            if (res.data.status) {
+              if (!res.data.msg_open) {
+                this.monitorInfo.showD1 = true
+              } else {
+                this.$toast('监控成功,您可前往“工作台-商机-业主监控”查看')
+              }
+            } else {
+              if (this.monitorInfo.remainNum === 0) {
+                if (this.info.vipStatus > 0) {
+                  this.$refs.collectRef.noCallApiFn('pc_buyer_monitor_more', true)
+                } else if (this.info.memberStatus > 0) {
+                  this.monitorInfo.showD3 = true
+                }
+              } else {
+                this.$toast(res.error_msg)
+              }
+            }
           } else {
-            this.$toast('关注成功,请前往“客户监控”中查看')
+            this.$toast(res.error_msg)
           }
           this.$refs.pushList.doQuery(this.filters)
         })
@@ -234,6 +307,7 @@ export default {
   computed: {
     ...mapState({
       scope: state => state.user.scope,
+      info: state => state.user.info,
       isDeleteAllScope: state => state.user.isDeleteAllScope
     }),
     getTopInfo () {

+ 174 - 25
src/views/ent-intel/MyClient.vue

@@ -14,29 +14,39 @@
               @click="changeState(item)">{{ item.n }}</button>
           </div>
           <div class="filter-item">
-            <span class="item-label">客户名称:</span>
+            <span class="item-label">业主名称:</span>
             <div style="display:flex;align-items: center;">
-              <el-input @keydown.enter.native="enterKeydown" class="ent-input" v-model="value" placeholder="请输入已关注客户名称" @clear="clearHandle" clearable @input="onInput"></el-input>
+              <el-input @keydown.enter.native="enterKeydown" class="ent-input" v-model="value" placeholder="请输入已监控业主名称" @clear="clearHandle" clearable @input="onInput"></el-input>
               <el-button v-show="value" @click="searchHandle" class="search-btn">搜索</el-button>
             </div>
           </div>
         </div>
         <div class="client-container">
           <div class="client-title">
-            <strong>客户列表</strong>
-            <span>(可关注 {{maxCount}} 个客户,已关注<em style="color:#2CB7CA;">{{client.followTotal || '0'}}</em>个)</span>
+            <strong>监控业主列表</strong>
+            <span>(可监控 {{maxCount}} 个业主,已监控<em style="color:#2CB7CA;">{{client.followTotal || '0'}}</em>个)</span>
+            <div @click="applyMore" class="apply-more-btn">申请监控更多业主</div>
           </div>
           <div class="client-list">
             <div class="l-thead">
-              <span class="w-800">客户</span>
-              <span class="w-100">关注时间</span>
+              <span class="w-800">业主</span>
+              <span class="w-100" style="display: inline-flex;align-items: center;">更新时间
+                <el-tooltip class="item" effect="dark" content="" placement="top">
+                  <img class="help-icon" src="@/assets/images/icon/help.png" alt=""/>
+                  <!-- <div slot="content">初始值为监控业主的时间,监控<br/>后,业主下如有与“我的订阅”相<br/>关的招标动态如有更新,则为项目<br/>更新时间。</div> -->
+                  <div slot="content">初始值为监控业主的时间,监控后,<br/>业主如有与“我的订阅”相关的招标<br/>动态更新,则为项目更新时间</div>
+                </el-tooltip>
+              </span>
               <span class="w-100">操作</span>
             </div>
             <div class="l-tbody" v-loading="loading" element-loading-background="#fff" v-if="client.list && client.list.length > 0">
               <ul class="items">
                 <li class="item" :class="{ visited: item.visited }" v-for="(item, index) in client.list" :key="'00' + index">
                   <div class="item-info w-800">
-                    <div class="info-name visited-hd" @click="goUnit(item)">{{item.name}}</div>
+                    <div class="info-name visited-hd" @click="goUnit(item)">
+                      {{item.name}}
+                      <span class="red-dot" v-if="item.unread"></span>
+                    </div>
                     <div class="info-other">
                       <span class="other-list" v-if="item.province">
                         <i class="area-icon"></i>
@@ -52,7 +62,7 @@
                   </div>
                   <div class="item-time w-100">{{item.followdate}}</div>
                   <div class="item-handle w-100" v-if="isNewEnt || isEntService">
-                    <p @click="cancelFollow(item)">取消关注</p>
+                    <p @click="cancelFollow(item)">取消监控</p>
                     <div class="action-follow" @click="clickRenButton(item, index)" v-if="item.name">
                       <span class="spa1" :class="{
                         'el-icon-jy-renling-active': item.claim1,
@@ -61,7 +71,7 @@
                       <span class="text">{{ item.claim1 ? '取消认领' : '认领' }}</span>
                     </div>
                   </div>
-                  <div class="item-handle w-100" @click="cancelFollow(item)" v-else>取消关注</div>
+                  <div class="item-handle w-100" @click="cancelFollow(item)" v-else>取消监控</div>
                 </li>
               </ul>
               <!-- 认领添加标签 -->
@@ -91,26 +101,43 @@
                 slot="button"
                 @click="goFollowClient"
               >
-                潜在客户挖掘
+                去监控
               </el-button>
             </Empty>
           </div>
         </div>
       </template>
     </forLayOut>
+    <CollectInfo ref="collectRef"></CollectInfo>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD2" title="确定不再监控?">
+      <template #footer>
+        <button class="action-button confirm" @click="setClientMonitorConfirm('2')">我再想想</button>
+        <button class="action-button cancel" @click="setClientMonitorCancel('2')">确认取消</button>
+      </template>
+      取消监控,将错过业主最新动态推送
+    </common-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD3" title="申请监控更多业主">
+      <template #footer>
+        <button class="action-button confirm" @click="setClientMonitorConfirm('3')">联系客服</button>
+        <button class="action-button cancel" @click="setClientMonitorCancel('3')">返回</button>
+      </template>
+      您可联系客服,申请升级产品套餐,监控更多业主
+    </common-dialog>
   </div>
 </template>
 
 <script>
-import { Input, Button, Pagination } from 'element-ui'
+import { Input, Button, Pagination, Tooltip } from 'element-ui'
 import forLayOut from '@/components/forecast/ForLayout.vue'
+import commonDialog from '@/components/dialog/Dialog.vue'
 import TabHeader from '@/components/common/TabHeader.vue'
+import CollectInfo from '@/components/collect-info/CollectInfo.vue'
 import vPopper from '@/components/common/Popper.vue'
 import Empty from '@/components/common/Empty.vue'
 import { mixinVisited } from '@/utils/mixins/visited'
 import { mapState, mapGetters } from 'vuex'
 import { getPowerUrl } from '@/utils/power/redirect'
-import { followClientList, entNewFollowClientList, claimchecked, custAttention, setStatusCustomer } from '@/api/modules'
+import { followClientList, entNewFollowClientList, claimchecked, custAttention, setStatusCustomer, setReadStatus } from '@/api/modules'
 export default {
   name: 'ent-intel',
   mixins: [mixinVisited],
@@ -118,9 +145,12 @@ export default {
     [Input.name]: Input,
     [Button.name]: Button,
     [Pagination.name]: Pagination,
+    [Tooltip.name]: Tooltip,
     forLayOut,
     TabHeader,
     Empty,
+    commonDialog,
+    CollectInfo,
     vPopper
   },
   data () {
@@ -140,13 +170,18 @@ export default {
         { v: 999, n: '全部' },
         { v: 1, n: '已认领' },
         { v: 0, n: '未认领' }
-      ]
+      ],
+      monitorInfo: {
+        showD2: false,
+        showD3: false
+      }
     }
   },
   computed: {
     ...mapState({
       newEnt: state => state.user.isNewEnt,
-      power: state => state.user.power
+      power: state => state.user.power,
+      info: state => state.user.info
     }),
     ...mapGetters('user', [
       'isEntService' // 商机管理服务
@@ -155,16 +190,15 @@ export default {
       return this.newEnt.isNew
     },
     hasThisPower () {
-      return this.power.includes(7)
+      return this.power.includes(24) || this.power.includes(25)
     },
     showAddButton () {
       const noData = this.client.followTotal === 0
-      const hasPower = !this.isNewEnt && this.hasThisPower
-      return noData && hasPower
+      return noData
     },
     showTips () {
       if (this.client.followTotal === 0) {
-        return '暂未关注任何客户'
+        return '暂未监控业主'
       } else {
         return '暂未匹配数据'
       }
@@ -177,6 +211,39 @@ export default {
     this.doSearch()
   },
   methods: {
+    // 申请监控更多业主
+    applyMore () {
+      if (this.info.vipStatus > 0) {
+        this.$refs.collectRef.noCallApiFn('pc_list_monitor_more')
+      } else {
+        this.monitorInfo.showD3 = true
+      }
+    },
+    setClientMonitorConfirm (data) {
+      switch (data) {
+        case '2':
+          this.monitorInfo.showD2 = false
+          break
+        case '3':
+          this.contactCustomer(this)
+          this.monitorInfo.showD3 = false
+          break
+        default:
+          break
+      }
+    },
+    setClientMonitorCancel (data) {
+      switch (data) {
+        case '2':
+          this.cancelFollowEvent()
+          break
+        case '3':
+          this.monitorInfo.showD3 = false
+          break
+        default:
+          break
+      }
+    },
     doSearch () {
       this.resetState()
       this.getClientList()
@@ -272,7 +339,7 @@ export default {
     clearHandle () {
       this.doSearch()
     },
-    goUnit (item) {
+    async goUnit (item) {
       item.visited = true
       this.pathVisiting(
         this.createPathItem(
@@ -280,8 +347,31 @@ export default {
           `id=${item.name}`
         )
       )
-      const { url } = getPowerUrl('buyerDesc', { id: item.name })
-      window.open(url)
+      const params = {
+        name: item.name
+      }
+      const { error_code: code, data } = await setReadStatus(params)
+      if (code === 0 && data) {
+        item.unread = 0
+        // 商机管理服务跳转到商机管理采购单位画像
+        if (this.info.isEntService) {
+          const url = '/entpc/unit_portrayal/' + item.name + '?active=2'
+          window.open(url)
+        } else if (this.info.entniche) {
+          if (this.info.entIsNew) {
+            // 新版商机管理 跳转到商机管理采购单位画像页面
+            const { url } = getPowerUrl('buyerDesc', { id: item.name + '?active=2' })
+            window.open(url)
+          } else {
+            // 老版商机管理 跳转到大会员采购单位画像页面
+            const url = '/swordfish/page_big_pc/unit_portrayal/' + item.name + '?active=2'
+            window.open(url)
+          }
+        } else {
+          const { url } = getPowerUrl('buyerDesc', { id: item.name + '?active=2' })
+          window.open(url)
+        }
+      }
     },
     onPageChange (p) {
       this.client.pageNum = p
@@ -292,14 +382,21 @@ export default {
       this.client.pageSize = size
       this.getClientList()
     },
-    // 取消关注
+    // 取消监控
     cancelFollow (item) {
+      this.monitorInfo.showD2 = true
+      this.monitorInfo.item = item
+    },
+    // 取消监控操作
+    cancelFollowEvent () {
+      const item = this.monitorInfo.item
       setStatusCustomer({
         name: item.name,
         b: true
       }).then(res => {
         if (res.error_code === 0 && res.data) {
-          this.$toast('取消关注成功', 1000)
+          this.$toast('取消监控成功', 1000)
+          this.monitorInfo.showD2 = false
           this.doSearch()
         } else {
           this.$toast(res.error_msg, 1500)
@@ -336,7 +433,8 @@ export default {
       }
     },
     goFollowClient () {
-      this.$router.replace('/potential_cor_list/c')
+      const goHref = location.origin + '/jylab/purSearch/index.html'
+      location.href = '/page_workDesktop/work-bench/page?link=' + encodeURIComponent(goHref)
     }
   }
 }
@@ -349,6 +447,22 @@ export default {
   ::v-deep .for_main{
     margin-top: -148px;
   }
+  ::v-deep{
+    .el-dialog {
+      margin-top: 30vh!important;
+    }
+    .el-dialog--center .el-dialog__body{
+      text-align: center;
+    }
+  }
+  .red-dot {
+    display: inline-block;
+    margin: 8px 0 0 4px;
+    width: 6px;
+    height: 6px;
+    background: #fb483d;
+    border-radius: 50%;
+  }
   .filter-container{
     padding: 42px 40px;
     background: #fff;
@@ -423,6 +537,20 @@ export default {
       }
     }
   }
+  ::v-deep{
+    .monitor-class {
+      padding: 32px;
+      .el-dialog__header {
+        padding: 0;
+      }
+      .el-dialog__body {
+        padding: 20px 0 32px;
+      }
+      .el-dialog__footer{
+        padding: 0;
+      }
+    }
+  }
   .area-icon {
     display: inline-block;
     width: 18px;
@@ -445,6 +573,8 @@ export default {
     border-radius: 4px;
     background: #fff;
     .client-title{
+      display: flex;
+      align-items: center;
       strong{
         font-weight: bold;
         font-size: 18px;
@@ -454,6 +584,21 @@ export default {
         font-size:14px;
         color:#686868;
       }
+      .apply-more-btn{
+        margin-left: 32px;
+        padding: 4px 16px;
+        color: #fff;
+        font-size: 14px;
+        line-height: 20px;
+        background: #2ABED1;
+        border-radius: 4px;
+        cursor: pointer;
+      }
+    }
+    .help-icon{
+      margin-left: 4px;
+      width: 18px;
+      height: 18px;
     }
     .l-tbody {
       position: relative;
@@ -482,6 +627,8 @@ export default {
         padding: 0 12px;
       }
       .info-name{
+        display: flex;
+        align-items: flex-start;
         margin-bottom: 8px;
         font-size: 16px;
         color: #1d1d1d;
@@ -537,10 +684,12 @@ export default {
     }
   }
   .add-btn{
-    margin: 16px 0;
+    padding: 6px 42px;
+    margin: 12px 0;
     background: #2cb7ca;
     border-radius: 6px;
     border: 0;
+    line-height: 24px;
   }
   .el-pagination-container{
     margin-top: 40px;

+ 1 - 1
src/views/order/components/big-member/desc.vue

@@ -264,7 +264,7 @@ export default {
     display: flex;
     justify-content: center;
     align-items: center;
-    padding: 12px;
+    padding: 12px 0;
     width: 120px;
     border-bottom: 1px solid #ececec;
     text-align: center;

+ 7 - 1
src/views/order/components/big-member/info-data.js

@@ -90,6 +90,12 @@ export const serviceListData = [
         four: '100个',
         five: '500个'
       },
+      {
+        two: '业主监控',
+        three: '监控业主最新发布的招标动态,并通过微信、邮件实时推送信息提醒,便于企业了解业主实时动态、及时跟标。',
+        four: '100个',
+        five: '500个'
+      },
       {
         two: '企业情报监控',
         three: '监控企业工商变动信息、最新招标采购、中标、项目动态,并通过微信、邮件实时推送信息提醒,帮助企业了解竞争对手和合作伙伴的动向。',
@@ -109,7 +115,7 @@ export const serviceListData = [
         five: 'icon-tick'
       },
       {
-        two: '业主人脉信息<br>(采购单位通讯录)',
+        two: '业主人脉信息<br>(采购单位通讯录)',
         three: '通过招标采购大数据分析与挖掘,获取业主单位负责人联系方式,帮助企业快速拓展人脉,赢得更多合作机会。',
         four: 'icon-tick',
         five: 'icon-tick'

+ 2 - 2
src/views/order/components/big-member/info.vue

@@ -52,7 +52,7 @@
                     </li>
                     <li class="sever_list m-w190">
                       <span class="j-icon icon-root"></span>
-                      <span class="serve_text">企业情报监控<span class="serve_sub_text">(100个)</span></span>
+                      <span class="serve_text">业主/企业情报监控<span class="serve_sub_text">(100个)</span></span>
                     </li>
                     <li class="sever_list m-w136">
                       <span class="j-icon icon-root"></span>
@@ -107,7 +107,7 @@
                     </li>
                     <li class="sever_list m-w180">
                       <span class="j-icon icon-root"></span>
-                      <span class="serve_text">企业情报监控<span class="serve_sub_text">(500个)</span></span>
+                      <span class="serve_text">业主/企业情报监控<span class="serve_sub_text">(500个)</span></span>
                     </li>
                     <li class="sever_list m-w164">
                       <span class="j-icon icon-root"></span>

+ 214 - 26
src/views/portrayal/UnitPortrayal.vue

@@ -9,10 +9,18 @@
               <span class="el-icon-jy-share"></span>
               <span class="follow-text">转给同事</span>
             </div>
-            <div class="u-follow" @click="setFollow" v-show="bigmember || isNewEnt.isNew">
-              <span :class="{ icon_heart_red: follow.followed, icon_heart_gray: !follow.followed }"></span>
-              <span class="follow-text">{{ follow.followed ? '已关注' : '关注' }}</span>
-            </div>
+            <el-popover
+              popper-class="monitor-popover"
+              placement="bottom"
+              width="224"
+              trigger="hover"
+              >
+              <div slot="reference" class="u-follow" @click="setFollow">
+                <span class="iconfont" :class="{ 'icon-yijiankong': follow.followed, 'icon-jiankong': !follow.followed }"></span>
+                <span class="follow-text">{{ follow.followed ? '已监控' : '监控' }}</span>
+              </div>
+              <monitor-com @showNeedSubmit="showNeedSubmit" @show="monitorInfo.showD4 = true" :already-num="monitorInfo.alreadyNum" :remain-num="monitorInfo.remainNum" @monitorCancel="monitorCancel" @monitorStatus="monitorStatus" :show-list="monitorInfo.showList"></monitor-com>
+            </el-popover>
             <div style="margin-left:10px;" v-if="isNewEnt.isNew || isEntService">
               <div class="u-follow" @click="setClaimed">
                 <span
@@ -200,6 +208,34 @@
     <el-dialog class="unit-dialog-group" title="联系客服" :visible.sync="isDialogShow">
       <div class="unit-dialog-content">如有疑问,请联系客服:400-108-6670</div>
     </el-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD1" title="监控成功">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('1')">去开启</button>
+        <button class="action-button cancel" @click="setMonitorCancel('1')">暂不开启</button>
+      </template>
+      您可前往“工作台-商机-业主监控”查看业主最新招标动态。为保证您能及时获取新增监控信息推送,请前往开启推送提醒。
+    </common-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD2" title="确定不再监控?">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('2')">我再想想</button>
+        <button class="action-button cancel" @click="setMonitorCancel('2')">确认取消</button>
+      </template>
+      取消监控,将错过业主最新动态推送
+    </common-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD3" title="监控业主个数已达上限">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('3')">联系客服</button>
+        <button class="action-button cancel" @click="setMonitorCancel('3')">返回</button>
+      </template>
+      您最多可监控{{monitorInfo.remainNum + monitorInfo.alreadyNum}}个业主,可联系客服,申请监控更多业主
+    </common-dialog>
+    <common-dialog center custom-class="monitor-class" width="380px" :visible="monitorInfo.showD4" title="申请监控更多业主">
+      <template #footer>
+        <button class="action-button confirm" @click="setMonitorConfirm('4')">联系客服</button>
+        <button class="action-button cancel" @click="setMonitorCancel('4')">返回</button>
+      </template>
+      您可联系客服,申请升级产品套餐,监控更多业主
+    </common-dialog>
     <CollectInfo ref="collectRef"></CollectInfo>
     <!-- 分享弹窗 -->
     <shareBox ref="shareBox"></shareBox>
@@ -211,6 +247,7 @@
 </template>
 <script>
 import Layout from '@/components/common/ContentLayout'
+import commonDialog from '@/components/dialog/Dialog.vue'
 import UnitChart from './components/UnitChart'
 import DynamicList from './components/DynamicList'
 import BidInfoActive from './components/BidInfoActive'
@@ -223,7 +260,9 @@ import vPopper from '@/components/common/Popper.vue'
 import shareBox from '@/components/shareBox/index.vue'
 import AsideNewscards from './components/AsideNewscards.vue'
 import WorkspaceButtonGroup from '@/components/dialog/WorkspaceButtonGroup.vue'
-import { Button, Dialog } from 'element-ui'
+import monitorCom from '@/components/common/Monitor.vue'
+import { Button, Dialog, Popover } from 'element-ui'
+import { openSelfLink } from '@/utils/'
 import {
   getBuyerSelect,
   getStatusCustomer,
@@ -257,10 +296,13 @@ export default {
     WorkspaceButtonGroup,
     [Dialog.name]: Dialog,
     [Button.name]: Button,
+    [Popover.name]: Popover,
     Empty,
     vPopper,
     shareBox,
-    crmAction
+    crmAction,
+    monitorCom,
+    commonDialog
   },
   props: {
     _buyerName: {
@@ -469,10 +511,26 @@ export default {
       buyerList: [],
       entInfoData: {},
       scrollEcho: true,
-      timer_: null
+      timer_: null,
+      monitorInfo: {
+        showList: [],
+        remainNum: 0,
+        alreadyNum: 0,
+        showD1: false,
+        showD2: false,
+        showD3: false,
+        showD4: false
+      }
     }
   },
   watch: {
+    loading (newval) {
+      if(!newval) {
+        if(this.getActive) {
+          this.handleClick(this.getActive)
+        }
+      }
+    },
     chartShowArr(newval) {
       if (newval.indexOf(true) !== -1) {
         this.emptyShow = false
@@ -503,6 +561,11 @@ export default {
         this.getSelect()
         // this.getClaimStatus()
       }
+    },
+    'follow.followed': {
+      handler(newVal) {
+        this.setMonitorInfo()
+      }
     }
   },
   computed: {
@@ -678,6 +741,9 @@ export default {
         employType: 3,
         idArr: this.info.buyerName,
       }
+    },
+    getActive () {
+      return this.$route.query.active
     }
   },
   created() {
@@ -761,6 +827,75 @@ export default {
     window.removeEventListener('scroll', this.watchScroll)
   },
   methods: {
+    // 查看监控状态
+    monitorStatus () {
+      this.handleClick('2')
+    },
+    setMonitorConfirm (data) {
+      switch (data) {
+        case "1":
+          window.open('/page_workDesktop/work-bench/app/big/push_setting')
+          const urls = this.$router.resolve({
+            path: '/push_setting'
+          })
+          this.monitorInfo.showD1 = false
+          openSelfLink(urls)
+          this.monitorInfo.showD1 = false
+          break;
+        case "2":
+          this.monitorInfo.showD2 = false
+          break;
+        case "3":
+          this.contactCustomer(this)
+          this.monitorInfo.showD3 = false
+          break;
+        case "4":
+          this.contactCustomer(this)
+          this.monitorInfo.showD4 = false
+          break;
+        default:
+          break;
+      }
+    },
+    // 显示留资
+    showNeedSubmit () {
+      this.$refs.collectRef.noCallApiFn('pc_buyer_monitor_more', true)
+    },
+    // 取消监控
+    monitorCancel () {
+      this.monitorInfo.showD2 = true
+    },
+    setMonitorCancel (data) {
+      switch (data) {
+        case "1":
+          this.monitorInfo.showD1 = false
+          break;
+        case "2":
+          this.setFollow('cancel')
+          this.monitorInfo.showD2 = false
+          break;
+        case "3":
+          this.monitorInfo.showD3 = false
+          break;
+        case "4":
+          this.monitorInfo.showD4 = false
+          break;
+        default:
+          break;
+      }
+    },
+    setMonitorInfo () {
+      if(this.userInfo.isFree) {
+        this.monitorInfo.showList = [1]
+      } else {
+        if (this.follow.followed) {
+          this.monitorInfo.showList = [2, 3, 4]
+        } else {
+          this.monitorInfo.showList = [1, 3]
+        }
+        this.$forceUpdate()
+      }
+    },
     handleClick(index) {
       if (this.timer_) {
         clearTimeout(this.timer_)
@@ -1046,15 +1181,27 @@ export default {
     getFollowState() {
       if (!this.info.buyerName) return
       // 查询当前企业是否在 关注的客户 列表中
-      getStatusCustomer({ name: this.info.buyerName }).then(res => {
-        if (res && res.error_code === 0 && res.data) {
-          this.follow.followed = res.data
+      getStatusCustomer({ name_list: [this.info.buyerName] }).then(res => {
+        if (res && res.error_code === 0) {
+          if(JSON.stringify(res.data.follow) !== '{}') {
+            this.follow.followed = true
+          } else {
+            this.follow.followed = false
+          }
+          this.monitorInfo.alreadyNum = res?.data.count?.use
+          this.monitorInfo.remainNum = res?.data.count?.surplus
+          this.setMonitorInfo()
         }
       })
       this.getClaimStatus()
     },
-    setFollow() {
+    setFollow(str) {
+      if (this.userInfo.isFree) {
+        this.$refs.collectRef.noCallApiFn('pc_buyer_monitor_freeuser', true)
+        return
+      }
       if (this.follow.loading) return
+      if (str !== 'cancel' && this.follow.followed) return
       const data = {
         name: this.info.buyerName,
         province: this.info.province,
@@ -1064,21 +1211,39 @@ export default {
       this.follow.loading = true
       // 潜在客户挖掘/我的客户-关注
       setStatusCustomer(data).then(res => {
-        if (res && res.error_code === 0 && res.data) {
-          if (this.follow.followed) {
-            // 取消关注操作返回
-            this.$toast('取消关注成功')
-            this.follow.followed = false
+        if (res && res.error_code === 0) {
+          if(res.data.status) {
+            if (this.follow.followed) {
+              // 取消监控操作返回
+              this.$toast('取消监控成功')
+              this.monitorInfo.showD1 = false
+              this.follow.followed = false
+            } else {
+              // 监控操作
+              // 没有打开推送设置显示去开启弹窗
+              if(!res.data.msg_open) {
+                this.monitorInfo.showD1 = true
+              } else {
+                this.$toast('监控成功,您可前往“工作台-商机-业主监控”查看')
+              }
+              this.follow.followed = true
+            }
           } else {
-            // 关注操作返回
-            this.follow.followed = true
-            this.$toast('关注成功,请前往“客户监控”中查看')
+            if(res.data.limit_status === 1) {
+              // 超级订阅用户打开留资弹窗
+              this.$refs.collectRef.noCallApiFn('pc_buyer_monitor_limit', true)
+            } else if(res.data.limit_status === 2) {
+              this.monitorInfo.showD3 = true
+            } else {
+              this.$toast('监控失败')
+            }
           }
         } else {
           if (res.error_msg) {
             this.$toast(res.error_msg)
           }
         }
+        this.getFollowState()
       }).finally(() => {
         this.follow.loading = false
       })
@@ -1125,6 +1290,14 @@ export default {
 @include diy-icon('renling-01', 20, 20);
 @include diy-icon('renling-active', 20, 20);
 @include diy-icon('share', 20, 20);
+::v-deep{
+  .el-dialog {
+    margin-top: 30vh!important;
+  }
+  .el-dialog--center .el-dialog__body{
+    text-align: center;
+  }
+}
 .upgrade-mask-group{
   margin-top: 0;
   margin-bottom: 32px;
@@ -1150,7 +1323,6 @@ export default {
 .free-bg-container {
   margin: 16px 0;
 }
-
 ::v-deep {
   .release_main {
     position: relative;
@@ -1185,11 +1357,6 @@ export default {
   height: 18px;
 }
 
-.icon_heart_gray {
-  background: url('~@/assets/images/icon/icon-heart.png') no-repeat;
-  background-size: contain;
-}
-
 .icon_heart_red {
   background: url('~@/assets/images/icon/icon-favorite.png') no-repeat;
   background-size: contain;
@@ -1202,6 +1369,14 @@ export default {
     }
   }
 }
+.icon-yijiankong {
+  font-size: 20px;
+  color: #FF9F40;
+}
+.icon-jiankong {
+  font-size: 20px;
+  color: #9B9CA3;
+}
 
 .unit-portrayal-content {
   position: relative;
@@ -1429,7 +1604,20 @@ export default {
       }
     }
   }
-
+  ::v-deep{
+    .monitor-class {
+      padding: 32px;
+      .el-dialog__header {
+        padding: 0;
+      }
+      .el-dialog__body {
+        padding: 20px 0 32px;
+      }
+      .el-dialog__footer{
+        padding: 0;
+      }
+    }
+  }
   .unit-type {
     position: relative;
     padding: 32px 40px;

+ 1 - 1
src/views/push-setting/index.vue

@@ -284,7 +284,7 @@ export default {
               if (!v.a_times) {
                 v.a_times = []
               }
-              const canEditType = ['o_subset', 'o_follow_project', 'o_follow_ent', 'o_entinfo', 'o_newproject_forecast']
+              const canEditType = ['o_subset', 'o_follow_project', 'o_follow_ent', 'o_entinfo', 'o_newproject_forecast', 'o_owner_monitor']
               arr.push({
                 classType: v.classType, // 仅用于归类展示
                 subTitle: v.subTitle, // 仅用于归类展示的副标题

+ 1 - 1
src/views/reportData/pageMonth.vue

@@ -1227,7 +1227,7 @@ export default {
           }
           .data_keys{
             margin: 20px 0;
-            height: 24px;
+            min-height: 24px;
             font-size: 14px;
             font-weight: 400;
             color: #1d1d1d;

+ 1 - 1
src/views/reportData/pageWeek.vue

@@ -787,7 +787,7 @@ export default {
           }
           .data_keys{
             margin: 20px 0;
-            height: 24px;
+            min-height: 24px;
             font-size: 14px;
             font-weight: 400;
             color: #1d1d1d;

+ 1 - 1
src/views/workspace/components/CommonUse.vue

@@ -211,7 +211,7 @@ export default {
               closeOnClickModal: false,
               center: true
             }, {
-              showCancelButton: menu.tipInfo?.isShowCancel,
+              showCancelButton: !!menu.tipInfo?.isShowCancel,
               confirmButtonText: menu.tipInfo?.confirmText
             }, menu.tipInfo?.options || {})
           }

+ 1 - 1
src/views/workspace/components/CustomerWatcher.vue

@@ -3,7 +3,7 @@
   <ListCard
     class="customer-watcher"
     :list="list"
-    title="客户监控"
+    title="业主监控"
     @clickListItem="clickListItem"
     @linkMore="linkMore"
     :loading="loading"

+ 1 - 1
vue.config.js

@@ -24,7 +24,7 @@ module.exports = {
     headers: {
       'Access-Control-Allow-Origin': '*'
     },
-    proxy: getProxyOfDomain('https://jybx-webtest.jydev.jianyu360.com/') || getProxyOfIp('http://127.0.0.1')
+    proxy: getProxyOfDomain('https://jybx3-webtest.jydev.jianyu360.com/') || getProxyOfIp('http://127.0.0.1')
   },
   css: {
     loaderOptions: {