diff --git a/api/controller/orderInquiry.go b/api/controller/orderInquiry.go index 73aa0ac..d5df5ca 100644 --- a/api/controller/orderInquiry.go +++ b/api/controller/orderInquiry.go @@ -168,3 +168,29 @@ func (r *OrderInquiry) GetOrderInquiryRecordPage(c *gin.Context) { result["data"] = GetOrderInquiryPageResponses responses.OkWithData(result, c) } + +// GetOrderInquiryRecord 问诊订单详情 +func (r *OrderInquiry) GetOrderInquiryRecord(c *gin.Context) { + id := c.Param("order_inquiry_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + orderInquiryId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + orderInquiryService := service.OrderInquiryService{} + getUserDoctorResponses, err := orderInquiryService.GetOrderInquiryRecord(orderInquiryId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getUserDoctorResponses, c) +} diff --git a/api/dao/messageIm.go b/api/dao/messageIm.go new file mode 100644 index 0000000..b31f138 --- /dev/null +++ b/api/dao/messageIm.go @@ -0,0 +1,72 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type MessageImDao struct { +} + +// GetMessageImById 获取Im消息数据-Im消息id +func (r *MessageImDao) GetMessageImById(MessageId int64) (m *model.MessageIm, err error) { + err = global.Db.First(&m, MessageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +func (r *MessageImDao) GetMessageImByOrderInquiryId(orderInquiryId int64) (m []*model.MessageIm, err error) { + err = global.Db.Where("order_inquiry_id = ?", orderInquiryId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetMessageImPreloadById 获取Im消息数据-加载全部关联-Im消息id +func (r *MessageImDao) GetMessageImPreloadById(MessageId int64) (m *model.MessageIm, err error) { + err = global.Db.Preload(clause.Associations).First(&m, MessageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteMessageIm 删除Im消息 +func (r *MessageImDao) DeleteMessageIm(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.MessageIm{}).Error + if err != nil { + return err + } + return nil +} + +// EditMessageIm 修改Im消息 +func (r *MessageImDao) EditMessageIm(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.MessageIm{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetMessageImList 获取Im消息列表 +func (r *MessageImDao) GetMessageImList(maps interface{}) (m []*model.MessageIm, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddMessageIm 新增Im消息 +func (r *MessageImDao) AddMessageIm(tx *gorm.DB, model *model.MessageIm) (*model.MessageIm, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dto/MessageIm.go b/api/dto/MessageIm.go new file mode 100644 index 0000000..d3eae22 --- /dev/null +++ b/api/dto/MessageIm.go @@ -0,0 +1,76 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +type MessageImDto struct { + MessageId string `json:"message_id"` // 主键id + FromUserId string `json:"from_user_id"` // 发送方user_id + ToUserId string `json:"to_user_id"` // 接收方user_id;NOT NULL + MessageKey string `json:"message_key"` // 消息唯一标识(系统返回,撤回消息使用) + MessageSendTime string `json:"message_send_time"` // 消息发送时间戳 + MessageSeq int `json:"message_seq"` // 消息序列号(单聊消息优先使用 MsgTime 进行排序,同一秒发送的消息则按 MsgSeq 排序,MsgSeq 值越大消息越靠后) + MessageSendResult int `json:"message_send_result"` // 消息下发结果(0:失败 1:成功) + SendErrorInfo string `json:"send_error_info"` // 消息下发失败原因 + MessageType string `json:"message_type"` // 消息类型(具体查看:https://cloud.tencent.com/document/product/269/2720) + IsSystem int `json:"is_system"` // 是否系统操作发送(0:否 1:是) + OrderInquiryId string `json:"order_inquiry_id"` // 问诊id(自定义字段) + MessageContent string `json:"message_content"` // 消息内容(json形式) + MessageCustomContent string `json:"message_custom_content"` // 自定义消息内容(json形式) + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +func GetMessageImDto(m *model.MessageIm) *MessageImDto { + return &MessageImDto{ + MessageId: fmt.Sprintf("%d", m.MessageId), + FromUserId: m.FromUserId, + ToUserId: fmt.Sprintf("%d", m.ToUserId), + MessageKey: m.MessageKey, + MessageSendTime: m.MessageSendTime, + MessageSeq: m.MessageSeq, + MessageSendResult: m.MessageSendResult, + SendErrorInfo: m.SendErrorInfo, + MessageType: m.MessageType, + IsSystem: m.IsSystem, + OrderInquiryId: fmt.Sprintf("%d", m.OrderInquiryId), + MessageContent: m.MessageContent, + MessageCustomContent: m.MessageCustomContent, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetMessageImListDto(m []*model.MessageIm) []*MessageImDto { + // 处理返回值 + responses := make([]*MessageImDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &MessageImDto{ + MessageId: fmt.Sprintf("%d", v.MessageId), + FromUserId: v.FromUserId, + ToUserId: fmt.Sprintf("%d", v.ToUserId), + MessageKey: v.MessageKey, + MessageSendTime: v.MessageSendTime, + MessageSeq: v.MessageSeq, + MessageSendResult: v.MessageSendResult, + SendErrorInfo: v.SendErrorInfo, + MessageType: v.MessageType, + IsSystem: v.IsSystem, + OrderInquiryId: fmt.Sprintf("%d", v.OrderInquiryId), + MessageContent: v.MessageContent, + MessageCustomContent: v.MessageCustomContent, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/OrderInquiry.go b/api/dto/OrderInquiry.go index 21f30a1..383e689 100644 --- a/api/dto/OrderInquiry.go +++ b/api/dto/OrderInquiry.go @@ -47,8 +47,10 @@ type OrderInquiryDto struct { OrderInquiryRefund *OrderInquiryRefundDto `json:"order_inquiry_refund"` // 退款数据 OrderEvaluation *OrderEvaluationDto `json:"order_evaluation"` // 订单评价 UserDoctor *UserDoctorDto `json:"user_doctor"` // 医生数据 + MessageIm []*MessageImDto `json:"message_im"` // 聊天记录 } +// GetOrderInquiryDto 问诊订单详情 func GetOrderInquiryDto(m *model.OrderInquiry) *OrderInquiryDto { var doctorId string if m.DoctorId != 0 { @@ -93,6 +95,7 @@ func GetOrderInquiryDto(m *model.OrderInquiry) *OrderInquiryDto { } } +// GetOrderInquiryListDto 问诊订单列表 func GetOrderInquiryListDto(m []*model.OrderInquiry) []*OrderInquiryDto { // 处理返回值 responses := make([]*OrderInquiryDto, len(m)) @@ -150,6 +153,7 @@ func GetOrderInquiryListDto(m []*model.OrderInquiry) []*OrderInquiryDto { return responses } +// GetOrderInquiryRecordListDto 问诊记录列表 func GetOrderInquiryRecordListDto(m []*model.OrderInquiry) []*OrderInquiryDto { // 处理返回值 responses := make([]*OrderInquiryDto, len(m)) @@ -199,6 +203,51 @@ func GetOrderInquiryRecordListDto(m []*model.OrderInquiry) []*OrderInquiryDto { return responses } +// GetOrderInquiryRecordDto 问诊记录详情 +func GetOrderInquiryRecordDto(m *model.OrderInquiry) *OrderInquiryDto { + var doctorId string + if m.DoctorId != 0 { + doctorId = fmt.Sprintf("%v", m.DoctorId) + } + + return &OrderInquiryDto{ + OrderInquiryId: fmt.Sprintf("%d", m.OrderInquiryId), + UserId: fmt.Sprintf("%d", m.UserId), + DoctorId: doctorId, + PatientId: fmt.Sprintf("%d", m.PatientId), + FamilyId: fmt.Sprintf("%d", m.FamilyId), + InquiryType: m.InquiryType, + InquiryMode: m.InquiryMode, + InquiryStatus: m.InquiryStatus, + IsDelete: m.IsDelete, + InquiryRefundStatus: m.InquiryRefundStatus, + InquiryPayChannel: m.InquiryPayChannel, + InquiryPayStatus: m.InquiryPayStatus, + InquiryNo: m.InquiryNo, + EscrowTradeNo: m.EscrowTradeNo, + AmountTotal: m.AmountTotal, + CouponAmountTotal: m.CouponAmountTotal, + PaymentAmountTotal: m.PaymentAmountTotal, + PayTime: m.PayTime, + ReceptionTime: m.ReceptionTime, + CompleteTime: m.CompleteTime, + FinishTime: m.FinishTime, + StatisticsStatus: m.StatisticsStatus, + StatisticsTime: m.StatisticsTime, + IsWithdrawal: m.IsWithdrawal, + WithdrawalTime: m.WithdrawalTime, + CancelTime: m.CancelTime, + CancelReason: m.CancelReason, + CancelRemarks: m.CancelRemarks, + PatientName: m.PatientName, + PatientNameMask: m.PatientNameMask, + PatientSex: m.PatientSex, + PatientAge: m.PatientAge, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + // LoadDoctorName 加载医生名称 func (r *OrderInquiryDto) LoadDoctorName(m *model.UserDoctor) *OrderInquiryDto { if m != nil { @@ -246,3 +295,13 @@ func (r *OrderInquiryDto) LoadOrderEvaluation(m *model.OrderEvaluation) *OrderIn } return r } + +// LoadMessageIm 加载聊天记录 +func (r *OrderInquiryDto) LoadMessageIm(m []*model.MessageIm) *OrderInquiryDto { + if len(m) > 0 { + d := GetMessageImListDto(m) + + r.MessageIm = d + } + return r +} diff --git a/api/model/messageIm.go b/api/model/messageIm.go new file mode 100644 index 0000000..fd61a48 --- /dev/null +++ b/api/model/messageIm.go @@ -0,0 +1,43 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// MessageIm IM消息表 +type MessageIm struct { + MessageId int64 `gorm:"column:message_id;type:bigint(19);primary_key;comment:主键id" json:"message_id"` + FromUserId string `gorm:"column:from_user_id;type:varchar(30);comment:发送方user_id" json:"from_user_id"` + ToUserId int64 `gorm:"column:to_user_id;type:bigint(20);comment:接收方user_id;NOT NULL" json:"to_user_id"` + MessageKey string `gorm:"column:message_key;type:varchar(255);comment:消息唯一标识(系统返回,撤回消息使用)" json:"message_key"` + MessageSendTime string `gorm:"column:message_send_time;type:varchar(11);comment:消息发送时间戳" json:"message_send_time"` + MessageSeq int `gorm:"column:message_seq;type:int(11);comment:消息序列号(单聊消息优先使用 MsgTime 进行排序,同一秒发送的消息则按 MsgSeq 排序,MsgSeq 值越大消息越靠后)" json:"message_seq"` + MessageSendResult int `gorm:"column:message_send_result;type:tinyint(4);default:0;comment:消息下发结果(0:失败 1:成功)" json:"message_send_result"` + SendErrorInfo string `gorm:"column:send_error_info;type:varchar(255);comment:消息下发失败原因" json:"send_error_info"` + MessageType string `gorm:"column:message_type;type:varchar(50);comment:消息类型(具体查看:https://cloud.tencent.com/document/product/269/2720)" json:"message_type"` + IsSystem int `gorm:"column:is_system;type:tinyint(4);default:0;comment:是否系统操作发送(0:否 1:是)" json:"is_system"` + OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:问诊id(自定义字段)" json:"order_inquiry_id"` + MessageContent string `gorm:"column:message_content;type:text;comment:消息内容(json形式)" json:"message_content"` + MessageCustomContent string `gorm:"column:message_custom_content;type:text;comment:自定义消息内容(json形式)" json:"message_custom_content"` + Model +} + +func (m *MessageIm) TableName() string { + return "gdxz_message_im" +} + +func (m *MessageIm) BeforeCreate(tx *gorm.DB) error { + if m.MessageId == 0 { + m.MessageId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/router/router.go b/api/router/router.go index 7377b6a..29fc5a5 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -406,7 +406,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { inquiryRecordGroup.GET("", api.OrderInquiry.GetOrderInquiryRecordPage) // 问诊记录详情 - inquiryRecordGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiry) + inquiryRecordGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiryRecord) } } diff --git a/api/service/OrderInquiry.go b/api/service/OrderInquiry.go index bb7a399..db912b4 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -322,3 +322,45 @@ func (r *OrderInquiryService) GetOrderInquiry(orderInquiryId int64) (g *dto.Orde g.LoadOrderEvaluation(orderEvaluation) return g, nil } + +// GetOrderInquiryRecord 问诊记录详情 +func (r *OrderInquiryService) GetOrderInquiryRecord(orderInquiryId int64) (g *dto.OrderInquiryDto, err error) { + // 获取问诊订单数据 + orderInquiryDao := dao.OrderInquiryDao{} + orderInquiry, err := orderInquiryDao.GetOrderInquiryPreloadById(orderInquiryId) + if err != nil || orderInquiry == nil { + return nil, errors.New(err.Error()) + } + + // 获取问诊病例 + orderInquiryCaseDao := dao.OrderInquiryCaseDao{} + orderInquiryCase, err := orderInquiryCaseDao.GetOrderInquiryCaseByOrderInquiryId(orderInquiryId) + if orderInquiryCase == nil { + return nil, errors.New("数据错误,无问诊病例") + } + + // 获取医生数据 + userDoctorService := UserDoctorService{} + userDoctor, err := userDoctorService.GetUserDoctorById(orderInquiry.DoctorId) + if err != nil { + return nil, errors.New(err.Error()) + } + + // 获取聊天记录 + messageImDao := dao.MessageImDao{} + messageIms, err := messageImDao.GetMessageImByOrderInquiryId(orderInquiryId) + + // 处理返回值 + g = dto.GetOrderInquiryRecordDto(orderInquiry) + + // 加载医生数据 + g.UserDoctor = userDoctor + + // 加载问诊病例 + g.LoadMaskOrderInquiryCase(orderInquiryCase) + + // 加载聊天记录 + g.LoadMessageIm(messageIms) + + return g, nil +}