瀏覽代碼

feature:总经理、销售总监 首页不展示公告 督办下移,展示跟进评论、改为展示评论记录,所有跟进记录增加回复功能

liuzhenlin 1 年之前
父節點
當前提交
b6a58cd1ff

+ 8 - 0
src/api/customer/follow.js

@@ -30,8 +30,16 @@ export default {
   addComment(query) {
     return micro_request.postRequest(basePath, 'FollowUpComment', 'Create', query)
   },
+  // 回复
+  addReply(query) {
+    return micro_request.postRequest(basePath, 'FollowUpComment', 'Reply', query)
+  },
   // 获取附件列表
   getFollowupFileList(query) {
     return micro_request.postRequest(basePath, 'FollowUpFile', 'GetList', query)
   },
+  // 首页评论记录
+  getHomeCommentList(query) {
+    return micro_request.postRequest(basePath, 'FollowUpComment', 'GetLatestComments', query)
+  },
 }

+ 12 - 8
src/components/postComments/index.vue

@@ -7,13 +7,13 @@
  * @FilePath: \订单全流程管理系统\src\views\base\components\PostComments.vue
 -->
 <template>
-  <el-dialog title="发表评论" :visible.sync="visible">
+  <el-dialog :title="reply ? '回复' : '发表评论'" :visible.sync="visible">
     <el-form ref="editForm" :model="editForm" :rules="editRules">
-      <el-form-item label="评论" prop="content">
+      <el-form-item :label="reply ? '回复' : '评论'" prop="content">
         <el-input
           v-model="editForm.content"
           maxlength="500"
-          placeholder="请输入评论内容"
+          :placeholder="reply ? '请输入回复内容' : '请输入评论内容'"
           resize="none"
           :rows="5"
           show-word-limit
@@ -35,6 +35,7 @@
       return {
         loading: false,
         visible: false,
+        reply: false,
         editForm: {
           content: '',
         },
@@ -45,10 +46,11 @@
       }
     },
     created() {
-      console.log(this.visible)
-      console.log(this.editForm)
-      console.log(this.editRules)
+      // console.log(this.visible)
+      // console.log(this.editForm)
+      // console.log(this.editRules)
       console.log(this.form)
+      console.log('reply', this.reply)
     },
     methods: {
       async postContent() {
@@ -56,10 +58,12 @@
           if (valid) {
             this.loading = true
             let params = {
-              followId: '' + this.form.id,
+              followId: this.reply ? '' + this.form.followId : '' + this.form.id,
               content: this.editForm.content,
+              pid: this.reply ? this.form.id : 0,
             }
-            const [err, res] = await to(api.addComment({ ...params }))
+            const post = this.reply ? api.addReply : api.addComment
+            const [err, res] = await to(post({ ...params }))
             this.loading = false
             if (err) return
             if (res.code == 200) {

+ 34 - 2
src/views/base/components/Follow.vue

@@ -41,13 +41,30 @@
             </div>
             <transition name="height">
               <ul class="comments">
-                <li v-for="comment in item.comments" :key="comment.id">
+                <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                   <vab-icon class="user-avatar" icon="account-circle-fill" />
                   <div class="text">
                     <p>{{ comment.createdName }}</p>
                     <p>{{ comment.content }}</p>
-                    <p>{{ comment.createdTime }}</p>
+                    <p>
+                      {{ comment.createdTime }}
+                      <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                    </p>
                   </div>
+                  <transition v-if="comment.replyComments" name="height">
+                    <ul class="comments" style="width: 100%">
+                      <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                        <vab-icon class="user-avatar" icon="account-circle-fill" />
+                        <div class="text">
+                          <p>{{ replyComments.createdName }}</p>
+                          <p>{{ replyComments.content }}</p>
+                          <p>
+                            {{ replyComments.createdTime }}
+                          </p>
+                        </div>
+                      </li>
+                    </ul>
+                  </transition>
                 </li>
               </ul>
             </transition>
@@ -111,6 +128,14 @@
           })
           .catch(() => {})
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.getFollowList()
+          })
+          .catch(() => {})
+      },
       // 展开评论
       showComment(row) {
         if (!row.comments.length) return this.$message.warning('暂无评论')
@@ -174,6 +199,7 @@
           overflow: auto;
 
           li {
+            padding-top: 10px;
             display: flex;
             border-top: 1px solid #e3e5e7;
 
@@ -196,6 +222,9 @@
                 font-size: 12px;
                 color: #9499a0;
                 text-align: right;
+                span {
+                  cursor: pointer;
+                }
               }
             }
           }
@@ -243,4 +272,7 @@
       }
     }
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>

+ 33 - 2
src/views/base/components/Visit.vue

@@ -43,13 +43,30 @@
             </div>
             <transition name="height">
               <ul class="comments">
-                <li v-for="comment in item.comments" :key="comment.id">
+                <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                   <vab-icon class="user-avatar" icon="account-circle-fill" />
                   <div class="text">
                     <p>{{ comment.createdName }}</p>
                     <p>{{ comment.content }}</p>
-                    <p>{{ comment.createdTime }}</p>
+                    <p>
+                      {{ comment.createdTime }}
+                      <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                    </p>
                   </div>
+                  <transition v-if="comment.replyComments" name="height">
+                    <ul class="comments" style="width: 100%">
+                      <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                        <vab-icon class="user-avatar" icon="account-circle-fill" />
+                        <div class="text">
+                          <p>{{ replyComments.createdName }}</p>
+                          <p>{{ replyComments.content }}</p>
+                          <p>
+                            {{ replyComments.createdTime }}
+                          </p>
+                        </div>
+                      </li>
+                    </ul>
+                  </transition>
                 </li>
               </ul>
             </transition>
@@ -105,6 +122,14 @@
       showDetail(row) {
         this.$refs.followDetail.init({ ...row })
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.getFollowList()
+          })
+          .catch(() => {})
+      },
       // 发表评论
       postComments(row) {
         this.$PostComment({ form: row, visible: true })
@@ -198,6 +223,9 @@
                 font-size: 12px;
                 color: #9499a0;
                 text-align: right;
+                span {
+                  cursor: pointer;
+                }
               }
             }
           }
@@ -245,4 +273,7 @@
       }
     }
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>

+ 34 - 2
src/views/base/partners/detail.vue

@@ -76,13 +76,30 @@
                     </div>
                     <transition name="height">
                       <ul class="comments">
-                        <li v-for="comment in item.comments" :key="comment.id">
+                        <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                           <vab-icon class="user-avatar" icon="account-circle-fill" />
                           <div class="text">
                             <p>{{ comment.createdName }}</p>
                             <p>{{ comment.content }}</p>
-                            <p>{{ comment.createdTime }}</p>
+                            <p>
+                              {{ comment.createdTime }}
+                              <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                            </p>
                           </div>
+                          <transition v-if="comment.replyComments" name="height">
+                            <ul class="comments" style="width: 100%">
+                              <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                                <vab-icon class="user-avatar" icon="account-circle-fill" />
+                                <div class="text">
+                                  <p>{{ replyComments.createdName }}</p>
+                                  <p>{{ replyComments.content }}</p>
+                                  <p>
+                                    {{ replyComments.createdTime }}
+                                  </p>
+                                </div>
+                              </li>
+                            </ul>
+                          </transition>
                         </li>
                       </ul>
                     </transition>
@@ -166,6 +183,14 @@
           })
           .catch(() => {})
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.getFollowList()
+          })
+          .catch(() => {})
+      },
       async init() {
         const [err, res] = await to(partnerApi.getCompanyConcat({ id: parseInt(this.id) }))
         if (err) return
@@ -415,6 +440,7 @@
             overflow: auto;
 
             li {
+              padding-top: 10px;
               display: flex;
               border-top: 1px solid #e3e5e7;
 
@@ -437,6 +463,9 @@
                   font-size: 12px;
                   color: #9499a0;
                   text-align: right;
+                  span {
+                    cursor: pointer;
+                  }
                 }
               }
             }
@@ -509,4 +538,7 @@
   .height-enter, .height-leave-to /* .fade-leave-active below version 2.1.8 */ {
     height: 0;
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>

+ 34 - 3
src/views/customer/detail.vue

@@ -160,13 +160,30 @@
                     </div>
                     <transition name="height">
                       <ul class="comments">
-                        <li v-for="comment in item.comments" :key="comment.id">
+                        <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                           <vab-icon class="user-avatar" icon="account-circle-fill" />
                           <div class="text">
                             <p>{{ comment.createdName }}</p>
                             <p>{{ comment.content }}</p>
-                            <p>{{ comment.createdTime }}</p>
+                            <p>
+                              {{ comment.createdTime }}
+                              <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                            </p>
                           </div>
+                          <transition v-if="comment.replyComments" name="height">
+                            <ul class="comments" style="width: 100%">
+                              <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                                <vab-icon class="user-avatar" icon="account-circle-fill" />
+                                <div class="text">
+                                  <p>{{ replyComments.createdName }}</p>
+                                  <p>{{ replyComments.content }}</p>
+                                  <p>
+                                    {{ replyComments.createdTime }}
+                                  </p>
+                                </div>
+                              </li>
+                            </ul>
+                          </transition>
                         </li>
                       </ul>
                     </transition>
@@ -855,6 +872,14 @@
           })
           .catch(() => {})
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.handleClick({ name: 'follow' })
+          })
+          .catch(() => {})
+      },
       // 展开评论
       showComment(row) {
         if (!row.comments.length) return this.$message.warning('暂无评论')
@@ -1100,7 +1125,7 @@
             li {
               display: flex;
               border-top: 1px solid #e3e5e7;
-
+              padding-top: 10px;
               .text {
                 flex: 1;
                 padding: 0 10px;
@@ -1120,6 +1145,9 @@
                   font-size: 12px;
                   color: #9499a0;
                   text-align: right;
+                  span {
+                    cursor: pointer;
+                  }
                 }
               }
             }
@@ -1192,4 +1220,7 @@
   .height-enter, .height-leave-to /* .fade-leave-active below version 2.1.8 */ {
     height: 0;
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>

+ 39 - 4
src/views/customer/follow.vue

@@ -93,7 +93,7 @@
                 </p>
                 <div class="footer">
                   <p>
-                    来自{{ selectDictLabel(targetTypeOptions, item.targetType) }}:
+                    来自{{ selectDictLabel(targetTypeOptions, item.targetType) }}:111
                     <span @click="jumpTo(item)">{{ item.targetName }}</span>
                   </p>
                   <div>
@@ -114,12 +114,25 @@
       </ul>
       <div class="comment">
         <ul>
-          <li v-for="item in comments" :key="item.id">
+          <li v-for="item in comments" :key="item.id" class="flex-wrap">
             <vab-icon class="user-avatar" icon="account-circle-fill" />
             <div class="text">
               <p>{{ item.createdName }}</p>
               <p>{{ item.content }}</p>
-              <p>{{ item.createdTime }}</p>
+              <p>
+                {{ item.createdTime }}
+                <span v-if="!item.replyComments" @click="postReply(item)">回复</span>
+              </p>
+            </div>
+            <div v-for="reply in item.replyComments" :key="reply.id" class="reply-box">
+              <vab-icon class="user-avatar" icon="account-circle-fill" />
+              <div class="text">
+                <p>{{ reply.createdName }}</p>
+                <p>{{ reply.content }}</p>
+                <p>
+                  {{ reply.createdTime }}
+                </p>
+              </div>
             </div>
           </li>
         </ul>
@@ -291,7 +304,7 @@
       },
       async showComment(id) {
         this.followId = id
-        const [err, res] = await to(api.getComment({ followId: id + '' }))
+        const [err, res] = await to(api.getComment({ followId: id + '', pid: '0' }))
         if (err) return
         this.comments = res.data.list || []
       },
@@ -320,6 +333,16 @@
         this.comment = ''
         this.fetchData()
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            // this.handleClick({ name: 'follow' })
+            this.showComment(this.followId)
+            this.fetchData()
+          })
+          .catch(() => {})
+      },
       addFollowUp() {
         let params = {
           followType: '20',
@@ -386,6 +409,10 @@
               font-size: 12px;
               color: #9499a0;
               text-align: right;
+              span {
+                cursor: pointer;
+                color: #1d66dc;
+              }
             }
           }
         }
@@ -503,4 +530,12 @@
       }
     }
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
+  .reply-box {
+    padding-left: 30px;
+    width: 100%;
+    display: flex;
+  }
 </style>

+ 34 - 2
src/views/customer/inviteTenders/details.vue

@@ -95,13 +95,30 @@
                     </div>
                     <transition name="height">
                       <ul class="comments">
-                        <li v-for="comment in item.comments" :key="comment.id">
+                        <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                           <vab-icon class="user-avatar" icon="account-circle-fill" />
                           <div class="text">
                             <p>{{ comment.createdName }}</p>
                             <p>{{ comment.content }}</p>
-                            <p>{{ comment.createdTime }}</p>
+                            <p>
+                              {{ comment.createdTime }}
+                              <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                            </p>
                           </div>
+                          <transition v-if="comment.replyComments" name="height">
+                            <ul class="comments" style="width: 100%">
+                              <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                                <vab-icon class="user-avatar" icon="account-circle-fill" />
+                                <div class="text">
+                                  <p>{{ replyComments.createdName }}</p>
+                                  <p>{{ replyComments.content }}</p>
+                                  <p>
+                                    {{ replyComments.createdTime }}
+                                  </p>
+                                </div>
+                              </li>
+                            </ul>
+                          </transition>
                         </li>
                       </ul>
                     </transition>
@@ -178,6 +195,14 @@
           })
           .catch(() => {})
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.handleClick({ name: 'follow' })
+          })
+          .catch(() => {})
+      },
       getOptions() {
         this.getDicts('bid_info_type').then((response) => {
           this.bidInfoTypeOptions = {}
@@ -455,6 +480,7 @@
             overflow: auto;
 
             li {
+              padding-top: 10px;
               display: flex;
               border-top: 1px solid #e3e5e7;
 
@@ -477,6 +503,9 @@
                   font-size: 12px;
                   color: #9499a0;
                   text-align: right;
+                  span {
+                    cursor: pointer;
+                  }
                 }
               }
             }
@@ -549,4 +578,7 @@
   .height-enter, .height-leave-to /* .fade-leave-active below version 2.1.8 */ {
     height: 0;
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>

+ 59 - 1
src/views/index/index.vue

@@ -191,6 +191,39 @@
         </el-timeline>
         <div class="timelineEmpty">暂无日程</div>
       </el-card> -->
+      <el-card v-if="roleKeys.includes('GeneralManager') || roleKeys.includes('SalesDirector')" class="notice">
+        <div slot="header" class="card-title">
+          <span>评论回复</span>
+          <div class="buttons">
+            <el-button size="mini" @click="handleFollow">
+              更多
+              <i class="el-icon-arrow-right el-icon--right"></i>
+            </el-button>
+          </div>
+        </div>
+        <el-table border :data="commentList" height="100%" style="width: 100%">
+          <el-table-column
+            align="center"
+            label="项目/客户/渠道名称"
+            prop="targetName"
+            show-overflow-tooltip
+            width="160" />
+          <el-table-column align="center" label="评论人" prop="createdName" width="120" />
+          <el-table-column align="center" label="评论内容" prop="content" show-overflow-tooltip width="220" />
+          <el-table-column align="center" label="评论时间" prop="createdTime" width="160" />
+          <el-table-column align="center" label="回复人" width="120">
+            <template #default="{ row }">{{ row.replyComments ? row.replyComments[0].createdName : '-' }}</template>
+          </el-table-column>
+          <el-table-column align="center" label="回复内容" show-overflow-tooltip width="220">
+            <template #default="{ row }">{{ row.replyComments ? row.replyComments[0].content : '-' }}</template>
+          </el-table-column>
+          <el-table-column align="center" label="回复时间" width="160">
+            <template #default="{ row }">
+              {{ row.replyComments ? parseTime(row.replyComments[0].createdTime, '{y}-{m}-{d} {h}:{i}') : '-' }}
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-card>
       <el-card class="notice">
         <div slot="header" class="card-title">
           <span>督办管理</span>
@@ -220,7 +253,7 @@
           </li>
         </ul>
       </el-card>
-      <el-card class="notice">
+      <el-card v-if="!roleKeys.includes('GeneralManager') && !roleKeys.includes('SalesDirector')" class="notice">
         <div slot="header" class="card-title">
           <span>公告</span>
           <div class="buttons">
@@ -289,6 +322,7 @@
 </template>
 
 <script>
+  import { mapGetters } from 'vuex'
   import NoticeDetails from '@/views/system/notice/details.vue'
   import * as echarts from 'echarts'
   import VueDragger from 'vuedraggable'
@@ -297,6 +331,8 @@
   import indexApi from '@/api/index'
   import messageApi from '@/api/system/message'
   import taskApi from '@/api/plat/task'
+  import followApi from '@/api/customer/follow'
+
   export default {
     name: 'Index',
     components: {
@@ -401,9 +437,19 @@
         statisticsForm: {
           toDoNumber: 0,
         },
+        commentList: [], //评论列表
       }
     },
+    computed: {
+      ...mapGetters({
+        roleKeys: 'user/roleKeys',
+      }),
+    },
     mounted() {
+      // GeneralManager 总经理
+      // SalesDirector 销售总监
+      console.log('roleKeys', this.roleKeys)
+      this.getCommentList()
       this.init()
       this.getDateList()
       this.getOptions()
@@ -420,6 +466,13 @@
       window.removeEventListener('resize', this.handleResize)
     },
     methods: {
+      // 获取首页评论信息
+      async getCommentList() {
+        if (!this.roleKeys.includes('GeneralManager') && !this.roleKeys.includes('SalesDirector')) return
+        const [err, res] = await to(followApi.getHomeCommentList({}))
+        if (err) return
+        this.commentList = res.data.list
+      },
       async getHomeNumReportData() {
         let ids = this.privateBoard.map((item) => {
           return item.id
@@ -1039,6 +1092,11 @@
           name: 'NoticeHistory',
         })
       },
+      handleFollow() {
+        this.$router.push({
+          name: 'CustomerFollow',
+        })
+      },
       handleSupervision() {
         this.$router.push({
           name: 'Task',

+ 34 - 2
src/views/proj/business/components/DetailsFollow.vue

@@ -44,13 +44,30 @@
             </div>
             <transition name="height">
               <ul class="comments">
-                <li v-for="comment in item.comments" :key="comment.id">
+                <li v-for="comment in item.comments" :key="comment.id" class="flex-wrap">
                   <vab-icon class="user-avatar" icon="account-circle-fill" />
                   <div class="text">
                     <p>{{ comment.createdName }}</p>
                     <p>{{ comment.content }}</p>
-                    <p>{{ comment.createdTime }}</p>
+                    <p>
+                      {{ comment.createdTime }}
+                      <span v-if="!comment.replyComments" @click="postReply(comment)">回复</span>
+                    </p>
                   </div>
+                  <transition v-if="comment.replyComments" name="height">
+                    <ul class="comments" style="width: 100%">
+                      <li v-for="replyComments in comment.replyComments" :key="replyComments.id">
+                        <vab-icon class="user-avatar" icon="account-circle-fill" />
+                        <div class="text">
+                          <p>{{ replyComments.createdName }}</p>
+                          <p>{{ replyComments.content }}</p>
+                          <p>
+                            {{ replyComments.createdTime }}
+                          </p>
+                        </div>
+                      </li>
+                    </ul>
+                  </transition>
                 </li>
               </ul>
             </transition>
@@ -108,6 +125,14 @@
           })
           .catch(() => {})
       },
+      // 发表回复
+      postReply(row) {
+        this.$PostComment({ form: row, visible: true, reply: true })
+          .then(() => {
+            this.fetchData()
+          })
+          .catch(() => {})
+      },
       // 展开评论
       showComment(row) {
         if (!row.comments.length) return this.$message.warning('暂无评论')
@@ -182,6 +207,7 @@
           overflow: auto;
 
           li {
+            padding-top: 10px;
             display: flex;
             border-top: 1px solid #e3e5e7;
 
@@ -204,6 +230,9 @@
                 font-size: 12px;
                 color: #9499a0;
                 text-align: right;
+                span {
+                  cursor: pointer;
+                }
               }
             }
           }
@@ -261,4 +290,7 @@
     font-size: 12px;
     color: rgba(0, 0, 0, 0.65);
   }
+  .flex-wrap {
+    flex-wrap: wrap;
+  }
 </style>