WH01243 3 年之前
父节点
当前提交
676bd6e44c

+ 5 - 2
Makefile

@@ -62,9 +62,12 @@ build_rpc_win:
 	go build -ldflags="-s -w"  -o ${RPC_WIN_FILE} ./rpc/usercenter.go
 
 #单元测试覆盖率
-cover:
+cover_out:
 	@echo "===========> Run go test "
-	cd service/ &&  go test -v -covermode=count -coverprofile=test_cover.out && go tool cover -html=test_cover.out -o coverage.html
+	cd service/ &&  go test -v -covermode=count -coverprofile=test_cover.out
+cover_html:
+	@echo "===========> Run go test "
+	cd service/ &&   go tool cover -html=test_cover.out -o coverage.html
 
 #清理
 clean:

+ 35 - 0
api/medical/common/initconfig.go

@@ -0,0 +1,35 @@
+package common
+
+import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/config"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+	"flag"
+	"github.com/zeromicro/go-zero/core/conf"
+	"github.com/zeromicro/go-zero/core/logx"
+	"log"
+)
+
+var configFile = flag.String("fs", "etc/medial_api.yaml", "the config file")
+var C config.Config
+
+//
+var logFile = flag.String("lf", "etc/logs.yaml", "the config file")
+var logc entity.Logc
+
+func init() {
+	conf.MustLoad(*configFile, &C)
+	log.Println("初始化配置") //
+	//初始化日志信息
+	conf.MustLoad(*logFile, &logc)
+	if len(logc.Level) > 0 {
+		for _, v := range logc.Level {
+			logx.MustSetup(logx.LogConf{
+				Mode:     logc.Mode,
+				Path:     logc.Path,
+				Level:    v,
+				KeepDays: logc.KeepDays,
+			})
+			logx.Info(v, "--日志记录")
+		}
+	}
+}

+ 6 - 0
api/medical/etc/logs.yaml

@@ -0,0 +1,6 @@
+Mode: file
+Path: ./logs
+Level:
+  - info
+  - error
+KeepDays: 10

+ 11 - 0
api/medical/etc/medical-api.yaml

@@ -1,3 +1,14 @@
 Name: medical-api
 Host: 0.0.0.0
 Port: 8888
+WebRpcPort: 8016
+Medical:
+  Etcd:
+    Hosts:
+      - 127.0.0.1:2379
+    Key: medical.rpc
+  Timeout: 10000
+Gateway:
+  ServerCode: medical
+  Etcd:
+    - 127.0.0.1:2379

+ 10 - 1
api/medical/internal/config/config.go

@@ -1,7 +1,16 @@
 package config
 
-import "github.com/zeromicro/go-zero/rest"
+import (
+	"github.com/zeromicro/go-zero/rest"
+	"github.com/zeromicro/go-zero/zrpc"
+)
 
 type Config struct {
 	rest.RestConf
+	Medical zrpc.RpcClientConf
+	Gateway struct {
+		ServerCode string
+		Etcd       []string
+	}
+	WebRpcPort int64
 }

+ 23 - 0
api/medical/internal/handler/auth/userauthinfohandler.go

@@ -0,0 +1,23 @@
+package auth
+
+import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/types"
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/logic/auth"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/svc"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func UserAuthInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		l := auth.NewUserAuthInfoLogic(r.Context(), svcCtx)
+		var req types.CommonReq
+		resp, err := l.UserAuthInfo(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/medical/internal/handler/auth/userauthinfosavehandler.go

@@ -0,0 +1,28 @@
+package auth
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/logic/auth"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/svc"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func UserAuthInfoSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.UserInfoReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := auth.NewUserAuthInfoSaveLogic(r.Context(), svcCtx)
+		resp, err := l.UserAuthInfoSave(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 17 - 0
api/medical/internal/handler/routes.go

@@ -4,6 +4,7 @@ package handler
 import (
 	"net/http"
 
+	auth "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/handler/auth"
 	distributor "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/handler/distributor"
 	institution "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/handler/institution"
 	public "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/handler/public"
@@ -85,4 +86,20 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 		},
 		rest.WithPrefix("/domain"),
 	)
+
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/domain/userAuthInfoSave",
+				Handler: auth.UserAuthInfoSaveHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/domain/userAuthInfo",
+				Handler: auth.UserAuthInfoHandler(serverCtx),
+			},
+		},
+		rest.WithPrefix("/domain"),
+	)
 }

+ 42 - 0
api/medical/internal/logic/auth/userauthinfologic.go

@@ -0,0 +1,42 @@
+package auth
+
+import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+	"context"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/svc"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserAuthInfoLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewUserAuthInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserAuthInfoLogic {
+	return &UserAuthInfoLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *UserAuthInfoLogic) UserAuthInfo(req *types.CommonReq) (*types.CommonRes, error) {
+	// todo: add your logic here and delete this line
+	resp, err := l.svcCtx.Medical.UserAuthInfo(l.ctx, &medical.CommonReq{
+		UserId: req.NewUserId,
+		Appid:  req.AppId,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return &types.CommonRes{
+		Error_msg:  resp.ErrorMsg,
+		Error_code: int(resp.ErrorCode),
+		Data:       resp.Data,
+		State:      resp.Status,
+	}, nil
+}

+ 49 - 0
api/medical/internal/logic/auth/userauthinfosavelogic.go

@@ -0,0 +1,49 @@
+package auth
+
+import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+	"context"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/svc"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserAuthInfoSaveLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewUserAuthInfoSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserAuthInfoSaveLogic {
+	return &UserAuthInfoSaveLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *UserAuthInfoSaveLogic) UserAuthInfoSave(req *types.UserInfoReq) (*types.CommonRes, error) {
+	// todo: add your logic here and delete this line
+	resp, err := l.svcCtx.Medical.UserAuthInfoSave(l.ctx, &medical.UserInfo{
+		UserId:        req.NewUserId,
+		Appid:         req.AppId,
+		Name:          req.Name,
+		Phone:         req.Phone,
+		Mail:          req.Mail,
+		Position:      req.Position,
+		Department:    req.Department,
+		EntName:       req.EntName,
+		EntCode:       req.EntCode,
+		OperationType: req.OperationType,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return &types.CommonRes{
+		Error_msg:  resp.ErrorMsg,
+		Error_code: int(resp.ErrorCode),
+		Data:       resp.Data,
+	}, nil
+}

+ 11 - 3
api/medical/internal/logic/institution/getfilteritemlogic.go

@@ -1,6 +1,7 @@
 package institution
 
 import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
 	"context"
 
 	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/svc"
@@ -23,8 +24,15 @@ func NewGetFilterItemLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Get
 	}
 }
 
-func (l *GetFilterItemLogic) GetFilterItem() (resp *types.CommonRes, err error) {
+func (l *GetFilterItemLogic) GetFilterItem() (*types.CommonRes, error) {
 	// todo: add your logic here and delete this line
-
-	return
+	resp, err := l.svcCtx.Medical.GetFilterItem(l.ctx, &medical.Zero{})
+	if err != nil {
+		return nil, err
+	}
+	return &types.CommonRes{
+		Error_msg:  resp.ErrorMsg,
+		Error_code: int(resp.ErrorCode),
+		Data:       resp.Data,
+	}, nil
 }

+ 6 - 2
api/medical/internal/svc/servicecontext.go

@@ -2,14 +2,18 @@ package svc
 
 import (
 	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/api/medical/internal/config"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+	"github.com/zeromicro/go-zero/zrpc"
 )
 
 type ServiceContext struct {
-	Config config.Config
+	Config  config.Config
+	Medical medical.Medical
 }
 
 func NewServiceContext(c config.Config) *ServiceContext {
 	return &ServiceContext{
-		Config: c,
+		Config:  c,
+		Medical: medical.NewMedical(zrpc.MustNewClient(c.Medical)),
 	}
 }

+ 19 - 0
api/medical/internal/types/types.go

@@ -5,6 +5,12 @@ type CommonRes struct {
 	Error_code int         `json:"error_code"`
 	Error_msg  string      `json:"error_msg"`
 	Data       interface{} `json:"data"`
+	State      bool        `json:"state"`
+}
+
+type CommonReq struct {
+	NewUserId int64  `header:"newUserId"`
+	AppId     string `header:"appId"`
 }
 
 type SearchInstitutionReq struct {
@@ -75,3 +81,16 @@ type UnFollowReq struct {
 	UserId string `header:"newUserId"` // 用户id
 	Id     int    `json:"id"`
 }
+
+type UserInfoReq struct {
+	Name          string `json:"name"`             // 姓名
+	Phone         string `json:"phone"`            // 手机号
+	Position      string `json:"position"`         // 个人职务
+	Department    string `json:"department"`       // 所在部门
+	EntCode       string `header:"ent_code"`       // 企业标识
+	EntName       string `header:"ent_name"`       // 企业名称
+	Mail          string `header:"mail"`           // 邮箱
+	OperationType string `header:"operation_type"` // add新增 update 修改
+	NewUserId     int64  `header:"newUserId"`
+	AppId         string `header:"appId"`
+}

+ 30 - 0
api/medical/medical.api

@@ -3,6 +3,11 @@ type CommonRes {
 	Error_code int         `json:"error_code"`
 	Error_msg  string      `json:"error_msg"`
 	Data       interface{} `json:"data"`
+	State      bool        `json:"state"`
+}
+type CommonReq {
+	NewUserId int64  `header:"newUserId"`
+	AppId     string `header:"appId"`
 }
 // 搜索医疗机构
 type SearchInstitutionReq {
@@ -124,4 +129,29 @@ service medical-api {
 	@handler unfolllow
 	post /unfollow (UnFollowReq) returns (CommonRes); // 取关
 	
+}
+
+type UserInfoReq {
+	Name          string `json:"name"`             // 姓名
+	Phone         string `json:"phone"`            // 手机号
+	Position      string `json:"position"`         // 个人职务
+	Department    string `json:"department"`       // 所在部门
+	EntCode       string `header:"ent_code"`       // 企业标识
+	EntName       string `header:"ent_name"`       // 企业名称
+	Mail          string `header:"mail"`           // 邮箱
+	OperationType string `header:"operation_type"` // add新增 update 修改
+	NewUserId     int64  `header:"newUserId"`
+	AppId         string `header:"appId"`
+}
+
+// 认证
+@server(
+	group : auth
+	prefix: domain
+)
+service medical-api {
+	@handler userAuthInfoSave
+	post /domain/userAuthInfoSave (UserInfoReq) returns (CommonRes); 	// 用户认证信息保存
+	@handler userAuthInfo
+	post /domain/userAuthInfo (CommonReq) returns (CommonRes); // 获取用户认证信息
 }

+ 7 - 2
entity/code.go

@@ -2,9 +2,10 @@ package entity
 
 //表代码
 const (
-	CODE_MEDICAL_INSTITUTION_LEVEL = "code_medical_institution_level"
-	CODE_MEDICAL_INSTITUTION_TYPE  = "code_medical_institution_type"
+	CODE_MEDICAL_INSTITUTION_LEVEL = "code_level"
+	CODE_MEDICAL_INSTITUTION_TYPE  = "code_type"
 	DOMAIN_ENT_FOLLOW              = "domain_ent_follow"
+	DOMAIN_CAPITAL_RETENTION       = "domain_capital_retention"
 )
 
 //返回状态
@@ -12,3 +13,7 @@ const (
 	ERRORCODE   = 1
 	SUCCESSCODE = 0
 )
+
+const (
+	Date_Full_Layout = "2006-01-02 15:04:05"
+)

+ 5 - 0
rpc/medical/etc/medical.yaml

@@ -18,3 +18,8 @@ BaseMysqlMain:
   passWord: =PDT49#80Z!RVv52_z
   maxOpenConns: 5
   maxIdleConns: 5
+Es:
+  addr: http://192.168.3.204:1500
+  size: 5
+  index: smart_new
+  type: smart

+ 51 - 0
rpc/medical/internal/logic/userauthinfologic.go

@@ -0,0 +1,51 @@
+package logic
+
+import (
+	quitl "app.yhyue.com/moapp/jybase/common"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service"
+	"context"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/internal/svc"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserAuthInfoLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewUserAuthInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserAuthInfoLogic {
+	return &UserAuthInfoLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// 获取用户认证信息
+func (l *UserAuthInfoLogic) UserAuthInfo(in *medical.CommonReq) (*medical.UserInfoResp, error) {
+	// todo: add your logic here and delete this line
+	m := service.AuthService{}
+	data := m.UserAuthInfo(in)
+	result := &medical.UserInfoResp{}
+	if data != nil {
+		result.Status = true
+		result.Data = &medical.UserInfo{
+			Mail:       quitl.InterfaceToStr((*data)["mail"]),
+			Name:       quitl.InterfaceToStr((*data)["name"]),
+			Phone:      quitl.InterfaceToStr((*data)["phone"]),
+			EntName:    quitl.InterfaceToStr((*data)["ent_name"]),
+			Position:   quitl.InterfaceToStr((*data)["position"]),
+			Department: quitl.InterfaceToStr((*data)["department"]),
+			EntCode:    quitl.InterfaceToStr((*data)["ent_code"]),
+		}
+	} else {
+		result.Status = false
+	}
+	result.ErrorCode = entity.SUCCESSCODE
+	return &medical.UserInfoResp{}, nil
+}

+ 41 - 0
rpc/medical/internal/logic/userauthinfosavelogic.go

@@ -0,0 +1,41 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service"
+	"context"
+
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/internal/svc"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserAuthInfoSaveLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewUserAuthInfoSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserAuthInfoSaveLogic {
+	return &UserAuthInfoSaveLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// 用户认证信息保存
+func (l *UserAuthInfoSaveLogic) UserAuthInfoSave(in *medical.UserInfo) (*medical.CommonResp, error) {
+	// todo: add your logic here and delete this line
+	m := service.AuthService{}
+	errcode, msg := m.UserAuthInfoSave(in)
+	result := &medical.CommonResp{}
+	if errcode {
+		result.ErrorCode = entity.ERRORCODE
+	} else {
+		result.ErrorCode = entity.ERRORCODE
+		result.ErrorMsg = msg
+	}
+	return result, nil
+}

+ 12 - 0
rpc/medical/internal/server/medicalserver.go

@@ -39,3 +39,15 @@ func (s *MedicalServer) Distributor(ctx context.Context, in *medical.SearchDistr
 	l := logic.NewDistributorLogic(ctx, s.svcCtx)
 	return l.Distributor(in)
 }
+
+// 用户认证信息保存
+func (s *MedicalServer) UserAuthInfoSave(ctx context.Context, in *medical.UserInfo) (*medical.CommonResp, error) {
+	l := logic.NewUserAuthInfoSaveLogic(ctx, s.svcCtx)
+	return l.UserAuthInfoSave(in)
+}
+
+// 获取用户认证信息
+func (s *MedicalServer) UserAuthInfo(ctx context.Context, in *medical.CommonReq) (*medical.UserInfoResp, error) {
+	l := logic.NewUserAuthInfoLogic(ctx, s.svcCtx)
+	return l.UserAuthInfo(in)
+}

+ 53 - 21
rpc/medical/medical.proto

@@ -11,46 +11,58 @@ message Response {
   string pong = 1;
 }
 
+message CommonResp {
+    int64           error_code  =1;
+    string          error_msg   =2;
+    string          data        =3;
+}
+message CommonReq {
+    int64           userId  =1;
+    string           appid=2;
+}
+message  Zero{
+
+}
 message SearchInstitutionReq {
   string      companyName      =1;    // 要搜索的医疗机构
   string      areaCode         =2;       // 区域代码
   string      levelCode        =3;      // 医院等级代码
   string      miTypeCode       =4;     // 机构类型
-  int64         businessTypeCode =5;        // 经营性质 1-公立 2-民营 3-其他
+  int64       businessTypeCode =5;        // 经营性质 1-公立 2-民营 3-其他
   string      sdequipmentCode  =6; // 业务范围
   string      countOrder       =7;      // 项目数量排序 0-不排序 1-数量倒序
   string      moneyOrder       =8;      // 金额数量排序:0- 不参与排序  1-按金额倒序
-  int64         page             =9;
-  int64         pageSize        =10;
+  int64       page             =9;
+  int64       pageSize        =10;
 }
 message SearchDistributorReq {
   string      companyName     =1;          // 要搜索的经销商
   string      areaCode        =2;          // 区域代码
   string      BusinessScope   =3;          // 业务范围
   string      brand           =4;          // 品牌
-  int64         ProductModel    =5;        // 产品型号
+  string       ProductModel    =5;        // 产品型号
   string      countOrder      =6;          // 项目数量排序 0-不排序 1-数量倒序
   string      moneyOrder      =7;          // 金额数量排序:0- 不参与排序  1-按金额倒序
-  int64         page            =8;
-  int64         pageSize        =9;
+  int64       page            =8;
+  int64       pageSize        =9;
 }
 message CompanyData {
   string      company_id     =1;          // 唯一标识
   string      company_name   =2;          // 机构名称
   string      area           =3;          // 区域
   string      project_money  =4;          // 项目总金额
-  int64         project_count  =5;          // 项目总数
-  int64         follow         =6;          // 是否关注 1-关注 0:-未关注
+  int64       project_count  =5;          // 项目总数
+  int64       follow         =6;          // 是否关注 1-关注 0:-未关注
 }
 message CompanyDataList {
   repeated     CompanyData list     =1;   // 唯一标识
-  int64          total                =2;   // 总数
+  int64        total                =2;   // 总数
 
 }
 message CompanyResp {
-  int64             error_code=1;          // 唯一标识
-  string          error_msg   =2;        // 机构名称
-  CompanyDataList  data       =3;    // 区域
+  int64           error_code=1;
+  string          error_msg   =2;
+  CompanyDataList  data       =3;
 }
 //医院等级
 message LevelCode {
@@ -76,15 +88,35 @@ message FilterItemResp{
   string          error_msg   =2;        // 机构名称
   FilterItem      data        =3;
 }
-message  Zero{
-
+//认证信息
+message UserInfo {
+  string             name          =1;          // 姓名
+  string             phone         =2;          // 手机号
+  string             position      =3;          //个人职务
+  string             department    =4;          // 所在部门
+  string             mail          =5;          // 个人邮箱
+  string             ent_code           =6;          // 企业代码
+  string             ent_name           =7;          // 企业名称
+  string             operation_type     =8;          //  add新增 update 修改
+  int64             user_id            =9;          //用户标识
+  string             appid=10;
+}
+message UserInfoResp{
+  int64           error_code  =1;          // 唯一标识
+  string          error_msg   =2;        // 机构名称
+  UserInfo        data        =3;
+  bool            status=4;
 }
-service Medical {
-  //搜索医疗机构
-  rpc Institution(SearchInstitutionReq) returns(CompanyResp);
-  //获取医疗机构筛选条件
-  rpc GetFilterItem (Zero) returns(FilterItemResp);
-  //搜索经销商
-  rpc Distributor(SearchDistributorReq) returns(CompanyResp);
 
+service Medical {
+      //搜索医疗机构
+      rpc Institution(SearchInstitutionReq) returns(CompanyResp);
+      //获取医疗机构筛选条件
+      rpc GetFilterItem (Zero) returns(FilterItemResp);
+      //搜索经销商
+      rpc Distributor(SearchDistributorReq) returns(CompanyResp);
+      //用户认证信息保存
+      rpc userAuthInfoSave(UserInfo) returns(CommonResp);
+      //获取用户认证信息
+      rpc userAuthInfo(CommonReq) returns(UserInfoResp);
 }

+ 16 - 0
rpc/medical/medical/medical.go

@@ -18,6 +18,10 @@ type (
 		GetFilterItem(ctx context.Context, in *Zero, opts ...grpc.CallOption) (*FilterItemResp, error)
 		// 搜索经销商
 		Distributor(ctx context.Context, in *SearchDistributorReq, opts ...grpc.CallOption) (*CompanyResp, error)
+		// 用户认证信息保存
+		UserAuthInfoSave(ctx context.Context, in *UserInfo, opts ...grpc.CallOption) (*CommonResp, error)
+		// 获取用户认证信息
+		UserAuthInfo(ctx context.Context, in *CommonReq, opts ...grpc.CallOption) (*UserInfoResp, error)
 	}
 
 	defaultMedical struct {
@@ -48,3 +52,15 @@ func (m *defaultMedical) Distributor(ctx context.Context, in *SearchDistributorR
 	client := NewMedicalClient(m.cli.Conn())
 	return client.Distributor(ctx, in, opts...)
 }
+
+// 用户认证信息保存
+func (m *defaultMedical) UserAuthInfoSave(ctx context.Context, in *UserInfo, opts ...grpc.CallOption) (*CommonResp, error) {
+	client := NewMedicalClient(m.cli.Conn())
+	return client.UserAuthInfoSave(ctx, in, opts...)
+}
+
+// 获取用户认证信息
+func (m *defaultMedical) UserAuthInfo(ctx context.Context, in *CommonReq, opts ...grpc.CallOption) (*UserInfoResp, error) {
+	client := NewMedicalClient(m.cli.Conn())
+	return client.UserAuthInfo(ctx, in, opts...)
+}

文件差异内容过多而无法显示
+ 540 - 179
rpc/medical/medical/medical.pb.go


+ 76 - 0
rpc/medical/medical/medical_grpc.pb.go

@@ -28,6 +28,10 @@ type MedicalClient interface {
 	GetFilterItem(ctx context.Context, in *Zero, opts ...grpc.CallOption) (*FilterItemResp, error)
 	//搜索经销商
 	Distributor(ctx context.Context, in *SearchDistributorReq, opts ...grpc.CallOption) (*CompanyResp, error)
+	//用户认证信息保存
+	UserAuthInfoSave(ctx context.Context, in *UserInfo, opts ...grpc.CallOption) (*CommonResp, error)
+	//获取用户认证信息
+	UserAuthInfo(ctx context.Context, in *CommonReq, opts ...grpc.CallOption) (*UserInfoResp, error)
 }
 
 type medicalClient struct {
@@ -65,6 +69,24 @@ func (c *medicalClient) Distributor(ctx context.Context, in *SearchDistributorRe
 	return out, nil
 }
 
+func (c *medicalClient) UserAuthInfoSave(ctx context.Context, in *UserInfo, opts ...grpc.CallOption) (*CommonResp, error) {
+	out := new(CommonResp)
+	err := c.cc.Invoke(ctx, "/medical.Medical/userAuthInfoSave", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *medicalClient) UserAuthInfo(ctx context.Context, in *CommonReq, opts ...grpc.CallOption) (*UserInfoResp, error) {
+	out := new(UserInfoResp)
+	err := c.cc.Invoke(ctx, "/medical.Medical/userAuthInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MedicalServer is the server API for Medical service.
 // All implementations must embed UnimplementedMedicalServer
 // for forward compatibility
@@ -75,6 +97,10 @@ type MedicalServer interface {
 	GetFilterItem(context.Context, *Zero) (*FilterItemResp, error)
 	//搜索经销商
 	Distributor(context.Context, *SearchDistributorReq) (*CompanyResp, error)
+	//用户认证信息保存
+	UserAuthInfoSave(context.Context, *UserInfo) (*CommonResp, error)
+	//获取用户认证信息
+	UserAuthInfo(context.Context, *CommonReq) (*UserInfoResp, error)
 	mustEmbedUnimplementedMedicalServer()
 }
 
@@ -91,6 +117,12 @@ func (UnimplementedMedicalServer) GetFilterItem(context.Context, *Zero) (*Filter
 func (UnimplementedMedicalServer) Distributor(context.Context, *SearchDistributorReq) (*CompanyResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Distributor not implemented")
 }
+func (UnimplementedMedicalServer) UserAuthInfoSave(context.Context, *UserInfo) (*CommonResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UserAuthInfoSave not implemented")
+}
+func (UnimplementedMedicalServer) UserAuthInfo(context.Context, *CommonReq) (*UserInfoResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UserAuthInfo not implemented")
+}
 func (UnimplementedMedicalServer) mustEmbedUnimplementedMedicalServer() {}
 
 // UnsafeMedicalServer may be embedded to opt out of forward compatibility for this service.
@@ -158,6 +190,42 @@ func _Medical_Distributor_Handler(srv interface{}, ctx context.Context, dec func
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Medical_UserAuthInfoSave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UserInfo)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MedicalServer).UserAuthInfoSave(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/medical.Medical/userAuthInfoSave",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MedicalServer).UserAuthInfoSave(ctx, req.(*UserInfo))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Medical_UserAuthInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CommonReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MedicalServer).UserAuthInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/medical.Medical/userAuthInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MedicalServer).UserAuthInfo(ctx, req.(*CommonReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // Medical_ServiceDesc is the grpc.ServiceDesc for Medical service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -177,6 +245,14 @@ var Medical_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "Distributor",
 			Handler:    _Medical_Distributor_Handler,
 		},
+		{
+			MethodName: "userAuthInfoSave",
+			Handler:    _Medical_UserAuthInfoSave_Handler,
+		},
+		{
+			MethodName: "userAuthInfo",
+			Handler:    _Medical_UserAuthInfo_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "medical.proto",

+ 78 - 0
service/AuthService.go

@@ -0,0 +1,78 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/log"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+	"fmt"
+	"time"
+)
+
+type AuthService struct{}
+
+//认证信息保存
+func (b AuthService) UserAuthInfoSave(in *medical.UserInfo) (bool, string) {
+	//先判断用户是否存在
+	user := entity.BaseMysql.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+		"user_id": in.UserId, "appid": in.Appid,
+	}, "id", "")
+	if user != nil {
+		if in.OperationType == "add" {
+			return false, "用户已验证"
+		}
+	} else {
+		if in.OperationType == "update" {
+			return false, "用户未认证,不可修改"
+		}
+	}
+
+	if in.OperationType == "update" {
+		//修改处理
+		data := map[string]interface{}{
+			"name":       in.Name,
+			"phone":      in.Phone,
+			"position":   in.Position,
+			"department": in.Department,
+			"mail":       in.Mail,
+			"ent_code":   in.EntCode,
+			"ent_name":   in.EntName,
+		}
+		ok1 := entity.BaseMysql.Update(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{"user_id": in.UserId, "appid": in.Appid}, data)
+		if ok1 {
+			return true, ""
+		} else {
+			log.Println(fmt.Sprintf("认证修改失败:入参:%v:%v,", in.UserId, data))
+			return false, "修改失败"
+		}
+	} else {
+		//新增处理
+		data := map[string]interface{}{
+			"name":        in.Name,
+			"phone":       in.Phone,
+			"position":    in.Position,
+			"department":  in.Department,
+			"mail":        in.Mail,
+			"ent_code":    in.EntCode,
+			"ent_name":    in.EntName,
+			"user_id":     in.UserId,
+			"create_time": time.Now().Local(),
+			"appid":       in.Appid,
+		}
+		ok := entity.BaseMysql.Insert(entity.DOMAIN_CAPITAL_RETENTION, data)
+		if ok > 0 {
+			return true, ""
+		} else {
+			log.Println(fmt.Sprintf("认证失败:参数:%v", data))
+			return false, "认证失败"
+		}
+	}
+}
+
+//认证信息查询
+func (b AuthService) UserAuthInfo(in *medical.CommonReq) *map[string]interface{} {
+	//先判断用户是否存在
+	user := entity.BaseMysql.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+		"user_id": in.UserId, "appid": in.Appid,
+	}, "id", "")
+	return user
+}

+ 154 - 0
service/AuthService_test.go

@@ -0,0 +1,154 @@
+package service
+
+import (
+	quitl "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/mysql"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+	"bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+	"fmt"
+	"math/rand"
+	"reflect"
+	"testing"
+)
+
+func init() {
+	entity.BaseMysql = &mysql.Mysql{
+		Address:      "192.168.3.217:4000",
+		UserName:     "root",
+		PassWord:     "=PDT49#80Z!RVv52_z",
+		DBName:       "base_service",
+		MaxOpenConns: 5,
+		MaxIdleConns: 5,
+	}
+	entity.BaseMysql.Init()
+}
+func TestAuthService_UserAuthInfo(t *testing.T) {
+	type args struct {
+		in *medical.CommonReq
+	}
+	tests := []struct {
+		name string
+		args args
+		want *map[string]interface{}
+	}{
+		// TODO: Add test cases.
+		{
+			name: "用户认证信息-认证",
+			args: args{
+				&medical.CommonReq{
+					UserId: "123",
+					Appid:  "10000",
+				},
+			},
+		},
+		{
+			name: "用户认证信息-未认证",
+			args: args{
+				&medical.CommonReq{
+					UserId: quitl.InterfaceToStr(rand.Int63n(100000000000)),
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			b := AuthService{}
+			if got := b.UserAuthInfo(tt.args.in); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("UserAuthInfo() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestAuthService_UserAuthInfoSave(t *testing.T) {
+	type args struct {
+		in *medical.UserInfo
+	}
+	tests := []struct {
+		name  string
+		args  args
+		want  bool
+		want1 string
+	}{
+		// TODO: Add test cases.
+		{
+			name: "用户认证信息保存",
+			args: args{
+				&medical.UserInfo{
+					UserId:        quitl.InterfaceToStr(rand.Int63n(100000000000)),
+					Mail:          "qqq.com",
+					Phone:         "13111111111",
+					Name:          fmt.Sprintf("用户%d", rand.Int63n(1000)),
+					Position:      "经理",
+					Department:    "公关",
+					EntCode:       "11111",
+					EntName:       "测试企业",
+					OperationType: "add",
+					Appid:         "10000",
+				},
+			}},
+		{
+			name: "用户认证信息保存-用户已认证",
+			args: args{
+				&medical.UserInfo{
+					UserId:        "36685456029",
+					Mail:          "qqq.com",
+					Phone:         "13111111111",
+					Name:          fmt.Sprintf("用户%d", rand.Int63n(1000)),
+					Position:      "经理",
+					Department:    "公关",
+					EntCode:       "11111",
+					EntName:       "测试企业",
+					OperationType: "add",
+					Appid:         "10000",
+				},
+			}},
+		{
+			name: "用户认证信息修改",
+			args: args{
+				&medical.UserInfo{
+					UserId:        "36685456029",
+					Mail:          "qqq.com",
+					Phone:         "13111111111",
+					Name:          fmt.Sprintf("用户%d", rand.Int63n(1000)),
+					Position:      "经理",
+					Department:    "公关",
+					EntCode:       "11111",
+					EntName:       "测试企业",
+					OperationType: "update",
+					Appid:         "10000",
+				},
+			},
+		},
+
+		{
+			name: "用户认证信息修改-未认证",
+			args: args{
+				&medical.UserInfo{
+					UserId:        "11111",
+					Mail:          "qqq.com",
+					Phone:         "13111111111",
+					Name:          fmt.Sprintf("用户%d", rand.Int63n(1000)),
+					Position:      "经理",
+					Department:    "公关",
+					EntCode:       "11111",
+					EntName:       "测试企业",
+					OperationType: "update",
+					Appid:         "10000",
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			b := AuthService{}
+			got, got1 := b.UserAuthInfoSave(tt.args.in)
+			if got != tt.want {
+				t.Errorf("UserAuthInfoSave() got = %v, want %v", got, tt.want)
+			}
+			if got1 != tt.want1 {
+				t.Errorf("UserAuthInfoSave() got1 = %v, want %v", got1, tt.want1)
+			}
+		})
+	}
+}

+ 1 - 4
service/InstitutionService_test.go

@@ -7,7 +7,7 @@ import (
 	"testing"
 )
 
-func initMysql() {
+func init() {
 	entity.Mysql = &mysql.Mysql{
 		Address:      "192.168.3.217:4000",
 		UserName:     "root",
@@ -18,9 +18,6 @@ func initMysql() {
 	}
 	entity.Mysql.Init()
 }
-func init() {
-	initMysql()
-}
 func TestInstitutionService_GetFilterItem(t *testing.T) {
 	tests := []struct {
 		name          string

+ 210 - 0
service/coverage.html

@@ -0,0 +1,210 @@
+
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+		<title>service: Go Coverage Report</title>
+		<style>
+			body {
+				background: black;
+				color: rgb(80, 80, 80);
+			}
+			body, pre, #legend span {
+				font-family: Menlo, monospace;
+				font-weight: bold;
+			}
+			#topbar {
+				background: black;
+				position: fixed;
+				top: 0; left: 0; right: 0;
+				height: 42px;
+				border-bottom: 1px solid rgb(80, 80, 80);
+			}
+			#content {
+				margin-top: 50px;
+			}
+			#nav, #legend {
+				float: left;
+				margin-left: 10px;
+			}
+			#legend {
+				margin-top: 12px;
+			}
+			#nav {
+				margin-top: 10px;
+			}
+			#legend span {
+				margin: 0 5px;
+			}
+			.cov0 { color: rgb(192, 0, 0) }
+.cov1 { color: rgb(128, 128, 128) }
+.cov2 { color: rgb(116, 140, 131) }
+.cov3 { color: rgb(104, 152, 134) }
+.cov4 { color: rgb(92, 164, 137) }
+.cov5 { color: rgb(80, 176, 140) }
+.cov6 { color: rgb(68, 188, 143) }
+.cov7 { color: rgb(56, 200, 146) }
+.cov8 { color: rgb(44, 212, 149) }
+.cov9 { color: rgb(32, 224, 152) }
+.cov10 { color: rgb(20, 236, 155) }
+
+		</style>
+	</head>
+	<body>
+		<div id="topbar">
+			<div id="nav">
+				<select id="files">
+				
+				<option value="file0">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go (81.0%)</option>
+				
+				<option value="file1">bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go (100.0%)</option>
+				
+				</select>
+			</div>
+			<div id="legend">
+				<span>not tracked</span>
+			
+				<span class="cov0">no coverage</span>
+				<span class="cov1">low coverage</span>
+				<span class="cov2">*</span>
+				<span class="cov3">*</span>
+				<span class="cov4">*</span>
+				<span class="cov5">*</span>
+				<span class="cov6">*</span>
+				<span class="cov7">*</span>
+				<span class="cov8">*</span>
+				<span class="cov9">*</span>
+				<span class="cov10">high coverage</span>
+			
+			</div>
+		</div>
+		<div id="content">
+		
+		<pre class="file" id="file0" style="display: none">package service
+
+import (
+        "app.yhyue.com/moapp/jybase/go-xweb/log"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/rpc/medical/medical"
+        "fmt"
+        "time"
+)
+
+type AuthService struct{}
+
+//认证信息保存
+func (b AuthService) UserAuthInfoSave(in *medical.UserInfo) (bool, string) <span class="cov10" title="4">{
+        //先判断用户是否存在
+        user := entity.BaseMysql.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+                "user_id": in.UserId,"appid":in.Appid,
+        }, "id", "")
+        if user != nil </span><span class="cov5" title="2">{
+                if in.OperationType == "add" </span><span class="cov1" title="1">{
+                        return false, "用户已验证"
+                }</span>
+        } else<span class="cov5" title="2"> {
+                if in.OperationType == "update" </span><span class="cov1" title="1">{
+                        return false, "用户未认证,不可修改"
+                }</span>
+        }
+
+        <span class="cov5" title="2">if in.OperationType == "update" </span><span class="cov1" title="1">{
+                //修改处理
+                data := map[string]interface{}{
+                        "name":  in.Name,
+                        "phone": in.Phone,
+                        "position":   in.Position,
+                        "department": in.Department,
+                        "mail":  in.Mail,
+                        "ent_code":   in.EntCode,
+                        "ent_name":   in.EntName,
+                }
+                ok1 := entity.BaseMysql.Update(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{"user_id": in.UserId,"appid":in.Appid}, data)
+                if ok1 </span><span class="cov1" title="1">{
+                        return true, ""
+                }</span> else<span class="cov0" title="0"> {
+                        log.Println(fmt.Sprintf("认证修改失败:入参:%v:%v,", in.UserId, data))
+                        return false, "修改失败"
+                }</span>
+        } else<span class="cov1" title="1"> {
+                //新增处理
+                data := map[string]interface{}{
+                        "name":   in.Name,
+                        "phone":  in.Phone,
+                        "position":    in.Position,
+                        "department":  in.Department,
+                        "mail":   in.Mail,
+                        "ent_code":    in.EntCode,
+                        "ent_name":    in.EntName,
+                        "user_id":     in.UserId,
+                        "create_time": time.Now().Local(),
+                        "appid":in.Appid,
+                }
+                ok := entity.BaseMysql.Insert(entity.DOMAIN_CAPITAL_RETENTION, data)
+                if ok &gt; 0 </span><span class="cov1" title="1">{
+                        return true, ""
+                }</span> else<span class="cov0" title="0"> {
+                        log.Println(fmt.Sprintf("认证失败:参数:%v", data))
+                        return false, "认证失败"
+                }</span>
+        }
+}
+
+//认证信息查询
+func (b AuthService) UserAuthInfo(in *medical.CommonReq) *map[string]interface{} <span class="cov5" title="2">{
+        //先判断用户是否存在
+        user := entity.BaseMysql.FindOne(entity.DOMAIN_CAPITAL_RETENTION, map[string]interface{}{
+                "user_id": in.UserId,"appid":in.Appid,
+        }, "id", "")
+        return user
+}</span>
+</pre>
+		
+		<pre class="file" id="file1" style="display: none">package service
+
+import (
+        "bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/entity"
+)
+
+type InstitutionService struct{}
+
+//医疗机构搜索条件
+func (b InstitutionService) GetFilterItem() (levelList, typeList *[]map[string]interface{}) <span class="cov8" title="1">{
+        //机构类型
+        levelList = entity.Mysql.Find(entity.CODE_MEDICAL_INSTITUTION_LEVEL, nil, "*", "", -1, -1)
+        //医院等级
+        typeList = entity.Mysql.Find(entity.CODE_MEDICAL_INSTITUTION_TYPE, nil, "*", "", -1, -1)
+        return
+}</span>
+</pre>
+		
+		</div>
+	</body>
+	<script>
+	(function() {
+		var files = document.getElementById('files');
+		var visible;
+		files.addEventListener('change', onChange, false);
+		function select(part) {
+			if (visible)
+				visible.style.display = 'none';
+			visible = document.getElementById(part);
+			if (!visible)
+				return;
+			files.value = part;
+			visible.style.display = 'block';
+			location.hash = part;
+		}
+		function onChange() {
+			select(files.value);
+			window.scrollTo(0, 0);
+		}
+		if (location.hash != "") {
+			select(location.hash.substr(1));
+		}
+		if (!visible) {
+			select("file0");
+		}
+	})();
+	</script>
+</html>

+ 15 - 0
service/test_cover.out

@@ -0,0 +1,15 @@
+mode: count
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/InstitutionService.go:10.93,16.2 3 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:14.76,19.17 2 4
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:29.2,29.34 1 2
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:19.17,20.32 1 2
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:20.32,22.4 1 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:23.8,24.35 1 2
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:24.35,26.4 1 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:29.34,41.10 3 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:41.10,43.4 1 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:43.9,46.4 2 0
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:47.8,62.13 3 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:62.13,64.4 1 1
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:64.9,67.4 2 0
+bp.jydev.jianyu360.cn/ApplicationCenter/medicalField/service/AuthService.go:72.82,78.2 2 2

部分文件因为文件数量过多而无法显示