Răsfoiți Sursa

Merge branch 'dev4.5.5' of http://127.0.0.1:8080/qmx/jy into dev4.5.5

TANGSHIZHE 4 ani în urmă
părinte
comite
a9fcfbe814
74 a modificat fișierele cu 3590 adăugiri și 381 ștergeri
  1. 1 1
      src/jfw/front/frontRouter.go
  2. 145 10
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  3. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/big-drain.png
  4. 60 15
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyWord.js
  5. 18 10
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyword-info.js
  6. 76 18
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyword-manage.js
  7. 22 1
      src/jfw/modules/app/src/web/templates/big-member/page_buy_commit.html
  8. 75 4
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  9. 23 1
      src/jfw/modules/app/src/web/templates/commonPay/checkout.html
  10. 35 2
      src/jfw/modules/app/src/web/templates/staticpage/privacy_rules.html
  11. 36 3
      src/jfw/modules/app/src/web/templates/staticpage/privacy_rules_client.html
  12. 1 0
      src/jfw/modules/app/src/web/templates/vipsubscribe/infoWord.html
  13. 3 2
      src/jfw/modules/app/src/web/templates/vipsubscribe/keyWord.html
  14. 4 3
      src/jfw/modules/app/src/web/templates/vipsubscribe/manageWord.html
  15. 10 6
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  16. 18 17
      src/jfw/modules/bigmember/src/entity/portrait.go
  17. 1 1
      src/jfw/modules/bigmember/src/entity/portraitBuyerSearch.go
  18. 23 11
      src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go
  19. 9 2
      src/jfw/modules/bigmember/src/service/use/use.go
  20. 1 1
      src/jfw/modules/common/src/qfw/util/jy/bigVipPower.go
  21. 2 1
      src/jfw/modules/publicapply/src/drainage/biddingtype.json
  22. 58 0
      src/jfw/modules/publicapply/src/drainage/entity/buyerunit.go
  23. 4 3
      src/jfw/modules/publicapply/src/drainage/initjson/initjson.go
  24. 4 3
      src/jfw/modules/publicapply/src/drainage/service/action.go
  25. 34 0
      src/jfw/modules/publicapply/src/drainage/service/buyerunit.go
  26. 40 13
      src/jfw/modules/subscribepay/src/service/afterPay.go
  27. 32 7
      src/jfw/modules/subscribepay/src/service/vipSubscribeChange.go
  28. 5 0
      src/jfw/public/recomKws.go
  29. 487 0
      src/web/staticres/big-member/css/unit_portrayal.css
  30. BIN
      src/web/staticres/big-member/image/working.gif
  31. 1245 0
      src/web/staticres/big-member/js/unit_portrayal.js
  32. BIN
      src/web/staticres/common-module/collection/image/buyer/01-bg.png
  33. BIN
      src/web/staticres/common-module/collection/image/buyer/01.png
  34. BIN
      src/web/staticres/common-module/collection/image/buyer/02-bg.png
  35. BIN
      src/web/staticres/common-module/collection/image/buyer/02.png
  36. BIN
      src/web/staticres/common-module/collection/image/buyer/03-bg.png
  37. BIN
      src/web/staticres/common-module/collection/image/buyer/03.png
  38. BIN
      src/web/staticres/common-module/collection/image/buyer/04-bg.png
  39. BIN
      src/web/staticres/common-module/collection/image/buyer/04.png
  40. BIN
      src/web/staticres/common-module/collection/image/buyer/05-bg.png
  41. BIN
      src/web/staticres/common-module/collection/image/buyer/05.png
  42. BIN
      src/web/staticres/common-module/collection/image/buyer/06-bg.png
  43. BIN
      src/web/staticres/common-module/collection/image/buyer/06.png
  44. BIN
      src/web/staticres/common-module/collection/image/buyer/07-bg.png
  45. BIN
      src/web/staticres/common-module/collection/image/buyer/07.png
  46. BIN
      src/web/staticres/common-module/collection/image/buyer/08-bg.png
  47. BIN
      src/web/staticres/common-module/collection/image/buyer/08.png
  48. BIN
      src/web/staticres/common-module/collection/image/buyer/09-bg.png
  49. BIN
      src/web/staticres/common-module/collection/image/buyer/09.png
  50. BIN
      src/web/staticres/common-module/collection/image/buyer/10-bg.png
  51. BIN
      src/web/staticres/common-module/collection/image/buyer/10.png
  52. BIN
      src/web/staticres/common-module/collection/image/buyer/11-bg.png
  53. BIN
      src/web/staticres/common-module/collection/image/buyer/11.png
  54. BIN
      src/web/staticres/common-module/collection/image/buyer/12-bg.png
  55. BIN
      src/web/staticres/common-module/collection/image/buyer/12.png
  56. 206 0
      src/web/staticres/common-module/collection/js/buyer-example.js
  57. 3 1
      src/web/staticres/common-module/collection/js/history-project.js
  58. 21 1
      src/web/staticres/css/wxcontentinfo.css
  59. BIN
      src/web/staticres/images/big-drain.png
  60. BIN
      src/web/staticres/images/pc-drainage-bg.png
  61. 60 15
      src/web/staticres/vipsubscribe/js/keyWord.js
  62. 18 10
      src/web/staticres/vipsubscribe/js/keyword-info.js
  63. 76 18
      src/web/staticres/vipsubscribe/js/keyword-manage.js
  64. 18 2
      src/web/templates/big-member/pc/page_buy_commit.html
  65. 29 3
      src/web/templates/big-member/pc/page_index.html
  66. 23 2
      src/web/templates/big-member/wx/page_buy_commit.html
  67. 390 0
      src/web/templates/big-member/wx/page_unit_portrayal.html
  68. 14 0
      src/web/templates/order/pc/orderPay.html
  69. 2 1
      src/web/templates/pc/member_orderDetail.html
  70. 218 187
      src/web/templates/staticpage/privacy_rules.html
  71. 22 0
      src/web/templates/weixin/commonPay/checkout.html
  72. 2 2
      src/web/templates/weixin/vipsubscribe/keyWord.html
  73. 3 3
      src/web/templates/weixin/vipsubscribe/manageWord.html
  74. 13 1
      src/web/templates/weixin/wxinfocontent_rec.html

+ 1 - 1
src/jfw/front/frontRouter.go

@@ -156,7 +156,7 @@ func (this *CommonRouter) BigpcPage(htmlPage string) error {
 	return this.doPcBigPage(htmlPage)
 }
 
-var bigVipFreePageReg = regexp.MustCompile(`set_*|free_*`)
+var bigVipFreePageReg = regexp.MustCompile(`set_*|free_*|unit_portrayal`)
 
 func (this *CommonRouter) doPcBigPage(pageSign string) error {
 	userid, _ := this.GetSession("userId").(string)

+ 145 - 10
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -4,7 +4,8 @@ var vNode = {
     delimiters: ['${', '}'],
     el: '#unit_portrayal',
     components: {
-      hisproComponent: hisproComponent
+      hisproComponent: hisproComponent,
+      buyerExample: buyerExample,
     },
     data() {
         // 修改柱状条颜色为渐变色
@@ -113,7 +114,10 @@ var vNode = {
             timer: null,
             initRendererSvg:{
                 renderer:'svg'
-            }
+            },
+            bigStatus: 0,
+            encryptId: '', // 首次埋点返回的加密id 用于点击去开通传参
+            power: []
         }
     },
     computed: {
@@ -130,7 +134,7 @@ var vNode = {
             var show_10 = this.isShow.showAge;
             var show_11 = this.isShow.showArea;
             var show_12 = this.isShow.showAgency;
-            if(!show_1 && !show_2 && !show_3 && !show_4 && !show_5 && !show_6 && !show_7 && !show_8 && !show_9 && !show_10 && !show_11 && !show_12) {
+            if(!show_1 && !show_2 && !show_3 && !show_4 && !show_5 && !show_6 && !show_7 && !show_8 && !show_9 && !show_10 && !show_11 && !show_12 && this.power.indexOf(5) > -1) {
                 return true;
             } else {
                 return false;
@@ -148,10 +152,14 @@ var vNode = {
             }).filter(function (v,i) {
                 return v.topData.length
             })
-        }
+        },
+        getStatus: function () {
+          return this.power.indexOf(5)  == -1 // power == 5
+        },
     },
     created () {
-        this.init();
+      this.getPowerInfo()
+      this.init();
     },
     mounted: function () {
         this.buyer.name = decodeURIComponent(utils.getParam('entName'));
@@ -168,6 +176,96 @@ var vNode = {
         }
     },
     methods: {
+        // 获取权限信息
+        getPowerInfo: function () {
+            var _this = this
+            $.ajax({
+              type: 'GET',
+              url: '/bigmember/use/isAdd?t=' + Date.now(),
+              success: function (res) {
+                  if (res.data) {
+                    _this.power = res.data.power
+                    _this.bigStatus = res.data.memberStatus
+                    var entniche = res.data.entniche
+                    var member = res.data.memberStatus
+                    var vip = res.data.vipStatus
+                    var userType = ''
+                    if (vip > 0) {
+                      userType = '1'
+                    }
+                    if (member > 0) {
+                      if (userType !== '') {
+                        userType += ','
+                      }
+                      userType += '2'
+                    }
+                    if (entniche) {
+                      if (userType !== '') {
+                        userType += ','
+                      }
+                      userType += '3'
+                    }
+                    if (userType === '') {
+                      userType = '0'
+                    }
+                    // 没有采购单位画像权限的 则添加埋点
+                    if (res.data.power.indexOf(5) === -1) {
+                      _this.getBuried(userType)
+                    }
+                  }
+              },
+              error: function (error) {
+                console.log(error)
+              }
+            })
+        },
+        // 进入页面埋点 非大会员用户请求
+        getBuried: function(type) {
+          var _this = this
+          var params = {
+            userType: type,
+            platform: utils.isIos ? 'AI' : 'AA'
+          }
+          $.ajax({
+            type: 'POST',
+            url: '/publicapply/drainage/buyerunit',
+            contentType: "application/json",
+            data: JSON.stringify(params),
+            success: function (res) {
+                if (res.data && res.data.status) {
+                  _this.encryptId = res.data.id
+                }
+            },
+            error: function (error) {
+              console.log(error)
+            }
+          })
+        },
+        // 点击去开通埋点方法
+        goBuyBuried: function(text) {
+          var _this = this
+          var params = {
+            mold: 'isCBBT',
+            id: _this.encryptId,
+            introduce: text
+          }
+          $.ajax({
+            type: 'POST',
+            url: '/publicapply/drainage/buyerunit',
+            contentType: "application/json",
+            data: JSON.stringify(params),
+            success: function (res) {
+              console.log(res)
+              setTimeout(function() {
+                location.href = '/jyapp/big/page/buy_commit?bid=' + _this.encryptId
+              }, 200)
+            },
+            error: function (error) {
+              console.log(error)
+              location.href = '/jyapp/big/page/buy_commit?bid=' + _this.encryptId
+            }
+          })
+        },
         init() {
             setTimeout(function() {
                 window.addEventListener('resize', function() {
@@ -234,6 +332,10 @@ var vNode = {
                             that.dt.isNext = false
                         }
                     } else if (that.dt.isMore === 'more') {
+                        if (that.power.indexOf(5) == -1) {
+                          that.openDialog()
+                          return
+                        }
                         that.dt.isMore = 'max'
                         if(res.data.count <= 23) {
                             that.dt.isNext = false
@@ -378,8 +480,8 @@ var vNode = {
           this.statistics.province = data.province ? data.province.replace(/省|市|自治区|特别行政区|壮族|回族|维吾尔/g, '') : '--';
           this.statistics.city = data.city;
           this.statistics.buyerClass = data.buyerclass ? data.buyerclass : '--';
-          this.statistics.start = new Date(Number(data.timeRange.start + '000')).pattern('yyyy/MM/dd');
-          this.statistics.end = new Date(Number(data.timeRange.end + '000')).pattern('yyyy/MM/dd');
+          this.statistics.start = data.timeRange ? new Date(Number(data.timeRange.start + '000')).pattern('yyyy/MM/dd'): '';
+          this.statistics.end = data.timeRange ? new Date(Number(data.timeRange.end + '000')).pattern('yyyy/MM/dd') : '';
           this.statistics.buyerCount = data.project_count ? data.project_count + '个' : '--';
           this.statistics.winnerCount = data.winner_count ? data.winner_count + '个' : '--';
           this.statistics.otherWinner = data.otherProvincesWinnerCount ? data.otherProvincesWinnerCount + '个' : '--';
@@ -1088,12 +1190,45 @@ var vNode = {
             item.positionTop = (index + 1)*20 + 'px'
             this.doubleBar.info = item
         },
+        // dialog
+        openDialog: function () {
+          var _this = this
+          this.$dialog.confirm({
+            width: 303,
+            className: 'custom-dialog',
+            title: '您暂无使用权限',
+            message: '开通大会员,采购单位项目动态全面获取,帮助企业洞察采购需求,开发新客户!',
+            messageAlign:'left',
+            confirmButtonText: _this.power.indexOf(5) < 0 && _this.bigStatus > 0 ? '联系客服' : '去开通',
+            confirmButtonColor: '#2ABED1',
+            showCancelButton: true,
+            cancelButtonText: '取消'
+          }).then(function(){
+            if (_this.power.indexOf(5) < 0 && _this.bigStatus > 0) {
+              try {
+                JyObj.callPhone('400-108-6670');
+              } catch (error) {
+                console.log(error)
+              }
+            } else {
+              _this.goBuyBuried('开通大会员,采购单位项目动态全面获取,帮助企业洞察采购需求,开发新客户!')
+            }
+          }).catch(function(err) {
+            console.log(err)
+          });
+        },
         // 跳转三级页
         goDetail: function(item){
-            if (item.id) {
-                var href = '/jyapp/article/content/' + item.id + '.html'
-                location.href = href
+          if (item.id) {
+            var href = '/jyapp/article/content/' + item.id + '.html'
+            location.href = href
+          } else {
+            if (this.power.indexOf(5) == -1) {
+              this.openDialog()
+            } else {
+              console.log('没有id')
             }
+          }
         },
         // 求最大项目数量
         getMaxProjectCount: function (analysisArr) {

BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/big-drain.png


+ 60 - 15
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyWord.js

@@ -26,6 +26,11 @@ var vm = new Vue({
     }
   },
   computed: {
+    keyListSorted: function () {
+      return this.filter.keywordsList.sort(function (a, b) {
+        return b.updatetime - a.updatetime
+      })
+    },
     fastImportTipShow: function () {
       return this.filter.allKeywordsList.length === 0 && this.filter.loaded && this.tip.fastImport
     },
@@ -135,33 +140,54 @@ var vm = new Vue({
     },
     // 向关键词中添加一些信息
     addInfoToKeyItem: function (groupList) {
+      var _this = this
       if (!Array.isArray(groupList)) return []
+      var arr = []
 
       groupList.forEach(function (keywordsList, index) {
-        if (Array.isArray(keywordsList.a_key)) {
+        if (keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
+          keywordsList.updatetime = _this.getMaxUpdateTime(keywordsList.a_key)
           keywordsList.a_key.forEach(function (keyword, iindex) {
             // 添加一些其他信息
             keyword.groupName = keywordsList.s_item // 分类名
             keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
             keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
           })
+          arr.push(keywordsList)
         }
       })
 
-      return groupList
+      return arr
     },
     getGroupNameList: function (keywordsGroupList) {
       var groupNameList = []
       if (!Array.isArray(keywordsGroupList)) return groupNameList
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          count: count // 分类下有多少个关键词
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex
+          })
+        }
       })
       return groupNameList
     },
+    getMaxUpdateTime: function (arr) {
+      var max = 0
+      if (!Array.isArray(arr)) return max
+      arr.some(function (item) {
+        if (item.updatetime && item.updatetime > max) {
+          max = item.updatetime
+        }
+      })
+      return max
+    },
     calcKeyInfo: function (item) {
       // 匹配方式 item.matchway 0/null精准 1模糊
       var key = item.key
@@ -233,7 +259,7 @@ var vm = new Vue({
         // type: edit编辑、add新增
         // gIndex: groupIndex 该关键词所在分类 在分类列表中的索引
         // kIndex: keyIndex 该关键词在其所在分类中的索引
-        location.href = `/jyapp/vipsubscribe/toSetInfoPage?type=edit&gIndex=${item.groupIndex}&kIndex=${item.keyIndex}`
+        location.href = `/jyapp/vipsubscribe/toSetinfoPage?type=edit&gIndex=${item.groupIndex}&kIndex=${item.keyIndex}`
       }
     },
     batchDeleteStateChange: function () {
@@ -279,6 +305,7 @@ var vm = new Vue({
 
       for (var key in deleteKeyArr) {
         if (Array.isArray(deleteKeyArr[key])) {
+          deleteKeyArr[key] = deleteKeyArr[key].sort(function (a, b) { return a - b })
           deleteKey[key] = deleteKeyArr[key].join(',')
         }
       }
@@ -286,6 +313,7 @@ var vm = new Vue({
     },
     batchDeleteConfirmed: function () {
       var deleteKey = this.getDeleteKey()
+      if (Object.keys(deleteKey).length === 0) return
       var loading = this.showLoading()
       var _this = this
       $.ajax({
@@ -316,7 +344,7 @@ var vm = new Vue({
       // instance 为对应的 SwipeCell 实例
       var position = e.position
       var instance = e.instance
-      var index = e.name
+      var index = e.name // item.groupIndex-item.keyIndex
 
       switch (position) {
         case 'left': {
@@ -339,6 +367,19 @@ var vm = new Vue({
         }
       }
     },
+    getGroupFromIndex: function (gIndex, kIndex) {
+      var groupItem = {}
+      this.filter.keywordsList.some(function (item) {
+        if (item) {
+          var gotThis = item.groupIndex == gIndex && item.keyIndex == kIndex
+          if (gotThis) {
+            groupItem = item
+          }
+          return gotThis
+        }
+      })
+      return groupItem
+    },
     /**
      * 删除单个关键词
      * @param {number} index 当前关键词在列表中的index
@@ -347,7 +388,11 @@ var vm = new Vue({
     delThisKey: function (index, instance) {
       var _this = this
       // 需要找到当前关键词组的item
-      var key = this.filter.keywordsList[index]
+      var indexArr = index.split('-')
+      var gIndex = indexArr[0]
+      var kIndex = indexArr[1]
+      var key = this.getGroupFromIndex(gIndex, kIndex)
+
       this.showDialog({
         title: '',
         message: '确定删除当前关键词?',
@@ -364,9 +409,9 @@ var vm = new Vue({
     // 根据分类名,得到分类索引
     getGroupIndexWithGroupName: function (gn) {
       var groupIndex = -1
-      this.keywordsGroupList.forEach(function(item, index) {
+      this.keywordsGroupList.forEach(function(item) {
         if (gn === item.s_item) {
-          groupIndex = index
+          groupIndex = item.groupIndex
         }
       })
       return groupIndex
@@ -382,10 +427,10 @@ var vm = new Vue({
       }
 
       var queryString = this.qsStringify(query)
-      location.href = '/jyapp/vipsubscribe/toSetInfoPage' + '?' + queryString
+      location.href = '/jyapp/vipsubscribe/toSetinfoPage' + '?' + queryString
     },
     toKeyManagePage: function () {
-      location.href = '/jyapp/vipsubscribe/toSetManagePage'
+      location.href = '/jyapp/vipsubscribe/toSetmanagePage'
     },
     fastImportDialogShow: function () {
       this.dialog.fastImport = true

+ 18 - 10
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyword-info.js

@@ -192,31 +192,39 @@ var vm = new Vue({
     // 向关键词中添加一些信息
     addInfoToKeyItem: function (groupList) {
       if (!Array.isArray(groupList)) return []
+      var arr = []
 
       groupList.forEach(function (keywordsList, index) {
-        if (Array.isArray(keywordsList.a_key)) {
+        if (keywordsList && keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
           keywordsList.a_key.forEach(function (keyword, iindex) {
             // 添加一些其他信息
             keyword.groupName = keywordsList.s_item // 分类名
             keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
             keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
           })
+          arr.push(keywordsList)
         }
       })
 
-      return groupList
+      return arr
     },
     getGroupNameList: function (keywordsGroupList) {
       var groupNameList = []
       if (!Array.isArray(keywordsGroupList)) return groupNameList
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          checked: false,
-          count: count, // 分类下有多少个关键词
-          gIndex: index
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            checked: false,
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex
+          })
+        }
       })
       return groupNameList
     },

+ 76 - 18
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/keyword-manage.js

@@ -4,6 +4,7 @@ var vm = new Vue({
   data: {
     batchDeleteState: false, // 是否在批量删除状态
     userData: {}, // getUserInfo接口用户原始数据
+    keywordsGroupList: [],
     groupNameList: [],
     listState: {
       loaded: false
@@ -16,6 +17,11 @@ var vm = new Vue({
     },
   },
   computed: {
+    groupNameListSorted: function () {
+      return this.groupNameList.sort(function (a, b) {
+        return b.updatetime - a.updatetime
+      })
+    },
     listShow: function () {
       return this.groupNameList.length !== 0 && this.listState.loaded
     },
@@ -85,10 +91,10 @@ var vm = new Vue({
             _this.userData = res.userData
             if (res.userData && res.userData.o_vipjy) {
               // 整理数据
-              var list = _this.getGroupNameList(res.userData.o_vipjy.a_items)
-              if (Array.isArray(list)) {
-                _this.groupNameList = list
-              }
+              var groupList = _this.addInfoToKeyItem(res.userData.o_vipjy.a_items)
+              var groupNameList = _this.getGroupNameList(groupList)
+              _this.keywordsGroupList = groupList
+              _this.groupNameList = groupNameList
             }
           }
         },
@@ -102,20 +108,59 @@ var vm = new Vue({
         }
       })
     },
+    // 向关键词中添加一些信息
+    addInfoToKeyItem: function (groupList) {
+      var _this = this
+      if (!Array.isArray(groupList)) return []
+      var arr = []
+
+      groupList.forEach(function (keywordsList, index) {
+        if (keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
+          keywordsList.updatetime = _this.getMaxUpdateTime(keywordsList.a_key)
+          keywordsList.a_key.forEach(function (keyword, iindex) {
+            // 添加一些其他信息
+            keyword.groupName = keywordsList.s_item // 分类名
+            keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
+            keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
+          })
+          arr.push(keywordsList)
+        }
+      })
+
+      return arr
+    },
     getGroupNameList: function (keywordsGroupList) {
       if (!Array.isArray(keywordsGroupList)) return
       var groupNameList = []
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          checked: false,
-          deleteDisabled: count > 0, // 该分类是否能被删除
-          count: count // 分类下有多少个关键词
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            checked: false,
+            deleteDisabled: count > 0, // 该分类是否能被删除
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex,
+            updatetime: item.updatetime
+          })
+        }
       })
       return groupNameList
     },
+    getMaxUpdateTime: function (arr) {
+      var max = 0
+      if (!Array.isArray(arr)) return max
+      arr.some(function (item) {
+        if (item.updatetime && item.updatetime > max) {
+          max = item.updatetime
+        }
+      })
+      return max
+    },
     // 通过已有分类得到一个未分类名
     getNewClassName: function () {
       var conf = {
@@ -162,9 +207,9 @@ var vm = new Vue({
     },
     getSelectIndexArr: function () {
       var selectedIndexArr = []
-      this.groupNameList.forEach(function (item, index) {
+      this.groupNameList.forEach(function (item) {
         if (!item.deleteDisabled && item.checked) {
-          selectedIndexArr.push(index)
+          selectedIndexArr.push(item.groupIndex)
         }
       })
       return selectedIndexArr
@@ -214,7 +259,7 @@ var vm = new Vue({
         }
       })
     },
-    clickKeyCard: function (item, index) {
+    clickKeyCard: function (item) {
       if (this.batchDeleteState) {
         // 执行点击选中逻辑
         // 如果关键词组下有关键词,则不能点击
@@ -223,7 +268,7 @@ var vm = new Vue({
         }
       } else {
         // 显示修改关键词组名弹框
-        this.editGroupName('edit', item, index)
+        this.editGroupName('edit', item, item.groupIndex)
       }
     },
     beforeKeySwipeCellClose: function (e) {
@@ -231,7 +276,7 @@ var vm = new Vue({
       // instance 为对应的 SwipeCell 实例
       var position = e.position
       var instance = e.instance
-      var index = e.name
+      var index = e.name // item.groupIndex
 
       switch (position) {
         case 'left': {
@@ -254,6 +299,19 @@ var vm = new Vue({
         }
       }
     },
+    getGroupFromIndex: function (idx) {
+      var groupItem = {}
+      this.groupNameList.some(function (item) {
+        if (item) {
+          var gotThis = item.groupIndex == idx
+          if (gotThis) {
+            groupItem = item
+          }
+          return gotThis
+        }
+      })
+      return groupItem
+    },
     /**
      * 删除单个分类
      * @param {number} index 当前关键词在当前分组的index
@@ -262,7 +320,7 @@ var vm = new Vue({
     delThisKey: function (index, instance) {
       var _this = this
       // 需要找到当前分类的item
-      var group = this.groupNameList[index]
+      var group = this.getGroupFromIndex(index)
       this.showDialog({
         title: '',
         message: '确定删除当前分类?',

+ 22 - 1
src/jfw/modules/app/src/web/templates/big-member/page_buy_commit.html

@@ -465,6 +465,7 @@
                     level = 1
                 }
                 var paramsMid = utils.getParam('mid') //引流语文案id
+                var buyerId = utils.getParam('bid') //采购单位画像跳转携带的参数
                 $.ajax({
                     type:'POST',
                     url:'/jypay/bigmember/createOrder',
@@ -494,9 +495,29 @@
                                 console.log(error)
                               }
                             }
+                            // 采购单位画像跳转过来的埋点
+                            if (buyerId) {
+                              var params = {
+                                mold: 'isOBT',
+                                price: Number(_this.afterall.replace(',', ''))*100,
+                                orderCode: res.data.order_code
+                              }
+                              $.ajax({
+                                type: 'POST',
+                                url: '/publicapply/drainage/buyerunit',
+                                contentType: "application/json",
+                                data: JSON.stringify(params),
+                                success: function (res) {
+                                  console.log(res)
+                                },
+                                error: function (error) {
+                                  console.log(error)
+                                }
+                              })
+                            }
                             setTimeout(function() {
                               history.replaceState({}, '', '/jyapp/big/page/orderdetail_member?order_code=' + res.data.order_code);
-                            location.href = '/jyapp/pay/checkout_member?orderCode='+res.data.order_code+'&from=buy&mid=' + paramsMid;
+                            location.href = '/jyapp/pay/checkout_member?orderCode='+res.data.order_code+'&from=buy&mid=' + paramsMid + '&bid=' + buyerId;
                             }, 300)
                         }else {
                             alert(res.error_msg)

+ 75 - 4
src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html

@@ -40,6 +40,27 @@
             z-index: 999;
             min-height: 284px;
         }
+        .vip_component{
+          position: relative;
+          margin-top: -1px;
+        }
+        .example-title{
+          position: absolute;
+          top:.32rem;
+          left:0.32rem;
+          font-size: .36rem;
+        }
+        .d_title{
+          font-weight: normal;
+        }
+        .vip_openDialog{
+            padding: 0.56rem 0 0.64rem;
+            width: 6.06rem;
+            /* height: 6.88rem; */
+            background: url('{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/openVip.png') no-repeat;
+            background-size: 100% 100%;
+            box-sizing: border-box;
+        }
     </style>
 </head>
 <body>
@@ -85,10 +106,6 @@
                 <div class="j-img img-empty empty-img"></div>
                 <p class="empty-text">暂无画像信息</p>
             </div>
-            <!-- 历史项目联系人 -->
-            <div class="history-list">
-                <hispro-component type="buyer" :buyer="buyer.name"></hispro-component>
-            </div>
             <!-- 招标动态 -->
             <div class="dynamic" v-if="isShow.showDynamic">
                 <div class="d_title">招标动态</div>
@@ -111,6 +128,14 @@
                     </div>
                 </div>
             </div>
+            <!-- 历史项目联系人 -->
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/01-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">历史项目联系方式</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_1" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/01.png'></buyer-example>
+            </div>
+            <div v-else>
+              <hispro-component class="history-list" type="buyer" :buyer="buyer.name"></hispro-component>
+            </div>
             <!-- 年度项目统计 -->
             <div class="years" v-if="isShow.showYearData">
                 <div class="chart_title">年度项目统计</div>
@@ -126,6 +151,10 @@
                 </ve-histogram>
                 <div class="bar-tip">注:项目金额指所有项目的中标金额之和,少数缺失的中标金额,用项目预算补充。</div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/02-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">年度项目统计</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_2" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/02.png'></buyer-example>
+            </div>
             <!-- 月度采购规模统计 -->
             <div class="month-scale" v-if="isShow.showMonthScale">
                 <div class="chart_title">月度采购规模统计</div>
@@ -135,6 +164,10 @@
                 </div>
                 <div class="bar-tip">注:采购规模指中标金额,少数缺失的中标金额,用项目预算补充。</div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/03-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">月度采购规模统计</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_3" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/03.png'></buyer-example>
+            </div>
             <!-- 采购规模分布 -->
             <div class="scale-distribute" v-if="isShow.showScaleFb">
                 <div class="chart_title">采购规模分布</div>
@@ -143,6 +176,10 @@
                 </div>
                 <div class="bar-tip">注:平均节支率=(全部项目预算-全部中标金额)/全部项目预算,是指价格减让部分与原价的比率,仅统计预算和中标金额同时存在的项目。</div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/04-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">采购规模分布</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_4" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/04.png'></buyer-example>
+            </div>
             <!-- 各类招标方式占比(双柱图) -->
             <div class="double-bar" v-if="isShow.showBidType">
                 <div class="chart_title">各类招标方式占比</div>
@@ -193,6 +230,10 @@
                     </div>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:8.8rem;background:url('/common-module/collection/image/buyer/05-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">各类招标方式占比</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_5" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/05.png'></buyer-example>
+            </div>
             <!-- 各行业项目平均节支率 -->
             <div class="savings-rate" v-if="isShow.showSaveRate">
                 <div class="chart_title">各行业项目平均节支率</div>
@@ -200,6 +241,10 @@
                     <ve-line :init-options="initRendererSvg" :data="savingsRateData" height="314px" :after-config="savingsRateConfig" :extend="chartOptions.lineChart"></ve-line>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/06-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">各行业项目平均节支率</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_6" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/06.png'></buyer-example>
+            </div>
             <!-- 各行业项目规模占比 -->
             <div class="industry-scale-rate" v-if="isShow.showScaleRate">
                 <p class="chart_title">各行业项目规模占比</p>
@@ -207,6 +252,10 @@
                     <div ref="pieChart" style="height: 360px;"></div>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:11.2rem;background:url('/common-module/collection/image/buyer/07-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">各行业项目规模占比</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_7" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/07.png'></buyer-example>
+            </div>
             <!-- 重点合作企业 -->
             <div class="client" v-if="computedClientList && computedClientList.length> 0">
                 <div class="client-title">重点合作企业</div>
@@ -235,6 +284,10 @@
                     </div>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/08-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">重点合作企业</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_8" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/08.png'></buyer-example>
+            </div>
             <!-- 合作企业注册资本分布 -->
             <div class="industry-scale-rate" v-if="isShow.showCapital">
                 <p class="chart_title">合作企业注册资本分布</p>
@@ -242,6 +295,10 @@
                     <ve-histogram :init-options="initRendererSvg" height="284px" set-option-opts :data="regCapitalData" :after-config="regCapConfig" :settings="regCapSettings" :extend="chartOptions.barLineChart.chartExtend"> </ve-histogram>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/09-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">合作企业注册资本分布</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_9" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/09.png'></buyer-example>
+            </div>
             <!-- 合作企业年龄分布 -->
             <div class="industry-scale-rate" v-if="isShow.showAge">
                 <p class="chart_title">合作企业年龄分布</p>
@@ -249,6 +306,10 @@
                     <ve-histogram :init-options="initRendererSvg" height="284px" :data="workingAgeData" :after-config="workingAgeConfig" :extend="chartOptions.barLineChart.chartExtend"> </ve-histogram>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/10-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">合作企业年龄分布</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_10" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/10.png'></buyer-example>
+            </div>
             <!-- 合作企业注册地分布 -->
             <div class="industry-scale-rate" v-if="isShow.showArea">
                 <p class="chart_title">合作企业注册地分布</p>
@@ -263,6 +324,10 @@
                     </ve-map>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/11-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">合作企业注册地分布</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_11" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/11.png'></buyer-example>
+            </div>
             <!-- 重点合作代理机构 -->
             <div class="agency" v-if="isShow.showAgency">
                 <div class="agency-title">重点合作代理机构</div>
@@ -286,6 +351,10 @@
                     </div>
                 </div>
             </div>
+            <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/12-bg.png') no-repeat;background-size:100% 100%">
+              <p class="example-title">重点合作代理机构</p>
+              <buyer-example :status="bigStatus" :power="power" type="item_12" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/12.png'></buyer-example>
+            </div>
         </div>
     </div>
 </div>
@@ -307,7 +376,9 @@
 {{include "/big-member/commonjs.html"}}
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/echarts_option.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/chart_options.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/buyer-example.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/baiducc.html"}}
 </body>

+ 23 - 1
src/jfw/modules/app/src/web/templates/commonPay/checkout.html

@@ -309,7 +309,7 @@
                                     iconHide: true,
                                     duration: 1500,
                                     callback: function () {
-                                      // 支付成功 判断有没有引流语id,有 需要埋点
+                                      // 三级页引流过来的埋点
                                       if (checkout.getUrlParam('mid')) {
                                         try {
                                           $.ajax({
@@ -325,6 +325,28 @@
                                         } catch (error) {
                                           console.log(error)
                                         }
+                                      }
+                                      // 采购单位画像引流过来的埋点
+                                      if (checkout.getUrlParam('bid')) {
+                                        try {
+                                          var params = {
+                                            mold: 'isPaid'
+                                          }
+                                          $.ajax({
+                                            type: 'POST',
+                                            url: '/publicapply/drainage/buyerunit',
+                                            contentType: "application/json",
+                                            data: JSON.stringify(params),
+                                            success: function (res) {
+                                              console.log(res)
+                                            },
+                                            error: function (error) {
+                                              console.log(error)
+                                            }
+                                          })
+                                        } catch (error) {
+                                          console.log(error)
+                                        }
                                       }
                                        var  bigmemberBid=checkout.getUrlParam("b");
                                         var href="/jyapp/{{.T.doType}}/paySuccess?orderCode=" + res.orderCode + "&email=" + res.email + "&payTime=" + res.payTime + "&pay_way=" + res.pay_way + "&price=" + res.price + "&t={{.T.t}}"

+ 35 - 2
src/jfw/modules/app/src/web/templates/staticpage/privacy_rules.html

@@ -72,7 +72,7 @@
                 <div class="col-md-12">
                     <h3 class="title">剑鱼标讯隐私政策</h3>
                     <p style="font-size: 18px;text-align: center;">引言</p>
-                    <p style="text-indent: 20px;">剑鱼标讯(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
+                    <p style="text-indent: 20px;"><span  id="companyName">北京剑鱼信息技术有限公司</span>(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务(“剑鱼标讯”)时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
                     </p>
                     <p style="text-indent: 20px;">一、我们如何收集和使用您的个人信息</p>
                     <p style="text-indent: 20px;">二、我们如何使用 Cookies 和同类技术</p>
@@ -102,8 +102,9 @@
                     <p style="text-indent: 20px;">我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、微信号,拟使用的用户名和密码,用于创建账号。</p>
                     <p style="font-size: 14px;">2、服务信息展示</p>
                     <p style="text-indent: 20px;">在您使用剑鱼标讯服务过程中,为识别账号异常状态、了解产品适配性、向您提供更契合您需求的页面展示和搜索结果,我们可能会自动收集您的使用情况并存储为网络日志信息,包括:</p>
-                    <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
+                    <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、MAC地址、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
                     <p>服务日志信息:当您使用剑鱼标讯服务时,我们会自动收集您对我们服务的详细使用情况,作为服务日志保存,包括浏览、搜索查询、招标订阅、关注企业、关注项目、发票信息、企业服务订单记录、以及IP地址、浏览器类型、访问日期和时间。</p>
+                    <p style="text-indent: 20px; ">为了优化产品的使用体验,我们需要收集应用在后台状态下的用户MAC地址信息,用于获取用户的手机网络信息,检查手机网络是否通畅,以解答用户在使用产品过程中遇到的各种操作问题。</p>
                     <p style="text-indent: 20px;">请注意,单独的设备信息、服务日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将这类信息进行匿名处理。</p>
                     <p style="text-indent: 20px;">为给您提供定制化的服务,我们将通过使用您的订阅、关注设置,向您推送您所需要信息。如您不接受定向推送功能,您可以直接在“我的-设置”功能页面中关闭“推送消息设置”按钮。</p>
                     <p style="font-size: 14px;">3、帮您提交及管理订单</p>
@@ -229,6 +230,30 @@
                     <p>我们设立了个人信息保护专职部门,剑鱼标讯客服会将您的需求向其转达。</p>
                     <p>剑鱼标讯客服邮箱:jy@topnet.net.cn</p>
                     <br>
+                    <p style="font-size: 18px;">附录:关于第三方软件开发工具包(SDK)的使用说明</p>
+                    <p>我们仅会出于合法、正当、必要、特定、明确的目的获取您的信息,并将审慎评估对于第三方软件开发工具包(SDK)的使用,同时对于这些第三方软件开发工具包(SDK)的安全保障能力进行综合评估,尽最大可能保护数据安全,因第三方会动态修改权限获取,我们会尽可能同步并告知您。</p>
+                    <p>(1)百度地图</p>
+                    <p style="text-indent: 20px;">SDK用途:获取用户的位置信息(城市),根据地域提供更精准的服务。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息,位置权限</p>
+                    <p>(2)小米</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向小米手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(3)华为</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向华为手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(4)友盟</p>
+                    <p style="text-indent: 20px;">SDK用途:用于平台信息统计,推送应用优惠活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(5)腾讯开放平台</p>
+                    <p style="text-indent: 20px;">SDK用途:用于人脸识别,用户进行实名认证。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(6)OPPO</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向OPPO手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(7)支付宝</p>
+                    <p style="text-indent: 20px;">SDK用途:用于调用支付宝实名认证信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <br>
                     <p style="font-size: 18px;">附件:《剑鱼标讯账户注销须知》</p>
                     <p>亲爱的剑鱼标讯用户:</p>
                     <p style="text-indent: 20px;">您在申请注销流程中点击同意前,应当认真阅读《剑鱼标讯账户注销须知》(以下称“《注销须知》”)。</p>
@@ -254,6 +279,14 @@
         </div>
     </div>
 </div>
+<script>
+    var isIos = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
+    var defaultCompanyName = '北京拓普丰联信息工程有限公司'
+    if (isIos) {
+        defaultCompanyName = '北京剑鱼信息技术有限公司'
+    }
+    document.getElementById('companyName').innerText = defaultCompanyName
+</script>
 <!-- main END -->
 <!-- footer -->
 

+ 36 - 3
src/jfw/modules/app/src/web/templates/staticpage/privacy_rules_client.html

@@ -59,13 +59,13 @@
 
 <body>
 <!-- main  START -->
-<div style="padding-bottom: 88px;background-color: #fff;">
+<div style="padding-bottom: 88px;background-color: #fff;padding-top: 10px;">
     <div class="container">
         <div class="row">
             <div class="col-md-12">
                 <h3 class="title">剑鱼标讯隐私政策</h3>
                 <p style="font-size: 18px;text-align: center;">引言</p>
-                <p style="text-indent: 20px;">剑鱼标讯(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
+                <p style="text-indent: 20px;"><span  id="companyName">北京剑鱼信息技术有限公司</span>(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务(“剑鱼标讯”)时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
                 </p>
                 <p style="text-indent: 20px;">一、我们如何收集和使用您的个人信息</p>
                 <p style="text-indent: 20px;">二、我们如何使用 Cookies 和同类技术</p>
@@ -95,8 +95,9 @@
                 <p style="text-indent: 20px;">我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、微信号,拟使用的用户名和密码,用于创建账号。</p>
                 <p style="font-size: 14px;">2、服务信息展示</p>
                 <p style="text-indent: 20px;">在您使用剑鱼标讯服务过程中,为识别账号异常状态、了解产品适配性、向您提供更契合您需求的页面展示和搜索结果,我们可能会自动收集您的使用情况并存储为网络日志信息,包括:</p>
-                <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
+                <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、MAC地址、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
                 <p>服务日志信息:当您使用剑鱼标讯服务时,我们会自动收集您对我们服务的详细使用情况,作为服务日志保存,包括浏览、搜索查询、招标订阅、关注企业、关注项目、发票信息、企业服务订单记录、以及IP地址、浏览器类型、访问日期和时间。</p>
+                <p style="text-indent: 20px; ">为了优化产品的使用体验,我们需要收集应用在后台状态下的用户MAC地址信息,用于获取用户的手机网络信息,检查手机网络是否通畅,以解答用户在使用产品过程中遇到的各种操作问题。</p>
                 <p style="text-indent: 20px;">请注意,单独的设备信息、服务日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将这类信息进行匿名处理。</p>
                 <p style="text-indent: 20px;">为给您提供定制化的服务,我们将通过使用您的订阅、关注设置,向您推送您所需要信息。如您不接受定向推送功能,您可以直接在“我的-设置”功能页面中关闭“推送消息设置”按钮。</p>
                 <p style="font-size: 14px;">3、帮您提交及管理订单</p>
@@ -222,6 +223,30 @@
                 <p>我们设立了个人信息保护专职部门,剑鱼标讯客服会将您的需求向其转达。</p>
                 <p>剑鱼标讯客服邮箱:jy@topnet.net.cn</p>
                 <br>
+                <p style="font-size: 18px;">附录:关于第三方软件开发工具包(SDK)的使用说明</p>
+                <p>我们仅会出于合法、正当、必要、特定、明确的目的获取您的信息,并将审慎评估对于第三方软件开发工具包(SDK)的使用,同时对于这些第三方软件开发工具包(SDK)的安全保障能力进行综合评估,尽最大可能保护数据安全,因第三方会动态修改权限获取,我们会尽可能同步并告知您。</p>
+                <p>(1)百度地图</p>
+                <p style="text-indent: 20px;">SDK用途:获取用户的位置信息(城市),根据地域提供更精准的服务。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息,位置权限</p>
+                <p>(2)小米</p>
+                <p style="text-indent: 20px;">SDK用途:用于向小米手机用户推送产品资讯和活动信息。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <p>(3)华为</p>
+                <p style="text-indent: 20px;">SDK用途:用于向华为手机用户推送产品资讯和活动信息。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <p>(4)友盟</p>
+                <p style="text-indent: 20px;">SDK用途:用于平台信息统计,推送应用优惠活动信息。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <p>(5)腾讯开放平台</p>
+                <p style="text-indent: 20px;">SDK用途:用于人脸识别,用户进行实名认证。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <p>(6)OPPO</p>
+                <p style="text-indent: 20px;">SDK用途:用于向OPPO手机用户推送产品资讯和活动信息。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <p>(7)支付宝</p>
+                <p style="text-indent: 20px;">SDK用途:用于调用支付宝实名认证信息。</p>
+                <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                <br>
                 <p style="font-size: 18px;">附件:《剑鱼标讯账户注销须知》</p>
                 <p>亲爱的剑鱼标讯用户:</p>
                 <p style="text-indent: 20px;">您在申请注销流程中点击同意前,应当认真阅读《剑鱼标讯账户注销须知》(以下称“《注销须知》”)。</p>
@@ -247,6 +272,14 @@
         </div>
     </div>
 </div>
+<script>
+    var isIos = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
+    var defaultCompanyName = '北京拓普丰联信息工程有限公司'
+    if (isIos) {
+        defaultCompanyName = '北京剑鱼信息技术有限公司'
+    }
+    document.getElementById('companyName').innerText = defaultCompanyName
+</script>
 <!-- main END -->
 <!-- footer -->
 

+ 1 - 0
src/jfw/modules/app/src/web/templates/vipsubscribe/infoWord.html

@@ -7,6 +7,7 @@
     <meta name="apple-mobile-web-app-capable" content="yes">
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <title>订阅关键词</title>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js'></script>
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/base.css?v={{Msg "seo" "version"}}' />

+ 3 - 2
src/jfw/modules/app/src/web/templates/vipsubscribe/keyWord.html

@@ -7,6 +7,7 @@
     <meta name="apple-mobile-web-app-capable" content="yes" />
     <meta name="apple-mobile-web-app-status-bar-style" content="black" />
     <title>关键词</title>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js'></script>
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/base.css?v={{Msg "seo" "version"}}' />
@@ -52,7 +53,7 @@
             <div class="keyword-list" v-show="listShow">
                 <div
                     class="keywords-item"
-                    v-for="(item,index) in filter.keywordsList"
+                    v-for="(item,index) in keyListSorted"
                     :key="index">
                     <div class="checkbox-container" :class="{ w0: !batchDeleteState }">
                         <van-checkbox
@@ -62,7 +63,7 @@
                         </van-checkbox>
                     </div>
                     <van-swipe-cell
-                        :name="index"
+                        :name="item.groupIndex + '-' + item.keyIndex"
                         :disabled="batchDeleteState"
                         :before-close="beforeKeySwipeCellClose">
                         <div class="j-key-card" @click="clickKeyCard(item)">

+ 4 - 3
src/jfw/modules/app/src/web/templates/vipsubscribe/manageWord.html

@@ -4,6 +4,7 @@
 <head>
     {{include "/common/meta.html"}}
     <title>关键词分类管理</title>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js'></script>
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/base.css?v={{Msg "seo" "version"}}' />
@@ -73,7 +74,7 @@
                     <!-- 分类名称卡片 -->
                     <div
                         class="keywords-item"
-                        v-for="(item,index) in groupNameList"
+                        v-for="(item,index) in groupNameListSorted"
                         :key="index">
                         <div class="checkbox-container" :class="{ w0: !batchDeleteState }">
                             <van-checkbox
@@ -84,10 +85,10 @@
                             </van-checkbox>
                         </div>
                         <van-swipe-cell
-                            :name="index"
+                            :name="item.groupIndex"
                             :disabled="item.deleteDisabled || batchDeleteState"
                             :before-close="beforeKeySwipeCellClose">
-                            <div class="j-key-card" @click="clickKeyCard(item, index)">
+                            <div class="j-key-card" @click="clickKeyCard(item)">
                                 <div class="j-key-card-left">${ item.name }</div>
                                 <div class="j-key-card-right">
                                     <span class="text">${ item.count }组关键词</span>

+ 10 - 6
src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html

@@ -1490,12 +1490,16 @@
                 anchor: '采购单位全景分析',
                 landname: rerbuyer
             }
-            if(bigstatus <= 0 || hasServiceArr.indexOf(5) == -1){
-                location.href = '/jyapp/big/page/landingPage'
-                sessionStorage.setItem('landinfo',JSON.stringify(landinfo))
-            }else {
-                location.href = "/jyapp/big/page/unit_portrayal?entName="+encodeURIComponent(rerbuyer)
-            }
+            /*
+              if(bigstatus <= 0 || hasServiceArr.indexOf(5) == -1){
+                  location.href = '/jyapp/big/page/landingPage'
+                  sessionStorage.setItem('landinfo',JSON.stringify(landinfo))
+              }else {
+                  location.href = "/jyapp/big/page/unit_portrayal?entName="+encodeURIComponent(rerbuyer)
+              }
+            */
+            //  大会员用户、非大会员用户都可跳转采购单位画像
+            location.href = "/jyapp/big/page/unit_portrayal?entName="+encodeURIComponent(rerbuyer)
         }
 
       })

+ 18 - 17
src/jfw/modules/bigmember/src/entity/portrait.go

@@ -20,22 +20,22 @@ const (
 )
 
 //大会员
-func CreatePortraitManager(userid string, pageFlag string) (*Portrait, error) {
+func CreatePortraitManager(userid string, pageFlag string) (*Portrait, bool, error) {
 	if userid == "" {
-		return nil, errors.New("未登录")
+		return nil, false, errors.New("未登录")
 	}
 	bigMsg := jy.GetBigVipUserBaseMsg(userid, db.Mysql, db.Mgo)
 
 	if pageFlag == "" {
-		return nil, errors.New("未知请求")
+		return nil, false, errors.New("未知请求")
 	}
 	if pageFlag != "entDetail" { ////企业基本信息接口 无权限控制
 		if bigMsg.Status <= 0 || !bigMsg.CheckBigVipBackPower(pageFlag) {
-			return nil, errors.New("非法请求")
+			return &Portrait{userid}, false, nil
 		}
 	}
 	uid := qutil.If(bigMsg.Pid == "", userid, bigMsg.Pid).(string) //若为子账号则显示主账号行业信息
-	return &Portrait{uid}, nil
+	return &Portrait{uid}, true, nil
 }
 
 //超级订阅
@@ -183,14 +183,14 @@ func (this *Portrait) WinnerPortraitData(entId string) (map[string]interface{},
 }
 
 //采购单位画像-查询最新项目动态
-func (this *Portrait) GetBuyerNewMsg(buyer string, start, limit int) ([]map[string]interface{}, error) {
+func (this *Portrait) GetBuyerNewMsg(buyer string, start, limit int, hasPower bool) ([]map[string]interface{}, error) {
 	if buyer == "" {
 		return nil, errors.New("企业名称异常")
 	}
 	if start > PortraitNewMegsLimit || start+limit > PortraitNewMegsLimit {
 		return nil, errors.New("超出检索限制")
 	}
-	return GetBuyerNewProject(buyer, start, limit), nil
+	return GetBuyerNewProject(buyer, start, limit, hasPower), nil
 }
 
 //采购单位画像
@@ -218,7 +218,7 @@ func (this *Portrait) GetBuyerNewCount(buyer string) int64 {
 //a段数据=timeRange、city、province、buyerclass、bidamount_count、fail_count、project_count、winner_count、otherProvincesWinnerCount、yearData、monthData、moneyRange、bidtypeData、rate、top12、topAgencyData
 //b段数据=topShow
 //c段数据=withCapitalData、withAreaData、withEstablishData
-func (this *Portrait) BuyerPortraitData(buyer string, flag string) (map[string]interface{}, error) {
+func (this *Portrait) BuyerPortraitData(buyer string, flag string, hasPower bool) (map[string]interface{}, error) {
 	if buyer == "" {
 		return nil, errors.New("企业名称异常")
 	}
@@ -226,16 +226,17 @@ func (this *Portrait) BuyerPortraitData(buyer string, flag string) (map[string]i
 	if !(flag == "a" || flag == "b" || flag == "c" || flag == "") {
 		return nil, errors.New("参数异常")
 	}
-
-	//buyerPortraitData := TryFunc(GetPortraitCache, buyer, "buyer", 2)
-	//buyerPortraitData, err := GetBuyerPortraitData(buyer)
-	//if err != nil {
-	//	return nil, err
-	//}
-	//
-
+	if !hasPower { //免费返回字段
+		if buyerPortraitAllData := TryFunc(GetPortraitCacheByStep, buyer, fmt.Sprintf("buyer"), 2); buyerPortraitAllData != nil {
+			freeReturnMap := map[string]interface{}{}
+			for _, key := range []string{"timeRange", "city", "province", "buyerclass", "fail_count", "project_count", "winner_count", "otherProvincesWinnerCount"} {
+				freeReturnMap[key] = buyerPortraitAllData[key]
+			}
+			return freeReturnMap, nil
+		}
+		return nil, nil
+	}
 	buyerPortraitData := TryFunc(GetPortraitCacheByStep, buyer, fmt.Sprintf("buyer_%s", flag), 2)
-
 	if flag == "" || flag == "b" { //只有查询全部或者查询b分布画像时,返回内容有重点合作企业
 		if buyerPortraitData != nil {
 			//重点合作企业 展示读者行业

+ 1 - 1
src/jfw/modules/bigmember/src/entity/portraitBuyerSearch.go

@@ -25,7 +25,7 @@ const (
 )
 
 //采购单位最新中标动态查询
-func GetBuyerNewProject(buyer string, start, size int) []map[string]interface{} {
+func GetBuyerNewProject(buyer string, start, size int, hasPower bool) []map[string]interface{} {
 	defer qutil.Catch()
 	res := elastic.GetPage("projectset", "projectset", `{"TERM_buyer":"`+buyer+`"}`, `{"firsttime":-1}`, buyerNewProjectSearchFields, start, size)
 	if res == nil || len(*res) == 0 {

+ 23 - 11
src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go

@@ -3,6 +3,7 @@ package portrait
 import (
 	. "api"
 	"entity"
+	"fmt"
 	"github.com/go-xweb/xweb"
 	"log"
 	qutil "qfw/util"
@@ -27,7 +28,7 @@ type EntPortrait struct {
 func (this *EntPortrait) EntDetail() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "entDetail")
+		cepm, _, err := entity.CreatePortraitManager(userId, "entDetail")
 		if err != nil {
 			return nil, err
 		}
@@ -36,7 +37,6 @@ func (this *EntPortrait) EntDetail() {
 		if err != nil {
 			return nil, err
 		}
-		//entInfo["showEntChange"] = jy.GetBigVipUserBaseMsg(userid, db.Mysql, db.Mgo)//xxxxxxx
 		return entInfo, nil
 	}()
 	if errMsg != nil {
@@ -48,10 +48,13 @@ func (this *EntPortrait) EntDetail() {
 func (this *EntPortrait) WinnerContacts() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "entPortrait")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "entPortrait")
 		if err != nil {
 			return nil, err
 		}
+		if !hasPower {
+			return nil, fmt.Errorf("非法请求")
+		}
 		entId := util.DecodeId(this.GetString("entId"))
 		rData, err := cepm.GetWinnerContactsMsg(entId)
 		if err != nil {
@@ -71,10 +74,13 @@ func (this *EntPortrait) WinnerContacts() {
 func (this *EntPortrait) WinnerNewMsg() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "entNewMsg")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "entNewMsg")
 		if err != nil {
 			return nil, err
 		}
+		if !hasPower {
+			return nil, fmt.Errorf("非法请求")
+		}
 		entId := util.DecodeId(this.GetString("entId"))
 		count, _ := this.GetInt("count")
 
@@ -120,10 +126,13 @@ func (this *EntPortrait) WinnerNewMsg() {
 func (this *EntPortrait) WinnerPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "entPortrait")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "entPortrait")
 		if err != nil {
 			return nil, err
 		}
+		if !hasPower {
+			return nil, fmt.Errorf("非法请求")
+		}
 		entId := this.GetString("entId")
 		rData, err := cepm.WinnerPortraitData(util.DecodeId(entId))
 		if err != nil {
@@ -141,7 +150,7 @@ func (this *EntPortrait) WinnerPortrait() {
 func (this *EntPortrait) BuyerNewMsg() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "buyerPortrait")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "buyerPortrait")
 		if err != nil {
 			return nil, err
 		}
@@ -159,7 +168,7 @@ func (this *EntPortrait) BuyerNewMsg() {
 			start = (pageNum - 1) * limit
 		}
 
-		if pageSign := this.GetString("pageSign"); pageSign != "" { //more:4-23条;max:24-50条(移动端)
+		if pageSign := this.GetString("pageSign"); pageSign != "" && hasPower { //more:4-23条;max:24-50条(移动端)
 			if pageSign == "more" {
 				start = 3
 				limit = 20
@@ -169,7 +178,7 @@ func (this *EntPortrait) BuyerNewMsg() {
 			}
 		}
 
-		rData, err := cepm.GetBuyerNewMsg(buyer, start, limit)
+		rData, err := cepm.GetBuyerNewMsg(buyer, start, limit, hasPower)
 		if err != nil {
 			return nil, err
 		}
@@ -191,10 +200,13 @@ func (this *EntPortrait) BuyerNewMsg() {
 func (this *EntPortrait) BuyerContacts() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "buyerPortrait")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "buyerPortrait")
 		if err != nil {
 			return nil, err
 		}
+		if !hasPower {
+			return nil, fmt.Errorf("非法请求")
+		}
 		buyerName := this.GetString("buyer")
 		rData, err := cepm.GetBuyerContactsMsg(buyerName)
 		if err != nil {
@@ -214,13 +226,13 @@ func (this *EntPortrait) BuyerContacts() {
 func (this *EntPortrait) BuyerPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, err := entity.CreatePortraitManager(userId, "buyerPortrait")
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "buyerPortrait")
 		if err != nil {
 			return nil, err
 		}
 		entName := this.GetString("buyer")
 		flag := this.GetString("flag") //分段请求标识
-		rData, err := cepm.BuyerPortraitData(entName, flag)
+		rData, err := cepm.BuyerPortraitData(entName, flag, hasPower)
 		if err != nil {
 			return nil, err
 		}

+ 9 - 2
src/jfw/modules/bigmember/src/service/use/use.go

@@ -566,13 +566,20 @@ func (u *Use) IsAdd() {
 			return Result{Data: d}
 		}
 		//获取用户所在企业 : 如有多个企业,仅显示一个企业,显示顺序为:购买商机管理的企业>企业认证的企业>普通 企业,同一类型存在多个时,任意展示一个企业
-		res := db.Mysql.SelectBySql(`SELECT i.name,i.phone,i.status,i.auth_status FROM entniche_user u LEFT JOIN entniche_info i
+		res := db.Mysql.SelectBySql(`SELECT i.name,i.phone,i.status,i.auth_status,u.power FROM entniche_user u LEFT JOIN entniche_info i
 			ON u.ent_id=i.id
 			WHERE u.phone=? 
 			ORDER BY  i.status DESC,i.auth_status DESC, CASE WHEN i.phone=? THEN 0  ELSE 1 END  ASC`, phone, phone)
 		if res != nil && len(*res) > 0 {
 			entname := qu.ObjToString((*res)[0]["name"])
 			d["entname"] = entname
+			//已购买企业未过期-商机管理用户
+			for _, v := range *res {
+				if qu.IntAll(v["status"]) == 1 && qu.IntAll(v["power"]) == 1 {
+					d["entniche"] = true
+					break
+				}
+			}
 		}
 		return Result{Data: d}
 	}()
@@ -775,7 +782,7 @@ func MergeKeyWords(kw []map[string]interface{}) []map[string]interface{} {
 	key := map[string]interface{}{
 		"s_item": "未分类",
 	}
-	for k, v := range kw {
+	for _, v := range kw {
 		if v["a_key"] != nil {
 			for _, v := range qu.ObjArrToMapArr(v["a_key"].([]interface{})) {
 				matchway := qu.IntAllDef(v["matchway"], 0) //matchway 0:精准匹配 1:模糊匹配  订阅设置优化改

+ 1 - 1
src/jfw/modules/common/src/qfw/util/jy/bigVipPower.go

@@ -160,7 +160,7 @@ func GetBigVipUserBaseMsg(userId string, mysql *mysql.Mysql, mg MongodbSim) *Big
 
 //权限判断
 func (this *BigVipBaseMsg) CheckBigVipFrontPower(reqFlag string) (pass bool) {
-	if reqFlag == "ent_portrait" { //画像页面无权限控制
+	if reqFlag == "ent_portrait" || reqFlag == "unit_portrayal" { //画像页面无权限控制
 		return true
 	}
 	if this.Vip_BuySet.Upgrade == 1 {

+ 2 - 1
src/jfw/modules/publicapply/src/drainage/biddingtype.json

@@ -1,5 +1,6 @@
 {
 	"subtypecoll":"biddingtype",
 	"cwcollotion":"drainage_content_config",
-	"cwlogcoll":"drainage_content_log"
+	"cwlogcoll":"drainage_content_log",
+	"butlogcoll":"drainage_buyerunit_log"
 }

+ 58 - 0
src/jfw/modules/publicapply/src/drainage/entity/buyerunit.go

@@ -0,0 +1,58 @@
+package drainage
+
+import (
+	"db"
+	. "drainage/initjson"
+	"log"
+	"qfw/util"
+	"time"
+)
+
+//引流用户信息等
+type BuyerUnit struct {
+	UserId    string `json:"userId"`    //用户id
+	UserType  string `json:"userType"`  //用户类型0:普通;1:超级订阅;2:大会员;3:商机管理;(可以存在1,2)
+	Introduce string `json:"introduce"` //采购单位画像功能文案
+	Mold      string `json:"mold"`      //更新参数
+	Platform  string `json:"platform"`  //平台P:PC;W:微信;AA:APPAndroid;AI:APPIOS
+	Price     string `json:"price"`     //购买大会员价格
+	Id        string `json:"id"`        //日志id
+	OrderCode string `json:"orderCode"` //订单号
+}
+
+func SaveBuyerUnitInfo(BUT BuyerUnit) (string, bool) {
+	if BUT.Id == "" {
+		butInfo := map[string]interface{}{
+			"date":      time.Now().Unix(), //时间
+			"userId":    BUT.UserId,        //用户id
+			"isPaid":    0,                 //是否支付-4
+			"isOBT":     0,                 //是否下单-3
+			"price":     BUT.Price,         //实际支付价格-3
+			"isCBBT":    0,                 //点击去购买按钮-2
+			"introduce": BUT.Introduce,     //功能按钮文案-2
+			"userType":  BUT.UserType,      //用户类型0:普通;1:超级订阅;2:大会员;3:商机管理;(可以存在1,2)-1
+			"platform":  BUT.Platform,      //平台P:PC;W:微信;AA:APPAndroid;AI:APPIOS-1
+			"orderCode": "",                //订单号 3
+		}
+		if id := db.Mgo_Log.Save(BidType.Butlogcoll, butInfo); id != "" {
+			return util.SE2.EncodeString(id), true
+		}
+	} else {
+		id := util.SE2.DecodeString(BUT.Id)
+		set := map[string]interface{}{
+			BUT.Mold: 1,
+		}
+		switch BUT.Mold {
+		case "isCBBT":
+			set["introduce"] = BUT.Introduce
+		case "isOBT":
+			set["price"] = BUT.Price
+			set["orderCode"] = BUT.OrderCode
+		}
+		log.Println("set:", set)
+		return "", db.Mgo_Log.UpdateById(BidType.Butlogcoll, id, map[string]interface{}{
+			"$set": set,
+		})
+	}
+	return "", false
+}

+ 4 - 3
src/jfw/modules/publicapply/src/drainage/initjson/initjson.go

@@ -9,9 +9,10 @@ import (
 )
 
 type bidType struct {
-	Subtypecoll string `json:"subtypecoll"` //招标信息类型
-	Cwcollotion string `json:"cwcollotion"` //快照页引流文案库
-	Cwlogcoll   string `json:"cwlogcoll"`   //引流文案点击日志
+	Subtypecoll string `json:"subtypecoll"` //招标信息类型 mysql
+	Cwcollotion string `json:"cwcollotion"` //快照页引流文案库 mysql
+	Cwlogcoll   string `json:"cwlogcoll"`   //引流文案点击日志 mongo
+	Butlogcoll  string `json:"butlogcoll"`  //采购单位日志表 mongo
 }
 
 var BidType *bidType

+ 4 - 3
src/jfw/modules/publicapply/src/drainage/service/action.go

@@ -6,7 +6,8 @@ import (
 
 type DrainageStruct struct {
 	*xweb.Action
-	copywriting xweb.Mapper `xweb:"/drainage/copywriting"` //快照页引流文案和链接信息
-	behaviorLog xweb.Mapper `xweb:"/drainage/behaviorLog"` //快照页引流文案点击信息
-	bmbutinfo   xweb.Mapper `xweb:"/drainage/bmt/(.*)"`    //大会员介绍页购买按钮点击事件
+	copywriting  xweb.Mapper `xweb:"/drainage/copywriting"` //快照页引流文案和链接信息
+	behaviorLog  xweb.Mapper `xweb:"/drainage/behaviorLog"` //快照页引流文案点击信息
+	bmbutinfo    xweb.Mapper `xweb:"/drainage/bmt/(.*)"`    //大会员介绍页购买按钮点击事件
+	buyerUnitLog xweb.Mapper `xweb:"/drainage/buyerunit"`   //采购单位画像引流日志
 }

+ 34 - 0
src/jfw/modules/publicapply/src/drainage/service/buyerunit.go

@@ -0,0 +1,34 @@
+package service
+
+import (
+	. "api"
+	. "drainage/entity"
+	"encoding/json"
+	qu "qfw/util"
+)
+
+//
+func (this *DrainageStruct) BuyerUnitLog() {
+	defer qu.Catch()
+	r := func() Result {
+		if this.Method() != "POST" {
+			return Result{Data: nil, Error_msg: Error_msg_1005}
+		}
+		buyerUnit := new(BuyerUnit)
+		if string(this.Body()) == "" {
+			return Result{Data: nil, Error_msg: Error_msg_1003}
+		}
+		//接收参数
+		json.Unmarshal(this.Body(), &buyerUnit)
+		if (*buyerUnit).Id == "" && (*buyerUnit).Introduce == "" && (*buyerUnit).Platform == "" {
+			return Result{Data: nil, Error_msg: Error_msg_1002}
+		}
+		(*buyerUnit).UserId, _ = this.GetSession("userId").(string)
+		m, b := SaveBuyerUnitInfo(*buyerUnit)
+		return Result{Data: map[string]interface{}{
+			"id":     m,
+			"status": b,
+		}}
+	}()
+	this.ServeJson(r)
+}

+ 40 - 13
src/jfw/modules/subscribepay/src/service/afterPay.go

@@ -496,7 +496,7 @@ func (a *AfterPay) SetUserInfo() error {
 						_key["key"] = newKws
 						_key["appendkey"] = append(addtion_kws, _kws[1:]...)
 						_key["notkey"] = not_kws
-						_key["matchway"] = match_way
+						_key["matchway"] = match_way //matchway 0:精准匹配 1:模糊匹配
 						if kwscount != "0" {
 							if KeyWordsRepeat(_key, a_items) {
 								flag = false
@@ -509,7 +509,6 @@ func (a *AfterPay) SetUserInfo() error {
 								saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".notkey"] = not_kws
 								saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".matchway"] = match_way
 								saveData["o_vipjy.a_items."+classify_index+".a_key."+kws_index+".updatetime"] = time.Now().Unix()
-
 							}
 						} else {
 							//首次添加分类和关键词
@@ -547,16 +546,17 @@ func (a *AfterPay) SetUserInfo() error {
 					//没有关键词 批量删除/新增分类
 					if classify_name != "" {
 						if actionType == "SC" { //保存分类 无关键词
-							log.Println(sitemsArr, classify_name)
 							if isRepeat(append(sitemsArr, classify_name)) {
 								msg = "分类名称重复"
 							} else {
-								if classify_index == "" {
-									classify_index = strconv.Itoa(len(a_items)) //索引
-									saveData["o_vipjy.a_items."+classify_index+".a_key"] = []map[string]interface{}{}
+								c_lens := strconv.Itoa(len(a_items))
+								if ci, _ := strconv.Atoi(classify_index); ci < len(a_items)+1 {
+									if classify_index == "" || c_lens == classify_index { //新增
+										classify_index = strconv.Itoa(len(a_items)) //索引
+										saveData["o_vipjy.a_items."+classify_index+".a_key"] = []map[string]interface{}{}
+									}
+									saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
 								}
-								log.Println("====", classify_index)
-								saveData["o_vipjy.a_items."+classify_index+".s_item"] = classify_name
 							}
 						}
 					} else {
@@ -758,12 +758,13 @@ func (a *AfterPay) GetUserInfo() error {
 
 //关键词判重
 func KeyWordsRepeat(obj map[string]interface{}, aitems []interface{}) bool {
+	// 录入的关键词
 	key, _ := obj["key"].([]string)
 	notkey, _ := obj["notkey"].([]string)
-	matchway, _ := obj["matchway"].(int)
+	matchway, _ := obj["matchway"].(int) //matchway 0:精准匹配 1:模糊匹配
 	appendkey, _ := obj["appendkey"].([]string)
 	log.Println("obj", obj)
-	// 录入的关键词
+	keyM := map[string]bool{} //已有的关键词组
 	for _, v := range aitems {
 		if items, ok := v.(map[string]interface{}); ok && len(items) > 0 {
 			for kk, vv := range items {
@@ -781,12 +782,38 @@ func KeyWordsRepeat(obj map[string]interface{}, aitems []interface{}) bool {
 						if n["appendkey"] != nil {
 							db_append = qutil.ObjArrToStringArr(n["appendkey"].([]interface{}))
 						}
-						if StringArrEqual(key, db_key) && StringArrEqual(notkey, db_not) && qutil.IntAllDef(n["matchway"], 0) == matchway && StringArrEqual(appendkey, db_append) {
-							return true
+						db_matchway := qutil.IntAllDef(n["matchway"], 0)
+						k_m := ""
+						if db_matchway == 1 {
+							for _, x := range append(db_key, db_append...) {
+								k_m = fmt.Sprintf("%s_%s_%v", x, strings.Join(db_not, ""), db_matchway)
+								log.Println("--k_m-", k_m)
+								keyM[k_m] = true
+							}
+						} else {
+							k_m = fmt.Sprintf("%s_%s_%v", strings.Join(append(db_key, db_append...), ""), strings.Join(db_not, ""), db_matchway)
+							keyM[k_m] = true
+							log.Println("--k_m-", k_m)
 						}
 					}
 				}
-
+			}
+		}
+	}
+	if len(keyM) > 0 {
+		if matchway == 1 {
+			for _, v := range append(key, appendkey...) {
+				k_m2 := fmt.Sprintf("%s_%s_%v", v, strings.Join(notkey, ""), matchway)
+				log.Println("--", k_m2)
+				if keyM[k_m2] {
+					return true
+				}
+			}
+		} else {
+			k_m2 := fmt.Sprintf("%s_%s_%v", strings.Join(append(key, appendkey...), ""), strings.Join(notkey, ""), matchway)
+			log.Println("--", k_m2)
+			if keyM[k_m2] {
+				return true
 			}
 		}
 	}

+ 32 - 7
src/jfw/modules/subscribepay/src/service/vipSubscribeChange.go

@@ -22,10 +22,11 @@ import (
 //订阅修改 or 升级
 type SubscribeChange struct {
 	*xweb.Action
-	getSubBuyMsg  xweb.Mapper `xweb:"/vipsubscribe/getSubBuyMsg"`  //获取vip订阅详情
-	saveChange    xweb.Mapper `xweb:"/vipsubscribe/saveChange"`    //订阅修改
-	mergeIndustry xweb.Mapper `xweb:"/vipsubscribe/mergeIndustry"` //行业合并
-	upgrade       xweb.Mapper `xweb:"/vipsubscribe/upgrade"`       //升级超级订阅
+	getSubBuyMsg   xweb.Mapper `xweb:"/vipsubscribe/getSubBuyMsg"`   //获取vip订阅详情
+	saveChange     xweb.Mapper `xweb:"/vipsubscribe/saveChange"`     //订阅修改
+	mergeIndustry  xweb.Mapper `xweb:"/vipsubscribe/mergeIndustry"`  //行业合并
+	upgrade        xweb.Mapper `xweb:"/vipsubscribe/upgrade"`        //升级超级订阅
+	freeSaveChange xweb.Mapper `xweb:"/vipsubscribe/freeSaveChange"` //免费用户试用超级订阅
 }
 
 func init() {
@@ -112,6 +113,30 @@ func (this *SubscribeChange) SaveChange() {
 	this.ServeJson(r.Format())
 }
 
+//免费用户设置超级订阅(体验)
+func (this *SubscribeChange) FreeSaveChange() {
+	area := qutil.ObjToMap(this.GetString("area"))
+	industry := strings.Split(this.GetString("industry"), ",")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	r := func() *entity.FuncResult {
+		if len(industry) == 1 && industry[0] == "" {
+			industry = []string{}
+		}
+		updateOk := util.MQFW.UpdateById("user", userId,
+			bson.M{"$set": bson.M{
+				"o_vipjy.o_area":       area,     //设置地区
+				"o_vipjy.a_buyerclass": industry, //设置行业
+			}})
+		return &entity.FuncResult{true, nil, map[string]interface{}{
+			"doSuccess": updateOk,
+		}}
+	}()
+	if r.Err != nil {
+		log.Printf("%s SaveChange err:%v\n", userId, r.Err.Error())
+	}
+	this.ServeJson(r.Format())
+}
+
 //升级订阅
 func (this *SubscribeChange) Upgrade() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
@@ -147,7 +172,7 @@ func (this *SubscribeChange) Upgrade() {
 			}
 			needRenew = true
 		}
-		area_select := true //是否回显城市选择
+		area_select := true                     //是否回显城市选择
 		if len(*area) == 0 && area_count != 0 { //升级时为传入选择省份
 			(*area)["areacount"] = area_count
 			area_select = false
@@ -249,7 +274,7 @@ func (this *SubscribeChange) Upgrade() {
 			disWord = disWordStr
 		}
 		ordercode := pay.GetOrderCode(userId)
-		if (disWord == "") {
+		if disWord == "" {
 			start_time := TimeProcessing(time.Now().Format(DateFullLayout), -config.Config.TermValidity).Format(DateFullLayout)
 			stop_time := TimeProcessing(time.Now().Format(DateFullLayout), config.Config.TermValidity).Format(DateFullLayout)
 			infoList := util.Mysql.SelectBySql("select  * from  dis_word where userId=?  and  ?<=start_time  and stop_time<? ORDER BY id ", userId, start_time, stop_time)
@@ -450,7 +475,7 @@ func needUpgrade(newBuySet, oldBuySet *entity.SubvipBuySet) bool {
 						UpgradeBuyset.AreaCount = newBuySet.AreaCount
 					}
 					del_2_flag, del_1_flag := 0, 0 //被占用
-					if c_2_diff < 0 { //有两个城市的名额未使用完
+					if c_2_diff < 0 {              //有两个城市的名额未使用完
 						if p_Diff > 0 {
 							//转移给一个省使用
 							if c_2_diff+p_Diff > 0 {

+ 5 - 0
src/jfw/public/recomKws.go

@@ -3,6 +3,7 @@ package public
 import (
 	"math/rand"
 	. "qfw/util"
+	"regexp"
 	"sort"
 	"strings"
 	"sync"
@@ -83,6 +84,10 @@ func (rk *recomKws) GetRecomKws(value string, count int) []*map[string]interface
 				if strings.HasSuffix(p.Word, "路") || DealString(p.Word) {
 					continue
 				}
+				hzRegexp := regexp.MustCompile("[^A-Za-z0-9\u4e00-\u9fa5]")
+				if hzRegexp.MatchString(p.Word) {
+					continue //过滤乱码
+				}
 				lock.Lock()
 				if !wordMap[p.Word] {
 					sl.List = append(sl.List, &map[string]interface{}{

+ 487 - 0
src/web/staticres/big-member/css/unit_portrayal.css

@@ -0,0 +1,487 @@
+.u-header{
+    padding-top: .24rem;
+    background-color: #fff;
+}
+.company{
+    display: flex;
+    align-items: center;
+    padding: 0 .32rem;
+    background: #fff;
+}
+.ent-title{
+    margin-left: .2rem;
+    font-size: .28rem;
+    line-height: .4rem;
+    color: #171826;
+}
+.region{
+    margin-top: .16rem;
+    padding: 0 .32rem;
+    color: #5F5E64;
+    font-size: .24rem;
+    line-height: .36rem;
+}
+.buyer-type{
+    margin-top: 0.04rem;
+    padding: 0 .32rem;
+    color: #5F5E64;
+    font-size: .24rem;
+    line-height: .36rem;
+}
+.buyer-info{
+    position: relative;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-top: .24rem;
+    padding: .24rem .16rem;
+}
+.buyer-info::after{
+    
+    position: absolute;
+    box-sizing: border-box;
+    content: ' ';
+    pointer-events: none;
+    top: -50%;
+    right: .32rem;
+    bottom: -50%;
+    left: .32rem;
+    border: 0 solid #ebedf0;
+    border-top-width: 1px;
+    border-bottom-width: 1px;
+    -webkit-transform: scaleY(.5);
+    transform: scaleY(.5);
+}
+.bi-item{
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    white-space: nowrap;
+    text-align: center;
+}
+.bi-item span:nth-child(1){
+    font-size: .2rem;
+    color: #5F5E64;
+    line-height: .28rem;
+}
+.bi-item span:nth-child(2){
+    margin-top: .16rem;
+    font-size: .28rem;
+    color: #171826;
+    line-height: .4rem;
+}
+.static-scope{
+    padding: .16rem 0;
+    font-size: .2rem;
+    color: #9B9CA3;
+    line-height: .28rem;
+    text-align: center;
+}
+.dynamic{
+    position: relative;
+    margin-top:.16rem;
+    background-color: #fff;
+}
+.d_title{
+    padding: .32rem .32rem .12rem;
+    font-weight: bold;
+    font-size: .36rem;
+    line-height: .52rem;
+    color: #171826;
+    height: 0.96rem;
+    box-sizing: border-box;
+}
+.d_list{
+    position: relative;
+    padding: .24rem .32rem;
+}
+.d_list::after{
+    position: absolute;
+    box-sizing: border-box;
+    content: ' ';
+    pointer-events: none;
+    right: 0;
+    bottom: 0;
+    left: 16px;
+    border-bottom: 1px solid #ebedf0;
+    -webkit-transform: scaleY(0.5);
+    transform: scaleY(0.5);
+}
+.i_title{
+    font-size: .28rem;
+    line-height: .4rem;
+    color: #171826;
+}
+.i_info{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-top: .16rem;
+}
+
+.i_area,.i_type{
+    display: inline-block;
+    margin-right: 0.08rem;
+    height: .4rem;
+    padding: 0 .16rem;
+    line-height: .4rem;
+    min-width: .8rem;
+    text-align: center;
+    background-color: rgba(42, 190, 209, 0.08);
+    color: #2ABED1;
+    font-size: .24rem;
+    border-radius: 4px;
+    font-weight: bold;
+}
+.i_time{
+    font-size: .2rem;
+    line-height: .36rem;
+    color: #9B9CA3;
+    text-align: right;
+}
+.more{
+    padding: .12rem 0 .28rem;
+    text-align: center;
+    color: #2ABED1;
+    font-size: .28rem;
+    line-height: .4rem;
+}
+
+.month-scale,.scale-distribute,.double-bar,.savings-rate,.industry-scale-rate{
+    margin-top: .16rem;
+    background-color: #fff;
+}
+
+.bar-tip{
+    padding: 0 .32rem .32rem;
+    text-align: justify;
+    color: #9B9CA3;
+    font-size: .2rem;
+    line-height: .28rem;
+}
+
+.double-bar .bar-content{
+    position: relative;
+    padding: 0 .16rem .38rem;
+    background: #fff;
+}
+.double-bar .rate-item{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-top: .24rem;
+}
+.double-bar .item-label{
+    width: 1.6rem;
+    white-space: nowrap;
+    text-align: right;
+    font-size: .2rem;
+    color: #5F5E64;
+    margin-right: .24rem;
+}
+.double-bar .item-chart{
+    position: relative;
+    flex: 1;
+    height: .4rem;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.double-bar .left-chart,.double-bar .right-chart{
+    flex: 1;
+    height: 100%;
+    overflow: hidden;
+}
+.double-bar .left-chart{
+    margin-right: 2px;
+}
+.double-bar .item-progress{
+    position: relative;
+    flex: 1;
+    width: 100%;
+    height: .4rem;
+    overflow: hidden;
+    font-size: .2rem;
+    line-height: .4rem;
+    display: flex;
+    justify-content: flex-end;
+}
+.double-bar .right-chart .item-progress{
+    justify-content: flex-start;
+}
+.double-bar .blue-progress-bg,.double-bar .yellow-progress-bg{
+    color: #fff;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    box-sizing: border-box;
+}
+.double-bar .blue-progress-bg{
+    background: #05A6F3;
+}
+.double-bar .yellow-progress-bg{
+    text-align: right;
+    background: #FF9F40;
+}
+.double-bar .blue-padding{
+    padding-left: 0.08rem;
+}
+.double-bar .yellow-padding{
+    padding-right: 0.08rem;
+}
+.double-bar .blue-progress-text{
+    padding-right:.08rem;
+    color: #05A6F3;
+}
+.double-bar .yellow-progress-text{
+    padding-left:.08rem;
+    color: #FF9F40;
+}
+.double-bar .tooltip{
+    position: absolute;
+    display: block;
+    white-space: nowrap;
+    z-index: 9999999;
+    transition: left 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0s, top 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0s;
+    background-color: rgb(255, 255, 255);
+    border: 2px solid #F5F6F7;
+    box-sizing: border-box;
+    border-radius: 4px;
+    color: rgb(23, 24, 38);
+    font: 12px / 18px "Microsoft YaHei";
+    padding: 7px 12px;
+    box-shadow: 0px 4px 16px rgba(8, 31, 38, 0.08);
+    pointer-events: none;
+}
+.double-bar .tooltip-item{
+    display: flex;
+    align-items: center;
+    font-size: .24rem;
+    color: #171826;
+    line-height: .36rem;
+}
+.double-bar .tooltip-circle{
+    display: inline-block;
+    width: 8px;
+    height: 8px;
+    border-radius: 8px;
+    margin-right: 4px;
+}
+.double-bar .custom-legend{
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-top: .4rem;
+    padding: 0 0.8rem 0 1.6rem;
+}
+.double-bar .tooltip-name{
+    text-align: center;
+    color: #9B9CA3;
+    font-size: .2rem;
+    margin-top: 0.08rem;
+}
+.double-bar .legend-item{
+    display: flex;
+    align-items: center;
+    font-size: .22rem;
+    color: #5F5E64;
+}
+.double-bar .blue-circle{
+    background-color: #05A6F3;
+}
+.double-bar .yellow-circle{
+    background-color: #FF9F40;
+}
+
+.years,.amount,.rank,.distribute{
+    position: relative;
+    margin-top: .16rem;
+    background-color: #fff;
+}
+.chart_title,.rank_title,.distribute_title{
+    padding: .32rem .32rem .12rem;
+    font-weight: bold;
+    font-size: .36rem;
+    line-height: .52rem;
+    color: #171826;
+    height: 0.96rem;
+    box-sizing: border-box;
+}
+
+.client,.agency{
+    margin-top: .16rem;
+}
+.client-title,.agency-title{
+    padding: .32rem .32rem .12rem;
+    font-weight: bold;
+    font-size: .36rem;
+    line-height: .52rem;
+    color: #171826;
+    height: 0.96rem;
+    box-sizing: border-box;
+    background-color: #fff;
+}
+.client-list{
+    margin-bottom: .16rem;
+    background-color: #fff;
+}
+.client .c-thead{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: .2rem .32rem 0;
+}
+.client .c-name,.client .item-name{
+    width: 4rem;
+    margin-right: .24rem;
+}
+.client .c-count,.client .item-count{
+    width: .9rem;
+    font-size: .22rem;
+    text-align: center;
+    margin-right: .24rem;
+}
+.client .c-rate,.client .item-rate{
+    width: 1.1rem;
+    font-size: .22rem;
+    text-align: center;
+    margin-right: .24rem;
+}
+.client .c-time,.client .item-time{
+    flex: 1;
+    font-size: .22rem;
+    text-align: center;
+}
+.client .c-name{
+    font-weight: bold;
+    font-size: .3rem;
+    color: #171826;
+}
+.client .c-count,.client .c-rate,.client .c-time{
+    color: #9B9CA3;
+    white-space: nowrap;
+}
+
+.client .progress-bar-container {
+    background-color: #fff;
+    padding: 0 .32rem;
+}
+
+.client .progress-bar-item {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    padding-bottom: .2rem;
+}
+
+.client .progress-bar-item .item-label {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 0.16rem 0 0.04rem;
+}
+
+.client .item-name {
+    font-size: .22rem;
+    line-height:.36rem;
+    color: #171826;
+    text-decoration: underline;
+}
+
+.client .item-count {
+    font-size: .22rem;
+    color: #171826;
+    line-height:.36rem;
+}
+
+.client .item-progress {
+    position: relative;
+    height: .4rem;
+    line-height: .4rem;
+    background-color: #EDEFF2;
+    border-radius: 0 .28rem .28rem 0;
+    overflow: hidden;
+}
+.client .item-money{
+    position: absolute;
+    left: .16rem;
+    top: 50%;
+    transform: translateY(-50%);
+    color: #8F5828;
+    font-size: .22rem;
+    z-index: 10;
+}
+.client .item-progress-count {
+    position: absolute;
+    top: 0;
+    left: 0;
+    height: 100%;
+    border-radius: 0 .28rem .28rem 0;
+    z-index: 9;
+}
+.client .active-progress{
+    background: #FAE7CA;
+}
+
+.agency-container{
+    padding: 0 .32rem;
+    background: #fff;
+}
+.agency-thead{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: .2rem 0 0;
+}
+.agency-thead .a-name,.agency-tbody .ab-name{
+    display: inline-block;
+    width: 4.2rem;
+    padding-right: .24rem;
+    line-height: .36rem;
+}
+
+.agency-thead .a-count,.agency-tbody .ab-count{
+    width: 1rem;
+    margin-right: .24rem;
+    white-space: nowrap;
+    font-size: .22rem;
+    color: #9B9CA3;
+    text-align: center;
+    line-height: .36rem;
+}
+.agency-thead .a-time,.agency-tbody .ab-time{
+    flex: 1;
+    white-space: nowrap;
+    font-size: .22rem;
+    color: #9B9CA3;
+    text-align: center;
+    line-height: .36rem;
+}
+.agency-tbody .ab-name,.agency-tbody .ab-count,.agency-tbody .ab-time{
+    color: #171826;
+}
+
+.agency-tbody .ab-list{
+    padding: .16rem 0 .2rem;
+}
+.agency-tbody .ab-label{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+.agency-tbody .ab-progress{
+    display: flex;
+    justify-content: start;
+    align-items: center;
+    margin-top: 0.04rem;
+    height: .2rem;
+    background-color: #F5F6F7;
+    border-radius: 0 .28rem .28rem 0;
+    overflow: hidden;
+}
+.agency-tbody .progress-active{
+    height: 100%;
+    background: linear-gradient(270deg, #2ABED1 0.81%, #8DE0EB 100%);
+    border-radius: 0 .28rem .28rem 0;
+}

BIN
src/web/staticres/big-member/image/working.gif


+ 1245 - 0
src/web/staticres/big-member/js/unit_portrayal.js

@@ -0,0 +1,1245 @@
+var hotChart = null;
+var pieChart = null;
+var vNode = {
+    delimiters: ['${', '}'],
+    el: '#unit_portrayal',
+    components: {
+      hisproComponent: hisproComponent,
+      buyerExample: buyerExample,
+    },
+    data() {
+        // 修改柱状条颜色为渐变色
+        this.colorGreen = [new echarts.graphic.LinearGradient(
+            0, 0, 0, 1,
+            [
+                {offset: 1, color: '#2ABED1'},
+                {offset: 0.5, color: '#2ABED1'},
+                {offset: 0, color: '#8DE0EB'}
+            ], false
+        ), '#FF9F40']
+        return {
+            chartLoading: true,
+            showAll:false,
+            buyer:{
+                name:'',
+                area: '',
+                city: '',
+            },
+            // 采购单位统计信息
+            statistics: {
+                province: '',
+                city: '',
+                buyerClass:'',
+                buyerCount: '',
+                buyerScale: '',
+                winnerCount:'',
+                otherWinner:'',
+                fail_count: '',
+                start: '',
+                end: ''
+            },
+            projectChartSettings:{
+                showLine: ['项目金额'],
+                axisSite: { right: ['项目金额'] }
+            },
+            // hotChart: null,
+            isShow:{
+                showDynamic: false,
+                showYearData: false,
+                showMonthScale: false,
+                showScaleFb:false,
+                showBidType: false,
+                showSaveRate: false,
+                showScaleRate: false,
+                showClient: false,
+                showCapital: false,
+                showAge:false,
+                showArea:false,
+                showAgency: false
+            },
+            // 中标动态
+            dt:{
+                list: [],
+                isMore:'',
+                pageCount: '',
+                isNext: true
+            },
+            regCapSettings:{
+                showLine: ['累计采购规模'],
+                axisSite: { right: ['累计采购规模'] },
+                // stack: { '注册资本分布': ['注册资本','企业数量', '采购项目数量', '平均节支率'] }
+            },
+            // 合作企业注册资本分布
+            regCapitalData:{
+                columns: ['注册资本', '企业数量', '累计采购规模'],
+                rows: [],
+                customData:[]
+            },
+            // 年度项目统计
+            projectData: {
+                columns: [],
+                rows: []
+            },
+            // 月度采购规模统计
+            monthScaleData: {
+                columns: [],
+                rows: []
+            },
+            doubleBar:{
+                list:[],
+                info:{},
+                showTooltip:false
+            },
+            savingsRateData:{
+                columns: [],
+                rows: []
+            },
+            // 重点合作企业
+            clientList:[],
+            workingAgeData:{
+                columns: ['企业年龄', '企业数量'],
+                rows: [],
+                customData:[]
+            },
+            mapChartData:{
+                columns: ['企业注册地', '企业数量','累计采购规模','采购项目数量','平均节支率'],
+                rows: [],
+                customData:[]
+            },
+            // 重点合作代理机构
+            agencyList: [],
+            // 热力图减去数据为0的行
+            minusRows:0,
+            reqCount: 0,
+            timer: null,
+            initRendererSvg:{
+                renderer:'svg'
+            },
+            bigStatus: 0,
+            encryptId: '', // 首次埋点返回的加密id 用于点击去开通传参
+            power: []
+        }
+    },
+    computed: {
+        allNot: function() {
+            var show_1 = this.isShow.showDynamic;
+            var show_2 = this.isShow.showYearData;
+            var show_3 = this.isShow.showMonthScale;
+            var show_4 = this.isShow.showScaleFb;
+            var show_5 = this.isShow.showBidType;
+            var show_6 = this.isShow.showSaveRate;
+            var show_7 = this.isShow.showScaleRate;
+            var show_8 = this.isShow.showClient;
+            var show_9 = this.isShow.showCapital;
+            var show_10 = this.isShow.showAge;
+            var show_11 = this.isShow.showArea;
+            var show_12 = this.isShow.showAgency;
+            if(!show_1 && !show_2 && !show_3 && !show_4 && !show_5 && !show_6 && !show_7 && !show_8 && !show_9 && !show_10 && !show_11 && !show_12 && this.power.indexOf(5) > -1) {
+                return true;
+            } else {
+                return false;
+            }
+        },
+        heatMapHeight: function(){
+            return 320 - 22*this.minusRows  + 'px'
+        },
+        computedClientList: function (){
+            return this.clientList.map(function (v) {
+                v.topData = v.topData.filter(function(s) {
+                    return s.winnerName && s.winnerName.trim().length
+                })
+                return v
+            }).filter(function (v,i) {
+                return v.topData.length
+            })
+        },
+        getStatus: function () {
+          return this.power.indexOf(5)  == -1 // power == 5
+        },
+    },
+    created () {
+      this.getPowerInfo()
+        this.init();
+    },
+    mounted: function () {
+        this.buyer.name = decodeURIComponent(utils.getParam('entName'));
+        this.getNewMsg(); // 中标动态
+        this.getChartData(); // 企业画像
+    },
+    beforeDestroy() {
+        window.removeEventListener("resize", this.init,20);
+        if(hotChart) {
+            hotChart.dispose();
+        }
+        if(pieChart) {
+            pieChart.dispose();
+        }
+    },
+    methods: {
+        // 获取权限信息
+        getPowerInfo: function () {
+          var _this = this
+          $.ajax({
+            type: 'GET',
+            url: '/bigmember/use/isAdd?t=' + Date.now(),
+            success: function (res) {
+              if (res.data) {
+                _this.power = res.data.power
+                _this.bigStatus = res.data.memberStatus
+                var entniche = res.data.entniche
+                var member = res.data.memberStatus
+                var vip = res.data.vipStatus
+                var userType = ''
+                if (vip > 0) {
+                  userType = '1'
+                }
+                if (member > 0) {
+                  if (userType !== '') {
+                    userType += ','
+                  }
+                  userType += '2'
+                }
+                if (entniche) {
+                  if (userType !== '') {
+                    userType += ','
+                  }
+                  userType += '3'
+                }
+                if (userType === '') {
+                  userType = '0'
+                }
+                // 没有采购单位画像权限的 则添加埋点
+                if (res.data.power.indexOf(5) === -1) {
+                  _this.getBuried(userType)
+                }
+              }
+            },
+            error: function (error) {
+              console.log(error)
+            }
+          })
+        },
+        // 进入页面埋点 非大会员用户请求
+        getBuried: function(type) {
+          var _this = this
+          var params = {
+            userType: type,
+            platform: 'W'
+          }
+          $.ajax({
+            type: 'POST',
+            url: '/publicapply/drainage/buyerunit',
+            contentType: "application/json",
+            data: JSON.stringify(params),
+            success: function (res) {
+                if (res.data && res.data.status) {
+                  _this.encryptId = res.data.id
+                }
+            },
+            error: function (error) {
+              console.log(error)
+            }
+          })
+        },
+        // 点击去开通埋点方法
+        goBuyBuried: function(text) {
+          var _this = this
+          var params = {
+            mold: 'isCBBT',
+            id: _this.encryptId,
+            introduce: text
+          }
+          $.ajax({
+            type: 'POST',
+            url: '/publicapply/drainage/buyerunit',
+            contentType: "application/json",
+            data: JSON.stringify(params),
+            success: function (res) {
+              console.log(res)
+              setTimeout(function() {
+                location.href = '/big/wx/page/buy_commit?bid=' + _this.encryptId
+              }, 200)
+            },
+            error: function (error) {
+              console.log(error)
+              location.href = '/big/wx/page/buy_commit?bid=' + _this.encryptId
+            }
+          })
+        },
+        init() {
+            setTimeout(function() {
+                window.addEventListener('resize', function() {
+                    hotChart.resize();
+                })
+            }, 20)
+        },
+        goEntInfo: function(item) {
+            location.href = "/weixin/frontPage/collection/sess/ent_portrait?eId=" + encodeURIComponent(item.entId)
+        },
+        // 查询采购单位地址(暂不需要)
+        getBuyer:function(){
+            var that = this;
+            $.ajax({
+                type:'POST',
+                url:'/bigmember/portrait/ent/buyerAddress',
+                data:{
+                    entName: decodeURIComponent(utils.getParam('entName'))
+                },
+                success:function(res) {
+                    // console.log(res)
+                    if(res.error_code == 0) {
+                        if(res.data.province) {
+                            that.buyer.area = res.data.province.replace(/省|市|自治区|特别行政区|壮族|回族|维吾尔/g, '');
+                        }
+                        if(res.data.city){
+                            that.buyer.city = res.data.city;
+                        }
+                    }else{
+                        console.log("未获取到")
+                    }
+                },
+                error:function(err) {
+                    console.log(err)
+                }
+            })
+        },
+        // 获取中标动态数据
+        getNewMsg: function(){
+          var that = this;
+          var data = {
+              buyer: decodeURIComponent(utils.getParam('entName')),
+              count: that.dt.pageCount,
+              pageSign: that.dt.isMore
+          }
+          $.ajax({
+            type:'POST',
+            url:'/bigmember/portrait/buyer/getNewMsg',
+            data:data,
+            success:function(res) {
+              if(res.error_code == 0) {
+                if (res.data.list && res.data.list.length && res.data.list.length > 0) {
+                  that.dt.pageCount = res.data.count
+                  if (res.data.list && $.isArray(res.data.list)) {
+                    that.isShow.showDynamic = true;
+                    res.data.list.forEach(function(v,i){
+                        v.firsttime = new Date(Number(v.firsttime + '000')).pattern('yyyy/MM/dd');
+                        v.bidamount = v.bidamount ? utils.moneyUnit(v.bidamount) : ''
+                    })
+                    if (!that.dt.isMore) {
+                        that.dt.list = []
+                        that.dt.isMore = 'more'
+                        if(res.data.count <= 3) {
+                            that.dt.isNext = false
+                        }
+                    } else if (that.dt.isMore === 'more') {
+                        if (that.power.indexOf(5) == -1) {
+                          that.openDialog()
+                          return
+                        }
+                        that.dt.isMore = 'max'
+                        if(res.data.count <= 23) {
+                            that.dt.isNext = false
+                        }
+                    } else if (that.dt.isMore === 'max') {
+                        that.dt.isNext = false
+                    }
+                    that.dt.list = that.dt.list.concat(res.data.list)
+                  }
+                }
+              } else {
+                console.log(res.error_code)
+              }
+            },
+            error:function(err) {
+              console.log(err)
+            }
+          })
+        },
+        // 获取采购单位画像所有数据
+        getChartData: function() {
+          var that = this;
+          $.ajax({
+            type:'POST',
+            url:'/bigmember/portrait/buyer/getData',
+            data:{
+              buyer: decodeURIComponent(utils.getParam('entName'))
+            },
+            success:function(res) {
+                if(res.error_code == 0) {
+                  if(res.data && Object.keys(res.data).length > 0) {
+                      that.chartLoading = false;
+                      that.initChartData('', res.data)
+                  } else {
+                    that.getSectionChartData('a')
+                  }
+                }
+            },
+            error:function(err) {
+              console.log(err)
+            }
+          })
+        },
+        // 分段获取画像数据
+        getSectionChartData: function(type) {
+          var that = this;
+          $.ajax({
+            type:'POST',
+            url:'/bigmember/portrait/buyer/getData',
+            data:{
+              buyer: decodeURIComponent(utils.getParam('entName')),
+              flag: type
+            },
+            success:function(res) {
+                if(res.error_code == 0) {
+                  that.reqCount++;
+                  if(res.data && Object.keys(res.data).length > 0) {
+                    that.chartLoading = false;
+                    that.initChartData(type, res.data)
+                    if (type === 'a') {
+                      that.reqCount = 0
+                      that.getSectionChartData('b')
+                    } else if (type === 'b') {
+                      that.reqCount = 0
+                      that.getSectionChartData('c')
+                    }
+                  } else {
+                    console.log('请求了获取不到data数据,再次请求')
+                    if (that.reqCount < 5) {
+                      that.getSectionChartData(type)
+                    } else {
+                      that.chartLoading = false;
+                    }
+                  }
+                }
+            },
+            error:function(err) {
+              console.log(err)
+            }
+          })
+        },
+        initChartData: function(flag, res) {
+          // a段数据 timeRange、city、province、buyerclass、bidamount_count、fail_count、project_count、winner_count、otherProvincesWinnerCount、yearData、monthData、moneyRange、bidtypeData、rate、top12、topAgencyData
+          // b段数据 topShow
+          // c段数据 withCapitalData、withAreaData、withEstablishData
+          if (flag === 'a') {
+            // 1.初始化画像基本信息
+            this.formatBaseInfo(res)
+            // 2.初始化年度统计数据
+            this.formatYearsData(res.yearData)
+            // 3.初始化月度统计数据
+            this.formatterMonthData(res.monthData)
+            // 4.初始化采购规模分布数据
+            this.formatHotData(res.moneyRange)
+            // 5.格式化各类招标方式占比数据
+            this.formatBidTypeData(res.bidtypeData)
+            // 6.初始化各行业项目平均节支率数据
+            this.formatSaveRateData(res.rate)
+            // 7.初始化各行业项目规模占比数据
+            this.formatTopData(res.top12)
+            // 12.初始化重点合作代理机构数据
+            this.formatAgencyData(res.topAgencyData)
+          } else if (flag === 'b') {
+            // 8.初始化重点合作企业数据
+            this.formatClientData(res.topShow)
+          } else if (flag === 'c') {
+             // 9.初始化合作企业注册资本分布数据
+            this.formatCapitalData(res.withCapitalData)
+            // 10.初始化合作企业年龄分布数据
+            this.formatAgeData(res.withEstablishData)
+            // 11.初始化合作企业注册地分布数据
+            this.formatAreaData(res.withAreaData)
+          } else {
+            // 1.初始化画像基本信息
+            this.formatBaseInfo(res)
+            // 2.初始化年度统计数据
+            this.formatYearsData(res.yearData)
+            // 3.初始化月度统计数据
+            this.formatterMonthData(res.monthData)
+            // 4.初始化采购规模分布数据
+            this.formatHotData(res.moneyRange)
+            // 5.格式化各类招标方式占比数据
+            this.formatBidTypeData(res.bidtypeData)
+            // 6.初始化各行业项目平均节支率数据
+            this.formatSaveRateData(res.rate)
+            // 7.初始化各行业项目规模占比数据
+            this.formatTopData(res.top12)
+            // 8.初始化重点合作企业数据
+            this.formatClientData(res.topShow)
+            // 9.初始化合作企业注册资本分布数据
+            this.formatCapitalData(res.withCapitalData)
+            // 10.初始化合作企业年龄分布数据
+            this.formatAgeData(res.withEstablishData)
+            // 11.初始化合作企业注册地分布数据
+            this.formatAreaData(res.withAreaData)
+            // 12.初始化重点合作代理机构数据
+            this.formatAgencyData(res.topAgencyData)
+          }
+        },
+        // 1.处理画像基本信息数据
+        formatBaseInfo: function(data) {
+          this.statistics.province = data.province ? data.province.replace(/省|市|自治区|特别行政区|壮族|回族|维吾尔/g, '') : '--';
+          this.statistics.city = data.city;
+          this.statistics.buyerClass = data.buyerclass ? data.buyerclass : '--';
+          this.statistics.start = data.timeRange ? new Date(Number(data.timeRange.start + '000')).pattern('yyyy/MM/dd'): '';
+          this.statistics.end = data.timeRange ? new Date(Number(data.timeRange.end + '000')).pattern('yyyy/MM/dd') : '';
+          this.statistics.buyerCount = data.project_count ? data.project_count + '个' : '--';
+          this.statistics.winnerCount = data.winner_count ? data.winner_count + '个' : '--';
+          this.statistics.otherWinner = data.otherProvincesWinnerCount ? data.otherProvincesWinnerCount + '个' : '--';
+          this.statistics.buyerScale = data.bidamount_count ? utils.moneyUnit(data.bidamount_count) : '--';
+          this.statistics.fail_count = data.fail_count ? data.fail_count + '条': '--';
+        },
+        // 2.处理年度统计数据
+        formatYearsData: function(data) {
+          if(data && Object.keys(data).length > 0){
+            var rows = [];
+            for (var key in data) {
+              rows.push({
+                '年份': key,
+                '项目数量': data[key].Count,
+                '项目金额': (data[key].Money/10000).fixed(0),
+              })
+            }
+            this.projectData.columns = ['年份', '项目数量', '项目金额'];
+            this.projectData.rows = rows;
+            this.isShow.showYearData = true;
+          }
+        },
+        // 3.处理月度采购规模数据
+        formatterMonthData: function(data) {
+          if (data && Object.keys(data).length > 0) {
+            var rows = [];
+            var columns = ['月份'];
+            var count = 0;
+            var yearArr = []
+            for (var key in data) {
+              yearArr.push(parseInt(key))
+            }
+            yearArr.sort(function (a, b) { return a - b })
+            yearArr.forEach(function (item) {
+              columns.push(item + '年')
+            })
+            for (var i = 1; i <= 12; i++) {
+              var columnsItem = {}
+              columns.forEach(function (item) {
+                var value = ''
+                if (item == '月份') {
+                    value = i + '月'
+                } else if (/年/g.test(item)) {
+                  if (data[item.slice(0, -1)]) {
+                    value = data[item.slice(0, -1)][i];
+                    value = (value /10000).fixed(2);
+                    count += value
+                  }
+                }
+                columnsItem[item] = value
+              })
+              rows.push(columnsItem)
+            }
+            // 数据总量为0,不赋值
+            if (count != 0) {
+              this.monthScaleData.columns = columns;
+              this.monthScaleData.rows = rows;
+              this.isShow.showMonthScale = true;
+            } else {
+              this.isShow.showMonthScale = false;
+            }
+          }
+        },
+        // 4.处理采购规模分布数据
+        formatHotData: function(res) {
+          var that = this
+          if(res && res.length > 0) {
+            // 数据都为0 隐藏
+            var countArr = res.map(function(v){
+              return v.project_count;
+            })
+            var max = Math.max.apply(null,countArr);
+            console.log(max,'max')
+            if(max == 0) {
+              that.isShow.showScaleFb = false
+            } else {
+              that.isShow.showScaleFb = true;
+              that.$nextTick(function(){
+                that.getHotChartData(res);
+              })
+            }
+          }
+        },
+        // 5.处理各类招标方式占比数据
+        formatBidTypeData: function(data) {
+          // 各类招标方式占比
+          if(data && data.length > 0) {
+            data.forEach(function(item){
+              item.money = (item.money / 10000).fixed(2);
+              item.moneyShare = (item.moneyShare*100).fixed(2);
+              item.numShare  = (item.numShare *100).fixed(2)
+              switch (item.type) {
+                case '招标':
+                  item.type = '公开招标'
+                  break;
+                case '邀标':
+                  item.type = '邀请招标'
+                  break;
+                case '询价':
+                  item.type = '询价采购'
+                  break;
+                case '单一':
+                  item.type = '单一来源采购'
+                  break;
+                case '竞价':
+                  item.type = '竞价采购'
+                  break;
+                case '竞谈':
+                  item.type = '竞争性谈判'
+                  break;
+              }
+            })
+            var maxLeftNum = Math.max.apply(Math, data.map(function(o) {return o.numShare}))
+            var maxRightNum = Math.max.apply(Math, data.map(function(o) {return o.moneyShare}))
+            data.forEach(function(v,i){
+              v.lPercent = (v.numShare/maxLeftNum*100).fixed(2);
+              v.rPercent = (v.moneyShare/maxRightNum*100).fixed(2);
+            })
+            this.doubleBar.list = data;
+            this.isShow.showBidType = true;
+          }
+        },
+        // 6.处理行业项目平均节支率数据
+        formatSaveRateData: function(data) {
+          if (data && Object.keys(data).length > 0) {
+            var rows = [];
+            var columns = ['日期','全部行业'];
+            var count = 0;
+            for (var key in data) {
+              if(key !== '全部行业') {
+                columns.push(key)
+              }
+            }
+            var industryArr = []
+            for (var key in data['全部行业']) {
+              industryArr.push(key)
+            }
+            industryArr.sort(function (a, b) { return a - b })
+            industryArr.forEach(function (item) {
+              var rowsItem = {
+                '日期': item + '年'
+              }
+              for (var k in data) {
+                count += (data[k][item] * 100)
+                rowsItem[k] = data[k][item] == null  ? null : (data[k][item] * 100).fixed(2)
+              }
+              rows.push(rowsItem)
+            })
+            // 数据总量为0,不赋值
+            if (count != 0) {
+              this.savingsRateData.columns = columns;
+              this.savingsRateData.rows = rows;
+              this.isShow.showSaveRate = true
+            }
+          }
+        },
+        // 7.处理各行业项目规模占比数据
+        formatTopData : function(data) {
+          var that = this
+          if (data && data.length > 0) {
+            that.isShow.showScaleRate = true
+            that.$nextTick(function(){
+              that.getPieCharData(data)
+            })
+          }
+        },
+        // 8.处理重点合作企业数据
+        formatClientData: function(data) {
+          if (data && data.length > 0) {
+            data.forEach(function(v,i){
+              v.topData.forEach(function(s,j){
+                s.parent = s.countMoney / v.topData[0].countMoney*100 + "%";
+                s.lastTime = new Date(Number(s.lastTime + '000')).pattern('yyyy/MM/dd')
+              })
+            })
+            this.clientList = data;
+            this.isShow.showClient = true;
+          }
+        },
+        // 9.处理合作企业注册资本分布数据
+        formatCapitalData: function (data) {
+          var that = this
+          if(data && data.length > 0) {
+            var columns = ['注册资本', '企业数量', '累计采购规模'];
+            var rows = [];
+            var capData = [];
+            data.forEach(function(item){
+              rows.push({
+                '注册资本': that.formatMoneyRange(item.key),
+                '企业数量': item.ent_count,
+                '累计采购规模': (item.money_count /10000).fixed(2)
+              })
+              capData.push({
+                '注册资本': that.formatMoneyRange(item.key),
+                '企业数量': item.ent_count,
+                '累计采购规模': (item.money_count /10000).fixed(2),
+                '采购项目数量': item.project_count,
+                '平均节支率': item.rate_avg
+              })
+            })
+            that.regCapitalData.columns = columns;
+            that.regCapitalData.rows = rows;
+            that.regCapitalData.customData = capData;
+            that.isShow.showCapital = true;
+          }
+        },
+        // 10.处理合作企业年龄分布数据
+        formatAgeData: function(data) {
+          if (data && data.length > 0) {
+            var ageRows = [];
+            var customRows = []
+            data.forEach(function(item){
+              if(item.key == '0_1'){
+                item.key = '<1'
+              }
+              if(item.key == '40'){
+                item.key = '≥40'
+              }
+              ageRows.push({
+                '企业年龄': item.key.replace('_','-'),
+                '企业数量': item.ent_count
+              })
+              customRows.push({
+                '企业年龄': item.key.replace('_','-'),
+                '企业数量': item.ent_count,
+                '累计采购规模': (item.money_count /10000).fixed(2),
+                '采购项目数量': item.project_count,
+                '平均节支率': item.rate_avg
+              })
+            })
+            this.workingAgeData.rows = ageRows;
+            this.workingAgeData.customData = customRows;
+            this.isShow.showAge = true;
+          }
+        },
+        // 11.处理合作企业注册地分布数据
+        formatAreaData: function(data) {
+          if (data && data.length > 0) {
+            var areaRows = []
+            var custom = []
+            data.forEach(function(item){
+              areaRows.push({
+                '企业注册地': item.area_name,
+                '企业数量': item.ent_count
+              })
+              custom.push({
+                '企业注册地': item.area_name,
+                '企业数量': item.ent_count,
+                '累计采购规模': (item.money_count /10000).fixed(2),
+                '采购项目数量': item.project_count,
+                '平均节支率': item.rate_avg
+              })
+            })
+            this.mapChartData.rows = areaRows;
+            this.mapChartData.customData = custom;
+            this.isShow.showArea = true;
+          }
+        },
+        // 12.处理重点合作代理机构数据
+        formatAgencyData: function(data) {
+          if(data && data.length > 0) {
+            data.forEach(function(v,i){
+              v.last_with_time = new Date(Number(v.last_with_time + '000')).pattern('yyyy/MM/dd')
+              v.parent = v.project_count / data[0].project_count*100 + "%";
+            })
+            this.agencyList = data;
+            this.isShow.showAgency = true
+          }
+        },
+        // 处理金额区间转换
+        formatMoneyRange: function(key){
+            if(!key) return;
+            if(key.indexOf('_')) {
+                key = key.split('_');
+            } else {
+                key = key.split('-');
+            }
+            if(!key[1]) return '>' + (key[0] / 100000000).fixed(2) + '亿';
+            key[0] = key[0] >= 100000000 ? (key[0] / 100000000).fixed(2) : (key[0] / 10000).fixed(2);
+            key[1] = key[1] >= 100000000 ? (key[1] / 100000000).fixed(2) + '亿' : (key[1] / 10000).fixed(2) + '万';
+            return key[0] + '-' + key[1];
+        },
+        /* ***** 配置项部分 ******* */
+        // 1.年度项目统计配置
+        projectConfig:function(options){
+            var that = this;
+            options.grid = {
+                left:16,
+                right: 16,
+                top: 20,
+                bottom: 60
+            }
+            options.yAxis[1].axisLabel.formatter = function(value, index) {
+                return value.toString().replace(/,/,'');
+            }
+            options.tooltip.axisPointer.shadowStyle.color = 'rgba(42, 190, 209,0.1)';
+            options.legend.show = true;
+            options.yAxis[1].axisLabel.show = true; // 显示右侧y轴刻度
+            options.series[1].lineStyle.width = 2 // 折线
+            options.series[1].lineStyle.color = '#FF9F40'
+            var maxCountList = this.projectData.rows.map(function(v){
+                return v['项目数量']
+            })
+            var maxPriceList = this.projectData.rows.map(function(v){
+                return v['项目金额']
+            })
+            var maxCount = Math.ceil(Math.max.apply(null,maxCountList)).toString();// 取出数量中最大值
+            var maxPrice = Math.ceil(Math.max.apply(null,maxPriceList)).toString();// 取出金额中最大值
+            // var minPrice = Math.min.apply(null,maxPriceList);// 去除金额最小值
+            maxPrice = Math.ceil(maxPrice / (Math.pow(10,maxPrice.length -1))) * Math.pow(10,maxPrice.length -1)
+            maxCount = Math.ceil(maxCount / (Math.pow(10,maxCount.length -1))) * Math.pow(10,maxCount.length -1)
+            var item = options.yAxis
+            item[0].min = 0;
+            item[1].min = 0;
+            item[0].max = maxCount;
+            item[0].interval = Math.ceil(maxCount / 5);
+            item[1].max = maxPrice;
+            item[1].interval = Math.ceil((maxPrice - 0) / 5);
+            options.tooltip.formatter = function(params) {
+                return that.formatter(params)
+            }
+            options.legend.formatter = function(name) {
+                if(name == '项目金额') {
+                    name = name + '(万元)-右轴'
+                }
+                if(name == '项目数量') {
+                    name =  name + '(个)'
+                }
+                return name;
+            }
+            return options
+        },
+        // 修改年度项目统计里点击浮窗显示效果
+        formatter: function (params) {
+            var tip = '';
+            for (var i = 0; i < params.length; i++) {
+                // 因柱状图颜色为渐变色,此处获取到的柱状图颜色,css不能识别,需单独设置小圆点的颜色
+                params[0].marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:#2ABED1"></span>'
+                if( i=== 0) {
+                    tip = tip + params[i].marker + params[i].seriesName + ':' + params[i].value + '个' + '<br/>';
+                }else if(i == 1){
+                    tip = tip + params[i].marker + params[i].seriesName + ':' + params[i].value + '万元' + '<br/>';
+                }
+            }
+            tip += '<div style="padding-top:2px;text-align:center;color:#9B9CA3;">' + ' - ' + params[0].name + ' - ' + '</div>'
+            return tip;
+        },
+        // 2.月度采购规模统计配置(折线图)
+        lineChartConfig: function(options) {
+            options.grid.top = 15;
+            options.yAxis[0].splitNumber = 5;
+            options.tooltip.formatter = function(params) {
+                var tip = '';
+                for (var i = 0; i < params.length; i++) {
+                    params[i].marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:' + params[i].color + ';"></span>'
+                    if(!params[i].value[1] && params[i].value[1] != 0) {
+                        tip = tip + ''
+                    } else {
+                        tip = tip + params[i].marker + params[i].seriesName + params[i].name + '采购规模:' + params[i].value[1].toString().replace(/,/,'') + '万元' +'<br/>';
+                    }
+                }
+                tip += '<div style="padding-top:2px;text-align:center;color:#9B9CA3;">' + ' - ' + params[0].name + ' - ' + '</div>'
+                return tip;
+            }
+            return options;
+        },
+        // 3.采购规模分布(热力图)
+        getHotChartData:function(arr){
+            var that = this;
+            var data = [];
+            var waitDelCount = 0;
+            var yAxis = chartOptions.hotChart.yAxis;
+            data = arr.map((v,i) => {
+                v.bidamount_avg = v.bidamount_avg == null ? '0' : v.bidamount_avg
+                var x = i % 10
+                var y = 10 - Math.ceil((i + 1)/10)
+                return [x,y,v.bidamount_avg,v.project_count,v.range]
+            })
+
+            for (var i = 9;i > -1;i--) {
+                var nowArr = data.slice(i*10, (i + 1)*10)
+                var nowDelStatus = nowArr.filter(function(v) { return v[3] > 0})
+                if (nowDelStatus.length > 0) {
+                    break
+                } else {
+                    waitDelCount ++
+                    data.splice(i*10, 10)
+                    yAxis[0].data.splice(0,1)
+                    yAxis[1].data.splice(0,1)
+                }
+            }
+            data.map(v => {
+                v[1] = v[1] - waitDelCount;
+                return v
+            })
+            console.log(waitDelCount,'减掉几行')
+            that.minusRows = waitDelCount;
+            chartOptions.hotChart.series[0].data = data;
+            var maxNum = Math.max.apply(Math, data.map(function(o) {return o[3]}))
+            chartOptions.hotChart.visualMap.max = maxNum < 10 ? 10 : maxNum;
+            var opt = chartOptions.hotChart;
+            opt.graphic[opt.graphic.length - 2].children[0].style.text = maxNum > 10 ? maxNum.toString() : '10';
+            opt.graphic[0].children[0].style.text = '项目数量(个)';
+            var  pj = Math.floor((opt.visualMap.max / 5)*100)/100;
+            opt.visualMap[0].pieces = [
+                {min: 0, max: 0, color: '#FFF4EB',symbol:'rect'},
+                {min: 1, max: pj*1, color: '#FFE7CF',symbol:'rect'},
+                {min: pj*1, max: pj*2,color: '#FFCF9F',symbol:'rect'},
+                {min: pj*2, max: pj*3,color: '#FFB366',symbol:'rect'},
+                {min: pj*3, max: pj*4,color: '#F48A5D',symbol:'rect'},
+                {min: pj*4, color: '#F06326',symbol:'rect'},
+            ];
+            opt.series[0].tooltip.formatter = function(params){
+                // console.log(params.value[2])
+                var data = params.value[4];
+                var newRange = data.split('-');
+                var sRange = utils.moneyUnit(newRange[0]);
+                var mRange = utils.moneyUnit(newRange[1]);
+                var totalRange;
+                if(sRange == '10000元') {
+                    sRange = '1万元'
+                }
+                if(mRange == '10000元') {
+                    mRange = '1万元'
+                }
+                if(sRange == '10000万元') {
+                    sRange = '1亿元'
+                }
+                if(mRange == '10000万元') {
+                    mRange = '1亿元'
+                }
+                if(sRange == '100亿元') {
+                    totalRange = sRange + '以上'
+                } else {
+                    totalRange = sRange + '-' + mRange
+                }
+                var tip = '';
+                var count = '<span>项目数量:' + params.value[3] + '个</span></br>';
+                var rate = (typeof params.value[2] === 'number' && !isNaN(params.value[2])) ? '<span>平均节支率:' + (params.value[2]*100).fixed(2) + '%</span></br>' : '';
+                var budget = '<span>采购规模:' + totalRange + '</span></br>';
+                tip = budget + count + rate;
+                return tip;
+            }
+            chartOptions.hotChart.series.pop();
+            chartOptions.hotChart.graphic.pop();
+            var index;
+            that.$nextTick(function(){
+                var ref = that.$refs.hotChart;
+                hotChart = echarts.init(ref,null,{renderer: "svg"});
+                hotChart.setOption(chartOptions.hotChart);
+                setTimeout(function(){
+                    // 默认展示某一个tooltip
+                    hotChart.dispatchAction({
+                        type: 'highlight',
+                        seriesIndex: 0,  // 显示第几个series
+                        dataIndex: that.getMaxProjectCount(data) // 显示第几个数据
+                    });
+                },20)
+                hotChart.on("mouseover", function(e) {
+                    index = that.getMaxProjectCount(data)
+                    if (e.dataIndex != index) {
+                        hotChart.dispatchAction({
+                            type: "downplay",
+                            seriesIndex: 0,
+                            dataIndex: index
+                        });
+                    }
+                });
+                hotChart.on("mouseout", function(e) {
+                    index = that.getMaxProjectCount(data)
+                    if (e.dataIndex != index) {
+                        hotChart.dispatchAction({
+                            type: "highlight",
+                            seriesIndex: 0,
+                            dataIndex: that.getMaxProjectCount(data)
+                        });
+                    }
+                });
+            })
+        },
+        // 4.各行业项目平均节支率
+        savingsRateConfig: function(options) {
+            var data = this.savingsRateData.rows;
+            var arr = [];
+            for (var i = 0; i < data.length; i++) {
+                var obj = data[i];
+                for (var key in obj) {
+                    if(key !== '日期' && obj[key]){
+                        arr.push(obj[key])
+                    }
+                }
+            }
+            var maxRate = Math.ceil(Math.max.apply(null,arr)).toString();
+            maxRate = Math.ceil(maxRate / (Math.pow(10,maxRate.length -1))) * Math.pow(10,maxRate.length -1);
+            console.log(maxRate)
+            options.color = ['#FB483D', '#05A6F3', '#0BD991', '#FF9F40','#8E6DF2','#C0C4CC'];
+            options.xAxis[0].axisLabel.margin = 12
+            options.yAxis[0].axisLabel.formatter = '{value}%';
+            options.yAxis[0].min = 0;
+            options.yAxis[0].max = maxRate;
+            options.yAxis[0].interval = Math.ceil(maxRate / 5);
+            options.grid = {
+                top: 20,
+                right: 16,
+                bottom: 70,
+                left: 10
+            }
+            options.legend.textStyle.padding = [0, 18, 0,0];
+            options.legend.left = 16;
+            options.legend.bottom = 10;
+            options.tooltip.formatter = function(params) {
+                var tip = '';
+                for (var i = 0; i < params.length; i++) {
+                    params[i].marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:' + params[i].color + ';"></span>'
+                    if(params[i].value[1] === undefined || params[i].value[1] === null || isNaN(params[i].value[1])) {
+                        tip = tip + params[i].marker + params[i].seriesName + ':--<br/>';
+                    } else {
+                        tip = tip + params[i].marker + params[i].seriesName + ':' + params[i].value[1] +'%<br/>';
+                    }
+                }
+                tip += '<div style="padding-top:2px;text-align:center;color:#9B9CA3;">' + ' - ' + params[0].name + ' - ' + '</div>'
+                return tip;
+            }
+            return options;
+        },
+        // 5.各行业项目规模占比(饼图自定义配置)
+        getPieCharData: function(data) {
+            var that = this;
+            var arr = [];
+            // 降序排列
+            data.sort(function(a,b){
+                return b.bidamount_share - a.bidamount_share
+            })
+            data.forEach(function(item){
+                arr.push(item.scopeclassName,item.bidamount_share,item.bidamount_count,item.project_count,item.rate_avg)
+            })
+            var normal =['行业','采购规模占比','采购规模', '采购项目数量','平均节支率'];
+            var newArr = that.arrTrans(5,arr);
+            newArr.unshift(normal)
+            chartOptions.deformPieChart.dataset.source = newArr;
+            chartOptions.deformPieChart.tooltip.formatter = function(params){
+                var tip = '';
+                var data = params.data;
+                params.marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:' + params.color +'"></span>';
+                var percent = '<span style="padding-left:13px;">采购规模占比:' + (data[1]*100).fixed(2) + '%</span></br>';
+                var scale = '<span style="padding-left:13px;">采购规模:' + utils.moneyUnit(data[2].fixed(2)) + '</span></br>';
+                var count = '<span style="padding-left:13px;">采购项目数量:' + data[3] + '个</span></br>';
+                var rate = (typeof data[4] === 'number' && !isNaN(data[4])) ? '<span style="padding-left:13px;">平均节支率:' + (data[4]*100).fixed(2) + '%</span></br>' : '';
+                tip = params.marker + params.name +'<br/>' + percent + scale + count + rate
+                return tip;
+            }
+            that.$nextTick(function(){
+                var ref = that.$refs.pieChart;
+                pieChart = echarts.init(ref,null,{renderer: "svg"});
+                pieChart.setOption(chartOptions.deformPieChart);
+                pieChart.resize();
+            })
+        },
+        arrTrans: function(num, arr) { // 一维数组转换为二维数组
+            var iconsArr = [];
+            arr.forEach(function(item, index) {
+                var page = Math.floor(index / num); // 计算该元素为第几个素组内
+                if (!iconsArr[page]) { // 判断是否存在
+                    iconsArr[page] = [];
+                }
+                iconsArr[page].push(item);
+            });
+            return iconsArr;
+        },
+        // 6.合作企业注册资本分布(柱状图+折线图配置)
+        regCapConfig: function (options) {
+            // console.log(options,'合作企业注册资本分布(柱状图+折线图)')
+            var customData = this.regCapitalData.customData;
+
+            var maxCountList = this.regCapitalData.rows.map(function(v){
+                return v['企业数量'];
+            })
+            var maxPriceList = this.regCapitalData.rows.map(function(v){
+                return v['累计采购规模'];
+            })
+            var maxLeft = Math.max.apply(null,maxCountList);
+            var maxRight = Math.max.apply(null,maxPriceList);
+            maxLeft = Math.ceil(maxLeft).toString();
+            maxRight = Math.ceil(maxRight).toString();
+            var l = Math.ceil(maxLeft / (Math.pow(10,maxLeft.length -1))) * Math.pow(10,maxLeft.length -1);
+            var r = Math.ceil(maxRight / (Math.pow(10,maxRight.length -1))) * Math.pow(10,maxRight.length -1);
+            var item = options.yAxis
+            item[0].min = 0;
+            item[1].min = 0;
+            item[0].max = l;
+            item[0].interval = Math.ceil(l / 5);
+            item[1].max = Math.ceil(r);
+            item[1].interval = Math.ceil((r - 0) / 5);
+            item[0].minInterval = 1;
+            options.tooltip.formatter = function(params) {
+                var obj = {}
+                var tip = '';
+                customData.forEach(function(v) {
+                    if(v['注册资本'] == params[0].name) {
+                        for(var key in v){
+                            obj[key] = v[key];
+                        }
+                    }
+                })
+                var regMoney = '<span>注册资本:' + obj['注册资本'] + '</span></br>';
+                var count = '<span>企业数量:' + obj['企业数量'] + '个</span></br>';
+                var scale = '<span>累计采购规模:' + obj['累计采购规模'] + '万元</span></br>';
+                var pCount = '<span>采购项目数量:' + obj['采购项目数量'] + '个</span></br>';
+                var rate = (typeof obj['平均节支率'] === 'number' && !isNaN(obj['平均节支率'])) ? '<span>平均节支率:' + (obj['平均节支率']*100).fixed(2) + '%</span></br>' : '';
+                tip = regMoney + count + scale + pCount + rate
+                return tip;
+            }
+            options.series.forEach(function(item) {
+                if(item.name == "累计采购规模") {
+                    item.type = 'line'
+                } else {
+                    item.type= 'bar'
+                    item.barWidth = 12
+                }
+            })
+            options.legend.formatter =  function(name){
+                if(name == "累计采购规模" ) {
+                    name = "累计采购规模(万元)-右轴"
+                }
+                if(name == "企业数量" ) {
+                    name = "企业数量(个)"
+                }
+                return name;
+            }
+            return options;
+        },
+        // 7.合作企业年龄分布配置项
+        workingAgeConfig: function(options) {
+            for (var i = 0; i < options.series.length; i++) {
+                options.series[i].barWidth = 20;
+                options.series[i].stack = '企业年龄分布'
+            }
+            var arr = this.workingAgeData.customData;
+            options.yAxis[0].minInterval = 1;
+            options.xAxis[0].name = '企业年龄(年)'
+            options.xAxis[0].axisLabel.interval = 0
+            options.tooltip.formatter = function(params) {
+                var obj = {}
+                var tip = '';
+                arr.forEach(function(v) {
+                    if(v['企业年龄'] == params[0].name) {
+                        for(var key in v){
+                            obj[key] = v[key];
+                        }
+                    }
+                })
+                var regMoney = '<span>企业年龄:' + obj['企业年龄'] + '</span></br>';
+                var count = '<span>企业数量:' + obj['企业数量'] + '个</span></br>';
+                var scale = '<span>累计采购规模:' + obj['累计采购规模'] + '万元</span></br>';
+                var pCount = '<span>采购项目数量:' + obj['采购项目数量'] + '个</span></br>';
+                var rate = (typeof obj['平均节支率'] == 'number' && !isNaN(obj['平均节支率'])) ? '<span>平均节支率:' + (obj['平均节支率']*100).fixed(2) + '%</span></br>' : '';
+                tip = regMoney + count + scale + pCount + rate
+                return tip;
+            }
+            options.color = ['#05A6F3']
+            return options;
+        },
+        // 8.合作企业注册地分布(地图配单独置项)
+        mapConfig: function(options) {
+            // console.log(options, '地图配置')
+            options.grid = {
+                left: 16,
+                right: 16
+            }
+            var arr = this.mapChartData.customData;
+            var maxNum = Math.max.apply(Math, arr.map(function(o) {return o['企业数量']}))
+            options.visualMap.min = 1;
+            options.visualMap.max = maxNum < 100 ? 100 : maxNum;
+            options.graphic[0].children[0].style.text = '企业数量(个)'
+            options.graphic[options.graphic.length - 1].children[0].style.text = maxNum > 100 ? maxNum : 100;
+            options.graphic[options.graphic.length - 1].children[1].style.text = 1;
+            options.tooltip.formatter = function(params) {
+                var obj = {}
+                var tip = '';
+                arr.forEach(function(v) {
+                    if(v['企业注册地'] == params.name) {
+                        for(var key in v){
+                            obj[key] = v[key];
+                        }
+                    }
+                })
+                if(Object.keys(obj).length > 0) {
+                    var regArea = '<span>企业注册地:' + obj['企业注册地'] + '</span></br>';
+                    var count = '<span>企业数量:' + obj['企业数量'] + '个</span></br>';
+                    var scale = '<span>累计采购规模:' + obj['累计采购规模'] + '万元</span></br>';
+                    var pCount = '<span>采购项目数量:' + obj['采购项目数量'] + '个</span></br>';
+                    var rate = (typeof obj['平均节支率'] == 'number' && !isNaN(obj['平均节支率']))? '<span>平均节支率:' + (obj['平均节支率']*100).fixed(2) + '%</span></br>' : '';
+                    tip = regArea + count + scale + pCount + rate
+                } else {
+                    tip = ''
+                }
+                return tip;
+            }
+            return options
+        },
+        // 4.各类招标方式占比图自定义tooltip
+        tooltipHandle:function(item,index){
+            // console.log(item,index)
+            this.doubleBar.showTooltip = true
+            item.positionLeft = Math.random()*100 + 'px'
+            item.positionTop = (index + 1)*20 + 'px'
+            this.doubleBar.info = item
+        },
+        openDialog: function () {
+          var _this = this
+          this.$dialog.confirm({
+            width: 303,
+            className: 'custom-dialog',
+            title: '您暂无使用权限',
+            message: '开通大会员,采购单位项目动态全面获取,帮助企业洞察采购需求,开发新客户!',
+            messageAlign:'left',
+            confirmButtonText: _this.power.indexOf(5) < 0 && _this.bigStatus > 0 ? '联系客服' : '去开通',
+            confirmButtonColor: '#2ABED1',
+            showCancelButton: true,
+            cancelButtonText: '取消'
+          }).then(function(){
+            if (_this.power.indexOf(5) < 0 && _this.bigStatus > 0) {
+              location.href = "tel: 400-108-6670"
+            } else {
+              _this.goBuyBuried('开通大会员,采购单位项目动态全面获取,帮助企业洞察采购需求,开发新客户!')
+            }
+          }).catch(function(err) {
+            console.log(err)
+          });
+        },
+        // 跳转三级页
+        goDetail: function(item){
+          if (item.id) {
+            var href = '/article/content/' + item.id + '.html'
+            location.href = href
+          } else {
+            if (this.power.indexOf(5) == -1) {
+              this.openDialog()
+            } else {
+              console.log('没有id')
+            }
+          }
+        },
+        // 求最大项目数量
+        getMaxProjectCount: function (analysisArr) {
+            if (!analysisArr || !$.isArray(analysisArr)) return
+            var itemMaxKey = 3  // 每一项中要比较大小的索引
+            var arr = JSON.parse(JSON.stringify(analysisArr))
+            utils.bSort(arr, itemMaxKey)
+            var maxCount = arr[arr.length - 1][itemMaxKey];
+            var maxIndex = -1
+            analysisArr.some(function (item, index) {
+                var gotIt = item[itemMaxKey] == maxCount
+                if (gotIt) maxIndex = index
+                return gotIt
+            })
+            return maxIndex
+        },
+    }
+}
+var unit = new Vue(vNode)

BIN
src/web/staticres/common-module/collection/image/buyer/01-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/01.png


BIN
src/web/staticres/common-module/collection/image/buyer/02-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/02.png


BIN
src/web/staticres/common-module/collection/image/buyer/03-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/03.png


BIN
src/web/staticres/common-module/collection/image/buyer/04-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/04.png


BIN
src/web/staticres/common-module/collection/image/buyer/05-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/05.png


BIN
src/web/staticres/common-module/collection/image/buyer/06-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/06.png


BIN
src/web/staticres/common-module/collection/image/buyer/07-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/07.png


BIN
src/web/staticres/common-module/collection/image/buyer/08-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/08.png


BIN
src/web/staticres/common-module/collection/image/buyer/09-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/09.png


BIN
src/web/staticres/common-module/collection/image/buyer/10-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/10.png


BIN
src/web/staticres/common-module/collection/image/buyer/11-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/11.png


BIN
src/web/staticres/common-module/collection/image/buyer/12-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/12.png


+ 206 - 0
src/web/staticres/common-module/collection/js/buyer-example.js

@@ -0,0 +1,206 @@
+var vipDialog = `
+<div class="vip_openDialog">
+  <div class="vip_head">
+      <span>{{getTextMap.titleText}}</span>
+      <span class="vip_extend"><span>{{getTextMap.headText.top}}</span><br/>{{getTextMap.headText.bot}}</span>
+  </div>
+  <div class="vip_content">
+    <div class="vip_content_div">
+      <img class="vip_img" :src="imgurl" />
+      <span class="vip_example">示例</span>
+    </div>
+  </div>
+  <div class="openBtn">
+      <button class="goBtn" @click="goOpen(getTextMap.headText.top,getTextMap.headText.bot)">{{getTextMap.btnText}}</button>
+  </div>
+</div>
+`
+
+var buyerExample = {
+  name: 'buyer-example',
+  template: vipDialog,
+  props: {
+    'imgurl': {
+      type: String,
+      default: function() {
+        return ''
+      }
+    },
+    "type": {
+      type: String,
+      default: function () {
+        return ''
+      }
+    },
+    "power": {
+      type: Array,
+      default: function () {
+        return []
+      }
+    },
+    "status": {
+      type: Number,
+      default: function () {
+        return 0
+      }
+    }
+  },
+  data: function() {
+    return {
+      titleText: '开通大会员',
+      btnText: '去开通',
+      headText: {
+        top: '通过实时监控项目的招标、中标、合同等',
+        bot: '信息,全面挖掘更多潜在商机!'
+      }
+    }
+  },
+  computed: {
+    getTextMap () {
+      var textMap = {
+        titleText: '开通大会员',
+        btnText: '去开通',
+        headText: {
+          top: '通过实时监控项目的招标、中标、合同等',
+          bot: '信息,全面挖掘更多潜在商机!'
+        }
+      }
+      if (this.power.indexOf(5) < 0 && this.status > 0) {
+        textMap.btnText = '联系客服'
+      }
+      switch (this.type) {
+          // 历史项目联系方式
+        case 'item_1': {
+          textMap.headText.top = ' 获取采购单位类似项目联系人、'
+          textMap.headText.bot = '联系方式等,一键拨打!'
+          break
+        }
+          // 年度项目统计
+        case 'item_2': {
+          textMap.headText.top = '采购单位年度项目规模、增长趋势'
+          textMap.headText.bot = '一目了然,快速分析市场!'
+          break
+        }
+          // 月度采购规模统计
+        case 'item_3': {
+          textMap.headText.top = '通过纵向对比近3年月度中标金额,'
+          textMap.headText.bot = '快速分析行业月度采购趋势!'
+          break
+        }
+          // 采购规模分布
+        case 'item_4': {
+          textMap.headText.top = '全面了解采购单位的年度采购规划、'
+          textMap.headText.bot = '项目预算,帮助投标人制定投标策略!'
+          break
+        }
+          // 各类招标方式占比
+        case 'item_5': {
+          textMap.headText.top = '洞察采购单位招标方式、数量、金额占比,'
+          textMap.headText.bot = '综合了解采购单位,帮企业决策是否投标!'
+          break
+        }
+          // 各行业项目平均节支率
+        case 'item_6': {
+          textMap.headText.top = '分析行业项目的预算、中标价格差额比率,'
+          textMap.headText.bot = '帮助企业核算采购项目的利润率!'
+          break
+        }
+          // 各行业项目规模占比
+        case 'item_7': {
+          textMap.headText.top = '通过行业采购项目的规模、数量、利润率,'
+          textMap.headText.bot = '洞悉采购单位的采购状况!'
+          break
+        }
+          // 重点合作企业
+        case 'item_8': {
+          textMap.headText.top = '通过挖掘重点合作企业,直观了解采购单位'
+          textMap.headText.bot = '与企业关系远近,辅助投标决策!'
+          break
+        }
+          // 合作企业注册资本分布
+        case 'item_9': {
+          textMap.headText.top = '通过分析合作企业注册资本、采购项目规模、'
+          textMap.headText.bot = '利润率,全面洞察采购单位合作企业!'
+          break
+        }
+         // 合作企业年龄分布
+        case 'item_10': {
+          textMap.headText.top = '通过分析合作企业年龄、数量、规模分布情况,'
+          textMap.headText.bot = '全面洞察采购单位合作企业!'
+          break
+        }
+        // 合作企业注册地分布
+        case 'item_11': {
+          textMap.headText.top = '通过分析合作企业的地址、数量、采购规模,'
+          textMap.headText.bot = '了解采购单位营商环境,辅助投标决策!'
+          break
+        }
+        // 重点合作代理机构
+        case 'item_12': {
+          textMap.headText.top = '通过提供合作代理机构的名录、数量,全面洞察'
+          textMap.headText.bot = '采购单位合作环境,辅助投标决策!'
+          break
+        }
+        default: {
+          textMap.headText.top = '采购单位项目动态全面获取,帮助企业'
+          textMap.headText.bot = '洞察采购需求,开发新客户!'
+          break
+        }
+      }
+      return textMap
+    },
+  },
+  methods: {
+    linkFn: function(id) {
+      var isWeixin = utils.isWeiXinBrowser
+      if(!isWeixin) {
+        if (this.getTextMap.btnText == '去开通') {
+          // 跳转到大会员
+          location.href = '/jyapp/big/page/buy_commit?bid=' + id
+        } else if (this.getTextMap.btnText == '联系客服') {
+          try {
+            JyObj.callPhone('400-108-6670');
+          } catch (error) {
+            console.log(error)
+          }
+        }
+      } else {
+        if (this.getTextMap.btnText == '去开通') {
+          // 跳转到大会员
+          location.href = '/big/wx/page/buy_commit?bid=' + id
+        } else if (this.getTextMap.btnText == '联系客服') {
+          location.href = 'tel:400-108-6670'
+        }
+      }
+    },
+    goOpen: function(top, bot) {
+      console.log(this.$parent.encryptId)
+      var params = {
+        mold: 'isCBBT',
+        id: this.$parent.encryptId,
+        introduce: top + bot
+      }
+      var _this = this
+      console.log(_this.getTextMap.btnText)
+      if (_this.getTextMap.btnText == '去开通') {
+        $.ajax({
+          type: 'POST',
+          url: '/publicapply/drainage/buyerunit',
+          contentType: "application/json",
+          data: JSON.stringify(params),
+          success: function (res) {
+            console.log(res)
+            _this.linkFn(_this.$parent.encryptId)
+          },
+          error: function (error) {
+            console.log(error)
+            _this.linkFn(_this.$parent.encryptId)
+          }
+        })
+      } else if (_this.getTextMap.btnText == '联系客服') {
+        _this.linkFn(_this.$parent.encryptId)
+      }
+      
+    }
+  }
+}

+ 3 - 1
src/web/staticres/common-module/collection/js/history-project.js

@@ -12,7 +12,7 @@ var historyProTemplate = `
                   <div class="his-contact-list" v-for="(data,index) in item.contacts">
                       <div class="contact-top">
                           <div class="contactlabel">联系人:</div>
-                          <div class="contact-name">{{data[Object.keys(data)]}}</div>
+                          <div class="contact-name">{{data[Object.keys(data)] || '--'}}</div>
                       </div>
                       <a :href="'tel:'+Object.keys(data)[0]" class="contact-bot" v-if="Object.keys(data)[0]!==''" @click="telPhoneClick($event,Object.keys(data)[0])">
                           <div class="con-left">
@@ -128,6 +128,8 @@ var hisproComponent = {
                 _this.list = res.data.list
               }
             }
+          } else {
+            loading.clear()
           }
         }
       })

Fișier diff suprimat deoarece este prea mare
+ 21 - 1
src/web/staticres/css/wxcontentinfo.css


BIN
src/web/staticres/images/big-drain.png


BIN
src/web/staticres/images/pc-drainage-bg.png


+ 60 - 15
src/web/staticres/vipsubscribe/js/keyWord.js

@@ -26,6 +26,11 @@ var vm = new Vue({
     }
   },
   computed: {
+    keyListSorted: function () {
+      return this.filter.keywordsList.sort(function (a, b) {
+        return b.updatetime - a.updatetime
+      })
+    },
     fastImportTipShow: function () {
       return this.filter.allKeywordsList.length === 0 && this.filter.loaded && this.tip.fastImport
     },
@@ -135,33 +140,54 @@ var vm = new Vue({
     },
     // 向关键词中添加一些信息
     addInfoToKeyItem: function (groupList) {
+      var _this = this
       if (!Array.isArray(groupList)) return []
+      var arr = []
 
       groupList.forEach(function (keywordsList, index) {
-        if (Array.isArray(keywordsList.a_key)) {
+        if (keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
+          keywordsList.updatetime = _this.getMaxUpdateTime(keywordsList.a_key)
           keywordsList.a_key.forEach(function (keyword, iindex) {
             // 添加一些其他信息
             keyword.groupName = keywordsList.s_item // 分类名
             keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
             keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
           })
+          arr.push(keywordsList)
         }
       })
 
-      return groupList
+      return arr
     },
     getGroupNameList: function (keywordsGroupList) {
       var groupNameList = []
       if (!Array.isArray(keywordsGroupList)) return groupNameList
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          count: count // 分类下有多少个关键词
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex
+          })
+        }
       })
       return groupNameList
     },
+    getMaxUpdateTime: function (arr) {
+      var max = 0
+      if (!Array.isArray(arr)) return max
+      arr.some(function (item) {
+        if (item.updatetime && item.updatetime > max) {
+          max = item.updatetime
+        }
+      })
+      return max
+    },
     calcKeyInfo: function (item) {
       // 匹配方式 item.matchway 0/null精准 1模糊
       var key = item.key
@@ -233,7 +259,7 @@ var vm = new Vue({
         // type: edit编辑、add新增
         // gIndex: groupIndex 该关键词所在分类 在分类列表中的索引
         // kIndex: keyIndex 该关键词在其所在分类中的索引
-        location.href = `/front/vipsubscribe/toSetInfoPage?type=edit&gIndex=${item.groupIndex}&kIndex=${item.keyIndex}`
+        location.href = `/front/vipsubscribe/toSetinfoPage?type=edit&gIndex=${item.groupIndex}&kIndex=${item.keyIndex}`
       }
     },
     batchDeleteStateChange: function () {
@@ -279,6 +305,7 @@ var vm = new Vue({
 
       for (var key in deleteKeyArr) {
         if (Array.isArray(deleteKeyArr[key])) {
+          deleteKeyArr[key] = deleteKeyArr[key].sort(function (a, b) { return a - b })
           deleteKey[key] = deleteKeyArr[key].join(',')
         }
       }
@@ -286,6 +313,7 @@ var vm = new Vue({
     },
     batchDeleteConfirmed: function () {
       var deleteKey = this.getDeleteKey()
+      if (Object.keys(deleteKey).length === 0) return
       var loading = this.showLoading()
       var _this = this
       $.ajax({
@@ -316,7 +344,7 @@ var vm = new Vue({
       // instance 为对应的 SwipeCell 实例
       var position = e.position
       var instance = e.instance
-      var index = e.name
+      var index = e.name // item.groupIndex-item.keyIndex
 
       switch (position) {
         case 'left': {
@@ -339,6 +367,19 @@ var vm = new Vue({
         }
       }
     },
+    getGroupFromIndex: function (gIndex, kIndex) {
+      var groupItem = {}
+      this.filter.keywordsList.some(function (item) {
+        if (item) {
+          var gotThis = item.groupIndex == gIndex && item.keyIndex == kIndex
+          if (gotThis) {
+            groupItem = item
+          }
+          return gotThis
+        }
+      })
+      return groupItem
+    },
     /**
      * 删除单个关键词
      * @param {number} index 当前关键词在列表中的index
@@ -347,7 +388,11 @@ var vm = new Vue({
     delThisKey: function (index, instance) {
       var _this = this
       // 需要找到当前关键词组的item
-      var key = this.filter.keywordsList[index]
+      var indexArr = index.split('-')
+      var gIndex = indexArr[0]
+      var kIndex = indexArr[1]
+      var key = this.getGroupFromIndex(gIndex, kIndex)
+
       this.showDialog({
         title: '',
         message: '确定删除当前关键词?',
@@ -364,9 +409,9 @@ var vm = new Vue({
     // 根据分类名,得到分类索引
     getGroupIndexWithGroupName: function (gn) {
       var groupIndex = -1
-      this.keywordsGroupList.forEach(function(item, index) {
+      this.keywordsGroupList.forEach(function(item) {
         if (gn === item.s_item) {
-          groupIndex = index
+          groupIndex = item.groupIndex
         }
       })
       return groupIndex
@@ -382,10 +427,10 @@ var vm = new Vue({
       }
 
       var queryString = this.qsStringify(query)
-      location.href = '/front/vipsubscribe/toSetInfoPage' + '?' + queryString
+      location.href = '/front/vipsubscribe/toSetinfoPage' + '?' + queryString
     },
     toKeyManagePage: function () {
-      location.href = '/front/vipsubscribe/toSetManagePage'
+      location.href = '/front/vipsubscribe/toSetmanagePage'
     },
     fastImportDialogShow: function () {
       this.dialog.fastImport = true

+ 18 - 10
src/web/staticres/vipsubscribe/js/keyword-info.js

@@ -192,31 +192,39 @@ var vm = new Vue({
     // 向关键词中添加一些信息
     addInfoToKeyItem: function (groupList) {
       if (!Array.isArray(groupList)) return []
+      var arr = []
 
       groupList.forEach(function (keywordsList, index) {
-        if (Array.isArray(keywordsList.a_key)) {
+        if (keywordsList && keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
           keywordsList.a_key.forEach(function (keyword, iindex) {
             // 添加一些其他信息
             keyword.groupName = keywordsList.s_item // 分类名
             keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
             keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
           })
+          arr.push(keywordsList)
         }
       })
 
-      return groupList
+      return arr
     },
     getGroupNameList: function (keywordsGroupList) {
       var groupNameList = []
       if (!Array.isArray(keywordsGroupList)) return groupNameList
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          checked: false,
-          count: count, // 分类下有多少个关键词
-          gIndex: index
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            checked: false,
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex
+          })
+        }
       })
       return groupNameList
     },

+ 76 - 18
src/web/staticres/vipsubscribe/js/keyword-manage.js

@@ -5,6 +5,7 @@ var vm = new Vue({
     batchDeleteState: false, // 是否在批量删除状态
     userData: {}, // getUserInfo接口用户原始数据
     groupNameList: [],
+    keywordsGroupList: [],
     listState: {
       loaded: false
     },
@@ -16,6 +17,11 @@ var vm = new Vue({
     },
   },
   computed: {
+    groupNameListSorted: function () {
+      return this.groupNameList.sort(function (a, b) {
+        return b.updatetime - a.updatetime
+      })
+    },
     listShow: function () {
       return this.groupNameList.length !== 0 && this.listState.loaded
     },
@@ -85,10 +91,10 @@ var vm = new Vue({
             _this.userData = res.userData
             if (res.userData && res.userData.o_vipjy) {
               // 整理数据
-              var list = _this.getGroupNameList(res.userData.o_vipjy.a_items)
-              if (Array.isArray(list)) {
-                _this.groupNameList = list
-              }
+              var groupList = _this.addInfoToKeyItem(res.userData.o_vipjy.a_items)
+              var groupNameList = _this.getGroupNameList(groupList)
+              _this.keywordsGroupList = groupList
+              _this.groupNameList = groupNameList
             }
           }
         },
@@ -102,20 +108,59 @@ var vm = new Vue({
         }
       })
     },
+    // 向关键词中添加一些信息
+    addInfoToKeyItem: function (groupList) {
+      var _this = this
+      if (!Array.isArray(groupList)) return []
+      var arr = []
+
+      groupList.forEach(function (keywordsList, index) {
+        if (keywordsList && Array.isArray(keywordsList.a_key)) {
+          keywordsList.groupIndex = index
+          keywordsList.updatetime = _this.getMaxUpdateTime(keywordsList.a_key)
+          keywordsList.a_key.forEach(function (keyword, iindex) {
+            // 添加一些其他信息
+            keyword.groupName = keywordsList.s_item // 分类名
+            keyword.groupIndex = index // 该关键词所在分类 在分类列表中的索引
+            keyword.keyIndex = iindex // 该关键词在其所在分类中的索引
+            if (!keyword.updatetime) {
+              keyword.updatetime = 0
+            }
+          })
+          arr.push(keywordsList)
+        }
+      })
+
+      return arr
+    },
     getGroupNameList: function (keywordsGroupList) {
       if (!Array.isArray(keywordsGroupList)) return
       var groupNameList = []
-      keywordsGroupList.forEach(function (item, index) {
-        var count = Array.isArray(item.a_key) ? item.a_key.length : 0
-        groupNameList.push({
-          name: item.s_item, // 分类名
-          checked: false,
-          deleteDisabled: count > 0, // 该分类是否能被删除
-          count: count // 分类下有多少个关键词
-        })
+      keywordsGroupList.forEach(function (item) {
+        if (item) {
+          var count = Array.isArray(item.a_key) ? item.a_key.length : 0
+          groupNameList.push({
+            name: item.s_item, // 分类名
+            checked: false,
+            deleteDisabled: count > 0, // 该分类是否能被删除
+            count: count, // 分类下有多少个关键词
+            groupIndex: item.groupIndex,
+            updatetime: item.updatetime
+          })
+        }
       })
       return groupNameList
     },
+    getMaxUpdateTime: function (arr) {
+      var max = 0
+      if (!Array.isArray(arr)) return max
+      arr.some(function (item) {
+        if (item.updatetime && item.updatetime > max) {
+          max = item.updatetime
+        }
+      })
+      return max
+    },
     // 通过已有分类得到一个未分类名
     getNewClassName: function () {
       var conf = {
@@ -162,9 +207,9 @@ var vm = new Vue({
     },
     getSelectIndexArr: function () {
       var selectedIndexArr = []
-      this.groupNameList.forEach(function (item, index) {
+      this.groupNameList.forEach(function (item) {
         if (!item.deleteDisabled && item.checked) {
-          selectedIndexArr.push(index)
+          selectedIndexArr.push(item.groupIndex)
         }
       })
       return selectedIndexArr
@@ -214,7 +259,7 @@ var vm = new Vue({
         }
       })
     },
-    clickKeyCard: function (item, index) {
+    clickKeyCard: function (item) {
       if (this.batchDeleteState) {
         // 执行点击选中逻辑
         // 如果关键词组下有关键词,则不能点击
@@ -223,7 +268,7 @@ var vm = new Vue({
         }
       } else {
         // 显示修改关键词组名弹框
-        this.editGroupName('edit', item, index)
+        this.editGroupName('edit', item, item.groupIndex)
       }
     },
     beforeKeySwipeCellClose: function (e) {
@@ -231,7 +276,7 @@ var vm = new Vue({
       // instance 为对应的 SwipeCell 实例
       var position = e.position
       var instance = e.instance
-      var index = e.name
+      var index = e.name // item.groupIndex
 
       switch (position) {
         case 'left': {
@@ -254,6 +299,19 @@ var vm = new Vue({
         }
       }
     },
+    getGroupFromIndex: function (idx) {
+      var groupItem = {}
+      this.groupNameList.some(function (item) {
+        if (item) {
+          var gotThis = item.groupIndex == idx
+          if (gotThis) {
+            groupItem = item
+          }
+          return gotThis
+        }
+      })
+      return groupItem
+    },
     /**
      * 删除单个分类
      * @param {number} index 当前关键词在当前分组的index
@@ -262,7 +320,7 @@ var vm = new Vue({
     delThisKey: function (index, instance) {
       var _this = this
       // 需要找到当前分类的item
-      var group = this.groupNameList[index]
+      var group = this.getGroupFromIndex(index)
       this.showDialog({
         title: '',
         message: '确定删除当前分类?',

+ 18 - 2
src/web/templates/big-member/pc/page_buy_commit.html

@@ -507,6 +507,7 @@
                 return openLoginDig()
             }
             var paramsMid = getParam('mid')
+            var paramsUnit = getParam('unit')
             $.ajax({
                 type: 'POST',
                 url: '/jypay/bigmember/createOrder',
@@ -516,6 +517,21 @@
                     order_phone: OrderPhoneCheck.phone
                 },
                 success: function (res) {
+                  // 采购单位画像引流
+                    if (paramsUnit && res.data && res.data.order_code) {
+                        $.ajax({
+                            type: 'POST',
+                            url: '/publicapply/drainage/buyerunit',
+                            data: JSON.stringify({
+                                mold: 'isOBT',
+                                price: getDisPrice(getParams.level, getParams.cycle)*100,
+                                orderCode: res.data.order_code,
+                                id: paramsUnit
+                            }),
+                            contentType: "application/json",
+                            dataType: "json"
+                        })
+                    }
                   // 判断url里是否有引导语文案id,如果有就需要埋点
                   if (paramsMid && res.data && res.data.order_code) {
                       try {
@@ -548,8 +564,8 @@
                       })
                     }
                     setTimeout(function() {
-                      history.replaceState({"flag": "pay"}, '', '/front/member/memberDetail?order_code=' + res.data.order_code);
-                      location.href = '/front/member/orderPay/' + res.data.order_code + '?mid=' + paramsMid;
+                      history.replaceState({"flag": "pay"}, '', '/front/member/memberDetail?order_code=' + res.data.order_code + (paramsUnit ? ('&unit=' + paramsUnit): ''));
+                      location.href = '/front/member/orderPay/' + res.data.order_code + '?mid=' + paramsMid + (paramsUnit ? ('&unit=' + paramsUnit): '');
                     }, 300)
                 }
             })

+ 29 - 3
src/web/templates/big-member/pc/page_index.html

@@ -1219,9 +1219,12 @@
         })
         $('*[data-go-buy]').on('click', function () {
             var member_pc=getMemberSource(source);
+            var i = 0
+            var introduce = '';
             try {
-                var i = $(this).attr('id').split('go-buy-')[1] || 0
-                _hmt.push(['_trackEvent',member_pc, 'click', corrMap[i]]);
+                i = $(this).attr('id').split('go-buy-')[1] || 0
+                introduce = corrMap[i]
+                _hmt.push(['_trackEvent',member_pc, 'click', introduce]);
             } catch (e) {
                 console.log('未初始化百度统计', e)
             }
@@ -1234,6 +1237,27 @@
                 openLoginDig()
                 return
             }
+            // 采购单位画像引流
+            var paramsUnit = getParam('unit')
+            if (paramsUnit) {
+                $.ajax({
+                    type: 'POST',
+                    url: '/publicapply/drainage/buyerunit',
+                    data: JSON.stringify({
+                        mold: 'isCBBT',
+                        introduce: introduce,
+                        id: paramsUnit
+                    }),
+                    contentType: "application/json",
+                    dataType: "json",
+                    success: function (r) {
+                        toNextPage()
+                    },
+                    error: function (r) {
+                        toNextPage()
+                    }
+                })
+            }
             // 判断是不是从有没有引流文案
             if (getParam('id')) {
               try {
@@ -1268,7 +1292,9 @@
                 // 购买过
                 location.href = '/swordfish/page_big_pc'
             } else {
-                var buy_commit_href ='/big/pc/page/buy_commit?mid=' + getParam('id');
+                // 采购单位画像引流
+                var paramsUnit = getParam('unit')
+                var buy_commit_href ='/big/pc/page/buy_commit?mid=' + getParam('id') + (paramsUnit ? ('&unit=' + paramsUnit): '');
                 if(source!=null&&source!=undefined){
                   buy_commit_href+="&source="+source;//baidusem
                 }

+ 23 - 2
src/web/templates/big-member/wx/page_buy_commit.html

@@ -450,6 +450,7 @@
                     level = 1
                 }
                 var paramsMid = utils.getParam('mid') //引流语文案id
+                var buyerId = utils.getParam('bid') // 从采购单位画像页面携带的加密id
                 $.ajax({
                     type:'POST',
                     url:'/jypay/bigmember/createOrder',
@@ -461,7 +462,7 @@
                     success:function(res){
                         if( res.error_code >= 0 ){
                           // 判断url里是否有引导语文案id,如果有就需要埋点
-                          if (paramsMid) {
+                            if (paramsMid) {
                               try {
                                 $.ajax({
                                   type: "POST",
@@ -479,9 +480,29 @@
                                 console.log(error)
                               }
                             }
+                            // 采购单位画像跳转过来的埋点
+                            if (buyerId) {
+                              var params = {
+                                mold: 'isOBT',
+                                price: Number(_this.afterall.replace(',', ''))*100,
+                                orderCode: res.data.order_code
+                              }
+                              $.ajax({
+                                type: 'POST',
+                                url: '/publicapply/drainage/buyerunit',
+                                contentType: "application/json",
+                                data: JSON.stringify(params),
+                                success: function (res) {
+                                  console.log(res)
+                                },
+                                error: function (error) {
+                                  console.log(error)
+                                }
+                              })
+                            }
                             setTimeout(function(){
                               history.replaceState({"flag": "pay"}, '', '/front/wxMyOrder/memberDetail/' + res.data.order_code);
-                              location.href = '/weixin/pay/checkout_member?orderCode='+res.data.order_code + '&mid=' +paramsMid;
+                              location.href = '/weixin/pay/checkout_member?orderCode='+res.data.order_code + '&mid=' +paramsMid + '&bid=' + buyerId;;
                             },300)
                         }else {
                             alert(res.error_msg)

+ 390 - 0
src/web/templates/big-member/wx/page_unit_portrayal.html

@@ -0,0 +1,390 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+    <title>采购单位画像 </title>
+
+    <!--引入公共资源头部-->
+    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="format-detection" content="telephone=yes"/>
+    <meta name="apple-mobile-web-app-status-bar-style" content="black">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+
+    <!--S-当前页必定需要预加载的资源-->
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="preload" as="style" href=//cdn.jsdelivr.net/npm/v-charts@1.19.0/lib/style.min.css />
+    <!--E-当前页必定需要预加载的资源-->
+    <script src="/big-member/js/rem.js"></script>
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/v-charts@1.19.0/lib/style.min.css />
+    <!--E-当前页面的css资源-->
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/public.css?v={{Msg "seo" "version"}}'>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/j-icons.css?v={{Msg "seo" "version"}}'>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/css/unit_portrayal.css?v={{Msg "seo" "version"}}' />
+    <style>
+        .skeleton{
+            height: 100%;
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-content: center;
+            background-color: #fff;
+        }
+        .working{
+            width: 4rem;
+            height: 4rem;
+            margin: -0.4rem auto 0;
+        }
+        .v-charts-component-loading{
+            top:0.96rem;
+            z-index: 999;
+            min-height: 284px;
+        }
+        .vip_component{
+          position: relative;
+          margin-top: -1px;
+        }
+        .example-title{
+          position: absolute;
+          top:.32rem;
+          left:0.32rem;
+          font-size: .36rem;
+        }
+        .d_title{
+          font-weight: normal;
+        }
+        .vip_openDialog{
+            padding: 0.56rem 0 0.64rem;
+            width: 6.06rem;
+            /* height: 6.88rem; */
+            background: url('{{Msg "seo" "cdn"}}/big-member/image/openVip.png') no-repeat;
+            background-size: 100% 100%;
+            box-sizing: border-box;
+        }
+    </style>
+</head>
+<body>
+<div class="j-container">
+    <div id="unit_portrayal" class="j-main" v-cloak @click="doubleBar.showTooltip = false">
+        <div v-if="chartLoading" class="skeleton">
+            <img class="working"  src="/big-member/image/working.gif" alt="">
+        </div>
+        <div v-else>
+          <div class="u-header">
+              <div class="company">
+                  <span class="j-icon icon-company"></span>
+                  <span class="ent-title">${buyer.name || '--'}</span>
+              </div>
+              <p class="region">所在地:${statistics.province || '--'} ${statistics.city}</p>
+              <p class="buyer-type">采购单位类型:${statistics.buyerClass || '--'}</p>
+              <div class="buyer-info">
+                  <div class="bi-item">
+                      <span>采购项目数量</span>
+                      <span>${statistics.buyerCount || '--'}</span>
+                  </div>
+                  <div class="bi-item">
+                      <span>采购规模</span>
+                      <span>${statistics.buyerScale || '--'}</span>
+                  </div>
+                  <div class="bi-item">
+                      <span>中标企业数量</span>
+                      <span>${statistics.winnerCount || '--'}</span>
+                  </div>
+                  <div class="bi-item">
+                      <span>外省中标企业</span>
+                      <span>${statistics.otherWinner || '--'}</span>
+                  </div>
+                  <div class="bi-item">
+                      <span>流标记录数</span>
+                      <span>${statistics.fail_count || '--'}</span>
+                  </div>
+              </div>
+              <div class="static-scope">数据统计范围:${statistics.start || '-'}-${statistics.end}</div>
+          </div>
+          <div class="empty" v-show="allNot">
+              <div class="j-img img-empty empty-img"></div>
+              <p class="empty-text">暂无画像信息</p>
+          </div>
+          <!-- 招标动态 -->
+          <div class="dynamic" v-if="isShow.showDynamic">
+              <div class="d_title">招标动态</div>
+              <div class="d_content">
+                  <div class="d_list" v-for="(item,index) in dt.list" @click="goDetail(item)">
+                      <p class="i_title">${item.title}</p>
+                      <div class="i_info">
+                          <p class="area_type">
+                              <span v-if="item.area" class="i_area">${item.area}</span>
+                              <span v-if="item.bidstatus" class="i_type">${item.bidstatus}</span>
+                              <span v-if="item.bidamount" class="i_type">${item.bidamount}</span>
+                          </p>
+                          <p class="i_time">${item.firsttime}</p>
+                      </div>
+                  </div>
+                  <div v-show="dt.isNext">
+                      <div class="more">
+                          <span @click.stop="getNewMsg">查看更多</span>
+                      </div>
+                  </div>
+              </div>
+          </div>
+          <!-- 历史项目联系人 -->
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/01-bg.png?v=1') no-repeat;background-size:100% 100%;">
+            <p class="example-title">历史项目联系方式</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_1" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/01.png'></buyer-example>
+          </div>
+          <div v-else>
+            <hispro-component class="history-list" type="buyer" :buyer="buyer.name"></hispro-component>
+          </div>
+          <!-- 年度项目统计 -->
+          <div class="years" v-if="isShow.showYearData">
+              <div class="chart_title">年度项目统计</div>
+              <ve-histogram
+                  ref="projectDataCharts"
+                  height="284px"
+                  :colors="colorGreen"
+                  :data="projectData"
+                  :init-options="initRendererSvg"
+                  :after-config="projectConfig"
+                  :settings="projectChartSettings"
+                  :extend="barChart.chartExtend">
+              </ve-histogram>
+              <div class="bar-tip">注:项目金额指所有项目的中标金额之和,少数缺失的中标金额,用项目预算补充。</div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/02-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">年度项目统计</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_2" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/02.png'></buyer-example>
+          </div>
+          <!-- 月度采购规模统计 -->
+          <div class="month-scale" v-if="isShow.showMonthScale">
+              <div class="chart_title">月度采购规模统计</div>
+              <div class="lineChart">
+                  <div style="padding: 6px 12px 0;font-size: 10px;color: #9B9CA3;">采购规模(万元)</div>
+                  <ve-line :init-options="initRendererSvg" :data="monthScaleData" height="300px" :after-config="lineChartConfig" :extend="chartOptions.lineChart"></ve-line>
+              </div>
+              <div class="bar-tip">注:采购规模指中标金额,少数缺失的中标金额,用项目预算补充。</div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/03-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">月度采购规模统计</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_3" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/03.png'></buyer-example>
+          </div>
+          <!-- 采购规模分布 -->
+          <div class="scale-distribute" v-if="isShow.showScaleFb">
+              <div class="chart_title">采购规模分布</div>
+              <div class="hotMapChart">
+                  <div id="myChart" ref="hotChart" :style="{height: heatMapHeight}"></div>
+              </div>
+              <div class="bar-tip">注:平均节支率=(全部项目预算-全部中标金额)/全部项目预算,是指价格减让部分与原价的比率,仅统计预算和中标金额同时存在的项目。</div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/04-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">采购规模分布</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_4" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/04.png'></buyer-example>
+          </div>
+          <!-- 各类招标方式占比(双柱图) -->
+          <div class="double-bar" v-if="isShow.showBidType">
+              <div class="chart_title">各类招标方式占比</div>
+              <div class="bar-content">
+                  <div class="rate-item" v-for="(item,index) in doubleBar.list" @click.stop="tooltipHandle(item,index)">
+                      <div class="item-label">${item.type}</div>
+                      <div class="item-chart">
+                          <div class="left-chart">
+                              <div class="item-progress" v-if="item.lPercent > 50">
+                                  <span class="blue-progress-bg blue-padding" :style="{width: item.lPercent + '%'}">${item.num}(${item.numShare  + '%'})</span>
+                              </div>
+                              <div class="item-progress" v-else>
+                                  <span class="blue-progress-text">${item.num}(${item.numShare  + '%'})</span>
+                                  <span class="blue-progress-bg" :style="{width: item.lPercent + '%'}"></span>
+                              </div>
+                          </div>
+                          <div class="right-chart">
+                              <div class="item-progress" v-if="item.rPercent > 50">
+                                  <span class="yellow-progress-bg yellow-padding" :style="{width: item.rPercent + '%'}">${item.money}(${item.moneyShare + '%'})</span>
+                              </div>
+                              <div class="item-progress" v-else>
+                                  <span class="yellow-progress-bg" :style="{width: item.rPercent + '%'}"></span>
+                                  <span class="yellow-progress-text">${item.money}(${item.moneyShare + '%'})</span>
+                              </div>
+                          </div>
+                      </div>
+                  </div>
+                  <div class="tooltip" v-show="doubleBar.showTooltip" :style="{left:doubleBar.info.positionLeft,top:doubleBar.info.positionTop}">
+                      <div class="tooltip-item">
+                          <span class="tooltip-circle blue-circle"></span>
+                          <span>数量(个)及占比:${doubleBar.info.num}(${doubleBar.info.numShare + '%'})</span>
+                      </div>
+                      <div class="tooltip-item">
+                          <span class="tooltip-circle yellow-circle"></span>
+                          <span>金额(万元)及占比:${doubleBar.info.money}(${doubleBar.info.moneyShare + '%'})</span>
+                      </div>
+                      <div class="tooltip-name">- ${doubleBar.info.type} -</div>
+                  </div>
+                  <div class="custom-legend">
+                      <div class="legend-item">
+                          <span class="tooltip-circle blue-circle"></span>
+                          <span>数量(个)及占比</span>
+                      </div>
+                      <div class="legend-item">
+                          <span class="tooltip-circle yellow-circle"></span>
+                          <span>金额(万元)及占比</span>
+                      </div>
+                  </div>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:8.8rem;background:url('/common-module/collection/image/buyer/05-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">各类招标方式占比</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_5" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/05.png'></buyer-example>
+          </div>
+          <!-- 各行业项目平均节支率 -->
+          <div class="savings-rate" v-if="isShow.showSaveRate">
+              <div class="chart_title">各行业项目平均节支率</div>
+              <div class="lineChart">
+                  <ve-line :init-options="initRendererSvg" :data="savingsRateData" height="314px" :after-config="savingsRateConfig" :extend="chartOptions.lineChart"></ve-line>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/06-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">各行业项目平均节支率</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_6" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/06.png'></buyer-example>
+          </div>
+          <!-- 各行业项目规模占比 -->
+          <div class="industry-scale-rate" v-if="isShow.showScaleRate">
+              <p class="chart_title">各行业项目规模占比</p>
+              <div class="pieChart">
+                  <div ref="pieChart" style="height: 360px;"></div>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:11.2rem;background:url('/common-module/collection/image/buyer/07-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">各行业项目规模占比</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_7" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/07.png'></buyer-example>
+          </div>
+          <!-- 重点合作企业 -->
+          <div class="client" v-if="computedClientList && computedClientList.length> 0">
+              <div class="client-title">重点合作企业</div>
+              <div class="client-content">
+                  <div class="client-list" v-for="c in computedClientList" >
+                      <div class="c-thead">
+                          <strong class="c-name">${c.class}</strong>
+                          <span class="c-count">项目数量</span>
+                          <!-- <span class="c-rate">平均折扣率</span> -->
+                          <span class="c-time">最近合作日期</span>
+                      </div>
+                      <div class="progress-bar-container">
+                          <div class="progress-bar-item" v-for="(item,index) in c.topData" :key="index">
+                              <div class="item-label">
+                                  <span @click="goEntInfo(item)" class="ellipsis-2 item-name">${item.winnerName}</span>
+                                  <span class="item-count">${item.countProject}个</span>
+                                  <!-- <span class="item-rate">${item.rate}</span> -->
+                                  <span class="item-time">${item.lastTime}</span>
+                              </div>
+                              <div class="item-progress">
+                                  <span class="item-money"  v-if="item.countMoney > 0">${utils.moneyUnit(item.countMoney)}</span>
+                                  <span class="item-progress-count active-progress" :style="{width: item.parent}"></span>
+                              </div>
+                          </div>
+                      </div>
+                  </div>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/08-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">重点合作企业</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_8" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/08.png'></buyer-example>
+          </div>
+          <!-- 合作企业注册资本分布 -->
+          <div class="industry-scale-rate" v-if="isShow.showCapital">
+              <p class="chart_title">合作企业注册资本分布</p>
+              <div class="barChart">
+                  <ve-histogram :init-options="initRendererSvg" height="284px" set-option-opts :data="regCapitalData" :after-config="regCapConfig" :settings="regCapSettings" :extend="chartOptions.barLineChart.chartExtend"> </ve-histogram>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/09-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">合作企业注册资本分布</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_9" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/09.png'></buyer-example>
+          </div>
+          <!-- 合作企业年龄分布 -->
+          <div class="industry-scale-rate" v-if="isShow.showAge">
+              <p class="chart_title">合作企业年龄分布</p>
+              <div class="barChart">
+                  <ve-histogram :init-options="initRendererSvg" height="284px" :data="workingAgeData" :after-config="workingAgeConfig" :extend="chartOptions.barLineChart.chartExtend"> </ve-histogram>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/10-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">合作企业年龄分布</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_10" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/10.png'></buyer-example>
+          </div>
+          <!-- 合作企业注册地分布 -->
+          <div class="industry-scale-rate" v-if="isShow.showArea">
+              <p class="chart_title">合作企业注册地分布</p>
+              <div class="map" style="padding: 0 .32rem;">
+                  <ve-map
+                      :init-options="initRendererSvg"
+                      height="302px"
+                      :after-config="mapConfig"
+                      :data="mapChartData"
+                      :settings="mapSettings.chartSettings"
+                      :extend="mapSettings.chartExtend">
+                  </ve-map>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/11-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">合作企业注册地分布</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_11" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/11.png'></buyer-example>
+          </div>
+          <!-- 重点合作代理机构 -->
+          <div class="agency" v-if="isShow.showAgency">
+              <div class="agency-title">重点合作代理机构</div>
+              <div class="agency-container">
+                  <div class="agency-thead">
+                      <strong class="a-name"></strong>
+                      <span class="a-count">项目数量</span>
+                      <span class="a-time">最近合作日期</span>
+                  </div>
+                  <div class="agency-tbody">
+                      <div v-for="item in agencyList" class="ab-list">
+                          <div class="ab-label">
+                              <span class="ellipsis-2 ab-name">${item.agency_name}</span>
+                              <span class="ab-count">${item.project_count}个</span>
+                              <span class="ab-time">${item.last_with_time}</span>
+                          </div>
+                          <div class="ab-progress">
+                              <span class="ab-progress-default progress-active" :style="{width: item.parent}"></span>
+                          </div>
+                      </div>
+                  </div>
+              </div>
+          </div>
+          <div class="vip_component" v-if="getStatus" style="height:10.8rem;background:url('/common-module/collection/image/buyer/12-bg.png?v=1') no-repeat;background-size:100% 100%">
+            <p class="example-title">重点合作代理机构</p>
+            <buyer-example :status="bigStatus" :power="power" type="item_12" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/buyer/12.png'></buyer-example>
+          </div>
+      </div>
+    </div>
+</div>
+
+<!--S-必定需要预加载的资源-->
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js />
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js />
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js />
+<link rel="preload" as="script" href=//cdn.jsdelivr.net/npm/echarts@4.8.0/dist/echarts.min.js />
+<link rel="preload" as="script" href=//cdn.jsdelivr.net/npm/v-charts@1.19.0/lib/index.min.js />
+<!--E-必定需要预加载的资源-->
+
+<!--S-当前页面的资源-->
+<script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
+<script src=//cdn.jsdelivr.net/npm/echarts@4.8.0/dist/echarts.min.js></script>
+<script src=//cdn.jsdelivr.net/npm/v-charts@1.19.0/lib/index.min.js></script>
+<script src='{{Msg "seo" "cdn"}}/big-member/js/utils.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/collection/js/echarts_option.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/collection/js/chart_options.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/collection/js/buyer-example.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}'></script>
+{{include "/common/baiducc.html"}}
+</body>
+</html>

+ 14 - 0
src/web/templates/order/pc/orderPay.html

@@ -249,6 +249,20 @@
                     }, function (r) {
                         if (r.success) {
                             var from = '' // 从那个页面过来orderList(订单列表)
+                            // 采购单位画像引流
+                            var paramsUnit = getParam('unit')
+                            if (paramsUnit) {
+                                $.ajax({
+                                    type: 'POST',
+                                    url: '/publicapply/drainage/buyerunit',
+                                    data: JSON.stringify({
+                                        mold: 'isPaid',
+                                        id: paramsUnit
+                                    }),
+                                    contentType: "application/json",
+                                    dataType: "json"
+                                })
+                            }
                             // 判断url里是否有引导语文案id,如果有就需要埋点
                             if (getParam('mid')) {
                                 try {

+ 2 - 1
src/web/templates/pc/member_orderDetail.html

@@ -325,7 +325,8 @@
             })
 
             $(".payOrder").on("click", function () {
-                location.href = "/front/member/orderPay/" + orderCode
+                var paramsUnit = getParam('unit')
+                location.href = "/front/member/orderPay/" + orderCode + (paramsUnit ? ('?unit=' + paramsUnit): '')
             })
         })
 

+ 218 - 187
src/web/templates/staticpage/privacy_rules.html

@@ -31,197 +31,228 @@
 </head>
 
 <body>
-<!-- header -->
-<!-- main  START -->
-<div style="padding-bottom: 88px;background-color: #fff;">
-    <div class="container">
-        <div class="row">
-            <div class="col-md-12">
-                <h3 class="title">剑鱼标讯隐私政策</h3>
-                <p style="font-size: 18px;text-align: center;">引言</p>
-                <p style="text-indent: 20px;">剑鱼标讯(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
-                </p>
-                <p style="text-indent: 20px;">一、我们如何收集和使用您的个人信息</p>
-                <p style="text-indent: 20px;">二、我们如何使用 Cookies 和同类技术</p>
-                <p style="text-indent: 20px;">三、我们如何共享、转让、公开披露您的个人信息</p>
-                <p style="text-indent: 20px;">四、我们如何保护和保存您的个人信息</p>
-                <p style="text-indent: 20px;">五、您如何管理个人信息</p>
-                <p style="text-indent: 20px;">六、未成年人的个人信息保护</p>
-                <p style="text-indent: 20px;">七、通知和修订</p>
-                <p style="text-indent: 20px;">八、如何联系我们</p>
-                <br>
-                <p style="text-indent: 20px;">本隐私政策与您所使用的剑鱼标讯服务以及该服务所包括的各种业务功能(以下统称“我们的产品与/或服务”)息息相关,希望您在使用我们的产品与/或服务前仔细阅读并确认您已经充分理解本隐私政策所写明的内容,并让您可以按照本隐私政策的指引做出您认为适当的选择。本隐私政策中涉及的相关术语,我们尽量以简明扼要的表述,以便您更好地理解。您使用或在我们更新本隐私政策后继续使用我们的产品与/或服务,即意味着您同意本隐私政策(含更新版本)内容,并且同意我们按照本隐私政策收集、使用、保存和共享您的相关信息。
-                </p>
-                <p style="text-indent: 20px;">如对本隐私政策或相关事宜有任何问题,您可随时通过拨打客服电话400-108-6670或发送邮件至jy@topnet.net.cn等多种方式与我们联系 。</p>
-                <br>
-                <p style="font-size: 18px;">一、我们如何收集和使用您的个人信息</p>
-                <p style="text-indent: 20px;text-align: left;word-break:break-all;">个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。本隐私政策中涉及的个人信息包括:基本信息(包括个人姓名、住址、个人电话号码、电子邮箱);个人身份信息(包括身份证等);网络身份标识信息(包括系统账号、IP地址、邮箱地址及与前述有关的密码、口令、口令保护答案);面部识别特征;个人财产信息(交易和消费记录、以及余额、优惠券等虚拟财产信息);通讯录;个人上网记录(包括网站浏览记录、软件使用记录、点击记录);个人常用设备信息(包括硬件型号、设备MAC地址、操作系统类型、软件列表唯一设备识别码(如IMEI/android ID/IDFA/OPENUDID/GUID、SIM卡IMSI信息等在内的描述个人常用设备基本情况的信息));个人位置信息(包括行程信息、精准定位信息、住宿信息、经纬度等);</p>
-                <p style="text-indent: 20px;">个人敏感信息是指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息,本隐私政策中涉及的个人敏感信息包括:您的财产信息(包括交易记录及余额、优惠券等虚拟财产信息);面部识别特征;个人身份信息(包括身份证);网络身份识别信息(包括账号、邮箱地址及与前述有关的密码口令的组合);其他信息(包括通讯录、行程信息、网页浏览记录、住宿信息、精准定位信息)。</p>
-                <p style="text-indent: 20px;">在您使用剑鱼标讯服务时,我们需要或可能需要收集与使用的您的个人信息分为如下两类:</p>
-                <p style="text-indent: 20px;">a) 为了向您提供剑鱼标讯服务基本功能,所需要您授权我们收集与使用的必要的个人信息。如您未提供此类必要信息,您将无法正常使用(或继续正常使用)剑鱼标讯服务;</p>
-                <p style="text-indent: 20px;">b) 为了优化您的使用体验,我们将向您提供剑鱼标讯服务的附加功能,您可以自主选择是否授权我们收集使用的个人信息。如您未提供此类信息,您将无法使用(或继续正常使用)剑鱼标讯服务的对应附加功能,但您仍可以继续使用剑鱼标讯服务的基本功能。</p>
-                <br>
-                <p style="font-size: 16px;">您了解并同意,以下信息不适用本《隐私权政策》:</p>
-                <p style="text-indent: 20px;">a) 您在使用剑鱼标讯服务时,对外公布或提供的信息;</p>
-                <p style="text-indent: 20px;">b) 任何国家官方网站、门户网站及行业性门户网站上的公开信息。</p>
-                <p style="font-size: 16px;">(一)为了实现剑鱼标讯服务的下述基本功能,我们将收集和使用您的如下个人信息:</p>
-                <p style="font-size: 14px;">1、帮助您成为我们的注册用户</p>
-                <p style="text-indent: 20px;">我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、微信号,拟使用的用户名和密码,用于创建账号。</p>
-                <p style="font-size: 14px;">2、服务信息展示</p>
-                <p style="text-indent: 20px;">在您使用剑鱼标讯服务过程中,为识别账号异常状态、了解产品适配性、向您提供更契合您需求的页面展示和搜索结果,我们可能会自动收集您的使用情况并存储为网络日志信息,包括:</p>
-                <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
-                <p>服务日志信息:当您使用剑鱼标讯服务时,我们会自动收集您对我们服务的详细使用情况,作为服务日志保存,包括浏览、搜索查询、招标订阅、关注企业、关注项目、发票信息、企业服务订单记录、以及IP地址、浏览器类型、访问日期和时间。</p>
-                <p style="text-indent: 20px;">请注意,单独的设备信息、服务日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将这类信息进行匿名处理。</p>
-                <p style="text-indent: 20px;">为给您提供定制化的服务,我们将通过使用您的订阅、关注设置,向您推送您所需要信息。如您不接受定向推送功能,您可以直接在“我的-设置”功能页面中关闭“推送消息设置”按钮。</p>
-                <p style="font-size: 14px;">3、帮您提交及管理订单</p>
-                <p style="text-indent: 20px;">当您在我们的产品及/或服务中订购增值服务时(如企业实名认证服务、超级订阅服务、数据导出服务、商机洞察服务、商机管理服务),我们会通过系统为您生成购买该增值服务的订单,同时该订单中会载明您所订购的服务信息、具体订单号、订单创建时间、您支付的金额,我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息、提供客服与售后服务及其他我们明确告知的目的。</p>
-                <p style="text-indent: 20px;">如您申请发票,还需提供以下信息:发票抬头、纳税人识别号、注册地址、注册电话、开户银行、银行账号、个人姓名、手机号、所属地区、详细地址、邮箱,以及您根据您的开票需求提供的更多信息,如购买方信息。</p>
-                <p style="font-size: 14px;">4、帮助您完成支付</p>
-                <p style="text-indent: 20px;">为完成增值服务订单支付,您需要提供第三方支付平台(支付宝、微信支付)账户并选择付款方式,我们会将您的用户名、对应的第三方支付平台账户名、订单支付相关信息、订单安全相关设备信息及其他反洗钱法律要求的必要信息通过在应用程序中嵌入的SDK等方式与第三方支付平台共享,前述第三方支付平台将获得您连接网络的权限、手机信息权限,并获取网络状态和wifi状态。</p>
-                <p style="font-size: 14px;">5、响应您的客服需求</p>
-                <p style="text-indent: 20px;">当您与我们联系或提出售中售后、争议纠纷处理申请时,为了保障您的账号及系统安全,我们需要核验您的用户身份。为便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们可能会保存您与我们的通信/通话记录及相关内容(包括账号信息、订单信息、您为了证明相关事实所提供的其他信息,或您留下的联系方式信息),如果您针对具体订单进行咨询、投诉的,我们会留存您的账号信息和订单信息。</p>
-                <br>
-                <p style="font-size: 16px;">(二)为了实现剑鱼标讯服务的某些附加功能,我们需要获取您的如下信息及对应设备权限。您拒绝提供个人信息的,不影响您使用剑鱼标讯基础服务。</p>
-                <p style="font-size: 14px;">1、图片获取、存储与上传功能</p>
-                <p style="text-indent: 20px;">当您使用剑鱼标讯App时,为实现“电子合同”、“实名认证”、“企业认证”功能,我们需要获取您设备的“相机-拍摄”权限;为实现上传图片、上传头像的功能,我们需要获取您设备的“存储-读取外置存储器”权限;为实现保存图片的功能,我们需要获取您设备的“写入外置存储器”权限。</p>
-                <p style="font-size: 14px;">2、个人实名认证服务</p>
-                <p style="text-indent: 20px;">用户可以对个人剑鱼标讯账号申请个人实名认证,剑鱼标讯根据用户的申请及其提交的资料和信息等,进行审核,并根据审核情况确定认证结果的服务。在提交认证申请时,需要您提供姓名、身份证正反面图片,身份证号等信息,以便我们对认证个人进行审核。</p>
-                <p style="font-size: 14px;">3、企业实名认证服务</p>
-                <p style="text-indent: 20px;">是指符合一定条件的用户可以对企业剑鱼标讯账号申请企业实名认证,剑鱼标讯根据用户的申请及其提交的资料和信息等,进行审核,并根据审核情况确定认证结果的服务。在提交认证申请时,需要您提供该企业名称、营业执照图片、社会统一信用代码,法定代表人姓名、身份证正反面图片、身份证号、对公账号、对公账号开户行等信息,以便我们对认证企业进行审核。</p>
-                <br>
-                <p style="font-size: 16px;">(三)您充分知晓,以下情形中,我们收集、使用个人信息无需征得您的授权同意:</p>
-                <p>1、与国家安全、国防安全有关的;</p>
-                <p>2、与公共安全、公共卫生、重大公共利益有关的;</p>
-                <p>3、与犯罪侦查、起诉、审判和判决执行等有关的;</p>
-                <p>4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
-                <p>5、所收集的个人信息是个人信息主体或监护人自行向社会公众公开的;</p>
-                <p>6、从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;</p>
-                <p>7、根据您的要求签订合同所必需的;</p>
-                <p>8、用于维护所提供的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障;</p>
-                <p>9、为合法的新闻报道所必需的;</p>
-                <p>10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</p>
-                <p>11、法律法规规定的其他情形。</p>
-                <br>
-                <p style="font-size: 16px;">(四)您个人信息使用的规则</p>
-                <p>1、我们会根据本隐私政策的约定并为实现我们的产品与/或服务功能对所收集的个人信息进行使用。</p>
-                <p>2、请您注意,您在使用我们的产品与/或服务时所提供的所有个人信息,除非您删除或通过系统设置拒绝我们收集,否则将在您使用我们的产品与/或服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除您的个人信息,具体请详见本隐私政策附件《剑鱼标讯账户注销须知》。</p>
-                <p>3、我们会对我们的产品与/或服务使用情况进行统计,并可能会与公众或第三方共享这些统计信息,以展示我们的产品与/或服务的整体使用趋势。但这些统计信息不包含您的任何身份识别信息。</p>
-                <p>4、当我们展示您的个人信息时,我们会采用包括内容替换、匿名处理方式对您的信息进行脱敏,以保护您的信息安全。</p>
-                <br>
-                <p style="font-size: 18px;">二、我们如何使用 Cookies 和同类技术</p>
-                <p>1、为实现您联机体验的个性化需求,使您获得更轻松的访问体验。我们会在您的计算机或移动设备上发送一个或多个名为Cookies的小数据文件,指定给您的Cookies 是唯一的,它只能被将Cookies发布给您的域中的Web服务器读取。我们向您发送Cookies是为了简化您重复登录的步骤、帮助判断您的登录状态以及账户或数据安全。</p>
-                <p>2、我们不会将 Cookies 用于本隐私政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookies。您可以清除移动设备、计算机上保存的所有 Cookies,大部分移动设备、网络浏览器会自动接受Cookies,但您通常可根据自己的需要来修改移动设备、浏览器的设置以拒绝 Cookies;另外,您也可以清除软件内保存的所有Cookies。但如果您这么做,您可能需要在每一次访问剑鱼标讯APP、网站时亲自更改用户设置,而且您之前所记录的相应信息也均会被删除,并且可能会对您所使用服务的安全性有一定影响。</p>
-                <br>
-                <p style="font-size: 18px;">三、我们如何共享、转让、公开披露您的个人信息</p>
-                <p style="font-size: 16px;">(一)共享</p>
-                <p>1、我们不会与剑鱼标讯以外的任何公司、组织和个人共享您的个人信息,但以下情况除外:</p>
-                <p>(1)事先获得您明确的同意或授权;</p>
-                <p>(2)根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况下进行提供;</p>
-                <p>(3)在法律法规允许的范围内,为维护剑鱼标讯、剑鱼标讯的关联方或合作伙伴、您或其他剑鱼标讯用户或社会公众利益、财产或安全免遭损害而有必要提供;</p>
-                <p>(4) 只有共享您的个人信息,才能实现我们的产品与/或服务的核心功能或提供您需要的服务;</p>
-                <p>(5)应您需求为您处理您与他人的纠纷或争议;</p>
-                <p>(6)符合与您签署的相关协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;</p>
-                <p>(7)基于学术研究而使用;</p>
-                <p>(8)基于符合法律法规的社会公共利益而使用。</p>
-                <p>2、我们可能会将您的个人信息与我们的关联方共享。但我们只会共享必要的个人信息,且受本隐私政策中所声明目的的约束。我们的关联方如要改变个人信息的处理目的,将再次征求您的授权同意。</p>
-                <p>3、我们可能会向合作伙伴等第三方共享您的订单信息、账户信息、设备信息以及位置信息,以保障为您提供的服务顺利完成。但我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。 </p>
-                <br>
-                <p style="font-size: 16px;">(二)转让</p>
-                <p style="text-indent: 20px;">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
-                <p>1、事先获得您明确的同意或授权;</p>
-                <p>2、根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况进行提供;</p>
-                <p>3、符合与您签署的相关协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;</p>
-                <p>4、在涉及合并、收购、资产转让或类似的交易时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本隐私政策的约束,否则,我们将要求该公司、组织重新向您征求授权同意。</p>
-                <br>
-                <p style="font-size: 16px;">(三)公开披露</p>
-                <p style="text-indent: 20px;">我们仅会在以下情况下,且采取符合业界标准的安全防护措施的前提下,才会公开披露您的个人信息:</p>
-                <p>1、根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;</p>
-                <p>2、根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式公开披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的信息,应该在法律允许的范围内尽可能保持透明。我们对所有的请求都进行了慎重的审查,以确保其具备合法依据,且仅限于执法部门因特定调查目的且有合法权利获取的数据。在法律法规许可的前提下,我们披露的文件均在加密密钥的保护之下。</p>
-                <br>
-                <p style="font-size: 18px;">四、我们如何保护和保存您的个人信息</p>
-                <p style="text-indent: 20px;">我们会将收集到的您的个人信息保存在我们的服务器上,并且仅在中华人民共和国境内储存。我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非法律对于储存期限有额外的明确要求,同时,我们采取了符合行业标准的安全保护措施,保护您的个人信息,防止其遭到未经授权的访问、公开披露、使用、修改、损坏和丢失。我们会采取一切合理可行的措施,保护您的个人信息。包括但不限于:</p>
-                <p>1. 我们具有明确的职权划分以及成型的访问控制机制,将有权接触到个人信息的工作人员限制在最小必要的范围之内;</p>
-                <p>2. 我们同时采用了加密技术,提高个人信息的安全性,对于个人敏感信息,我们将一律通过https加密协议传输,您的密码、口令在存储时将被额外加密;</p>
-                <p style="text-indent: 20px;">互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,从而导致您的合法权益受损,我们将承担相应的法律责任。</p>
-                <p style="text-indent: 20px;">在不幸发生个人安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话或推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。</p>
-                <p style="text-indent: 20px;">同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。</p>
-                <br>
-                <p style="font-size: 18px;">五、您如何管理您的个人信息</p>
-                <p style="text-indent: 20px;">剑鱼标讯非常重视您对个人信息的关注,并尽全力保护您对于您个人信息访问、更正、删除以及撤回同意的权利,以使您拥有充分的能力保障您的隐私和安全。您的权利包括:</p>
-                <p style="font-size: 16px;">1、访问和更正您的个人信息</p>
-                <p>除法律法规规定外,您有权随时访问和更正您的个人信息,具体包括: </p>
-                <p style="text-indent: 20px;">(1)您的账户信息:您可以在“我的”页面的“设置”菜单中查阅您提交给剑鱼标讯的所有个人信息,你也可通过上述途径更新个人信息及实名认证信息(您的实名认证信息是您通过实名认证时使用的姓名和身份证信息)。</p>
-                <p style="text-indent: 20px;">(2)您的订单信息:您可以通过访问“我的”页面查看您的所有待付款、已完成、已取消或全部订单。移动端具体路径为:移动端首页--“我的”—待付款/已完成/已取消/全部订单。您可以选择删除已经完成和已取消的订单来删除您的订单信息,但这样可能导致我们无法准确判断您的购买信息而难以提供相应的售后服务。</p>
-                <p style="text-indent: 20px;">(3)您的发票信息:您可以查询您所申请的订单发票信息,移动端路径为首页--“我的”—已完成,点击进入每笔订单,查看您填写的发票信息。</p>
-                <p style="text-indent: 20px;">(4)对于您在使用我们的产品与/或服务过程中产生的其他个人信息需要访问或更正,请随时联系我们。我们会根据本隐私政策所列明的方式和期限响应您的请求。</p>
-                <p style="text-indent: 20px;">(5)您无法访问和更正的个人信息:除上述列明的信息外,您的部分个人信息我们还无法为您提供访问和更正的服务,这些信息主要是为了提升您的用户体验和保证交易安全所收集的您的设备信息、您使用扩展功能时产生的个人信息。上述信息我们会在您的授权范围内进行使用,您无法访问和更正,但您可联系我们进行删除或做匿名化处理。</p>
-                <p style="font-size: 16px;">2、删除您的个人信息</p>
-                <p style="text-indent: 20px;">您在我们的产品与/或服务页面中可以直接清除或删除的信息,包括订单信息、浏览信息; </p>
-                <p style="text-indent: 20px;">在以下情形中,您可以向我们提出删除个人信息的请求:</p>
-                <p style="text-indent: 20px;">(1)如果我们处理个人信息的行为违反法律法规;</p>
-                <p style="text-indent: 20px;">(2)如果我们收集、使用您的个人信息,却未征得您的同意;</p>
-                <p style="text-indent: 20px;">(3)如果我们处理个人信息的行为违反了与您的约定;</p>
-                <p style="text-indent: 20px;">(4)如果我们终止服务及运营。</p>
-                <p style="text-indent: 20px;">若我们决定响应您的删除请求,我们还将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。若我们响应您的删除请求,我们不能保证立即从备份系统中删除相应的信息,但会在备份系统更新时删除这些信息。</p>
-                <p style="font-size: 16px;">3、改变您授权同意的范围或撤回您的授权</p>
-                <p style="text-indent: 20px;">您可以通过删除信息、关闭设备功能、在剑鱼标讯网站或软件中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集您个人信息的全部授权。</p>
-                <p style="text-indent: 20px;">请您理解,每个业务功能需要一些基本的个人信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响此前基于您的授权而开展的个人信息处理。</p>
-                <p style="font-size: 16px;">4、注销账户</p>
-                <p style="text-indent: 20px;">您可以通过删除信息、关闭设备功能、在剑鱼标讯网站或软件中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集您个人信息的全部授权。</p>
-                <p style="font-size: 16px;">5、如果您不想接受我们给您发送的推送信息,您随时可通过以下方式取消:</p>
-                <p style="text-indent: 20px;">您可以通过移动端APP“设置-推送消息设置”设置是否接受我们通过“通知”推动给您的信息。</p>
-                <p style="font-size: 16px;">6、响应您的请求</p>
-                <p style="text-indent: 20px;">如果您无法通过上述方式访问、更正或删除您的个人信息,或您需要访问、更正或删除您在使用我们产品与/或服务时所产生的其他个人信息,或您认为剑鱼标讯存在任何违反法律法规或与您关于个人信息的收集或使用的约定,您均可以发送电子邮件至jy@topnet.net.cn或通过本隐私政策中的其他方式与我们联系。为了保障安全,我们可能需要您提供书面请求,或提供您的身份证明文件,我们将在收到您反馈并验证您的身份后的15天内答复您的请求。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。</p>
-                <p>在以下情形中,按照法律法规要求,我们将无法响应您的请求:</p>
-                <p>(1)与国家安全、国防安全有关的;</p>
-                <p>(2)与公共安全、公共卫生、重大公共利益有关的;</p>
-                <p>(3)与犯罪侦查、起诉和审判等有关的;</p>
-                <p>(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
-                <p>(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。</p>
-                <br>
-                <p style="font-size: 18px;">六、未成年人的个人信息保护</p>
-                <p style="text-indent: 20px;">我们的网站及服务主要面向成年人,如果没有监护人的明确同意,儿童不应创建自己的个人信息主体账户。</p>
-                <p style="text-indent: 20px;">对于经监护人同意而收集儿童个人信息的情况,我们只会在受到监管政策允许、监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。</p>
-                <p style="text-indent: 20px;">尽管适用法律对儿童的定义不同,但我们将不满14周岁的任何人均视为儿童。</p>
-                <p style="text-indent: 20px;">如果我们发现自己在未事先获得监护人同意的情况下收集了儿童的个人信息,我们会尽快设法删除相关数据。</p>
-                <br>
-                <p style="font-size: 18px;">七、通知和修订</p>
-                <p style="text-indent: 20px;">为了给您带来更好的服务体验,我们可能会不时增加新的服务功能或对原有功能进行优化,因此可能会收集、使用新的个人信息或变更使用个人信息的目的或方式,本《隐私权政策》也可能会依照最新的监管政策不时变更。在发生前述变更时,我们将更新本《隐私权政策》,并以显著的方式使您知悉,并在征得您的明示同意后收集、使用您的个人信息。</p>
-                <p style="text-indent: 20px;">未经您明确同意,我们不会削减您按照本《隐私权政策》所应享有的权利。我们会在专门页面上发布对本《隐私权政策》所做的任何变更。对于重大变更,我们还会提供更为显著的通知(如网站公示或向您提供弹窗提示等形式),说明具体变更内容。</p>
-                <br>
-                <p style="font-size: 18px;">八、如何联系我们</p>
-                <p>您可以通过以下方式与我们联系,我们将在收到您的需求后,在15个工作日内予以回复:</p>
-                <p style="text-indent: 20px;">1、您可以通过以下方式与我们联系,我们将在收到您的需求后,在15个工作日内予以回复:</p>
-                <p style="text-indent: 20px;">2、如发现个人信息可能被泄露,您可以通过剑鱼标讯客服进行投诉举报;</p>
-                <p>我们设立了个人信息保护专职部门,剑鱼标讯客服会将您的需求向其转达。</p>
-                <p>剑鱼标讯客服邮箱:jy@topnet.net.cn</p>
-                <br>
-                <p style="font-size: 18px;">附件:《剑鱼标讯账户注销须知》</p>
-                <p>亲爱的剑鱼标讯用户:</p>
-                <p style="text-indent: 20px;">您在申请注销流程中点击同意前,应当认真阅读《剑鱼标讯账户注销须知》(以下称“《注销须知》”)。</p>
-                <p>请您务必审慎阅读、充分理解《注销须知》中相关条款内容,其中包括:</p>
-                <p>1、与您约定免除或限制责任的条款;</p>
-                <p>2、其他以粗体标识的重要条款。</p>
-                <p style="text-indent: 20px;">如您对本《注销须知》有任何疑问,可拨打我们的客服电话400-108-6670联系客服。</p>
-                <p style="text-indent: 20px;">【特别提示】当您按照注销页面提示填写信息、阅读并同意本《注销须知》及相关条款与条件且完成全部注销程序后,即表示您已充分阅读、理解并接受本《注销须知》的全部内容。阅读本《注销须知》的过程中,如果您不同意相关任何条款和条件约定,请您立即停止账户注销程序。</p>
-                <p style="text-indent: 20px;">我们在此善意地提醒您,您注销账户的行为会给您的售后维权带来诸多不便,且注销剑鱼标讯账户后,您的个人信息我们只会在剑鱼标讯的前台系统中去除,使其保持不可被检索、访问的状态,或对其进行匿名化处理。您知晓并理解,根据相关法律规定,相关交易记录须在剑鱼标讯后台保存5年甚至更长的时间。</p>
-                <p style="text-indent: 20px;">如果您仍执意注销账户,您的账户需同时满足以下条件:</p>
-                <p style="text-indent: 20px;">(1)在最近一个月内,账户没有进行更改密码、更改绑定信息等敏感操作;</p>
-                <p style="text-indent: 20px;">(2)自愿放弃账户在剑鱼标讯中的资产和虚拟权益(包括但不限于账户余额、优惠券等),并确保账户中无欠款;</p>
-                <p style="text-indent: 20px;">(3)账户内无未完成的订单和服务;</p>
-                <p style="text-indent: 20px;">(4)账户无任何纠纷,包括投诉举报或被投诉举报;</p>
-                <p>3、剑鱼标讯账户一旦被注销将不可恢复,请您在操作之前自行备份剑鱼标讯账户相关的所有信息和数据。请您保存好订单商品和服务的交易凭证、票据等资料,否则您有可能须支付额外的账户和订单查询费用,或无法享受售后服务。</p>
-                <p>4、在剑鱼标讯账户注销期间,如果您的剑鱼标讯账户涉及争议纠纷,包括但不限于投诉、举报、诉讼、仲裁、国家有权机关调查等,剑鱼标讯有权自行终止本剑鱼标讯账户的注销而无需另行得到您的同意。</p>
-                <p>5、注销剑鱼标讯账户,您将无法再使用本剑鱼标讯账户,也将无法找回您剑鱼标讯账户中及与账户相关的任何内容或信息,包括但不限于:</p>
-                <p style="text-indent: 20px;">(1)您将无法登录、使用本剑鱼标讯账户;</p>
-                <p style="text-indent: 20px;">(2)本剑鱼标讯账户的个人资料和历史信息(包括但不限于用户名、头像、订单记录、订阅信息、关注信息、推送记录等)都将无法找回;</p>
-                <p style="text-indent: 20px;">(3)您曾获得的余额、优惠券及其他卡券等视为您自行放弃,将无法继续使用。您理解并同意,剑鱼标讯无法协助您重新恢复前述服务。请您在提交注销申请前,务必先了解您须解绑的其他相关账户信息,具体可与我们的客服联系。</p>
-                <p>6、注销本剑鱼标讯账户并不代表本剑鱼标讯账户注销前的账户行为和相关责任得到豁免或减轻。</p>
-
+    <!-- main  START -->
+    <div style="padding-bottom: 88px;background-color: #fff;">
+        <div class="container">
+            <div class="row">
+                <div class="col-md-12">
+                    <h3 class="title">剑鱼标讯隐私政策</h3>
+                    <p style="font-size: 18px;text-align: center;">引言</p>
+                    <p style="text-indent: 20px;"><span  id="companyName">北京剑鱼信息技术有限公司</span>(“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务(“剑鱼标讯”)时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
+                    </p>
+                    <p style="text-indent: 20px;">一、我们如何收集和使用您的个人信息</p>
+                    <p style="text-indent: 20px;">二、我们如何使用 Cookies 和同类技术</p>
+                    <p style="text-indent: 20px;">三、我们如何共享、转让、公开披露您的个人信息</p>
+                    <p style="text-indent: 20px;">四、我们如何保护和保存您的个人信息</p>
+                    <p style="text-indent: 20px;">五、您如何管理个人信息</p>
+                    <p style="text-indent: 20px;">六、未成年人的个人信息保护</p>
+                    <p style="text-indent: 20px;">七、通知和修订</p>
+                    <p style="text-indent: 20px;">八、如何联系我们</p>
+                     <br>
+                    <p style="text-indent: 20px;">本隐私政策与您所使用的剑鱼标讯服务以及该服务所包括的各种业务功能(以下统称“我们的产品与/或服务”)息息相关,希望您在使用我们的产品与/或服务前仔细阅读并确认您已经充分理解本隐私政策所写明的内容,并让您可以按照本隐私政策的指引做出您认为适当的选择。本隐私政策中涉及的相关术语,我们尽量以简明扼要的表述,以便您更好地理解。您使用或在我们更新本隐私政策后继续使用我们的产品与/或服务,即意味着您同意本隐私政策(含更新版本)内容,并且同意我们按照本隐私政策收集、使用、保存和共享您的相关信息。
+                    </p>
+                    <p style="text-indent: 20px;">如对本隐私政策或相关事宜有任何问题,您可随时通过拨打客服电话400-108-6670或发送邮件至jy@topnet.net.cn等多种方式与我们联系 。</p>
+                    <br>
+                    <p style="font-size: 18px;">一、我们如何收集和使用您的个人信息</p>
+                     <p style="text-indent: 20px;text-align: left;word-break:break-all;">个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。本隐私政策中涉及的个人信息包括:基本信息(包括个人姓名、住址、个人电话号码、电子邮箱);个人身份信息(包括身份证等);网络身份标识信息(包括系统账号、IP地址、邮箱地址及与前述有关的密码、口令、口令保护答案);面部识别特征;个人财产信息(交易和消费记录、以及余额、优惠券等虚拟财产信息);通讯录;个人上网记录(包括网站浏览记录、软件使用记录、点击记录);个人常用设备信息(包括硬件型号、设备MAC地址、操作系统类型、软件列表唯一设备识别码(如IMEI/android ID/IDFA/OPENUDID/GUID、SIM卡IMSI信息等在内的描述个人常用设备基本情况的信息));个人位置信息(包括行程信息、精准定位信息、住宿信息、经纬度等);</p>
+                     <p style="text-indent: 20px;">个人敏感信息是指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息,本隐私政策中涉及的个人敏感信息包括:您的财产信息(包括交易记录及余额、优惠券等虚拟财产信息);面部识别特征;个人身份信息(包括身份证);网络身份识别信息(包括账号、邮箱地址及与前述有关的密码口令的组合);其他信息(包括通讯录、行程信息、网页浏览记录、住宿信息、精准定位信息)。</p>
+                     <p style="text-indent: 20px;">在您使用剑鱼标讯服务时,我们需要或可能需要收集与使用的您的个人信息分为如下两类:</p>
+                     <p style="text-indent: 20px;">a) 为了向您提供剑鱼标讯服务基本功能,所需要您授权我们收集与使用的必要的个人信息。如您未提供此类必要信息,您将无法正常使用(或继续正常使用)剑鱼标讯服务;</p>
+                     <p style="text-indent: 20px;">b) 为了优化您的使用体验,我们将向您提供剑鱼标讯服务的附加功能,您可以自主选择是否授权我们收集使用的个人信息。如您未提供此类信息,您将无法使用(或继续正常使用)剑鱼标讯服务的对应附加功能,但您仍可以继续使用剑鱼标讯服务的基本功能。</p>
+                    <br>
+                    <p style="font-size: 16px;">您了解并同意,以下信息不适用本《隐私权政策》:</p>
+                    <p style="text-indent: 20px;">a) 您在使用剑鱼标讯服务时,对外公布或提供的信息;</p>
+                    <p style="text-indent: 20px;">b) 任何国家官方网站、门户网站及行业性门户网站上的公开信息。</p>
+                    <p style="font-size: 16px;">(一)为了实现剑鱼标讯服务的下述基本功能,我们将收集和使用您的如下个人信息:</p>
+                    <p style="font-size: 14px;">1、帮助您成为我们的注册用户</p>
+                    <p style="text-indent: 20px;">我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、微信号,拟使用的用户名和密码,用于创建账号。</p>
+                    <p style="font-size: 14px;">2、服务信息展示</p>
+                    <p style="text-indent: 20px;">在您使用剑鱼标讯服务过程中,为识别账号异常状态、了解产品适配性、向您提供更契合您需求的页面展示和搜索结果,我们可能会自动收集您的使用情况并存储为网络日志信息,包括:</p>
+                    <p>设备信息:我们会根据您在使用剑鱼标讯服务中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、MAC地址、操作系统版本、设备设置、唯一设备标识符)、设备所在位置相关信息(包括您授权的GPS位置)、您在设备上的操作日志信息。</p>
+                    <p>服务日志信息:当您使用剑鱼标讯服务时,我们会自动收集您对我们服务的详细使用情况,作为服务日志保存,包括浏览、搜索查询、招标订阅、关注企业、关注项目、发票信息、企业服务订单记录、以及IP地址、浏览器类型、访问日期和时间。</p>
+                    <p style="text-indent: 20px; ">为了优化产品的使用体验,我们需要收集应用在后台状态下的用户MAC地址信息,用于获取用户的手机网络信息,检查手机网络是否通畅,以解答用户在使用产品过程中遇到的各种操作问题。</p>
+                    <p style="text-indent: 20px;">请注意,单独的设备信息、服务日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将这类信息进行匿名处理。</p>
+                    <p style="text-indent: 20px;">为给您提供定制化的服务,我们将通过使用您的订阅、关注设置,向您推送您所需要信息。如您不接受定向推送功能,您可以直接在“我的-设置”功能页面中关闭“推送消息设置”按钮。</p>
+                    <p style="font-size: 14px;">3、帮您提交及管理订单</p>
+                    <p style="text-indent: 20px;">当您在我们的产品及/或服务中订购增值服务时(如企业实名认证服务、超级订阅服务、数据导出服务、商机洞察服务、商机管理服务),我们会通过系统为您生成购买该增值服务的订单,同时该订单中会载明您所订购的服务信息、具体订单号、订单创建时间、您支付的金额,我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息、提供客服与售后服务及其他我们明确告知的目的。</p>
+                    <p style="text-indent: 20px;">如您申请发票,还需提供以下信息:发票抬头、纳税人识别号、注册地址、注册电话、开户银行、银行账号、个人姓名、手机号、所属地区、详细地址、邮箱,以及您根据您的开票需求提供的更多信息,如购买方信息。</p>
+                    <p style="font-size: 14px;">4、帮助您完成支付</p>
+                    <p style="text-indent: 20px;">为完成增值服务订单支付,您需要提供第三方支付平台(支付宝、微信支付)账户并选择付款方式,我们会将您的用户名、对应的第三方支付平台账户名、订单支付相关信息、订单安全相关设备信息及其他反洗钱法律要求的必要信息通过在应用程序中嵌入的SDK等方式与第三方支付平台共享,前述第三方支付平台将获得您连接网络的权限、手机信息权限,并获取网络状态和wifi状态。</p>
+                    <p style="font-size: 14px;">5、响应您的客服需求</p>
+                    <p style="text-indent: 20px;">当您与我们联系或提出售中售后、争议纠纷处理申请时,为了保障您的账号及系统安全,我们需要核验您的用户身份。为便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们可能会保存您与我们的通信/通话记录及相关内容(包括账号信息、订单信息、您为了证明相关事实所提供的其他信息,或您留下的联系方式信息),如果您针对具体订单进行咨询、投诉的,我们会留存您的账号信息和订单信息。</p>
+                    <br>
+                    <p style="font-size: 16px;">(二)为了实现剑鱼标讯服务的某些附加功能,我们需要获取您的如下信息及对应设备权限。您拒绝提供个人信息的,不影响您使用剑鱼标讯基础服务。</p>
+                    <p style="font-size: 14px;">1、图片获取、存储与上传功能</p>
+                    <p style="text-indent: 20px;">当您使用剑鱼标讯App时,为实现“电子合同”、“实名认证”、“企业认证”功能,我们需要获取您设备的“相机-拍摄”权限;为实现上传图片、上传头像的功能,我们需要获取您设备的“存储-读取外置存储器”权限;为实现保存图片的功能,我们需要获取您设备的“写入外置存储器”权限。</p>
+                    <p style="font-size: 14px;">2、个人实名认证服务</p>
+                    <p style="text-indent: 20px;">用户可以对个人剑鱼标讯账号申请个人实名认证,剑鱼标讯根据用户的申请及其提交的资料和信息等,进行审核,并根据审核情况确定认证结果的服务。在提交认证申请时,需要您提供姓名、身份证正反面图片,身份证号等信息,以便我们对认证个人进行审核。</p>
+                    <p style="font-size: 14px;">3、企业实名认证服务</p>
+                    <p style="text-indent: 20px;">是指符合一定条件的用户可以对企业剑鱼标讯账号申请企业实名认证,剑鱼标讯根据用户的申请及其提交的资料和信息等,进行审核,并根据审核情况确定认证结果的服务。在提交认证申请时,需要您提供该企业名称、营业执照图片、社会统一信用代码,法定代表人姓名、身份证正反面图片、身份证号、对公账号、对公账号开户行等信息,以便我们对认证企业进行审核。</p>
+                    <br>
+                    <p style="font-size: 16px;">(三)您充分知晓,以下情形中,我们收集、使用个人信息无需征得您的授权同意:</p>
+                    <p>1、与国家安全、国防安全有关的;</p>
+                    <p>2、与公共安全、公共卫生、重大公共利益有关的;</p>
+                    <p>3、与犯罪侦查、起诉、审判和判决执行等有关的;</p>
+                    <p>4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
+                    <p>5、所收集的个人信息是个人信息主体或监护人自行向社会公众公开的;</p>
+                    <p>6、从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;</p>
+                    <p>7、根据您的要求签订合同所必需的;</p>
+                    <p>8、用于维护所提供的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障;</p>
+                    <p>9、为合法的新闻报道所必需的;</p>
+                    <p>10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</p>
+                    <p>11、法律法规规定的其他情形。</p>
+                    <br>
+                    <p style="font-size: 16px;">(四)您个人信息使用的规则</p>
+                    <p>1、我们会根据本隐私政策的约定并为实现我们的产品与/或服务功能对所收集的个人信息进行使用。</p>
+                    <p>2、请您注意,您在使用我们的产品与/或服务时所提供的所有个人信息,除非您删除或通过系统设置拒绝我们收集,否则将在您使用我们的产品与/或服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除您的个人信息,具体请详见本隐私政策附件《剑鱼标讯账户注销须知》。</p>
+                    <p>3、我们会对我们的产品与/或服务使用情况进行统计,并可能会与公众或第三方共享这些统计信息,以展示我们的产品与/或服务的整体使用趋势。但这些统计信息不包含您的任何身份识别信息。</p>
+                    <p>4、当我们展示您的个人信息时,我们会采用包括内容替换、匿名处理方式对您的信息进行脱敏,以保护您的信息安全。</p>
+                    <br>
+                    <p style="font-size: 18px;">二、我们如何使用 Cookies 和同类技术</p>
+                    <p>1、为实现您联机体验的个性化需求,使您获得更轻松的访问体验。我们会在您的计算机或移动设备上发送一个或多个名为Cookies的小数据文件,指定给您的Cookies 是唯一的,它只能被将Cookies发布给您的域中的Web服务器读取。我们向您发送Cookies是为了简化您重复登录的步骤、帮助判断您的登录状态以及账户或数据安全。</p>
+                    <p>2、我们不会将 Cookies 用于本隐私政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookies。您可以清除移动设备、计算机上保存的所有 Cookies,大部分移动设备、网络浏览器会自动接受Cookies,但您通常可根据自己的需要来修改移动设备、浏览器的设置以拒绝 Cookies;另外,您也可以清除软件内保存的所有Cookies。但如果您这么做,您可能需要在每一次访问剑鱼标讯APP、网站时亲自更改用户设置,而且您之前所记录的相应信息也均会被删除,并且可能会对您所使用服务的安全性有一定影响。</p>
+                    <br>
+                    <p style="font-size: 18px;">三、我们如何共享、转让、公开披露您的个人信息</p>
+                    <p style="font-size: 16px;">(一)共享</p>
+                    <p>1、我们不会与剑鱼标讯以外的任何公司、组织和个人共享您的个人信息,但以下情况除外:</p>
+                    <p>(1)事先获得您明确的同意或授权;</p>
+                    <p>(2)根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况下进行提供;</p>
+                    <p>(3)在法律法规允许的范围内,为维护剑鱼标讯、剑鱼标讯的关联方或合作伙伴、您或其他剑鱼标讯用户或社会公众利益、财产或安全免遭损害而有必要提供;</p>
+                    <p>(4) 只有共享您的个人信息,才能实现我们的产品与/或服务的核心功能或提供您需要的服务;</p>
+                    <p>(5)应您需求为您处理您与他人的纠纷或争议;</p>
+                    <p>(6)符合与您签署的相关协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;</p>
+                    <p>(7)基于学术研究而使用;</p>
+                    <p>(8)基于符合法律法规的社会公共利益而使用。</p>
+                    <p>2、我们可能会将您的个人信息与我们的关联方共享。但我们只会共享必要的个人信息,且受本隐私政策中所声明目的的约束。我们的关联方如要改变个人信息的处理目的,将再次征求您的授权同意。</p>
+                    <p>3、我们可能会向合作伙伴等第三方共享您的订单信息、账户信息、设备信息以及位置信息,以保障为您提供的服务顺利完成。但我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。 </p>
+                    <br>
+                    <p style="font-size: 16px;">(二)转让</p>
+                    <p style="text-indent: 20px;">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
+                    <p>1、事先获得您明确的同意或授权;</p>
+                    <p>2、根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况进行提供;</p>
+                    <p>3、符合与您签署的相关协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;</p>
+                    <p>4、在涉及合并、收购、资产转让或类似的交易时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本隐私政策的约束,否则,我们将要求该公司、组织重新向您征求授权同意。</p>
+                    <br>
+                    <p style="font-size: 16px;">(三)公开披露</p>
+                    <p style="text-indent: 20px;">我们仅会在以下情况下,且采取符合业界标准的安全防护措施的前提下,才会公开披露您的个人信息:</p>
+                    <p>1、根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;</p>
+                    <p>2、根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式公开披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的信息,应该在法律允许的范围内尽可能保持透明。我们对所有的请求都进行了慎重的审查,以确保其具备合法依据,且仅限于执法部门因特定调查目的且有合法权利获取的数据。在法律法规许可的前提下,我们披露的文件均在加密密钥的保护之下。</p>
+                    <br>
+                    <p style="font-size: 18px;">四、我们如何保护和保存您的个人信息</p>
+                    <p style="text-indent: 20px;">我们会将收集到的您的个人信息保存在我们的服务器上,并且仅在中华人民共和国境内储存。我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非法律对于储存期限有额外的明确要求,同时,我们采取了符合行业标准的安全保护措施,保护您的个人信息,防止其遭到未经授权的访问、公开披露、使用、修改、损坏和丢失。我们会采取一切合理可行的措施,保护您的个人信息。包括但不限于:</p>
+                    <p>1. 我们具有明确的职权划分以及成型的访问控制机制,将有权接触到个人信息的工作人员限制在最小必要的范围之内;</p>
+                    <p>2. 我们同时采用了加密技术,提高个人信息的安全性,对于个人敏感信息,我们将一律通过https加密协议传输,您的密码、口令在存储时将被额外加密;</p>
+                    <p style="text-indent: 20px;">互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,从而导致您的合法权益受损,我们将承担相应的法律责任。</p>
+                    <p style="text-indent: 20px;">在不幸发生个人安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话或推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。</p>
+                    <p style="text-indent: 20px;">同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。</p>
+                    <br>
+                    <p style="font-size: 18px;">五、您如何管理您的个人信息</p>
+                    <p style="text-indent: 20px;">剑鱼标讯非常重视您对个人信息的关注,并尽全力保护您对于您个人信息访问、更正、删除以及撤回同意的权利,以使您拥有充分的能力保障您的隐私和安全。您的权利包括:</p>
+                    <p style="font-size: 16px;">1、访问和更正您的个人信息</p>
+                    <p>除法律法规规定外,您有权随时访问和更正您的个人信息,具体包括: </p>
+                    <p style="text-indent: 20px;">(1)您的账户信息:您可以在“我的”页面的“设置”菜单中查阅您提交给剑鱼标讯的所有个人信息,你也可通过上述途径更新个人信息及实名认证信息(您的实名认证信息是您通过实名认证时使用的姓名和身份证信息)。</p>
+                    <p style="text-indent: 20px;">(2)您的订单信息:您可以通过访问“我的”页面查看您的所有待付款、已完成、已取消或全部订单。移动端具体路径为:移动端首页--“我的”—待付款/已完成/已取消/全部订单。您可以选择删除已经完成和已取消的订单来删除您的订单信息,但这样可能导致我们无法准确判断您的购买信息而难以提供相应的售后服务。</p>
+                    <p style="text-indent: 20px;">(3)您的发票信息:您可以查询您所申请的订单发票信息,移动端路径为首页--“我的”—已完成,点击进入每笔订单,查看您填写的发票信息。</p>
+                    <p style="text-indent: 20px;">(4)对于您在使用我们的产品与/或服务过程中产生的其他个人信息需要访问或更正,请随时联系我们。我们会根据本隐私政策所列明的方式和期限响应您的请求。</p>
+                    <p style="text-indent: 20px;">(5)您无法访问和更正的个人信息:除上述列明的信息外,您的部分个人信息我们还无法为您提供访问和更正的服务,这些信息主要是为了提升您的用户体验和保证交易安全所收集的您的设备信息、您使用扩展功能时产生的个人信息。上述信息我们会在您的授权范围内进行使用,您无法访问和更正,但您可联系我们进行删除或做匿名化处理。</p>
+                    <p style="font-size: 16px;">2、删除您的个人信息</p>
+                    <p style="text-indent: 20px;">您在我们的产品与/或服务页面中可以直接清除或删除的信息,包括订单信息、浏览信息; </p>
+                    <p style="text-indent: 20px;">在以下情形中,您可以向我们提出删除个人信息的请求:</p>
+                    <p style="text-indent: 20px;">(1)如果我们处理个人信息的行为违反法律法规;</p>
+                    <p style="text-indent: 20px;">(2)如果我们收集、使用您的个人信息,却未征得您的同意;</p>
+                    <p style="text-indent: 20px;">(3)如果我们处理个人信息的行为违反了与您的约定;</p>
+                    <p style="text-indent: 20px;">(4)如果我们终止服务及运营。</p>
+                    <p style="text-indent: 20px;">若我们决定响应您的删除请求,我们还将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。若我们响应您的删除请求,我们不能保证立即从备份系统中删除相应的信息,但会在备份系统更新时删除这些信息。</p>
+                    <p style="font-size: 16px;">3、改变您授权同意的范围或撤回您的授权</p>
+                    <p style="text-indent: 20px;">您可以通过删除信息、关闭设备功能、在剑鱼标讯网站或软件中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集您个人信息的全部授权。</p>
+                    <p style="text-indent: 20px;">请您理解,每个业务功能需要一些基本的个人信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响此前基于您的授权而开展的个人信息处理。</p>
+                    <p style="font-size: 16px;">4、注销账户</p>
+                    <p style="text-indent: 20px;">您可以通过删除信息、关闭设备功能、在剑鱼标讯网站或软件中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集您个人信息的全部授权。</p>
+                    <p style="font-size: 16px;">5、如果您不想接受我们给您发送的推送信息,您随时可通过以下方式取消:</p>
+                    <p style="text-indent: 20px;">您可以通过移动端APP“设置-推送消息设置”设置是否接受我们通过“通知”推动给您的信息。</p>
+                    <p style="font-size: 16px;">6、响应您的请求</p>
+                    <p style="text-indent: 20px;">如果您无法通过上述方式访问、更正或删除您的个人信息,或您需要访问、更正或删除您在使用我们产品与/或服务时所产生的其他个人信息,或您认为剑鱼标讯存在任何违反法律法规或与您关于个人信息的收集或使用的约定,您均可以发送电子邮件至jy@topnet.net.cn或通过本隐私政策中的其他方式与我们联系。为了保障安全,我们可能需要您提供书面请求,或提供您的身份证明文件,我们将在收到您反馈并验证您的身份后的15天内答复您的请求。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。</p>
+                    <p>在以下情形中,按照法律法规要求,我们将无法响应您的请求:</p>
+                    <p>(1)与国家安全、国防安全有关的;</p>
+                    <p>(2)与公共安全、公共卫生、重大公共利益有关的;</p>
+                    <p>(3)与犯罪侦查、起诉和审判等有关的;</p>
+                    <p>(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
+                    <p>(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。</p>
+                    <br>
+                    <p style="font-size: 18px;">六、未成年人的个人信息保护</p>
+                    <p style="text-indent: 20px;">我们的网站及服务主要面向成年人,如果没有监护人的明确同意,儿童不应创建自己的个人信息主体账户。</p>
+                    <p style="text-indent: 20px;">对于经监护人同意而收集儿童个人信息的情况,我们只会在受到监管政策允许、监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。</p>
+                    <p style="text-indent: 20px;">尽管适用法律对儿童的定义不同,但我们将不满14周岁的任何人均视为儿童。</p>
+                    <p style="text-indent: 20px;">如果我们发现自己在未事先获得监护人同意的情况下收集了儿童的个人信息,我们会尽快设法删除相关数据。</p>
+                    <br>
+                    <p style="font-size: 18px;">七、通知和修订</p>
+                    <p style="text-indent: 20px;">为了给您带来更好的服务体验,我们可能会不时增加新的服务功能或对原有功能进行优化,因此可能会收集、使用新的个人信息或变更使用个人信息的目的或方式,本《隐私权政策》也可能会依照最新的监管政策不时变更。在发生前述变更时,我们将更新本《隐私权政策》,并以显著的方式使您知悉,并在征得您的明示同意后收集、使用您的个人信息。</p>
+                    <p style="text-indent: 20px;">未经您明确同意,我们不会削减您按照本《隐私权政策》所应享有的权利。我们会在专门页面上发布对本《隐私权政策》所做的任何变更。对于重大变更,我们还会提供更为显著的通知(如网站公示或向您提供弹窗提示等形式),说明具体变更内容。</p>
+                    <br>
+                    <p style="font-size: 18px;">八、如何联系我们</p>
+                    <p>您可以通过以下方式与我们联系,我们将在收到您的需求后,在15个工作日内予以回复:</p>
+                    <p style="text-indent: 20px;">1、您可以通过以下方式与我们联系,我们将在收到您的需求后,在15个工作日内予以回复:</p>
+                    <p style="text-indent: 20px;">2、如发现个人信息可能被泄露,您可以通过剑鱼标讯客服进行投诉举报;</p>
+                    <p>我们设立了个人信息保护专职部门,剑鱼标讯客服会将您的需求向其转达。</p>
+                    <p>剑鱼标讯客服邮箱:jy@topnet.net.cn</p>
+                    <br>
+                    <p style="font-size: 18px;">附录:关于第三方软件开发工具包(SDK)的使用说明</p>
+                    <p>我们仅会出于合法、正当、必要、特定、明确的目的获取您的信息,并将审慎评估对于第三方软件开发工具包(SDK)的使用,同时对于这些第三方软件开发工具包(SDK)的安全保障能力进行综合评估,尽最大可能保护数据安全,因第三方会动态修改权限获取,我们会尽可能同步并告知您。</p>
+                    <p>(1)百度地图</p>
+                    <p style="text-indent: 20px;">SDK用途:获取用户的位置信息(城市),根据地域提供更精准的服务。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息,位置权限</p>
+                    <p>(2)小米</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向小米手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(3)华为</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向华为手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(4)友盟</p>
+                    <p style="text-indent: 20px;">SDK用途:用于平台信息统计,推送应用优惠活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(5)腾讯开放平台</p>
+                    <p style="text-indent: 20px;">SDK用途:用于人脸识别,用户进行实名认证。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(6)OPPO</p>
+                    <p style="text-indent: 20px;">SDK用途:用于向OPPO手机用户推送产品资讯和活动信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <p>(7)支付宝</p>
+                    <p style="text-indent: 20px;">SDK用途:用于调用支付宝实名认证信息。</p>
+                    <p style="text-indent: 20px;">SDK收集的信息类型:手机设备信息</p>
+                    <br>
+                    <p style="font-size: 18px;">附件:《剑鱼标讯账户注销须知》</p>
+                    <p>亲爱的剑鱼标讯用户:</p>
+                    <p style="text-indent: 20px;">您在申请注销流程中点击同意前,应当认真阅读《剑鱼标讯账户注销须知》(以下称“《注销须知》”)。</p>
+                    <p>请您务必审慎阅读、充分理解《注销须知》中相关条款内容,其中包括:</p>
+                    <p>1、与您约定免除或限制责任的条款;</p>
+                    <p>2、其他以粗体标识的重要条款。</p>
+                    <p style="text-indent: 20px;">如您对本《注销须知》有任何疑问,可拨打我们的客服电话400-108-6670联系客服。</p>
+                    <p style="text-indent: 20px;">【特别提示】当您按照注销页面提示填写信息、阅读并同意本《注销须知》及相关条款与条件且完成全部注销程序后,即表示您已充分阅读、理解并接受本《注销须知》的全部内容。阅读本《注销须知》的过程中,如果您不同意相关任何条款和条件约定,请您立即停止账户注销程序。</p>
+                    <p style="text-indent: 20px;">我们在此善意地提醒您,您注销账户的行为会给您的售后维权带来诸多不便,且注销剑鱼标讯账户后,您的个人信息我们只会在剑鱼标讯的前台系统中去除,使其保持不可被检索、访问的状态,或对其进行匿名化处理。您知晓并理解,根据相关法律规定,相关交易记录须在剑鱼标讯后台保存5年甚至更长的时间。</p>
+                    <p style="text-indent: 20px;">如果您仍执意注销账户,您的账户需同时满足以下条件:</p>
+                    <p style="text-indent: 20px;">(1)在最近一个月内,账户没有进行更改密码、更改绑定信息等敏感操作;</p>
+                    <p style="text-indent: 20px;">(2)自愿放弃账户在剑鱼标讯中的资产和虚拟权益(包括但不限于账户余额、优惠券等),并确保账户中无欠款;</p>
+                    <p style="text-indent: 20px;">(3)账户内无未完成的订单和服务;</p>
+                    <p style="text-indent: 20px;">(4)账户无任何纠纷,包括投诉举报或被投诉举报;</p>
+                    <p>3、剑鱼标讯账户一旦被注销将不可恢复,请您在操作之前自行备份剑鱼标讯账户相关的所有信息和数据。请您保存好订单商品和服务的交易凭证、票据等资料,否则您有可能须支付额外的账户和订单查询费用,或无法享受售后服务。</p>
+                    <p>4、在剑鱼标讯账户注销期间,如果您的剑鱼标讯账户涉及争议纠纷,包括但不限于投诉、举报、诉讼、仲裁、国家有权机关调查等,剑鱼标讯有权自行终止本剑鱼标讯账户的注销而无需另行得到您的同意。</p>
+                    <p>5、注销剑鱼标讯账户,您将无法再使用本剑鱼标讯账户,也将无法找回您剑鱼标讯账户中及与账户相关的任何内容或信息,包括但不限于:</p>
+                    <p style="text-indent: 20px;">(1)您将无法登录、使用本剑鱼标讯账户;</p>
+                    <p style="text-indent: 20px;">(2)本剑鱼标讯账户的个人资料和历史信息(包括但不限于用户名、头像、订单记录、订阅信息、关注信息、推送记录等)都将无法找回;</p>
+                    <p style="text-indent: 20px;">(3)您曾获得的余额、优惠券及其他卡券等视为您自行放弃,将无法继续使用。您理解并同意,剑鱼标讯无法协助您重新恢复前述服务。请您在提交注销申请前,务必先了解您须解绑的其他相关账户信息,具体可与我们的客服联系。</p>
+                    <p>6、注销本剑鱼标讯账户并不代表本剑鱼标讯账户注销前的账户行为和相关责任得到豁免或减轻。</p>
             </div>
         </div>
     </div>
 </div>
+<script>
+    var isIos = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
+    var defaultCompanyName = '北京拓普丰联信息工程有限公司'
+    if (isIos) {
+        defaultCompanyName = '北京剑鱼信息技术有限公司'
+    }
+    document.getElementById('companyName').innerText = defaultCompanyName
+</script>
 <!-- main END -->
 <!-- footer -->
 

+ 22 - 0
src/web/templates/weixin/commonPay/checkout.html

@@ -322,6 +322,28 @@
                                         } catch (error) {
                                           console.log(error)
                                         }
+                                      }
+                                      // 采购单位画像引流过来的埋点
+                                      if (checkout.getUrlParam('bid')) {
+                                        try {
+                                          var params = {
+                                            mold: 'isPaid'
+                                          }
+                                          $.ajax({
+                                            type: 'POST',
+                                            url: '/publicapply/drainage/buyerunit',
+                                            contentType: "application/json",
+                                            data: JSON.stringify(params),
+                                            success: function (res) {
+                                              console.log(res)
+                                            },
+                                            error: function (error) {
+                                              console.log(error)
+                                            }
+                                          })
+                                        } catch (error) {
+                                          console.log(error)
+                                        }
                                       }
                                         var  bigmemberBid=checkout.getUrlParam("b");
                                         var href ="/weixin/{{.T.doType}}/paySuccess?orderCode=" + res.orderCode + "&email=" + res.email + "&payTime=" + res.payTime + "&price=" + res.price + "&t={{.T.t}}"

+ 2 - 2
src/web/templates/weixin/vipsubscribe/keyWord.html

@@ -46,7 +46,7 @@
             <div class="keyword-list" v-show="listShow">
                 <div
                     class="keywords-item"
-                    v-for="(item,index) in filter.keywordsList"
+                    v-for="(item,index) in keyListSorted"
                     :key="index">
                     <div class="checkbox-container" :class="{ w0: !batchDeleteState }">
                         <van-checkbox
@@ -56,7 +56,7 @@
                         </van-checkbox>
                     </div>
                     <van-swipe-cell
-                        :name="index"
+                        :name="item.groupIndex + '-' + item.keyIndex"
                         :disabled="batchDeleteState"
                         :before-close="beforeKeySwipeCellClose">
                         <div class="j-key-card" @click="clickKeyCard(item)">

+ 3 - 3
src/web/templates/weixin/vipsubscribe/manageWord.html

@@ -72,7 +72,7 @@
                     <!-- 分类名称卡片 -->
                     <div
                         class="keywords-item"
-                        v-for="(item,index) in groupNameList"
+                        v-for="(item,index) in groupNameListSorted"
                         :key="index">
                         <div class="checkbox-container" :class="{ w0: !batchDeleteState }">
                             <van-checkbox
@@ -83,10 +83,10 @@
                             </van-checkbox>
                         </div>
                         <van-swipe-cell
-                            :name="index"
+                            :name="item.groupIndex"
                             :disabled="item.deleteDisabled || batchDeleteState"
                             :before-close="beforeKeySwipeCellClose">
-                            <div class="j-key-card" @click="clickKeyCard(item, index)">
+                            <div class="j-key-card" @click="clickKeyCard(item)">
                                 <div class="j-key-card-left">${ item.name }</div>
                                 <div class="j-key-card-right">
                                     <span class="text">${ item.count }组关键词</span>

+ 13 - 1
src/web/templates/weixin/wxinfocontent_rec.html

@@ -1652,7 +1652,7 @@ $(function(){
 		if(rerbuyertel==undefined||rerbuyertel==null){
 			rerbuyertel=""
 		}
-		outhtml +='<li><p class="name">采购单位</p><p class="textcontent">'+rerbuyer+'</p><a dataName="采购单位" dataCont="'+rerbuyer+'" dataCode="buyer" onClick="recoveryAction(this)">纠错</a></li>'
+		outhtml +='<li><p class="name">采购单位</p><div class="unitcenter caigouunit"><p class="textcontent">'+rerbuyer+'</p></div><a dataName="采购单位" dataCont="'+rerbuyer+'" dataCode="buyer" onClick="recoveryAction(this)">纠错</a></li>'
 		outhtml +='<li><p class="name">采购联系人</p><p class="textcontent">'+rerbuyerperson+'</p><a dataName="采购联系人" dataCont="'+rerbuyerperson+'" dataCode="buyerperson" onClick="recoveryAction(this)">纠错</a></li>'+
 					'<li class="bbm0"><p class="name">采购电话</p><p class="textcontent">'+rerbuyertel+'</p><a dataName="采购电话" dataCont="'+rerbuyertel+'" dataCode="buyertel" onClick="recoveryAction(this)">纠错</a></li>'
 		if(packageCon==""){
@@ -1828,6 +1828,18 @@ $(function(){
     $.get("/front/shorturl/replication");
     });
 
+    // 采购单位跳转
+    $('.caigouunit').on('click',function(){
+      if(rerbuyer != ''&&rerbuyer!=null){
+          var landinfo = {
+              anchor: '采购单位全景分析',
+              landname: rerbuyer
+          }
+          //  大会员用户、非大会员用户都可跳转采购单位画像
+          location.href = "/big/wx/page/unit_portrayal?entName="+encodeURIComponent(rerbuyer)
+      }
+
+    })
 		// 中标单位跳转
 		$('.zhongbiaounit').on('click',function(){
         if (rerwinner!=""&&rerwinner!=null){

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff