Browse Source

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

yangfeng 1 year ago
parent
commit
0527db981f

+ 1 - 1
apps/bigmember_pc/src/api/modules/business.js

@@ -12,7 +12,7 @@ export function getBusinessDetails(data) {
 }
 }
 
 
 // 是否需要完善信息提示
 // 是否需要完善信息提示
-export function isNeedCompleteInfo () {
+export function isNeedCompleteInfo() {
   return request({
   return request({
     baseURL: '/salesLeads',
     baseURL: '/salesLeads',
     url: '/businessRetain',
     url: '/businessRetain',

+ 10 - 0
apps/bigmember_pc/src/api/modules/workspace.js

@@ -130,3 +130,13 @@ export function getWorkspaceEquityCount() {
     method: 'get'
     method: 'get'
   })
   })
 }
 }
+
+// 工作台首页-商机情报、待办消息列表(getMessageCenterList接口简版)
+export function getBusinessTodoList(data) {
+  return request({
+    baseURL: '/jyapi/messageCenter',
+    url: '/WorkDeskList',
+    method: 'POST',
+    data
+  })
+}

BIN
apps/bigmember_pc/src/assets/images/workspace/db.png


+ 0 - 0
apps/bigmember_pc/src/assets/images/workspace/shangjiqingbao.png → apps/bigmember_pc/src/assets/images/workspace/qb.png


+ 3 - 1
apps/bigmember_pc/src/store/workspace.js

@@ -11,6 +11,7 @@ import dataReport from './workspace/data-report'
 import asideOthers from './workspace/aside-others'
 import asideOthers from './workspace/aside-others'
 import importantNews from './workspace/important-news'
 import importantNews from './workspace/important-news'
 import industryReport from './workspace/industry-report'
 import industryReport from './workspace/industry-report'
+import businessTodo from './workspace/business-todo'
 
 
 export default {
 export default {
   namespaced: true,
   namespaced: true,
@@ -59,6 +60,7 @@ export default {
     asideOthers,
     asideOthers,
     customerWatcher,
     customerWatcher,
     importantNews,
     importantNews,
-    industryReport
+    industryReport,
+    businessTodo
   }
   }
 }
 }

+ 85 - 0
apps/bigmember_pc/src/store/workspace/business-todo.js

@@ -0,0 +1,85 @@
+import { getBusinessTodoList } from '@/api/modules'
+import { getAssetsFile } from '@/utils'
+import { dateMatter } from '@/utils/'
+
+export default {
+  namespaced: true,
+  state: () => ({
+    loading: true,
+    loaded: false,
+    businessList: [],
+    todoList: [],
+    showTodo: false
+  }),
+  mutations: {
+    changeShowTodo(state, data) {
+      state.showTodo = data
+    },
+    changeBusinessList(state, list = []) {
+      if (Array.isArray(list)) {
+        state.businessList = list
+      }
+    },
+    changeTodoList(state, list = []) {
+      if (Array.isArray(list)) {
+        state.todoList = list
+      }
+    },
+    changeLoading(state, f = false) {
+      state.loading = f
+    },
+    changeLoaded(state, f = false) {
+      state.loaded = f
+    }
+  },
+  actions: {
+    async getList({ dispatch }, payload) {
+      const defaultPrams = {
+        needDealtWithCount: true,
+        msgType: 5,
+        offset: 1,
+        size: 5
+      }
+      const params = Object.assign({}, defaultPrams, payload)
+      dispatch('getMessageList', params)
+    },
+    async getMessageList({ commit }, payload) {
+      try {
+        commit('changeLoading', true)
+        commit('changeLoaded', false)
+        const {
+          busData = [],
+          needDoData = [],
+          code
+        } = await getBusinessTodoList(payload)
+        if (code === 0) {
+          if (Array.isArray(busData)) {
+            busData.forEach((v) => {
+              v.time = dateMatter(v.createTime.replace(/-/g, '/'))
+              v.img = getAssetsFile('workspace/qb.png')
+            })
+            commit('changeBusinessList', busData)
+          }
+          if (Array.isArray(needDoData)) {
+            needDoData.forEach((v) => {
+              v.time = dateMatter(v.createTime.replace(/-/g, '/'))
+              v.img = getAssetsFile('workspace/db.png')
+            })
+            commit('changeTodoList', needDoData)
+          }
+          const { needDealtWithCount } = payload
+          if (needDealtWithCount) {
+            commit('changeShowTodo', !needDoData ? false : needDoData.length)
+          }
+        }
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+      } catch (error) {
+        commit('changeLoading', false)
+        commit('changeLoaded', true)
+        console.log(error)
+      }
+    }
+  },
+  getters: {}
+}

+ 2 - 1
apps/bigmember_pc/src/store/workspace/message.js

@@ -54,7 +54,8 @@ export default {
         msgType: -1,
         msgType: -1,
         isRead: 0,
         isRead: 0,
         offset: 1,
         offset: 1,
-        size: 20
+        size: 20,
+        isfilterActive: true // P442新增参数:过滤活动类消息
       }
       }
       dispatch('getMessageList', params)
       dispatch('getMessageList', params)
     },
     },

+ 1 - 1
apps/bigmember_pc/src/views/business/detail.vue

@@ -154,7 +154,7 @@ export default {
     // 是否需要完善信息
     // 是否需要完善信息
     async isNeedComplete() {
     async isNeedComplete() {
       const { error_code: code, data } = await isNeedCompleteInfo()
       const { error_code: code, data } = await isNeedCompleteInfo()
-      if(code === 0) {
+      if (code === 0) {
         this.needComplete = !!data
         this.needComplete = !!data
       }
       }
     },
     },

+ 64 - 57
apps/bigmember_pc/src/views/workspace/components/BusinessToDo.vue

@@ -3,43 +3,47 @@
     <header class="card-header">
     <header class="card-header">
       <div class="card-header-tabs">
       <div class="card-header-tabs">
         <span
         <span
-          :class="{ active: activeName === tab.id }"
-          v-for="tab in tabs"
-          :key="tab.id"
-          @click="onTabClick(tab.id)"
+          :class="{
+            active: activeName === tab.type,
+            only: computedTabs.length === 1
+          }"
+          v-for="tab in computedTabs"
+          :key="tab.type"
+          @click="onTabClick(tab.type)"
           >{{ tab.name }}</span
           >{{ tab.name }}</span
         >
         >
       </div>
       </div>
-      <div class="card-header-more" @click="linkMore">
+      <div class="card-header-more" v-if="showMore" @click="linkMore">
         <span class="more-text">更多</span>
         <span class="more-text">更多</span>
         <span class="el-icon-jy-blue-more"></span>
         <span class="el-icon-jy-blue-more"></span>
       </div>
       </div>
     </header>
     </header>
     <transition name="el-fade-in-linear">
     <transition name="el-fade-in-linear">
-      <div>
-        <main class="card-main" v-show="activeName === '1'">
-          <div class="chat-list" v-if="businessList.length != 0">
+      <div v-loading="loading">
+        <main class="card-main" v-show="activeName === 5">
+          <div class="chat-list">
             <ChatItem
             <ChatItem
               v-for="(item, index) in businessList"
               v-for="(item, index) in businessList"
               :key="index"
               :key="index"
               v-bind="item"
               v-bind="item"
+              @click="onBusinessItem(item)"
             ></ChatItem>
             ></ChatItem>
           </div>
           </div>
-          <div class="empty-wrapper" v-else>
+          <div class="empty-wrapper" v-show="!businessList.length && loaded">
             <Empty class="empty-mini" :mtb60="false">
             <Empty class="empty-mini" :mtb60="false">
               <slot name="empty-content">暂无数据</slot>
               <slot name="empty-content">暂无数据</slot>
             </Empty>
             </Empty>
           </div>
           </div>
         </main>
         </main>
-        <main class="card-main" v-show="activeName === '2'">
-          <div class="chat-list" v-if="todoList.length != 0">
+        <main class="card-main" v-show="activeName === 11">
+          <div class="chat-list">
             <ChatItem
             <ChatItem
               v-for="(item, index) in todoList"
               v-for="(item, index) in todoList"
               :key="index"
               :key="index"
               v-bind="item"
               v-bind="item"
             ></ChatItem>
             ></ChatItem>
           </div>
           </div>
-          <div class="empty-wrapper" v-else>
+          <div class="empty-wrapper" v-show="!todoList.length && loaded">
             <Empty class="empty-mini" :mtb60="false">
             <Empty class="empty-mini" :mtb60="false">
               <slot name="empty-content">暂无数据</slot>
               <slot name="empty-content">暂无数据</slot>
             </Empty>
             </Empty>
@@ -53,7 +57,7 @@
 <script>
 <script>
 import ChatItem from '../ui/ChatItem.vue'
 import ChatItem from '../ui/ChatItem.vue'
 import Empty from '@/components/common/Empty.vue'
 import Empty from '@/components/common/Empty.vue'
-import { getAssetsFile } from '@/utils'
+import { mapState, mapActions } from 'vuex'
 
 
 export default {
 export default {
   name: 'BusinessToDo',
   name: 'BusinessToDo',
@@ -64,54 +68,49 @@ export default {
   data() {
   data() {
     return {
     return {
       tabs: [
       tabs: [
-        { id: '1', name: '商机情报' },
-        { id: '2', name: '待办' }
+        { name: '商机情报', type: 5 },
+        { name: '待办', type: 11 }
       ],
       ],
-      activeName: '1',
-      businessList: [
-        {
-          id: '11',
-          title: '您有一条新的专属商机情报',
-          time: '2020年10月8日 9:30',
-          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
-          img: getAssetsFile('workspace/shangjiqingbao.png')
-        },
-        {
-          id: '11',
-          title: '您有一条新的专属商机情报',
-          time: '2020年10月8日 9:30',
-          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
-          img: getAssetsFile('workspace/shangjiqingbao.png')
-        },
-        {
-          id: '11',
-          title: '您有一条新的专属商机情报',
-          time: '2020年10月8日 9:30',
-          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
-          img: getAssetsFile('workspace/shangjiqingbao.png')
-        },
-        {
-          id: '11',
-          title: '您有一条新的专属商机情报',
-          time: '2020年10月8日 9:30',
-          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
-          img: getAssetsFile('workspace/shangjiqingbao.png')
-        },
-        {
-          id: '11',
-          title: '您有一条新的专属商机情报',
-          time: '2020年10月8日 9:30',
-          content: '客户服务专家和你一起聊聊:如何从招投标数据中发现商机?',
-          img: getAssetsFile('workspace/shangjiqingbao.png')
-        }
-      ],
-      todoList: []
+      activeName: 5
     }
     }
   },
   },
+  computed: {
+    ...mapState({
+      loading: (state) => state.workspace.businessTodo.loading,
+      loaded: (state) => state.workspace.businessTodo.loaded,
+      showTodo: (state) => state.workspace.businessTodo.showTodo,
+      businessList: (state) => state.workspace.businessTodo.businessList,
+      todoList: (state) => state.workspace.businessTodo.todoList
+    }),
+    showMore() {
+      const businessType = this.activeName === 5
+      const todoLength = this.todoList.length
+      const businessLength = this.businessList.length
+      return businessType ? businessLength : todoLength
+    },
+    // P442需求:待办为空时,不展示该分类
+    computedTabs() {
+      return this.tabs.filter((item) => {
+        return this.showTodo ? item : item.type !== 11
+      })
+    }
+  },
+  created() {
+    this.getList()
+  },
   methods: {
   methods: {
-    linkMore() {},
-    onTabClick(index) {
-      this.activeName = index
+    ...mapActions('workspace/businessTodo', ['getList']),
+    linkMore() {
+      const type = this.activeName
+      window.open(`/swordfish/frontPage/messageCenter/sess/index?type=${type}`)
+    },
+    onTabClick(msgType) {
+      this.activeName = msgType
+      // this.getList()
+    },
+    onBusinessItem(item) {
+      const link = `/swordfish/page_big_pc/business_detail/${item.id}`
+      window.open(link)
     }
     }
   }
   }
 }
 }
@@ -152,6 +151,12 @@ export default {
           background: $color_main;
           background: $color_main;
         }
         }
       }
       }
+      .only {
+        color: #1d1d1d;
+        &::after {
+          display: none;
+        }
+      }
     }
     }
     &-more {
     &-more {
       display: flex;
       display: flex;
@@ -167,6 +172,7 @@ export default {
   }
   }
   .card-main {
   .card-main {
     padding: 0 12px 16px;
     padding: 0 12px 16px;
+    min-height: 246px;
   }
   }
   ::v-deep {
   ::v-deep {
     .chat-item {
     .chat-item {
@@ -174,6 +180,7 @@ export default {
         width: 32px;
         width: 32px;
         height: 32px;
         height: 32px;
         background: transparent;
         background: transparent;
+        margin-right: 12px;
       }
       }
     }
     }
   }
   }

+ 16 - 1
apps/bigmember_pc/src/views/workspace/ui/ChatItem.vue

@@ -3,6 +3,7 @@
     <div class="chat-item-l">
     <div class="chat-item-l">
       <img v-if="img" :src="img" alt="" />
       <img v-if="img" :src="img" alt="" />
       <span v-else>{{ name }}</span>
       <span v-else>{{ name }}</span>
+      <span v-if="dot" class="l-dot"></span>
     </div>
     </div>
     <div class="chat-item-r">
     <div class="chat-item-r">
       <div class="chat-item-r-top">
       <div class="chat-item-r-top">
@@ -41,6 +42,10 @@ export default {
     visited: {
     visited: {
       type: Boolean,
       type: Boolean,
       default: false
       default: false
+    },
+    dot: {
+      type: Boolean,
+      default: false
     }
     }
   }
   }
 }
 }
@@ -54,6 +59,7 @@ export default {
   align-items: center;
   align-items: center;
   cursor: pointer;
   cursor: pointer;
   &-l {
   &-l {
+    position: relative;
     display: flex;
     display: flex;
     width: 36px;
     width: 36px;
     height: 36px;
     height: 36px;
@@ -63,9 +69,18 @@ export default {
     font-size: 13px;
     font-size: 13px;
     border-radius: 50%;
     border-radius: 50%;
     color: #fff;
     color: #fff;
-    overflow: hidden;
     background: #2cb7ca;
     background: #2cb7ca;
     flex-shrink: 0;
     flex-shrink: 0;
+    .l-dot {
+      position: absolute;
+      right: 0;
+      top: 2px;
+      width: 6px;
+      height: 6px;
+      background: #fb483d;
+      border: 1px solid #ffffff;
+      border-radius: 50%;
+    }
   }
   }
   &-r {
   &-r {
     flex: 1;
     flex: 1;