浏览代码

通用跟进支持评论

xiaohaizhao 1 年之前
父节点
当前提交
6a4e6e1a64

+ 106 - 0
pages/trace/comment/items.js

@@ -0,0 +1,106 @@
+const _Http = getApp().globalData.http;
+
+Component({
+    options: {
+        addGlobalClass: true
+    },
+    properties: {
+        comments: {
+            type: Array,
+            value: []
+        },
+        ownertable: {
+            type: String,
+            value: 'sys_datafollowup'
+        },
+        ownerid: {
+            type: String
+        },
+        replyid: {
+            type: [Number, String]
+        },
+        userid: {
+            type: [Number, String]
+        }
+    },
+    data: {
+        loading: false,
+        comment: '',
+
+    },
+    methods: {
+        onInput(e) {
+            this.setData({
+                comment: e.detail.value
+            })
+        },
+        onSend() {
+            this.setData({
+                loading: true
+            })
+            _Http.basic({
+                "id": 20240429161601,
+                "content": {
+                    "ownertable": this.data.ownertable, //数据表
+                    "ownerid": this.data.ownerid,
+                    "content": this.data.comment,
+                    replyid: this.data.replyid
+                }
+            }).then(res => {
+                console.log("发送评论", res)
+                this.setData({
+                    loading: false
+                })
+                wx.showToast({
+                    title: res.code == '1' ? '回复成功' : res.msg,
+                    icon: "none"
+                })
+                if (res.code == '1') {
+                    this.setData({
+                        comment: ""
+                    })
+                    _Http[this.data.ownerid].updateCommentList();
+                    _Http[this.data.ownerid].changeReply()
+                }
+            })
+        },
+        reply(e) {
+            let {
+                item
+            } = e.currentTarget.dataset;
+            _Http[this.data.ownerid].changeReply(item.sys_datacommentid)
+            this.setData({
+                comment: '',
+                replyUser: item
+            })
+        },
+        deleteItem(e) {
+            const {
+                item
+            } = e.currentTarget.dataset;
+            wx.showModal({
+                title: '提示',
+                content: `是否确定删除该评论`,
+                complete: ({
+                    confirm
+                }) => {
+                    if (confirm) _Http.basic({
+                        "id": 20240429161701,
+                        "content": {
+                            "sys_datacommentid": item.sys_datacommentid
+                        }
+                    }).then(res => {
+                        console.log("删除评论", res)
+                        wx.showToast({
+                            title: res.msg == '成功' ? '删除成功' : res.msg,
+                            icon: "none"
+                        });
+                        if (res.msg == '成功') {
+                            _Http[this.data.ownerid].updateCommentList();
+                        }
+                    })
+                }
+            })
+        },
+    }
+})

+ 6 - 0
pages/trace/comment/items.json

@@ -0,0 +1,6 @@
+{
+    "component": true,
+    "usingComponents": {
+        "items":"/pages/trace/comment/items"
+    }
+}

+ 106 - 0
pages/trace/comment/items.scss

@@ -0,0 +1,106 @@
+.items {
+	width: 100%;
+
+	.name {
+		display: flex;
+		align-items: center;
+
+		line-height: 38rpx;
+		font-weight: bold;
+		font-size: 28rpx;
+		color: #333333;
+		margin-top: 24rpx;
+
+		.replyusername {
+			border-top: 10rpx solid transparent;
+			border-bottom: 10rpx solid transparent;
+			border-left: 12rpx solid #3874F6;
+			border-right: 10rpx solid transparent;
+			margin-left: 24rpx;
+			margin-right: 14rpx;
+			transform: scale(0.9);
+		}
+	}
+
+	.content {
+		font-size: 28rpx;
+		color: #666666;
+		line-height: 40rpx;
+		margin-top: 8rpx;
+		word-break: break-all;
+    white-space: pre-wrap;
+	}
+
+	.bottom {
+		display: flex;
+		height: 38rpx;
+		margin-top: 2rpx;
+		align-items: center;
+
+		.createdate {
+			height: 32rpx;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #999999;
+			margin-right: 12rpx;
+		}
+
+		.icon-qingkong {
+			font-size: 28rpx;
+			color: #666666;
+		}
+
+		.icon-huifu {
+			font-size: 28rpx;
+			color: #3874F6;
+		}
+
+		.iconfont::before {
+			margin-right: 8rpx;
+		}
+
+		.icon-qingkong::before {
+			color: #999999;
+		}
+
+	}
+
+	.comment-box {
+		width: 100%;
+		background: #FFFFFF;
+		padding: 20rpx;
+		box-sizing: border-box;
+		border-radius: 8rpx;
+		border: 2rpx solid #CCCCCC;
+		margin-top: 10rpx;
+
+		textarea {
+			width: 100%;
+			font-size: 28rpx;
+		}
+
+		.but-box {
+			display: flex;
+			justify-content: flex-end;
+			border-top: 2rpx solid #eee;
+			margin-top: 12rpx;
+			padding-top: 20rpx;
+		}
+
+		.but {
+			width: 120rpx;
+			height: 60rpx;
+			background: #3874F6;
+			border-radius: 8rpx;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF;
+		}
+	}
+
+	.sub {
+		width: 100%;
+		padding-left: 20rpx;
+		box-sizing: border-box;
+	}
+}

+ 21 - 0
pages/trace/comment/items.wxml

@@ -0,0 +1,21 @@
+<view class="items" wx:for="{{comments}}" wx:key="sys_datacommentid">
+	<view class="name">{{item.createby}}
+		<view class="replyusername" wx:if="{{item.replyusername}}" />{{item.replyusername}}
+	</view>
+	<view class="content">{{item.content}}</view>
+	<view class="bottom">
+		<view class="createdate">{{item.createdate}}</view>
+		<view class="iconfont icon-qingkong" wx:if="{{userid==item.createuserid}}" data-item="{{item}}" bind:tap="deleteItem">删除</view>
+		<view style="flex:1;" />
+		<view class="iconfont icon-huifu" data-item="{{item}}" bind:tap="reply">{{replyid == item.sys_datacommentid?'取消回复':'回复'}}</view>
+	</view>
+	<view class="comment-box" wx:if="{{replyid == item.sys_datacommentid}}">
+		<textarea maxlength='499' auto-focus confirm-type='send' value="{{comment}}" placeholder='我回复{{replyUser.createby}}:' placeholder-style='font-size:28rpx; color:#BBBBBB;' auto-height bind:input="onInput" bind:confirm="onSend" />
+		<view class="but-box">
+			<van-button custom-class='but' disabled='{{!comment.length}}' loading='{{loading}}' bind:tap="onSend">发布</van-button>
+		</view>
+	</view>
+	<view class="sub">
+		<items userid='{{userid}}' comments='{{item.subcomment}}' replyid="{{replyid}}" ownerid='{{ownerid}}' ownertable='{{ownertable}}' />
+	</view>
+</view>

+ 36 - 48
pages/trace/comment/list.js

@@ -1,9 +1,33 @@
 const _Http = getApp().globalData.http;
 Component({
+    lifetimes: {
+        attached: function () {
+            _Http[this.data.ownerid] = {
+                changeReply: function (replyid = 0) {
+                    this.setData({
+                        replyid: replyid == this.data.replyid ? 0 : replyid
+                    })
+                }.bind(this),
+                updateCommentList: function () {
+                    this.triggerEvent("updateCommentList", {
+                        "ownertable": this.data.ownertable, //数据表
+                        "ownerid": this.data.ownerid,
+                    })
+                }.bind(this)
+            }
+            this.setData({
+                userid: wx.getStorageSync('userMsg').userid
+            })
+
+        },
+        detached: function () {
+            delete _Http[this.data.ownerid]
+        },
+    },
     properties: {
-        title: {
-            type: String,
-            value: '评论(0)'
+        quantity: {
+            type: [String, Number],
+            value: 0
         },
         comments: {
             type: Array,
@@ -21,16 +45,15 @@ Component({
         }
     },
     data: {
-        show: true,
-        content: {
-            comment: '',
-            reply: ''
-        }
+        loading: false,
+        show: false,
+        comment: '',
+        replyid: 0,
     },
     methods: {
         onInput(e) {
             this.setData({
-                [`content.${e.currentTarget.dataset.key}`]: e.detail.value
+                comment: e.detail.value
             })
         },
         onSend() {
@@ -42,8 +65,8 @@ Component({
                 "content": {
                     "ownertable": this.data.ownertable, //数据表
                     "ownerid": this.data.ownerid,
-                    "content": this.data.content.comment,
-                    "replyid": "0"
+                    "content": this.data.comment,
+                    replyid: 0
                 }
             }).then(res => {
                 console.log("发送评论", res)
@@ -56,44 +79,9 @@ Component({
                 })
                 if (res.code == '1') {
                     this.setData({
-                        'content.comment': ""
-                    })
-                    this.triggerEvent("updateCommentList", {
-                        "ownertable": this.data.ownertable,
-                        "ownerid": this.data.ownerid,
-                    })
-                }
-            })
-        },
-        deleteItem(e) {
-            const {
-                item
-            } = e.currentTarget.dataset,
-                that = this;
-            wx.showModal({
-                title: '提示',
-                content: `是否确定删除该评论`,
-                complete: ({
-                    confirm
-                }) => {
-                    if (confirm) _Http.basic({
-                        "id": 20240429161701,
-                        "content": {
-                            "sys_datacommentid": item.sys_datacommentid
-                        }
-                    }).then(res => {
-                        console.log("删除评论", res)
-                        wx.showToast({
-                            title: res.msg == '成功' ? '删除成功' : res.msg,
-                            icon: "none"
-                        });
-                        if (res.msg == '成功') {
-                            that.triggerEvent("updateCommentList", {
-                                "ownertable": that.data.ownertable,
-                                "ownerid": that.data.ownerid,
-                            })
-                        }
+                        comment: ""
                     })
+                    _Http[this.data.ownerid].updateCommentList();
                 }
             })
         },

+ 3 - 1
pages/trace/comment/list.json

@@ -1,4 +1,6 @@
 {
     "component": true,
-    "usingComponents": {}
+    "usingComponents": {
+        "items": "/pages/trace/comment/items"
+    }
 }

+ 7 - 7
pages/trace/comment/list.scss

@@ -36,7 +36,6 @@
 
 	.list {
 		width: 680rpx;
-		height: 840rpx;
 		background: #F5F5F5;
 		border-radius: 8rpx;
 		margin-top: 20rpx;
@@ -51,12 +50,13 @@
 
 		.scroll {
 			height: 748rpx;
-			.scroll-content {
-				padding: 20rpx;
-				padding-top: 0;
-				width: 100%;
-				box-sizing: border-box;
-			}
+		}
+
+		.scroll-content {
+			padding: 20rpx;
+			padding-top: 0;
+			width: 100%;
+			box-sizing: border-box;
 		}
 	}
 }

+ 12 - 7
pages/trace/comment/list.wxml

@@ -1,18 +1,23 @@
 <view class="box" wx:if="{{show}}">
 	<view class="comment-box">
-		<textarea maxlength='499'  value="{{content.comment}}" placeholder='我评论:' placeholder-style='font-size:28rpx; color:#BBBBBB;' auto-height data-key="comment" bind:input="onInput" />
+		<textarea maxlength='499' confirm-type='send' auto-focus='{{!comments.length}}' value="{{comment}}" placeholder='我评论:' placeholder-style='font-size:28rpx; color:#BBBBBB;' auto-height bind:input="onInput" bindconfirm='{{comment.length?"onSend":""}}' />
 		<view class="but-box">
-			<van-button custom-class='but' disabled='{{!content.comment.length}}' loading='{{loading}}' bind:tap="onSend">发布</van-button>
+			<van-button custom-class='but' disabled='{{!comment.length}}' loading='{{loading}}' bind:tap="onSend">发布</van-button>
 		</view>
 	</view>
-	<view class="list">
-		<view class="title">{{title}}</view>
-		<scroll-view class="scroll" scroll-y>
+	<view class="list" wx:if="{{comments.length}}">
+		<view class="title">评论({{quantity}})</view>
+		<scroll-view wx:if="{{quantity > 4}}" class="scroll" scroll-y>
 			<view class="scroll-content">
-				<view class="item" wx:for="{{comments}}" wx:key="sys_datacommentid">
-					<view class="name">{{item.createby}}</view>
+				<view style="margin-top: -24rpx;">
+					<items userid='{{userid}}' comments='{{comments}}' replyid='{{replyid}}' ownerid='{{ownerid}}' ownertable='{{ownertable}}' />
 				</view>
 			</view>
 		</scroll-view>
+		<view wx:else class="scroll-content">
+			<view style="margin-top: -24rpx;">
+				<items userid='{{userid}}' comments='{{comments}}' replyid='{{replyid}}' ownerid='{{ownerid}}' ownertable='{{ownertable}}' />
+			</view>
+		</view>
 	</view>
 </view>

+ 42 - 7
pages/trace/index.js

@@ -33,11 +33,48 @@ Component({
       pageNumber: 1,
       pageSize: 10,
       pageTotal: 1,
-      total: null
+      total: null,
+      where: {
+        condition: ""
+      }
     },
-    list: []
+    list: [],
+    showSearch: false,
+    focus: false,
+    condition: ""
   },
   methods: {
+    toSearch() {
+      if (this.data.showSearch && this.data.content.where.condition) {
+        this.data.content.where.condition = '';
+        this.getList("", true);
+      } else if (this.data.condition) {
+        this.data.content.where.condition = this.data.condition;
+        this.setData({
+          condition: this.data.condition
+        })
+        this.getList("", true);
+      }
+      this.setData({
+        showSearch: !this.data.showSearch
+      })
+      setTimeout(() => {
+        this.setData({
+          focus: this.data.showSearch
+        })
+      }, 300)
+    },
+    onChange({
+      detail
+    }) {
+      this.data.condition = detail;
+    },
+    onSearch({
+      detail
+    }) {
+      this.data.content.where.condition = detail;
+      this.getList("", true)
+    },
     getList(id, init = false) {
       let content = {
         ...this.data.content,
@@ -175,8 +212,8 @@ Component({
         "content.total": this.data.content.total - 1
       })
     },
-    comment() {
-      let page = this.selectComponent("#Comment");
+    comment(e) {
+      let page = this.selectComponent('#' + e.currentTarget.id);
       page.setData({
         show: !page.data.show
       })
@@ -189,11 +226,9 @@ Component({
         "id": 20240920092204,
         content: detail
       }).then(res => {
-        console.log("更新列表", res)
-        console.log("更新列表1", this.data.list)
+        console.log("更新评论列表", res)
         if (res.code == 1) {
           let idName = detail.ownertable + 'id';
-
           const index = this.data.list.findIndex(v => v[idName] == detail.ownerid)
           if (index != -1) {
             let item = this.data.list[index];

+ 26 - 1
pages/trace/index.scss

@@ -15,12 +15,14 @@
     .expand {
         flex: 1;
         display: flex;
+        align-items: center;
         justify-content: flex-end;
 
         .but {
             display: flex;
             align-items: center;
             justify-content: center;
+            flex-shrink: 0;
             width: 80rpx;
             height: 80rpx;
             background: #FFFFFF;
@@ -57,7 +59,6 @@
                 text-align: center;
                 line-height: 80rpx;
                 border-radius: 50%;
-                background-color: #3874F6;
                 font-size: 28rpx;
                 font-family: PingFang SC-Regular, PingFang SC;
                 color: #FFFFFF;
@@ -139,4 +140,28 @@
             margin-left: -10rpx;
         }
     }
+}
+
+.custom-class {
+    --search-background-color: #fff !important;
+    padding-right: 10rpx !important;
+}
+
+.createdate {
+    display: flex;
+    align-items: center;
+    font-size: 24rpx;
+    color: #3874F6;
+    margin-bottom: 20rpx;
+}
+
+.createdate::before {
+    content: '';
+    display: inline-block;
+    width: 16rpx;
+    height: 16rpx;
+    border-radius: 50%;
+    border: 4rpx solid #3874F6;
+    box-sizing: border-box;
+    margin-right: 8rpx;
 }

+ 13 - 3
pages/trace/index.wxml

@@ -3,15 +3,24 @@
         总共{{content.total}}个
     </view>
     <view class="expand">
+        <van-search wx:if="{{showSearch}}" custom-class='custom-class' focus='{{focus}}' value="{{ condition }}" shape="round" bind:change='onChange' bind:search='onSearch' bind:clear='onSearch' placeholder="业务员、跟进内容" background='#F4F5F7' />
+        <navigator url="#" class="but" bindtap="toSearch">
+            <van-icon name="search" />
+        </navigator>
         <navigator wx:if="{{disabled}}" url="#" class="but" bindtap="insetr">
             <van-icon name="plus" />
         </navigator>
     </view>
 </view>
+
 <view class="trace-box" wx:for="{{list}}" wx:key="sys_datafollowupid">
     <navigator url="#" class="item" data-item="{{item}}" bindtap="toDetail">
+        <view class="createdate">
+            {{item.createdate}}
+        </view>
         <view class="user">
-            <view class="portrait">
+            <image class="portrait" wx:if="{{item.headpic}}" src="{{item.headpic}}" mode="aspectFill" lazy-load />
+            <view class="portrait" style="background-color: #3874F6;" wx:else>
                 {{item.createby[0]}}
             </view>
             <view class="content">
@@ -48,9 +57,10 @@
             营销费用:<text style="color: #FF3B30;">{{item.showsalesfeesamount||' --'}}</text>
         </view>
     </navigator>
-    <commentList id="Comment" comments='{{item.comment}}' title="评论({{item.commentqty}})" ownerid='{{item.sys_datafollowupid}}' bind:updateCommentList='updateCommentList' />
+    <Yl_Files wx:if="{{item.attinfos.length}}" attinfos='{{item.attinfos}}' />
+    <commentList id="Comment{{item.sys_datafollowupid}}" comments='{{item.comment}}' quantity="{{item.commentqty}}" ownerid='{{item.sys_datafollowupid}}' bind:updateCommentList='updateCommentList' />
     <view class="bottom">
-        <navigator url="#" class="comment" bind:tap="comment">
+        <navigator url="#" class="comment" bind:tap="comment" id="Comment{{item.sys_datafollowupid}}">
             <text class="iconfont icon-huifu" /><text style="color: #3874F6;">评论({{item.commentqty}})</text>
         </navigator>
         <view style="flex:1;" />