protocol.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "log/slog"
  6. )
  7. import (
  8. "google.golang.org/grpc/codes"
  9. "google.golang.org/grpc/status"
  10. "google.golang.org/protobuf/types/known/structpb"
  11. "gorm.io/gorm"
  12. )
  13. import (
  14. "protocol-server/common"
  15. "protocol-server/models"
  16. pb "protocol-server/rpc_idl/dr_protocol_pb"
  17. )
  18. var nilStruct *structpb.Struct
  19. func init() {
  20. var err error
  21. nilStruct, err = structpb.NewStruct(map[string]any{})
  22. if err != nil {
  23. panic(err)
  24. }
  25. }
  26. type ProtocolServer struct {
  27. pb.UnimplementedProtocolServer
  28. }
  29. func (s *ProtocolServer) GetPatientTypeList(ctx context.Context, in *pb.PatientTypeRequest) (*pb.PatientTypeReply, error) {
  30. res := pb.PatientTypeReply{}
  31. product, _, _, err := common.GetHeader(ctx)
  32. if err != nil {
  33. return &res, err
  34. }
  35. err = models.DB.Model(&models.PatientType{}).Scopes(
  36. models.String("product = ?", product.ToString()),
  37. models.Bool("is_enabled = ?", in.IsEnabled),
  38. ).Order("sort").Find(&res.PatientTypeList).Error
  39. if err != nil {
  40. return nil, status.Errorf(codes.Internal, "patient_type find err %v", err)
  41. }
  42. for _, pt := range res.GetPatientTypeList() {
  43. pt.PatientTypeNameLocal = pt.PatientTypeName
  44. }
  45. return &res, nil
  46. }
  47. func (s *ProtocolServer) GetBodyPartList(ctx context.Context, in *pb.BodyPartRequest) (*pb.BodyPartReply, error) {
  48. res := pb.BodyPartReply{}
  49. product, _, _, err := common.GetHeader(ctx)
  50. if err != nil {
  51. return &res, err
  52. }
  53. err = models.DB.Model(&models.BodyPart{}).Scopes(
  54. models.String("patient_type = ?", in.GetPatientType()),
  55. models.String("modality = ?", in.GetModality()),
  56. models.String("product = ?", product.ToString()),
  57. models.Bool("is_enabled = ?", in.IsEnabled),
  58. ).Order("sort").Find(&res.BodyPartList).Error
  59. if err != nil {
  60. return nil, status.Errorf(codes.Internal, "body_part find err %v", err)
  61. }
  62. for _, pt := range res.GetBodyPartList() {
  63. pt.BodyPartNameLocal = pt.BodyPartName
  64. }
  65. return &res, nil
  66. }
  67. func (s *ProtocolServer) GetProcedureList(ctx context.Context, in *pb.ProcedureRequest) (*pb.ProcedureReply, error) {
  68. res := pb.ProcedureReply{}
  69. product, _, _, err := common.GetHeader(ctx)
  70. if err != nil {
  71. return &res, err
  72. }
  73. err = models.DB.Model(&models.Procedure{}).Scopes(
  74. models.String("patient_type = ?", in.GetPatientType()),
  75. models.String("body_part_id = ?", in.GetBodyPartId()),
  76. models.String("product = ?", product.ToString()),
  77. models.Bool("is_enabled = ?", in.IsEnabled),
  78. models.Bool("is_pre_install = ?", in.IsPreInstall),
  79. ).Order("sort").Find(&res.ProcedureList).Error
  80. if err != nil {
  81. return nil, status.Errorf(codes.Internal, "procedure find err %v", err)
  82. }
  83. for _, pt := range res.GetProcedureList() {
  84. pt.ProcedureNameLocal = pt.ProcedureName
  85. pt.ProcedureDescriptionLocal = pt.ProcedureDescription
  86. }
  87. return &res, nil
  88. }
  89. func (s *ProtocolServer) GetProcedure(ctx context.Context, in *pb.IDRequest) (*pb.Procedure, error) {
  90. slog.Info("[rpc]GetProcedure...", "instance_id", *in.InstanceId)
  91. res := pb.Procedure{}
  92. product, _, _, err := common.GetHeader(ctx)
  93. if err != nil {
  94. return &res, err
  95. }
  96. err = models.DB.Model(&models.Procedure{}).Scopes(
  97. models.String("internal_id = ?", in.GetInstanceId()),
  98. models.String("product = ?", product.ToString()),
  99. ).Order("sort").Find(&res).Error
  100. if err != nil {
  101. if errors.Is(err, gorm.ErrRecordNotFound) {
  102. return nil, status.Errorf(codes.NotFound, "procedure %s not found", in.GetInstanceId())
  103. }
  104. return nil, status.Errorf(codes.Internal, "procedure find err %v", err)
  105. }
  106. res.ProcedureNameLocal = res.ProcedureName
  107. res.ProcedureDescriptionLocal = res.ProcedureDescription
  108. return &res, nil
  109. }
  110. func (s *ProtocolServer) GetViewList(ctx context.Context, in *pb.ViewRequest) (*pb.ViewReply, error) {
  111. procedure := models.Procedure{}
  112. res := pb.ViewReply{}
  113. product, _, _, err := common.GetHeader(ctx)
  114. if err != nil {
  115. return &res, err
  116. }
  117. if in.GetProcedureId() == "" {
  118. err := models.DB.Model(&models.View{}).Scopes(
  119. models.String("patient_type = ?", in.GetPatientType()),
  120. models.String("body_part_id = ?", in.GetBodyPartId()),
  121. models.String("product = ?", product.ToString()),
  122. models.Bool("is_enabled = ?", in.IsEnabled),
  123. models.Bool("is_pre_install = ?", in.IsPreInstall),
  124. ).Order("sort").Find(&procedure.Views).Error
  125. if err != nil {
  126. return nil, status.Errorf(codes.Internal, "view find err %v", err)
  127. }
  128. } else {
  129. err := models.DB.Model(&models.Procedure{}).Preload("Views").Scopes(
  130. models.String("procedure_id = ?", in.GetProcedureId()),
  131. models.String("product = ?", product.ToString()),
  132. models.Bool("is_enabled = ?", in.IsEnabled),
  133. models.Bool("is_pre_install = ?", in.IsPreInstall),
  134. ).Order("sort").First(&procedure).Error
  135. if err != nil {
  136. if errors.Is(err, gorm.ErrRecordNotFound) {
  137. return nil, status.Errorf(codes.NotFound, "procedure %s not found", in.GetProcedureId())
  138. }
  139. return nil, status.Errorf(codes.Internal, "procedure find err %v", err)
  140. }
  141. }
  142. for i := range procedure.Views {
  143. res.ViewList = append(res.ViewList, view2pb(procedure.Views[i]))
  144. }
  145. return &res, nil
  146. }
  147. func (s *ProtocolServer) GetView(ctx context.Context, in *pb.IDRequest) (*pb.View, error) {
  148. slog.Info("[rpc]GetView...", "instance_id", *in.InstanceId)
  149. product, _, _, err := common.GetHeader(ctx)
  150. if err != nil {
  151. slog.Info("[rpc]GetView err:", err)
  152. return &pb.View{}, err
  153. }
  154. var view models.View
  155. err = models.DB.Scopes(
  156. models.String("internal_id = ?", in.GetInstanceId()),
  157. models.String("product = ?", product.ToString()),
  158. ).Order("sort").First(&view).Error
  159. if err != nil {
  160. if errors.Is(err, gorm.ErrRecordNotFound) {
  161. return nil, status.Errorf(codes.NotFound, "view %s not found", in.GetInstanceId())
  162. }
  163. return nil, status.Errorf(codes.Internal, "view find err %v", err)
  164. }
  165. return view2pb(&view), nil
  166. }