# -*- coding: utf-8 -*- import json import datetime from django.conf import settings from django.db.models import Q from gm_types.mimas import ( TRACTATE_PLATFORM, TRACTATE_REPLY_HIGHLIGHT ) from gm_types.error import ERROR as CODES from gm_types.gaia import USER_TYPE, DOCTOR_TYPE from gm_dataquery.dict_mixin import to_dict from gm_rpcd.all import RPCDFaultException from utils.rpc import gen, get_current_user from talos.portal import get_doctor_from_user_ids from talos.cache.base import reply_cache as reply_msg_cache from talos.tools.replies_tool import ReplyTool from talos.libs.datetime_utils import get_timestamp_or_none from qa.utils.decorator import listing from talos.rpc import bind_context, bind from talos.services import ( get_user_from_context, UserService, UserConvertService, ) from talos.services.doctor import DoctorService from talos.services.soft_article.soft_article import SoftArticleService from talos.tools.tractate_reply_tool import reply_update_cache from talos.tasks.tractate import doctor_reply_push from talos.services.soft_article.reply import SoftArticleReplyService, SoftArticle, SoftArticleReply from talos.services.soft_article.vote import SoftArticleReplyVoteService uri_pre = 'mimas/soft_article_reply' class Test(): pass def handle_args(conditions): base_query = Q() if conditions.get("start_time"): times = datetime.datetime.fromtimestamp(conditions.get("start_time")) base_query &= Q(create_time__gte=times) if conditions.get("end_time"): times = datetime.datetime.fromtimestamp(conditions.get("end_time")) base_query &= Q(create_time__lte=times) if conditions.get("status", None) != None: base_query &= Q(is_reply=conditions.get("status")) if conditions.get('title'): s_article_ids = SoftArticle.objects.using(settings.SLAVE_DB_NAME)\ .filter(title__contains=conditions.get('title'))\ .values_list('id', flat=True) base_query &= Q(softarticle_id__in=list(s_article_ids)) return base_query @bind(uri_pre + '/list') def get_my_reply_list(merchant_id, conditions={}, page=1, count=10): """医生后台专用列表""" SECOND_COUNT, START_INDEX = 5, 0 offset = count * (page - 1) r_query = handle_args(conditions) reply_all = SoftArticleReply.objects.filter(r_query, merchant_id=merchant_id, top_id=0).order_by('-id') replies = list(reply_all[offset:offset+count].values()) top_reply_user_ids = [item.get('user_id') for item in replies] top_users = UserService.get_users_by_user_ids(top_reply_user_ids) second_user_ids, second_doctor_ids, repied_ids, article_ids = [], [], [], [] for top_reply_info in replies: article_ids.append(top_reply_info.get('softarticle_id')) second_reply = SoftArticleReplyService.get_second_reply_by_top_id(top_id=top_reply_info.get('id'), count=SECOND_COUNT, offset=START_INDEX) top_reply_info['create_time'] = int(top_reply_info['create_time'].timestamp()) top_reply_info['update_time'] = int(top_reply_info['update_time'].timestamp()) top_reply_info['reply_count'] = int(SoftArticleReplyService.top_reply_count(top_reply_info.get('id'))) or 0 second_user_ids.extend([reply.get('user_id') for reply in second_reply]) second_doctor_ids.extend([reply.get('doctor_id') for reply in second_reply]) repied_ids.extend([reply.get('replied_id') for reply in second_reply]) # 处理一级评论的用户信息 top_reply_info['replies'] = second_reply if top_reply_info.get('user_id') not in top_users: continue top_reply_info['user_name'] = top_users[top_reply_info.get('user_id')].nickname top_reply_info['user_portrait'] = top_users[top_reply_info.get('user_id')].portrait relations = SoftArticleService.get_relation_data(soft_article_ids=article_ids) soft_articles = SoftArticleService.get_dict_by_soft_article_ids(soft_article_ids=article_ids) # 处理二级评论、被评论用户信息 replied_infos = SoftArticleReplyService.get_replies_info(reply_ids=repied_ids) replyed_user_ids = [value.get('user_id') for key, value in replied_infos.items()] second_user_ids = list(set(second_user_ids + replyed_user_ids)) second_users = UserService.get_users_by_user_ids(second_user_ids) replyed_doctor_ids = [value.get('doctor_id') for key, value in replied_infos.items()] second_doctor_ids = list(set(second_doctor_ids + replyed_doctor_ids)) doctor_infos = DoctorService.get_doctor_by_doctor_ids_v1(doctor_ids=second_doctor_ids) second_doctors = {doctor_key: doctor_values.get('meta') for doctor_key, doctor_values in doctor_infos.items()} # 给二级评论补充用户信息 for top_reply_info in replies: top_reply_info['service_data'] = relations.get(top_reply_info.get('softarticle_id')).get('service') top_reply_info['diary_data'] = relations.get(top_reply_info.get('softarticle_id')).get('diary') top_reply_info['article_info'] = soft_articles.get(top_reply_info.get('softarticle_id')) for second_reply in top_reply_info['replies']: if second_reply.get('doctor_id') in second_doctors: second_reply['doctor_name'] = second_doctors[second_reply.get('doctor_id')].get('name') second_reply['doctor_portrait'] = second_doctors[second_reply.get('doctor_id')].get('portrait') if second_reply.get('user_id') in second_users: second_reply['user_name'] = second_users[second_reply.get('user_id')].nickname second_reply['user_portrait'] = second_users[second_reply.get('user_id')].portrait replied_info = replied_infos.get(second_reply.get('replied_id'), {}) if replied_info.get('user_id') in second_users: second_reply['replied_user_id'] = second_users[replied_info.get('user_id')].id second_reply['replied_user_name'] = second_users[replied_info.get('user_id')].nickname second_reply['replied_user_portrait'] = second_users[replied_info.get('user_id')].portrait if replied_info.get('doctor_id') in second_doctors: second_reply['replied_doctor_id'] = replied_info.get('doctor_id') second_reply['replied_doctor_name'] = second_doctors[replied_info.get('doctor_id')].get('name') second_reply['replied_doctor_portrait'] = second_doctors[replied_info.get('doctor_id')].get('portrait') return {"total": reply_all.count(), "data": replies} @bind(uri_pre + '/reply_create') def reply_create(soft_article_id, top_id, reply_id=None, content=None): """ 医生后台帖子回复 :return: """ soft_article = SoftArticle.objects.filter(id=soft_article_id, platform=TRACTATE_PLATFORM.DOCTOR).first() if not soft_article: return {"error": 1, "msg": "帖子不存在或已下线"} reply = SoftArticleReplyService.create(content=content, doctor_id=soft_article.doctor_id, soft_article_id=soft_article_id, merchant_id=soft_article.merchant_id, extra={"top_id": top_id, "replied_id": reply_id, "source_id": TRACTATE_PLATFORM.DOCTOR}) SoftArticleReplyService.update_reply_count(top_reply_id=top_id) if reply_id: s_reply = SoftArticleReplyService.get_by_id(pk=reply_id) s_reply.is_reply = True s_reply.save() doctor_reply_push.delay(soft_article_id=soft_article_id, reply_id=reply.id) doctor_info = DoctorService.get_doctor_from_doctor_id(reply.doctor_id) return { "id": reply.id, "soft_article_id": reply.softarticle_id, "replied_id": reply.replied_id, "doctor_id": reply.doctor_id, "doctor_name": doctor_info.name, "doctor_portrait": doctor_info.portrait, "content": reply.content, "vote_num": 0, "create_time": reply.create_time.timestamp(), "is_vote": False, "replied_user_id": "", "replied_user_name": "", "replied_user_portrait": "", } @bind_context(uri_pre + '/create') def create_reply(ctx, soft_article_id, content, top_id=None, reply_id=None): """ 用户发布评论 """ user = get_user_from_context(ctx) if not user: return gen(CODES.LOGIN_REQUIRED) article = SoftArticleService.healthy(soft_article_id) result = { "replied_user_id": "", "replied_user_portrait": "", "replied_user_name": "" } if not top_id and not reply_id: top_id = 0 if reply_id and not top_id: top_id = reply_id if reply_id: replied_info = SoftArticleReplyService.get_by_id(pk=reply_id) if replied_info.user_id: replied_user_info = UserConvertService.get_user_info_by_user_id(replied_info.user_id) result.update({ "replied_user_id": replied_info.user_id, "replied_user_portrait": replied_user_info.get("portrait", ""), "replied_user_name": replied_user_info.get("user_name", ""), "replied_user_type": USER_TYPE.NORMAL, "replied_user_info": replied_user_info, }) if replied_info.doctor_id: doctor_info = UserConvertService.format_doctor_analogy_user_info_by_doctor_id(replied_info.doctor_id) result.update({ "replied_user_id": doctor_info.get("user_id", 0), "replied_user_portrait": doctor_info.get("portrait", ""), "replied_user_name": doctor_info.get("user_name", ""), "replied_user_type": USER_TYPE.EXPERT, "replied_user_info": doctor_info, }) reply = SoftArticleReplyService.create(content=content, user_id=user.id, merchant_id=article.merchant_id, soft_article_id=soft_article_id, extra={"top_id": top_id, "replied_id": reply_id, "source_id": TRACTATE_PLATFORM.GM}) # replied_user_id = replied_info.user_id if reply_id else None # if replied_user_id and user.id != replied_user_id: # rt = ReplyTool(reply_msg_cache, replied_user_id) # rt.receive_soft_article_reply(reply.id) doctor_reply_push.delay(soft_article_id=soft_article_id, reply_id=reply.id) # 更新一级评论下的评论数 if top_id: result.update({"top_id": int(top_id)}) SoftArticleReplyService.update_reply_count(top_reply_id=top_id) else: result.update({"replies": []}) SoftArticleService.incr_article_reply(soft_article_id=soft_article_id) result.update({ 'id': reply.id, 'content': reply.content, 'user_type': USER_TYPE.NORMAL, 'create_time': get_timestamp_or_none(reply.create_time), "replied_id": int(reply_id) if reply_id else '', "user_name": user.nickname, "user_id": user.id, "user_portrait": user.portrait, "is_vote": False, "vote_num": 0, "status": TRACTATE_REPLY_HIGHLIGHT.DARK, "reply_count": 0, 'reply_user_info': UserConvertService.get_user_info_by_user_id(user.id) }) return result @bind(uri_pre + '/top_list') def top_reply_list(soft_article_id, offset=0, count=10): """一级评论列表""" top_infos = SoftArticleReplyService.list_top_reply_by_soft_article_id( soft_article_id=soft_article_id, offset=offset, count=count) user_ids = [top.get("user_id") for top in top_infos] user_infos = UserConvertService.get_user_info_by_user_ids(user_ids=user_ids) for top_info in top_infos: _user_info = user_infos.get(top_info.get('user_id', 0), {}) top_info.update({ "user_name": _user_info.get("user_name", ""), "user_portrait": _user_info.get("user_portrait", ""), "reply_user_info": _user_info, }) return top_infos @bind(uri_pre + '/list_top_reply') def get_top_list_by_soft_articles(soft_article_ids=[], offset=0, top_count=2, sort_condition=None): """多个软文的一级评论""" result, user_ids = {}, [] for soft_article_id in soft_article_ids: soft_article_info = SoftArticleReplyService.list_top_reply_by_soft_article_id( soft_article_id=soft_article_id, offset=offset, count=top_count, sort_condition=sort_condition) user_ids.extend([reply.get('user_id') for reply in soft_article_info]) result[str(soft_article_id)] = soft_article_info users = UserConvertService.get_user_info_by_user_ids(user_ids) for k, item in result.items(): for reply in item: _user_info = users.get(reply.get("user_id", 0), {}) if not _user_info: continue reply.update({ "user_nickname": _user_info.get("user_name", ""), "user_portrait": _user_info.get("portrait", ""), "reply_user_info": _user_info, }) return result @bind(uri_pre + '/second_list') def get_second_list_by_top_id(top_id, offset=0, count=10, is_doctor=False): """一级评论的子评论""" if not is_doctor: second_list = SoftArticleReplyService.get_second_reply_by_top_id(top_id=top_id, offset=offset, count=count) else: second_list = SoftArticleReplyService.get_second_reply_by_top_id(top_id=top_id, offset=offset) user_ids, replied_ids, doctor_ids = set(), set(), set() for second_info in second_list: _user_id = second_info.get("user_id", 0) _replied_id = second_info.get("replied_id", 0) _doctor_id = second_info.get("doctor_id", "") if _user_id: user_ids.add(_user_id) if _replied_id: replied_ids.add(_replied_id) if _doctor_id: doctor_ids.add(_doctor_id) replied_infos = SoftArticleReplyService.get_replies_info(reply_ids=replied_ids) user_ids.update(set(reply_value.get('user_id', 0) for reply_key, reply_value in replied_infos.items())) doctor_ids.update(set(reply_value.get('doctor_id', "") for reply_key, reply_value in replied_infos.items())) user_infos = UserConvertService.get_user_info_by_user_ids(user_ids=user_ids) doctor_infos = UserConvertService.format_doctor_analogy_user_info_by_doctor_ids(doctor_ids) for second_info in second_list: _user_info = user_infos.get(second_info.get('user_id', 0), {}) _doctor_info = doctor_infos.get(second_info.get('doctor_id', ""), {}) if _user_info: second_info.update({ "user_type": USER_TYPE.NORMAL, "user_name": _user_info.get("user_name", ""), "user_portrait": _user_info.get("portrait", ""), "reply_user_info": _user_info, }) if _doctor_info: second_info.update({ "doctor_id": _doctor_info.get("doctor_id", ""), "doctor_name": _doctor_info.get("user_name", ""), "doctor_portrait": _doctor_info.get("portrait", ""), "reply_doctor_info": _doctor_info, }) if _doctor_info.get('doctor_type') == DOCTOR_TYPE.OFFICER: second_info['user_type'] = USER_TYPE.OFFICER second_info['doctor_id'] = _doctor_info.get('hospital_id', "") reply_data = replied_infos.get(second_info.get('replied_id'), {}) _replied_user_info = user_infos.get(reply_data.get('user_id', 0), {}) _replied_doctor_info = doctor_infos.get(reply_data.get('doctor_id', ""), {}) if _replied_user_info: second_info.update({ "replied_user_type": USER_TYPE.NORMAL, "replied_user_id": reply_data.get('user_id'), "replied_user_name": _replied_user_info.get("user_name", ""), "replied_user_portrait": _replied_user_info.get("portrait", ""), "replied_user_info": _replied_user_info, }) if _replied_doctor_info: second_info.update({ "replied_doctor_id": reply_data.get('doctor_id'), "replied_doctor_name": _doctor_info.get("user_name", ""), "replied_doctor_portrait": _doctor_info.get("portrait", ""), "replied_doctor_info": _replied_doctor_info, }) if _doctor_info.get('doctor_type') == DOCTOR_TYPE.OFFICER: second_info['replied_user_type'] = USER_TYPE.OFFICER second_info['replied_doctor_id'] = _doctor_info.get('hospital_id', "") return second_list @bind(uri_pre + '/reply_popup') # @listing() def get_reply_in_popup(soft_article_id, offset=0, count=5, user_id=None, sort_condition=None): """评论弹窗~获取评论(一级和二级)""" SECOND_COUNT, START_INDEX = 2, 0 SoftArticleService.healthy(soft_article_id) # 一级评论数据 top_reply_infos = SoftArticleReplyService.list_top_reply_by_soft_article_id( soft_article_id=int(soft_article_id), offset=int(offset), count=int(count), sort_condition=sort_condition ) top_reply_user_ids, vote_reply_ids = set(), [] second_user_ids, repied_ids, second_doctor_ids = set(), [], set() # 一级评论处理用户,点赞状态,二级评论及子评论逻辑 for item in top_reply_infos: _user_id = item.get("user_id", 0) _id = item.get("id", 0) if _user_id: top_reply_user_ids.add(_user_id) if _id: vote_reply_ids.append(_id) # 二级评论 second_reply = SoftArticleReplyService.get_second_reply_by_top_id( top_id=_id, count=SECOND_COUNT, offset=START_INDEX, sort_condition=sort_condition ) # 处理一级评论的子评论 item['replies'] = second_reply for reply in second_reply: _reply_user_id = reply.get("user_id", 0) _replied_id = reply.get("replied_id", 0) _second_reply_id = reply.get("id", 0) _second_doctor_id = reply.get("doctor_id", "") if _reply_user_id: second_user_ids.add(_reply_user_id) if _replied_id: repied_ids.append(_replied_id) if _second_reply_id: vote_reply_ids.append(_second_reply_id) if _second_doctor_id: second_doctor_ids.add(_second_doctor_id) # 处理二级评论、被评论用户信息 replied_infos = SoftArticleReplyService.get_replies_info(reply_ids=repied_ids) replyed_user_ids, replyed_doctor_ids = set(), set() for key, value in replied_infos.items(): _replyed_user_id = value.get("user_id", 0) _replyed_doctor_id = value.get("doctor_id", "") if _replyed_user_id: replyed_user_ids.add(_replyed_user_id) if _replyed_doctor_id: replyed_doctor_ids.add(_replyed_doctor_id) # 取所有用户信息 _all_user_ids = top_reply_user_ids | second_user_ids | replyed_user_ids all_user_infos = UserConvertService.get_user_info_by_user_ids(_all_user_ids) # 取所有医生信息 _all_doctor_ids = second_doctor_ids | replyed_doctor_ids second_doctors = UserConvertService.format_doctor_analogy_user_info_by_doctor_ids(_all_doctor_ids) # 取所有已经被点赞的评论id voted_reply_ids = SoftArticleReplyVoteService.get_vote_status( user_id=user_id, softarticle_id=soft_article_id, reply_ids=vote_reply_ids) # 评论信息处理 for top_reply_info in top_reply_infos: top_reply_user_info = all_user_infos.get(top_reply_info.get("user_id", 0), {}) if not top_reply_user_info: continue top_reply_info.update({ "user_name": top_reply_user_info.get("user_name", ""), "user_portrait": top_reply_user_info.get("portrait", ""), "is_vote": bool(top_reply_info.get("id", 0) in voted_reply_ids), "top_reply_user_info": top_reply_user_info, }) # 二级评论信息处理 for second_reply in top_reply_info.get('replies', []): second_reply_user_info = all_user_infos.get(second_reply.get('user_id', 0), {}) second_reply_doctor_info = second_doctors.get(second_reply.get('doctor_id', ""), {}) second_reply['is_vote'] = True if second_reply['id'] in voted_reply_ids else False if second_reply_user_info: second_reply.update({ "user_type": USER_TYPE.NORMAL, "user_name": second_reply_user_info.get("user_name", ""), "user_portrait": second_reply_user_info.get("portrait", ""), "second_reply_user_info": second_reply_user_info, }) if second_reply_doctor_info: second_reply.update({ "doctor_id": second_reply.get('doctor_id', ""), "doctor_name": second_reply_doctor_info.get("user_name", ""), "doctor_portrait": second_reply_doctor_info.get("portrait", ""), "second_reply_doctor_info": second_reply_doctor_info, }) if second_reply_doctor_info.get('doctor_type') == DOCTOR_TYPE.OFFICER: second_reply['user_type'] = USER_TYPE.OFFICER second_reply['doctor_id'] = second_reply_doctor_info.get('hospital_id', "") replied_info = replied_infos.get(second_reply.get('replied_id'), {}) replied_info_user_info = all_user_infos.get(replied_info.get("user_id", 0), {}) replied_info_doctor_info = second_doctors.get(replied_info.get("doctor_id", ""), {}) if replied_info_user_info: second_reply.update({ "replied_user_type": USER_TYPE.NORMAL, "replied_user_id": replied_info.get('user_id'), "replied_user_name": replied_info_user_info.get("user_name", ""), "replied_user_portrait": replied_info_user_info.get("portrait", ""), "replied_user_info": replied_info_user_info, }) if replied_info_doctor_info: second_reply.update({ "replied_doctor_id": replied_info.get('doctor_id'), "replied_doctor_name": replied_info_doctor_info.get("user_name", ""), "replied_doctor_portrait": replied_info_doctor_info.get("portrait", ""), "replied_doctor_info": replied_info_doctor_info, }) if replied_info_doctor_info.get('doctor_type') == DOCTOR_TYPE.OFFICER: second_reply['replied_user_type'] = USER_TYPE.OFFICER second_reply['replied_doctor_id'] = replied_info_doctor_info.get('hospital_id', "") return top_reply_infos @bind(uri_pre + '/light_reply') def get_light_reply(soft_article_id, user_id=None, target_reply_id=None): """获取高亮评论 针对用户""" SECOND_COUNT, START_INDEX = 2, 0 more_highlight = True if not target_reply_id: return gen(CODES.PARAMS_INCOMPLETE) top_info = SoftArticleReplyService.get_highlight_reply(target_reply_id=target_reply_id) if not top_info: return [] user_ids, replied_ids, vote_reply_ids, doctor_ids = set(), set(), set(), set() user_ids.add(top_info.get('user_id')) vote_reply_ids.add(top_info.get('id')) doctor_ids.add(top_info.get('doctor_id')) second_replies = SoftArticleReplyService.get_second_reply_by_top_id( top_id=top_info.get('id'), count=SECOND_COUNT, target_reply_id=target_reply_id ) for reply in second_replies: _replied_id = reply.get('replied_id', 0) _reply_user_id = reply.get('user_id', 0) _reply_doctor_id = reply.get('doctor_id', "") _second_reply_id = reply.get("id", 0) if _reply_user_id: user_ids.add(_reply_user_id) if _replied_id: replied_ids.add(_replied_id) if _reply_doctor_id: doctor_ids.add(_reply_doctor_id) if _second_reply_id: vote_reply_ids.add(_second_reply_id) #获取用户是否点过赞 voted_reply_ids = SoftArticleReplyVoteService.get_vote_status( user_id=user_id, softarticle_id=soft_article_id, reply_ids=vote_reply_ids) replied_infos = SoftArticleReplyService.get_replies_info(reply_ids=replied_ids) for key, value in replied_infos.items(): user_ids.add(value.get('user_id', 0)) doctor_ids.add(value.get('doctor_id', "")) all_user = UserConvertService.get_user_info_by_user_ids(user_ids) second_doctors = UserConvertService.format_doctor_analogy_user_info_by_doctor_ids(doctor_ids) for second_reply in second_replies: second_reply_user_info = all_user.get(second_reply.get("user_id", 0), {}) second_reply_doctor_info = all_user.get(second_reply.get("doctor_id", ""), {}) if not top_info['status'] and second_reply['status'] == TRACTATE_REPLY_HIGHLIGHT.LIGHT: more_highlight = False second_reply['is_vote'] = True if second_reply.get('id') in voted_reply_ids else False if second_reply_user_info: second_reply.update({ "user_name": second_reply_user_info.get("user_name", ""), "user_portrait": second_reply_user_info.get("portrait", ""), "second_user_info": second_reply_user_info, }) if second_reply_doctor_info: second_reply.update({ "doctor_name": second_reply_doctor_info.get("user_name", ""), "doctor_portrait": second_reply_doctor_info.get("portrait", ""), "second_doctor_info": second_reply_doctor_info, }) replied_info = replied_infos.get(second_reply.get('replied_id'), {}) replied_info_user_info = all_user.get(replied_info.get("user_id", 0), {}) replied_info_doctor_info = second_doctors.get(replied_info.get("doctor_id", ""), {}) if replied_info_user_info: second_reply.update({ "replied_user_id": replied_info.get('user_id'), "replied_user_name": replied_info_user_info.get("user_name", ""), "replied_user_portrait": replied_info_user_info.get("portrait", ""), "replied_user_info": replied_info_user_info, }) if replied_info_doctor_info: second_reply.update({ "replied_doctor_id": replied_info.get('doctor_id'), "replied_doctor_name": replied_info_doctor_info.get("user_name", ""), "replied_doctor_portrait": replied_info_doctor_info.get("portrait", ""), "replied_doctor_info": replied_info_doctor_info, }) top_user_info = all_user.get(top_info.get("user_id", 0), {}) top_info.update({ "replies": second_replies, "user_id": top_user_info.get("user_id", 0), "user_name": top_user_info.get("user_name", ""), "user_portrait": top_user_info.get("portrait", ""), "is_vote": True if top_info.get('id') in voted_reply_ids else False, "top_reply_user_info": top_user_info, }) if not top_info['status'] and more_highlight: top_info['status'] = TRACTATE_REPLY_HIGHLIGHT.MORE_LIGHT return [top_info] @bind_context(uri_pre + 'receive', with_context=True) def get_replies_by_ids(ctx, replies_ids): user = get_user_from_context(ctx) if not user: return gen(CODES.LOGIN_REQUIRED) if not replies_ids: return {} replies_dict = SoftArticleReplyService.get_replies_info(reply_ids=replies_ids) user_ids = [] replied_ids = [] soft_article_ids = [] for _, reply in replies_dict.items(): user_ids.append(reply["user_id"]) replied_ids.append(reply["replied_id"]) soft_article_ids.append(reply["softarticle_id"]) replied_dict = SoftArticleReplyService.get_replies_info(reply_ids=replied_ids) users_dict = UserService.get_users_by_user_ids(user_ids) #Todo需要修改 soft_article_dict = SoftArticleService.get_soft_article_by_ids(soft_article_ids) result = {} for reply_id, reply in replies_dict.items(): reply_user = users_dict.get(reply["user_id"], {}) replied = {} if reply["replied_id"]: item = replied_dict.get(reply["replied_id"], {}) if item: replied = { "id": reply["replied_id"], "content": reply["content"], } soft_article = {} soft_article_obj = soft_article_dict.get(reply["softarticle_id"]) if soft_article_obj: soft_article = { "id": soft_article_obj.id, "content": soft_article_obj.content, "user_id": soft_article_obj.user_id } info = { "id": reply["id"], "reply_date": reply["create_time"], "reply_content": reply["content"], "soft_article": soft_article, "replied": replied, "reply_user": { "id": reply_user.id, "name": reply_user.nickname, "portrait": reply_user.portrait, }, "author": { "id": user.id, "name": user.nickname, "portrait": user.portrait, }, } result[str(reply_id)] = info return result