From 593ea49554d7c50bf265b49e666870d4159e7941 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 14 Jul 2023 14:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- api/dao/basicBank.go | 4 +- api/dao/orderPrescription.go | 72 ++++++++++ api/dao/userDoctor.go | 2 + api/middlewares/logrus.go | 9 ++ api/middlewares/requestParamsMiddleware.go | 85 ++++++++++++ api/model/orderPrescription.go | 36 +++++ api/requests/userDoctor.go | 2 +- api/router/router.go | 7 + api/service/userDoctor.go | 145 +++++++++++++++------ config.yaml | 3 +- config/oss.go | 1 - 12 files changed, 321 insertions(+), 48 deletions(-) create mode 100644 api/dao/orderPrescription.go create mode 100644 api/middlewares/requestParamsMiddleware.go create mode 100644 api/model/orderPrescription.go diff --git a/.gitignore b/.gitignore index 4fb7291..0d992f9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,4 @@ *.log # Dependency directories (remove the comment below to include it) -# vendor/ - +# vendor/ \ No newline at end of file diff --git a/api/dao/basicBank.go b/api/dao/basicBank.go index a316395..75172e2 100644 --- a/api/dao/basicBank.go +++ b/api/dao/basicBank.go @@ -65,11 +65,11 @@ func (r *BasicBankDao) AddBasicBank(tx *gorm.DB, model *model.BasicBank) (*model // AddBasicBankByMap 新增专长-map func (r *BasicBankDao) AddBasicBankByMap(tx *gorm.DB, data map[string]interface{}) (*model.BasicBank, error) { - userDoctorInfo := &model.BasicBank{} + basicBank := &model.BasicBank{} if err := tx.Model(&model.BasicBank{}).Create(data).Error; err != nil { return nil, err } - return userDoctorInfo, nil + return basicBank, nil } // GetBasicBankListByStruct 获取专长列表 diff --git a/api/dao/orderPrescription.go b/api/dao/orderPrescription.go new file mode 100644 index 0000000..087f9d6 --- /dev/null +++ b/api/dao/orderPrescription.go @@ -0,0 +1,72 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderPrescriptionDao struct { +} + +// GetById 获取处方-处方id +func (r *OrderPrescriptionDao) GetById(orderPrescriptionId int64) (m *model.OrderPrescription, err error) { + err = global.Db.First(&m, orderPrescriptionId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Delete 删除处方 +func (r *OrderPrescriptionDao) Delete(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.BasicBank{}).Error + if err != nil { + return err + } + return nil +} + +// Edit 修改处方 +func (r *OrderPrescriptionDao) Edit(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.BasicBank{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditById 修改处方-处方id +func (r *OrderPrescriptionDao) EditById(tx *gorm.DB, orderPrescriptionId int64, data interface{}) error { + err := tx.Model(&model.BasicBank{}).Where("order_prescription_id = ?", orderPrescriptionId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetList 获取处方列表 +func (r *OrderPrescriptionDao) GetList(maps interface{}) (m []*model.OrderPrescription, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Add 新增处方 +func (r *OrderPrescriptionDao) Add(tx *gorm.DB, model *model.OrderPrescription) (*model.OrderPrescription, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// AddByMap 新增处方-map +func (r *OrderPrescriptionDao) AddByMap(tx *gorm.DB, data map[string]interface{}) (*model.OrderPrescription, error) { + orderPrescription := &model.OrderPrescription{} + if err := tx.Model(&model.OrderPrescription{}).Create(data).Error; err != nil { + return nil, err + } + return orderPrescription, nil +} diff --git a/api/dao/userDoctor.go b/api/dao/userDoctor.go index 37a8ee2..8af8ac5 100644 --- a/api/dao/userDoctor.go +++ b/api/dao/userDoctor.go @@ -246,6 +246,8 @@ func (r *UserDoctorDao) GetUserDoctorPendingPageSearch(p requests.GetUserDoctorP // 身份认证状态 if p.IdenAuthStatus != nil { query = query.Where("iden_auth_status = ?", p.IdenAuthStatus) + } else { + query = query.Where("iden_auth_status IN ?", []string{"2", "3"}) } // 医院名称 diff --git a/api/middlewares/logrus.go b/api/middlewares/logrus.go index 85c5fc8..2d4de18 100644 --- a/api/middlewares/logrus.go +++ b/api/middlewares/logrus.go @@ -18,6 +18,14 @@ func Logrus() gin.HandlerFunc { // 处理请求 c.Next() + // 获取 请求 参数 + params, ok := c.Get("params") + if !ok { + params = "" + } else { + params = params.(map[string]interface{}) + } + // 结束时间 endTime := time.Now() @@ -43,6 +51,7 @@ func Logrus() gin.HandlerFunc { "ip": clientIP, "method": reqMethod, "uri": reqUri, + "params": params, }).Info("access") } } diff --git a/api/middlewares/requestParamsMiddleware.go b/api/middlewares/requestParamsMiddleware.go new file mode 100644 index 0000000..a1b21f6 --- /dev/null +++ b/api/middlewares/requestParamsMiddleware.go @@ -0,0 +1,85 @@ +package middlewares + +import ( + "encoding/json" + "github.com/gin-gonic/gin" + "hospital-admin-api/consts" + "net/http" +) + +// RequestParamsMiddleware 获取请求参数中间件 +func RequestParamsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + contentType := c.GetHeader("Content-Type") + + // 判断请求参数类型 + switch contentType { + case "application/json": + // 解析 JSON 参数 + var params map[string]interface{} + // 读取请求体数据 + data, err := c.GetRawData() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read request body"}) + return + } + + // 解析 JSON 数据到 map[string]interface{} + err = json.Unmarshal(data, ¶ms) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "message": "Invalid JSON data", + "code": consts.HTTP_ERROR, + "data": "", + }) + c.Abort() + return + } + + // 存储参数到上下文 + c.Set("params", params) + + case "application/form-data", "application/x-www-form-urlencoded": + // 解析 Form 表单参数 + err := c.Request.ParseForm() + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "message": "Invalid form data", + "code": consts.HTTP_ERROR, + "data": "", + }) + c.Abort() + return + } + + // 将参数转换为 map[string]interface{} + params := make(map[string]interface{}) + for key, values := range c.Request.Form { + if len(values) > 0 { + params[key] = values[0] + } + } + + // 存储参数到上下文 + c.Set("params", params) + + default: + // 解析 URL 参数 + queryParams := c.Request.URL.Query() + + // 将参数转换为 map[string]interface{} + params := make(map[string]interface{}) + for key, values := range queryParams { + if len(values) > 0 { + params[key] = values[0] + } + } + + // 存储参数到上下文 + c.Set("params", params) + } + + // 继续处理请求 + c.Next() + } +} diff --git a/api/model/orderPrescription.go b/api/model/orderPrescription.go new file mode 100644 index 0000000..0b36380 --- /dev/null +++ b/api/model/orderPrescription.go @@ -0,0 +1,36 @@ +package model + +import "time" + +// OrderPrescription 订单-处方表 +type OrderPrescription struct { + OrderPrescriptionId int64 `gorm:"column:order_prescription_id;type:bigint(19);primary_key;comment:主键id" json:"order_prescription_id"` + OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:订单-问诊id;NOT NULL" json:"order_inquiry_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id;NOT NULL" json:"doctor_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` + FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id(就诊用户)" json:"family_id"` + PharmacistId int64 `gorm:"column:pharmacist_id;type:bigint(19);comment:药师id" json:"pharmacist_id"` + PrescriptionStatus int `gorm:"column:prescription_status;type:tinyint(1);comment:处方状态(1:待审核 2:待使用 3:已失效 4:已使用)" json:"prescription_status"` + PharmacistAuditStatus int `gorm:"column:pharmacist_audit_status;type:tinyint(1);default:0;comment:药师审核状态(0:审核中 1:审核成功 2:审核驳回)" json:"pharmacist_audit_status"` + PharmacistVerifyTime time.Time `gorm:"column:pharmacist_verify_time;type:datetime;comment:药师审核时间" json:"pharmacist_verify_time"` + PharmacistFailReason string `gorm:"column:pharmacist_fail_reason;type:varchar(255);comment:药师审核驳回原因" json:"pharmacist_fail_reason"` + PlatformAuditStatus int `gorm:"column:platform_audit_status;type:tinyint(1);default:0;comment:处方平台审核状态(0:审核中 1:审核成功 2:审核驳回)" json:"platform_audit_status"` + PlatformFailTime time.Time `gorm:"column:platform_fail_time;type:datetime;comment:平台审核失败时间" json:"platform_fail_time"` + PlatformFailReason string `gorm:"column:platform_fail_reason;type:varchar(255);comment:处方平台驳回原因" json:"platform_fail_reason"` + IsAutoPharVerify int `gorm:"column:is_auto_phar_verify;type:tinyint(1);default:0;comment:是否药师自动审核(0:否 1:是)" json:"is_auto_phar_verify"` + DoctorCreatedTime time.Time `gorm:"column:doctor_created_time;type:datetime;comment:医生开具处方时间" json:"doctor_created_time"` + ExpiredTime time.Time `gorm:"column:expired_time;type:datetime;comment:处方过期时间" json:"expired_time"` + VoidTime time.Time `gorm:"column:void_time;type:datetime;comment:处方作废时间" json:"void_time"` + IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:是否删除(0:否 1:是)" json:"is_delete"` + PrescriptionCode string `gorm:"column:prescription_code;type:varchar(255);comment:处方编号" json:"prescription_code"` + DoctorName string `gorm:"column:doctor_name;type:varchar(100);comment:医生名称" json:"doctor_name"` + PatientName string `gorm:"column:patient_name;type:varchar(100);comment:患者姓名-就诊人" json:"patient_name"` + PatientSex int `gorm:"column:patient_sex;type:tinyint(1);comment:患者性别-就诊人(1:男 2:女)" json:"patient_sex"` + PatientAge int `gorm:"column:patient_age;type:int(11);comment:患者年龄-就诊人" json:"patient_age"` + DoctorAdvice string `gorm:"column:doctor_advice;type:varchar(255);comment:医嘱" json:"doctor_advice"` + Model +} + +func (m *OrderPrescription) TableName() string { + return "gdxz_order_prescription" +} diff --git a/api/requests/userDoctor.go b/api/requests/userDoctor.go index 7b18875..22aa639 100644 --- a/api/requests/userDoctor.go +++ b/api/requests/userDoctor.go @@ -29,7 +29,7 @@ type GetUserDoctorPage struct { // PutUserDoctor 修改医生 type PutUserDoctor struct { - IsRecommend int `json:"is_recommend" form:"is_recommend" label:"是否首页推荐"` // (0:否 1:是) + IsRecommend int `json:"is_recommend" form:"is_recommend"` // (0:否 1:是) Avatar string `json:"avatar" form:"avatar" validate:"required" label:"头像"` DoctorTitle int `json:"doctor_title" form:"doctor_title" validate:"required,oneof=1 2 3 4 5 6" label:"医生职称"` // (1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师) DepartmentCustomId string `json:"department_custom_id" form:"department_custom_id" validate:"required" label:"科室"` diff --git a/api/router/router.go b/api/router/router.go index de8faa5..f63e355 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -20,7 +20,13 @@ func Init() *gin.Engine { gin.SetMode(gin.ReleaseMode) } + // 获取请求参数中间件-json格式下会导致接口获取不到请求数据 + // r.Use(middlewares.RequestParamsMiddleware()) + + // 日志中间件 r.Use(middlewares.Logrus()) + + // 异常 r.Use(gin.Recovery()) // 404处理 @@ -334,6 +340,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 审核-审核医生 doctorPendingGroup.PUT("/:doctor_id", api.UserDoctor.PutUserDoctorPending) } + // // // 医生详情 // doctorGroup.GET("/:post_id", api.Post.GetPost) diff --git a/api/service/userDoctor.go b/api/service/userDoctor.go index ef0ba8e..0f0f910 100644 --- a/api/service/userDoctor.go +++ b/api/service/userDoctor.go @@ -132,6 +132,10 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r return false, errors.New("医生数据错误") } + if userDoctor.IdenAuthStatus == 2 { + return false, errors.New("医生身份审核中,不允许修改") + } + userDoctorData := make(map[string]interface{}) // 医生数据 userDoctorInfoData := make(map[string]interface{}) // 医生详情数据 userData := make(map[string]interface{}) // 用户数据 @@ -279,6 +283,9 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r if putUserDoctorRequest.IdCardFront != "" { idCardFront := strings.Replace(putUserDoctorRequest.IdCardFront, "https://img.applets.igandanyiyuan.com", "", 1) if idCardFront != userDoctorInfo.IdCardFront { + if userDoctor.MultiPointStatus == 2 { + return false, errors.New("多点执业审核中,请操作后进行修改") + } userDoctorInfoData["id_card_front"] = idCardFront } } @@ -290,6 +297,10 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r if putUserDoctorRequest.IdCardBack != "" { idCardBack := strings.Replace(putUserDoctorRequest.IdCardBack, "https://img.applets.igandanyiyuan.com", "", 1) if idCardBack != userDoctorInfo.IdCardBack { + if userDoctor.MultiPointStatus == 2 { + return false, errors.New("多点执业审核中,请操作后进行修改") + } + userDoctorInfoData["id_card_back"] = idCardBack } } @@ -301,6 +312,10 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r if putUserDoctorRequest.SignImage != "" { signImage := strings.Replace(putUserDoctorRequest.SignImage, "https://img.applets.igandanyiyuan.com", "", 1) if signImage != userDoctorInfo.SignImage { + if userDoctor.MultiPointStatus == 2 { + return false, errors.New("多点执业审核中,请操作后进行修改") + } + userDoctorInfoData["sign_image"] = signImage } } @@ -322,6 +337,56 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r } } + // 处理多点问题 + fieldsToCheck := []string{"id_card_front", "id_card_back", "sign_image"} + + exists := false + for _, field := range fieldsToCheck { + if _, ok := userDoctorInfoData[field]; ok { + exists = true + break + } + } + + if exists { + idCardFront := userDoctorInfo.IdCardFront + idCardBack := userDoctorInfo.IdCardBack + signImage := userDoctorInfo.SignImage + + if _, ok := userDoctorInfoData["id_card_front"]; ok { + idCardFront = userDoctorInfoData["id_card_front"].(string) + } + + if _, ok := userDoctorInfoData["id_card_back"]; ok { + idCardBack = userDoctorInfoData["id_card_back"].(string) + } + + if _, ok := userDoctorInfoData["sign_image"]; ok { + signImage = userDoctorInfoData["sign_image"].(string) + } + + if idCardFront != "" && idCardBack != "" && signImage != "" { + // 检测是否存在正在审核中的处方 + orderPrescriptionDao := dao.OrderPrescriptionDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + maps["prescription_status"] = 1 + orderPrescription, err := orderPrescriptionDao.GetList(maps) + if err != nil { + return false, errors.New("修改失败") + } + + if len(orderPrescription) > 0 { + return false, errors.New("存在审核中的处方,请勿修改签名数据") + } + + // 修改签名数据,重新认定为未审核 + userDoctorData["multi_point_status"] = 2 + userDoctorData["multi_point_fail_reason"] = "" + } + } + // 开始事务 tx := global.Db.Begin() defer func() { @@ -478,46 +543,46 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, putUserDoctorRequest r // 判断签名图片是否修改,同步修改ca平台 // 1、新用户,未存在证书 - if putUserDoctorRequest.SignImage != "" { - signImage := strings.Replace(putUserDoctorRequest.SignImage, "https://img.applets.igandanyiyuan.com", "", 1) - if signImage != userDoctorInfo.SignImage { - // 检测是否存在云证书 - userCaCertDao := dao.UserCaCert{} - userCaCerts, err := userCaCertDao.GetUserCaCertListByUserId(userDoctor.UserId) - if err != nil { - tx.Rollback() - return false, errors.New("修改失败") - } - - if userCaCerts != nil && len(userCaCerts) > 0 { - userCaCert := userCaCerts[0] - // 检测是否已经添加签章配置 - if userCaCert.IsSignConfig == 1 { - // 修改签章配置为未添加 - data := make(map[string]interface{}) - data["is_sign_config"] = 0 - err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) - if err != nil { - tx.Rollback() - return false, errors.New(err.Error()) - } - - // 删除签章配置 - deleteUserSignConfigRequestData := &ca.DeleteUserSignConfigRequestData{ - UserId: strconv.FormatInt(userDoctor.UserId, 10), - ConfigKey: strconv.FormatInt(userDoctor.UserId, 10), - } - - _, err := ca.DeleteUserSignConfig(deleteUserSignConfigRequestData) - if err != nil { - tx.Rollback() - return false, errors.New(err.Error()) - } - } - } - - } - } + // if putUserDoctorRequest.SignImage != "" { + // signImage := strings.Replace(putUserDoctorRequest.SignImage, "https://img.applets.igandanyiyuan.com", "", 1) + // if signImage != userDoctorInfo.SignImage { + // // 检测是否存在云证书 + // userCaCertDao := dao.UserCaCert{} + // userCaCerts, err := userCaCertDao.GetUserCaCertListByUserId(userDoctor.UserId) + // if err != nil { + // tx.Rollback() + // return false, errors.New("修改失败") + // } + // + // if userCaCerts != nil && len(userCaCerts) > 0 { + // userCaCert := userCaCerts[0] + // // 检测是否已经添加签章配置 + // if userCaCert.IsSignConfig == 1 { + // // 修改签章配置为未添加 + // data := make(map[string]interface{}) + // data["is_sign_config"] = 0 + // err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) + // if err != nil { + // tx.Rollback() + // return false, errors.New(err.Error()) + // } + // + // // 删除签章配置 + // deleteUserSignConfigRequestData := &ca.DeleteUserSignConfigRequestData{ + // UserId: strconv.FormatInt(userDoctor.UserId, 10), + // ConfigKey: strconv.FormatInt(userDoctor.UserId, 10), + // } + // + // _, err := ca.DeleteUserSignConfig(deleteUserSignConfigRequestData) + // if err != nil { + // tx.Rollback() + // return false, errors.New(err.Error()) + // } + // } + // } + // + // } + // } tx.Commit() return true, nil diff --git a/config.yaml b/config.yaml index ffe4bc7..7c6b3aa 100644 --- a/config.yaml +++ b/config.yaml @@ -18,7 +18,7 @@ mysql: log: file-path: "./log/" # file-path: "/var/log/dev-hospital-admin-api/" - file-name: "hospital-admin-api.log" + file-name: "dev-hospital-admin-api.log" # [redis] redis: @@ -39,7 +39,6 @@ oss: oss-bucket: gdxz-hospital oss-endpoint: oss-cn-chengdu.aliyuncs.com oss-custom-domain-name: https://img.applets.igandanyiyuan.com - oss-env: applet-dev ca-online: ca-online-app-id: SCCA1646691325903052802 diff --git a/config/oss.go b/config/oss.go index 4c38444..7c508b4 100644 --- a/config/oss.go +++ b/config/oss.go @@ -6,5 +6,4 @@ type Oss struct { OssBucket string `mapstructure:"oss-bucket" json:"oss-bucket" yaml:"oss-bucket"` OssEndpoint string `mapstructure:"oss-endpoint" json:"oss-endpoint" yaml:"oss-endpoint"` OssCustomDomainName string `mapstructure:"oss-custom-domain-name" json:"oss-custom-domain-name" yaml:"oss-custom-domain-name"` - OssEnv string `mapstructure:"oss-env" json:"oss-env" yaml:"oss-env"` }