Эх сурвалжийг харах

Merge branch 'dev/v1.0.88_yf' of jianyu/web into feature/v1.0.88

yangfeng 6 сар өмнө
parent
commit
5366bd6bfb

+ 39 - 19
apps/bigmember_pc/src/api/modules/forecast.js

@@ -1,5 +1,5 @@
-import request from '@/api'
 import qs from 'qs'
+import request from '@/api'
 
 // 潜在项目预测list接口
 export function getPotenList(data) {
@@ -7,7 +7,7 @@ export function getPotenList(data) {
   return request({
     url: '/bigmember/forecast/forPList',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -17,7 +17,7 @@ export function getProjectList(data) {
   return request({
     url: '/bigmember/analysis/projectName',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -27,7 +27,7 @@ export function getResultDetail(data) {
   return request({
     url: '/bigmember/forecast/forWResult',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -37,7 +37,7 @@ export function getEntFollowList(data) {
   return request({
     url: '/bigmember/follow/ent/list',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -47,7 +47,7 @@ export function getBidAssociation(data) {
   return request({
     url: '/bigmember/search/ent/association',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -67,7 +67,7 @@ export function getBidProjectInfo(data) {
   return request({
     url: '/bigmember/analysis/projectInfo',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -77,7 +77,7 @@ export function getForWData(data) {
   return request({
     url: '/bigmember/forecast/forWData',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -87,7 +87,7 @@ export function getForWStatus(data) {
   return request({
     url: '/bigmember/forecast/forWStatus',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -97,7 +97,7 @@ export function getForWResult(data) {
   return request({
     url: '/bigmember/forecast/forWResult',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -107,7 +107,7 @@ export function getPotenDetail(data) {
   return request({
     url: '/bigmember/forecast/forPContent',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -117,7 +117,7 @@ export function getfollowCheck(data) {
   return request({
     url: '/bigmember/follow/ent/followCheck',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -127,7 +127,7 @@ export function getBidAiused(data) {
   return request({
     url: '/bigmember/use/aiused_history',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -137,7 +137,7 @@ export function getBdInfoStatus(data) {
   return request({
     url: '/bigmember/forecast/bdInfoStatus',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -147,7 +147,7 @@ export function getSearchByNames(data) {
   return request({
     url: '/bigmember/entinfo/bynames',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -157,7 +157,7 @@ export function getNewMsgSelects(data) {
   return request({
     url: '/bigmember/portrait/winner/getNewMsgSelects',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -167,7 +167,7 @@ export function getSvipMsgSelects(data) {
   return request({
     url: '/bigmember/portrait/subVipPortrait/getNewMsgSelects',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -177,7 +177,7 @@ export function changeEntGroup(data) {
   return request({
     url: '/bigmember/follow/ent/changeGroup',
     method: 'post',
-    data: data
+    data
   })
 }
 
@@ -195,6 +195,26 @@ export function forecastDataExport(data) {
   return request({
     url: '/bigmember/forecast/forDerive',
     method: 'post',
-    data: data
+    data
+  })
+}
+
+// 企业监控分组(仅有获取),不含达到分组上限
+export function ajaxFollowEntGroup(data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/bigmember/follow/ent/labelGroupList',
+    method: 'post',
+    data
+  })
+}
+
+// 企业监控分组(获取、新增、编辑、删除),(获取)包含达到监控上限相关字段
+export function ajaxFollowUpdateGroup(data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/bigmember/follow/ent/labelGroup',
+    method: 'post',
+    data
   })
 }

+ 94 - 3
apps/bigmember_pc/src/components/forecast/ForFilter.vue

@@ -3,8 +3,19 @@
     <div class="filter-title">筛选条件</div>
     <div class="filter-item">
       <span class="item-label">分组:</span>
-      <div>
+      <!-- <div>
         <GroupTag selectorType="line" @onChange="getGroupTag"></GroupTag>
+      </div> -->
+      <div class="selected-list">
+        <el-tag
+          class="tag-item"
+          :class="tag.checked ? 'active' : ''"
+          type="plain"
+          v-for="tag in formatGroupList"
+          :key="tag.name"
+          @click="changeTag(tag)"
+          >{{ tag.name }}</el-tag
+        >
       </div>
     </div>
     <div class="filter-item">
@@ -28,19 +39,26 @@
 </template>
 
 <script>
-import { Input, Button } from 'element-ui'
+import { Input, Button, Tag } from 'element-ui'
 import GroupTag from '@/components/selector/GroupSelectorContent.vue'
 export default {
   name: 'ent-filter',
-  props: {},
+  props: {
+    groupList: {
+      type: Array,
+      default: () => []
+    }
+  },
   computed: {},
   components: {
     [Input.name]: Input,
     [Button.name]: Button,
+    [Tag.name]: Tag,
     GroupTag
   },
   data() {
     return {
+      formatGroupList: [],
       entVal: '',
       curGroup: ''
     }
@@ -48,7 +66,24 @@ export default {
   destroyed() {
     this.$store.commit('forcast/clearEntFilter')
   },
+  watch: {
+    groupList(newVal) {
+      this.initGroupList()
+    }
+  },
+  mounted() {
+    this.initGroupList()
+  },
   methods: {
+    initGroupList() {
+      const selectedGroup = this.curGroup.split(',')
+      this.formatGroupList = this.groupList.map((item, index) => {
+        return {
+          ...item,
+          checked: selectedGroup.includes(item.id)
+        }
+      })
+    },
     getGroupTag(data) {
       this.curGroup = data
       this.$emit('onPageChange', 0, this.entVal, data)
@@ -81,6 +116,48 @@ export default {
       if (!val) {
         this.clearHandle()
       }
+    },
+    changeTag(item) {
+      const data = this.formatGroupList
+      const list = data.slice(1, data.length)
+      if (item.id === '') {
+        list.forEach((v) => {
+          v.checked = false
+        })
+        item.checked = true
+      } else {
+        item.checked = !item.checked
+        const someChecked = list.some((s) => {
+          return s.checked
+        })
+        const everyChecked = list.every((s) => {
+          return s.checked
+        })
+        if (someChecked) {
+          data[0].checked = false
+        } else {
+          data[0].checked = true
+        }
+        if (everyChecked) {
+          list.forEach((v) => {
+            v.checked = false
+          })
+          data[0].checked = true
+        }
+      }
+      const selected = this.getSelectedTag()
+      // this.$emit('onChange', selected)
+      this.getGroupTag(selected)
+    },
+    getSelectedTag() {
+      const data = []
+      const lists = this.formatGroupList
+      lists.forEach((v) => {
+        if (v.checked) {
+          data.push(v.id)
+        }
+      })
+      return data.toString()
     }
   }
 }
@@ -132,5 +209,19 @@ export default {
       border: 0;
     }
   }
+  .tag-item {
+    height: 26px;
+    line-height: 26px;
+    margin-right: 12px;
+    background: #fff;
+    border: 0;
+    color: #1d1d1d;
+    font-size: 14px;
+    cursor: pointer;
+    &.active {
+      color: #fff;
+      background-color: $color-text--highlight;
+    }
+  }
 }
 </style>

+ 99 - 18
apps/bigmember_pc/src/components/forecast/ForeCast.vue

@@ -491,24 +491,49 @@
       </el-pagination>
     </div>
     <!-- 分组dialog -->
-    <el-dialog
-      custom-class="sub-dialog"
+    <common-dialog
+      custom-class="monitor-class"
       :visible.sync="dialog.group"
       :close-on-click-modal="false"
       :show-close="false"
       :destroy-on-close="true"
-      :lock-scroll="false"
       center
-      width="460px"
+      title="编辑分组"
+      width="464px"
     >
-      <GroupCard
+      <!-- <GroupCard
         :initGroupInfo="this.cur.group"
         @onCancel="dialog.group = false"
         @onConfirm="saveGroupData"
       >
         <div slot="header">编辑分组</div>
-      </GroupCard>
-    </el-dialog>
+      </GroupCard> -->
+      <MonitorGroup
+        :key="cur.group"
+        :list="groupList"
+        :echo="cur.group"
+        @emitDisabled="onGroupDisabled"
+        @onChange="onChangeGroup"
+        @add="onAddGroup"
+        @edit="onEditGroup"
+      ></MonitorGroup>
+      <template #footer>
+        <button
+          class="action-button confirm"
+          :disabled="groupActionDisabled"
+          @click="confirmChangeGroup"
+        >
+          确定
+        </button>
+        <button
+          class="action-button cancel"
+          :disabled="groupActionDisabled"
+          @click="dialog.group = false"
+        >
+          取消
+        </button>
+      </template>
+    </common-dialog>
   </div>
 </template>
 
@@ -540,6 +565,9 @@ import {
 } from '@/api/modules'
 import MoneySelection from '@/components/selector-cascader/MoneySelection.vue'
 import AreaCityCountryCascader from '@/components/selector-cascader/AreaCityCountryCascader.vue'
+import MonitorGroup from '@/composables/quick-monitor/component/MonitorGroup.vue'
+import commonDialog from '@/components/dialog/Dialog.vue'
+
 export default {
   props: [
     'type',
@@ -554,7 +582,8 @@ export default {
     'entSearch',
     'entSearchRes',
     'showFiltrate',
-    'tab_list'
+    'tab_list',
+    'groupList'
   ],
   name: 'listData',
   mixins: [mixinVisited],
@@ -572,7 +601,9 @@ export default {
     Tips,
     TimeSelector,
     tabs,
-    AreaCityCountryCascader
+    AreaCityCountryCascader,
+    MonitorGroup,
+    commonDialog
   },
   data() {
     return {
@@ -596,7 +627,8 @@ export default {
       },
       cur: {
         group: '', // 当前点击编辑的分组信息
-        fid: ''
+        fid: '',
+        entId: ''
       },
       filterPrice: {
         min: '',
@@ -606,7 +638,9 @@ export default {
       regionMapData: '',
       sourceAreaMap: {},
       allChecked: false,
-      selectedId: []
+      selectedId: [],
+      groupActionDisabled: false,
+      checkedGroupId: ''
     }
   },
   created() {
@@ -1013,8 +1047,9 @@ export default {
     // 企业情报监控 编辑分组
     editGroup(item) {
       this.dialog.group = true
-      this.cur.group = item.s_group ? item.s_group : 'A'
+      this.cur.group = item.s_grousp
       this.cur.fid = item.fid
+      this.cur.entId = item.s_entId
     },
     // 企业情报监控 取消关注
     cancelFollow(item) {
@@ -1040,16 +1075,13 @@ export default {
     },
     saveGroupData(data) {
       const params = {
-        fid: this.cur.fid,
-        group: data
-      }
-      const defaultParams = {
-        fid: this.cur.fid
+        entId: this.cur.entId,
+        groups: data ? data : undefined
       }
       const filter = this.filter
       const num = this.listState.list.length <= 1 ? 0 : this.listState.pageNum
       // console.log(num, this.listState.list, '1111')
-      changeEntGroup(data === 'A' ? defaultParams : params).then((res) => {
+      changeEntGroup(params).then((res) => {
         if (res.data === 'success') {
           this.dialog.group = false
           this.$emit(
@@ -1199,6 +1231,33 @@ export default {
       this.filterPrice = { min: '', max: '' }
       this.$emit('changePrice', this.filterPrice)
       this.$emit('onChange', { start: 0, end: 0 })
+    },
+    // 编辑分组弹框确定/取消按钮是否禁用
+    onGroupDisabled(val) {
+      this.groupActionDisabled = val
+      this.$forceUpdate()
+    },
+    // 新增分组
+    onAddGroup(data) {
+      this.$emit('updateGroup', {
+        type: 'add',
+        name: data?.name
+      })
+    },
+    // 编辑分组
+    onEditGroup(data) {
+      this.$emit('updateGroup', {
+        type: 'put',
+        groupId: data?.groupId,
+        name: data?.name
+      })
+    },
+    // 选择分组组件change回调事件
+    onChangeGroup(id) {
+      this.checkedGroupId = id
+    },
+    confirmChangeGroup() {
+      this.saveGroupData(this.checkedGroupId)
     }
   }
 }
@@ -1773,6 +1832,28 @@ export default {
         height: 8px;
       }
     }
+    .monitor-class {
+      padding: 32px;
+      left: 50%;
+      top: 50%;
+      transform: translate(-50%, -50%);
+      margin: 0px !important;
+      border-radius: 8px;
+      .el-dialog__header {
+        padding: 0;
+      }
+      .el-dialog__body {
+        padding: 20px 0 32px;
+        text-align: center;
+      }
+      .el-dialog__footer {
+        padding: 0;
+      }
+    }
+    .action-button.cancel[disabled] {
+      background-color: #e3e4e5;
+      color: #999999;
+    }
   }
   .empty-container {
     padding-bottom: 60px;

+ 70 - 5
apps/bigmember_pc/src/views/ent-intel/EntIntel.vue

@@ -11,7 +11,11 @@
       <TabHeader slot="bidtab" actived="ent"></TabHeader>
       <img class="bidfor_img" src="@/assets/images/item_1.png" slot="bidImg" />
       <template v-slot:main>
-        <ForFilter v-if="type == 0" @onPageChange="getMyFollowList"></ForFilter>
+        <ForFilter
+          v-if="type == 0"
+          :group-list="groupList"
+          @onPageChange="getMyFollowList"
+        ></ForFilter>
         <ForeCast
           style="border-radius: 4px"
           v-loading="loading"
@@ -22,6 +26,8 @@
           v-if="type == 0"
           slot="main"
           :myDataObj="myDataObj"
+          :groupList="formatGroupList"
+          @updateGroup="onUpdateGroup"
         ></ForeCast>
         <ForeCast
           key="entintelRes"
@@ -42,8 +48,13 @@ import ForeCast from '@/components/forecast/ForeCast.vue'
 import TabHeader from '@/components/common/TabHeader.vue'
 import ForFilter from '@/components/forecast/ForFilter.vue'
 import { mapState } from 'vuex'
-import { getEntFollowList } from '@/api/modules'
+import {
+  getEntFollowList,
+  ajaxFollowEntGroup,
+  ajaxFollowUpdateGroup
+} from '@/api/modules'
 import { scrollTargetView } from '@/utils/'
+
 export default {
   name: 'ent-intel',
   components: {
@@ -61,7 +72,9 @@ export default {
         initTotal: 0 // 已关注总数
       },
       tiptext: '',
-      loading: true
+      loading: true,
+      groupList: [],
+      formatGroupList: []
     }
   },
   computed: {
@@ -71,8 +84,9 @@ export default {
       type: (state) => state.forcast.type
     })
   },
-  created() {
+  async created() {
     // listData
+    this.ajaxEntGroupList({ type: 'get' })
     this.ajaxGetEntFollowList()
   },
   mounted() {
@@ -96,7 +110,58 @@ export default {
         scrollTargetView('.listData_ul')
       })
     },
-    ajaxGetEntFollowList (p = 0, match = '', group = '', pageSize = 10) {
+    onUpdateGroup(params) {
+      this.ajaxEntGroupList(params)
+    },
+    async onUpdateGroup(params) {
+      const { type, groupId, name } = params
+      const { error_code: code } = await ajaxFollowUpdateGroup({
+        type,
+        groupId,
+        name
+      })
+      if (code === 0) {
+        this.$toast(type === 'add' ? '新增分组成功' : '修改分组成功')
+        this.ajaxEntGroupList()
+      }
+    },
+    // 获取分组(新增、编辑)
+    async ajaxEntGroupList() {
+      const {
+        error_code: code,
+        data,
+        error_msg: msg
+      } = await ajaxFollowEntGroup({ type: 'get' })
+      if (code === 0) {
+        // 分组
+        if (data?.groupUserArr) {
+          const newItem = {
+            id: '',
+            name: '全部',
+            count: 0
+          }
+          data?.groupUserArr.unshift(newItem)
+          // 筛选项分组(增加全部选项)
+          this.groupList = data?.groupUserArr.map((group) => {
+            return {
+              id: group.id,
+              name: group.name,
+              isPut: group.isPut,
+              count: group.count
+            }
+          })
+          // 编辑分组(排除全部)
+          this.formatGroupList = this.groupList.filter((v) => {
+            return v.id
+          })
+        } else {
+          this.groupList = []
+        }
+      } else {
+        this.$toast(msg || '操作失败')
+      }
+    },
+    ajaxGetEntFollowList(p = 0, match = '', group = '', pageSize = 10) {
       getEntFollowList({
         pageNum: p,
         pageSize: pageSize,