可对于发表的留言进行多级回复,附图:
注:留言表设计可以根据情况调整 红色字体是必须的
留言表表设计 | ||||
ST_ID | N | NVARCHAR2(200) | Y | 系统编号 |
ST_Assign_ID | N | NVARCHAR2(100) | Y | 指派工作ID |
ST_STAFF_ID | N | NVARCHAR2(100) | Y | 职员ID |
DT_START | N | DATE | Y | 留言日期 |
ST_CONTENT | N | CLOB | Y | 内容 |
ST_CREATE_USER | N | NVARCHAR2(100) | Y | 创建者 |
DT_CREATE_DATE | N | DATE | Y | 创建时间 |
ST_MODIFY_USER | N | NVARCHAR2(100) | Y | 修改者 |
DT_MODIFY_DATE | N | DATE | Y | 修改时间 |
ST_COMPANY_ID | N | NVARCHAR2(20) | Y | 公司ID |
ST_ID_M | N | NVARCHAR2(100) | 关联留言ID | |
NO_TYPE | N | NUMBER | 0留言1回复 |
新增
发表留言:
回复发表的留言:(回复哪条留言需要传对应留言的id到id_m)
查看
附上代码:
/// <summary>
/// 根据id查找数据留言
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<List<MessageReplyQuery>> GetDataById(MessageFrontModel data)
{
List<MessageReplyQuery> queryList = new List<MessageReplyQuery>();
// 查询发表的集合
var publish = await _sqlSugarClient.Queryable<MessageFrontModel>()
.LeftJoin<StaffModel>((p,s)=>p.ST_STAFF_ID==s.ST_ID)
.Where(p => p.NO_TYPE == 0 && p.ST_ID_M == null && p.ST_ASSIGN_ID == data.ST_ID && p.ST_COMPANY_ID == data.ST_COMPANY_ID)
.OrderBy(p=>p.DT_CREATEDATE,OrderByType.Desc)
.Select((p,s)=>new MessageFrontModel
{
DT_CREATEDATE = p.DT_CREATEDATE,
ST_ASSIGN_ID = p.ST_ASSIGN_ID,
DT_MODIFYDATE = p.DT_MODIFYDATE,
DT_START=p.DT_START,
ST_COMPANY_ID = p.ST_COMPANY_ID,
ST_CREATEUSER=p.ST_CREATEUSER,
ST_STAFF_ID=s.ST_CODE!=null?s.ST_CODE+ " | "+s.ST_NAME:s.ST_CODE,
ST_AVATAR=s.ST_IMG,
ST_CONTENT=p.ST_CONTENT,
ST_ID=p.ST_ID,
NO_TYPE=p.NO_TYPE,
ST_ID_M=p.ST_ID_M,
ST_MODIFYUSER=p.ST_MODIFYUSER,
})
.ToListAsync();
// 查询回复的集合
var replyData = await _sqlSugarClient.Queryable<MessageFrontModel>()
.LeftJoin<StaffModel>((p, s) => p.ST_STAFF_ID == s.ST_ID)
.OrderBy(p => p.DT_CREATEDATE, OrderByType.Asc)
.Select((p, s) => new MessageFrontModel
{
DT_CREATEDATE = p.DT_CREATEDATE,
ST_ASSIGN_ID = p.ST_ASSIGN_ID,
DT_MODIFYDATE = p.DT_MODIFYDATE,
DT_START = p.DT_START,
ST_COMPANY_ID = p.ST_COMPANY_ID,
ST_CREATEUSER = p.ST_CREATEUSER,
ST_STAFF_ID = s.ST_CODE != null ? s.ST_CODE + " | " + s.ST_NAME : s.ST_CODE,
ST_AVATAR = s.ST_IMG,
ST_CONTENT = p.ST_CONTENT,
ST_ID = p.ST_ID,
NO_TYPE = p.NO_TYPE,
ST_ID_M = p.ST_ID_M,
ST_MODIFYUSER = p.ST_MODIFYUSER,
})
.ToListAsync();
foreach (var item in publish)
{
MessageReplyQuery query = new MessageReplyQuery();
query.id = item.ST_ID;
query.assign_id = item.ST_ASSIGN_ID;
query.staff_id = item.ST_STAFF_ID;
query.start = item.DT_START;
query.content = item.ST_CONTENT;
query.id_m = item.ST_ID_M;
query.type = 0;
query.avatar = item.ST_AVATAR;
query.create_date = item.DT_CREATEDATE;
// 递归构建回复列表
query.replyList = BuildReplyList(item.ST_ID, replyData, data.ST_COMPANY_ID);
queryList.Add(query);
}
return queryList;
}
/// <summary>
/// 回复-这个是回复多级回复的全部在最后
/// </summary>
/// <param name="parentId"></param>
/// <param name="replyData"></param>
/// <param name="companyId"></param>
/// <returns></returns>
private List<ReplyQuery> BuildReplyList(string parentId, List<MessageFrontModel> replyData, string companyId)
{
List<ReplyQuery> replyList = new List<ReplyQuery>();
// 查询回复的集合
var replies = replyData
.Where(p => p.NO_TYPE == 1 && p.ST_ID_M == parentId && p.ST_COMPANY_ID == companyId)
.OrderBy(p => p.DT_CREATEDATE)
.ToList();
foreach (var reply in replies)
{
ReplyQuery replyQuery = new ReplyQuery();
replyQuery.id = reply.ST_ID;
replyQuery.id_m = reply.ST_ID_M;
replyQuery.content = reply.ST_CONTENT;
replyQuery.start = reply.DT_START;
replyQuery.assign_id = reply.ST_ASSIGN_ID;
replyQuery.staff_id = reply.ST_STAFF_ID;
replyQuery.create_date = reply.DT_CREATEDATE;
replyQuery.type = 1; // 假设类型 1 代表回复
// 将回复直接添加到最外层的回复列表中
replyList.Add(replyQuery);
}
//第二级循环结束,再把后面的数据插入到第二级后面
foreach (var reply in replies)
{
var thirdLevelReplies = BuildReplyList(reply.ST_ID, replyData, companyId);
foreach (var thirdLevelReply in thirdLevelReplies)
{
replyList.Add(thirdLevelReply);
}
}
// 对整个 replyList 进行排序
replyList = replyList.OrderBy(r => r.create_date).ToList();
return replyList;
}
如果想实现多级留言显示到对应回复的下方,则修改BuildReplyList这个方法可实现:
private List<ReplyQuery> BuildReplyList(string parentId, List<MessageFrontModel> replyData, string companyId)
{
List<ReplyQuery> replyList = new List<ReplyQuery>();
var replies = replyData
.Where(p => p.NO_TYPE == 1 && p.ST_ID_M == parentId && p.ST_COMPANY_ID == companyId)
.ToList();
foreach (var reply in replies)
{
ReplyQuery replyQuery = new ReplyQuery();
replyQuery.id = reply.ST_ID;
replyQuery.id_m = reply.ST_ID_M;
replyQuery.content = reply.ST_CONTENT;
replyQuery.start = reply.DT_START;
replyQuery.assign_id = reply.ST_ASSIGN_ID;
replyQuery.staff_id = reply.ST_STAFF_ID;
replyQuery.type = 1; // 假设类型 1 代表回复
// 将回复直接添加到最外层的回复列表中
replyList.Add(replyQuery);
// 处理第三级回复并添加到第二级回复列表中 回复对应的显示
var thirdLevelReplies = BuildReplyList(reply.ST_ID, replyData, companyId);
foreach (var thirdLevelReply in thirdLevelReplies)
{
replyList.Add(thirdLevelReply);
}
replyList.Add(replyQuery);
// 递归构建下一级回复列表
//这个是回复多级 如果只需要二级 这个可以不要,
//replyQuery.replyList = BuildReplyList(reply.ST_ID, replyData, companyId);
// replyList.Add(replyQuery);
}
return replyList;
}