From a14d321ffaf82e7c6bcdafac3b562c41a30b2551 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Tue, 14 Nov 2023 11:27:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BB=E7=94=9F=E5=88=97=E8=A1=A8-=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/export.go | 36 ++++ api/dao/userDoctor.go | 196 ++++++++++++++---- api/dto/UserDoctor.go | 2 +- api/requests/userDoctor.go | 23 +++ api/router/router.go | 2 +- api/service/export.go | 405 +++++++++++++++++++++++++++++++++---- output.xlsx | Bin 0 -> 26753 bytes utils/export.go | 10 +- utils/intToString.go | 235 +++++++++++++++++++++ 9 files changed, 830 insertions(+), 79 deletions(-) create mode 100755 output.xlsx create mode 100644 utils/intToString.go diff --git a/api/controller/export.go b/api/controller/export.go index 596d292..0cb0d7b 100644 --- a/api/controller/export.go +++ b/api/controller/export.go @@ -80,3 +80,39 @@ func (r *Export) DoctorWithdrawalOrder(c *gin.Context) { responses.OkWithData(ossAddress, c) } + +// UserDoctor 医生列表 +func (r *Export) UserDoctor(c *gin.Context) { + userDoctorRequest := requests.UserDoctorRequest{} + req := userDoctorRequest.UserDoctorExportList + + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 获取数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctors, err := userDoctorDao.GetUserDoctorExportListSearch(req) + + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 业务处理 + exportService := service.ExportService{} + ossAddress, err := exportService.UserDoctor(userDoctors) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(ossAddress, c) +} diff --git a/api/dao/userDoctor.go b/api/dao/userDoctor.go index 74ff45a..70940ce 100644 --- a/api/dao/userDoctor.go +++ b/api/dao/userDoctor.go @@ -1,12 +1,14 @@ package dao import ( + "errors" "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" "hospital-admin-api/api/requests" "hospital-admin-api/global" "strings" + "time" ) type UserDoctorDao struct { @@ -174,44 +176,20 @@ func (r *UserDoctorDao) GetUserDoctorPageSearch(req requests.GetUserDoctorPage, query = query.Where("doctor_title = ?", req.DoctorTitle) } - // // 问诊类型 - // if req.InquiryService != "" { - // result := strings.Split(req.InquiryService, ",") - // if len(result) > 0 { - // subQuery := global.Db - // for _, v := range result { - // if v == "1" { - // subQuery = subQuery.Where("is_img_expert_reception = ?", 1) - // } - // - // if v == "2" { - // if subQuery != nil { - // subQuery = subQuery.Or("is_img_quick_reception = ?", 1) - // } else { - // subQuery = subQuery.Where("is_img_quick_reception = ?", 1) - // } - // } - // - // if v == "3" { - // if subQuery != nil { - // subQuery = subQuery.Or("is_img_welfare_reception = ?", 1) - // } else { - // subQuery = subQuery.Where("is_img_welfare_reception = ?", 1) - // } - // } - // - // if v == "4" { - // if subQuery != nil { - // subQuery = subQuery.Or("multi_point_status = ?", 1) - // } else { - // subQuery = subQuery.Where("multi_point_status = ?", 1) - // } - // } - // - // } - // query = query.Where(subQuery) - // } - // } + // 注册时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + if startTime == endTime { + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + } + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } // 排序 query = query.Order("created_at desc") @@ -435,3 +413,145 @@ func (r *UserDoctorDao) GetUserDoctorListSearch(req requests.GetUserDoctorList) } return m, nil } + +// GetUserDoctorExportListSearch 医生列表-导出 +func (r *UserDoctorDao) GetUserDoctorExportListSearch(req requests.UserDoctorExportList) (m []*model.UserDoctor, err error) { + // 构建查询条件 + query := global.Db.Model(&model.UserDoctor{}).Omit("open_id", "union_id", "wx_session_key") + + // 用户 + query = query.Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Omit("user_password", "salt") + }) + + // 医生详情 + query = query.Preload("UserDoctorInfo") + + // 医院 + query = query.Preload("Hospital", func(db *gorm.DB) *gorm.DB { + return db.Select("hospital_id,hospital_name,hospital_level_name") + }) + + // 医生问诊配置 + query = query.Preload("DoctorInquiryConfig") + + // 当前搜索数据 + if req.Type == 1 { + // 医生问诊配置 + if req.InquiryService != "" { + result := strings.Split(req.InquiryService, ",") + if len(result) > 0 { + subQuery := global.Db.Model(&model.DoctorInquiryConfig{}). + Where("gdxz_doctor_inquiry_config.doctor_id = gdxz_user_doctor.doctor_id"). + Where("gdxz_doctor_inquiry_config.inquiry_type IN (?)", req.InquiryService). + Where("gdxz_doctor_inquiry_config.inquiry_mode = ?", 1). + Where("gdxz_doctor_inquiry_config.is_enable = ?", 1).Select("1") + + query = query.Where("EXISTS (?)", subQuery) + } + } + + // 手机号 + if req.Mobile != "" { + subQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile LIKE ?", "%"+req.Mobile+"%") + + query = query.Where(gorm.Expr("user_id IN (?)", subQuery)) + } + + // 用户名称 + if req.UserName != "" { + query = query.Where("user_name LIKE ?", "%"+req.UserName+"%") + } + + // 状态 + if req.UserStatus != nil { + query = query.Where("status = ?", req.UserStatus) + } + + // 医院名称 + if req.HospitalName != "" { + subQuery := global.Db.Model(&model.Hospital{}). + Select("hospital_id"). + Where("hospital_name LIKE ?", "%"+req.HospitalName+"%") + + query = query.Where(gorm.Expr("hospital_id IN (?)", subQuery)) + } + + // 科室名称 + if req.DepartmentCustomName != "" { + query = query.Where("department_custom_name = ?", req.DepartmentCustomName) + } + + // 实名认证状态 + if req.IDCardStatus != nil { + query = query.Where("idcard_status = ?", req.IDCardStatus) + } + + // 身份认证状态 + if req.IdenAuthStatus != nil { + query = query.Where("iden_auth_status = ?", req.IdenAuthStatus) + } + + // 医生多点执业认证状态 + if req.MultiPointStatus != nil { + query = query.Where("multi_point_status = ?", req.MultiPointStatus) + } + + // 是否首页推荐 + if req.IsRecommend != nil { + query = query.Where("is_recommend = ?", req.IsRecommend) + } + + if req.DoctorTitle != nil { + query = query.Where("doctor_title = ?", req.DoctorTitle) + } + + // 注册时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + if startTime == endTime { + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + } + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + } + + // 当前选择数据 + if req.Type == 2 { + if req.Id == "" { + return nil, errors.New("未提供需导出数据编号") + } + + id := strings.Split(req.Id, ",") + query = query.Where("doctor_id IN (?)", id) + } + + // 排序 + query = query.Order("created_at desc") + + if req.IsEnterpriseDeepCooperation != nil { + query = query.Where("is_enterprise_deep_cooperation = ?", req.IsEnterpriseDeepCooperation) + } + + if req.IsPlatformDeepCooperation != nil { + query = query.Where("is_platform_deep_cooperation = ?", req.IsPlatformDeepCooperation) + } + + if req.IsSysDiagnoCooperation != nil { + query = query.Where("is_sys_diagno_cooperation = ?", req.IsSysDiagnoCooperation) + } + + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/UserDoctor.go b/api/dto/UserDoctor.go index 27f7b9d..5459808 100644 --- a/api/dto/UserDoctor.go +++ b/api/dto/UserDoctor.go @@ -171,7 +171,7 @@ func GetUserDoctorListDto(m []*model.UserDoctor) []*UserDoctorDto { } // 加载医生服务类型 - if v.User != nil { + if v.DoctorInquiryConfig != nil { response = response.LoadDoctorInquiryType(v.DoctorInquiryConfig) } else { response.InquiryType = "暂无" diff --git a/api/requests/userDoctor.go b/api/requests/userDoctor.go index 8aee96d..64f9fb2 100644 --- a/api/requests/userDoctor.go +++ b/api/requests/userDoctor.go @@ -10,6 +10,7 @@ type UserDoctorRequest struct { PutMulti // 多点-审核医生 GetUserDoctorList // 获取医生列表 GetUserDoctorBankCardPage // 获取医生银行卡列表-分页 + UserDoctorExportList // 医生列表-导出 } // GetUserDoctorPage 获取医生列表-分页 @@ -30,6 +31,7 @@ type GetUserDoctorPage struct { IsEnterpriseDeepCooperation *int `json:"is_enterprise_deep_cooperation" form:"is_enterprise_deep_cooperation" label:"是否企业深度合作"` // (0:否 1:是) IsPlatformDeepCooperation *int `json:"is_platform_deep_cooperation" form:"is_platform_deep_cooperation" label:"平台深度合作医生"` // 是否平台深度合作医生(0:否 1:是) IsSysDiagnoCooperation *int `json:"is_sys_diagno_cooperation" form:"is_sys_diagno_cooperation" label:"是否先思达合作医生"` // (0:否 1:是) + CreatedAt string `json:"created_at" form:"created_at" label:"注册时间"` } // PutUserDoctor 修改医生 @@ -149,3 +151,24 @@ type GetUserDoctorBankCardPage struct { BankCardCode string `json:"bank_card_code" form:"bank_card_code" label:"银行卡号"` BankName string `json:"bank_name" form:"bank_name" label:"银行名称"` } + +// UserDoctorExportList 医生列表-导出 +type UserDoctorExportList struct { + Type int `json:"type" form:"type" label:"类型" validate:"required,oneof=1 2 3"` // 1:当前搜索数据 2:当前选择数据 3:全部数据 + Id string `json:"id" form:"id" label:"id"` + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + UserName string `json:"user_name" form:"user_name" label:"用户名"` + UserStatus *int `json:"user_status" form:"user_status" label:"用户状态"` // (0:禁用 1:正常 2:删除) + HospitalName string `json:"hospital_name" form:"hospital_name" label:"医院名称"` + DepartmentCustomName string `json:"department_custom_name" form:"department_custom_name" label:"科室名称"` + IDCardStatus *int `json:"idcard_status" form:"idcard_status" label:"身份证状态"` // (0:未认证 1:认证通过 2:认证失败) + IdenAuthStatus *int `json:"iden_auth_status" form:"iden_auth_status" label:"认证状态"` // (0:未认证 1:认证通过 2:审核中 3:认证失败) + MultiPointStatus *int `json:"multi_point_status" form:"multi_point_status" label:"多点执业状态"` // 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + IsRecommend *int `json:"is_recommend" form:"is_recommend" label:"是否推荐"` // (0:否 1:是) + DoctorTitle *int `json:"doctor_title" form:"doctor_title" label:"医生职称"` // (1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师) + InquiryService string `json:"inquiry_service" form:"inquiry_service" label:"问诊服务"` // (1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + IsEnterpriseDeepCooperation *int `json:"is_enterprise_deep_cooperation" form:"is_enterprise_deep_cooperation" label:"是否企业深度合作"` // (0:否 1:是) + IsPlatformDeepCooperation *int `json:"is_platform_deep_cooperation" form:"is_platform_deep_cooperation" label:"平台深度合作医生"` // 是否平台深度合作医生(0:否 1:是) + IsSysDiagnoCooperation *int `json:"is_sys_diagno_cooperation" form:"is_sys_diagno_cooperation" label:"是否先思达合作医生"` // (0:否 1:是) + CreatedAt string `json:"created_at" form:"created_at" label:"注册时间"` +} diff --git a/api/router/router.go b/api/router/router.go index 3f5abed..1637870 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -609,7 +609,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { doctorGroup := exportGroup.Group("/doctor") { // 医生列表 - doctorGroup.POST("", api.UserCaCert.RenewUserCloudCert) + doctorGroup.POST("", api.Export.UserDoctor) // 医生银行卡 doctorGroup.POST("/bank/card", api.UserCaCert.RenewUserCloudCert) diff --git a/api/service/export.go b/api/service/export.go index 8b4aa5b..dc0a88e 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -8,6 +8,8 @@ import ( "hospital-admin-api/extend/aliyun" "hospital-admin-api/utils" "math/rand" + "strconv" + "strings" "time" ) @@ -37,6 +39,7 @@ type DoctorWithdrawalData struct { CreatedAt time.Time // 创建时间 } +// DoctorWithdrawalOrderData 提现记录-关联订单 type DoctorWithdrawalOrderData struct { DoctorName string // 医生姓名 PatientName string // 患者姓名-就诊人 @@ -55,6 +58,59 @@ type DoctorWithdrawalOrderData struct { } +// UserDoctorData 医生列表 +type UserDoctorData struct { + UserName string // 用户名称 + Status string // 状态(0:禁用 1:正常 2:删除) + IdcardStatus string // 实名认证状态(0:未认证 1:认证通过 2:认证失败) + IdenAuthStatus string // 身份认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + IdenAuthTime time.Time // 审核时间 + IdenAuthFailReason string // 身份认证失败原因 + MultiPointStatus string // 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + MultiPointTime time.Time // 审核时间 + MultiPointFailReason string // 多点执业认证失败原因 + IsRecommend string // 是否首页推荐(0:否 1:是) + Avatar string // 头像 + DoctorTitle string // 医生职称(1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师) + DepartmentCustomName string // 科室名称(如未自己输入,填入标准科室名称) + DepartmentCustomMobile string // 科室电话 + HospitalName string // 医院名称 + ServedPatientsNum string // 服务患者数量(订单结束时统计) + PraiseRate float64 // 好评率(百分制。订单平均评价中超过4-5分的订单总数 / 总订单数 * 5) + AvgResponseTime float64 // 平均响应时间(分钟制) + NumberOfFans string // 被关注数量 + IsOnline string // 是否在线(0:不在线 1:在线) + IsPlatformDeepCooperation string // 是否平台深度合作医生(0:否 1:是) + IsEnterpriseDeepCooperation string // 是否企业深度合作医生(0:否 1:是) + IsSysDiagnoCooperation string // 是否先思达合作医生(0:否 1:是) + QrCode string // 分享二维码 + BeGoodAt string // 擅长 + BriefIntroduction string // 医生简介 + CreatedAt time.Time // 创建时间 + Mobile string // 手机号 + Age string // 年龄 + Sex string // 性别(0:未知 1:男 2:女) + RegisterMethod string // 注册方式(1:微信小程序 2:后台添加 ) + CreatedBy string // 创建者 + InquiryType string // 服务类型 + CardType string // 类型(1:身份证 2:护照 3:港澳通行证 4:台胞证);NOT NULL + CardName string // 证件姓名 + CardNum string // 证件号码 + LicenseCert string // 医师执业证(逗号分隔) + QualificationCert string // 医师资格证(逗号分隔) + QualificationCertNum string // 医师资格证号(逗号分隔) + WorkCert string // 医师工作证(逗号分隔) + MultiPointImages string // 多点执业备案信息(逗号分隔) + IdCardFront string // 身份证正面图片 + IdCardBack string // 身份证背面图片 + SignImage string // 签名图片 + CertApplicationTime time.Time // ca证书申请时间 + CertExpireTime time.Time // ca证书过期时间 + BankName string // 开户银行名称 + BankCardCode string // 开户银行卡号 + BankCardAddress string // 开户银行地址 +} + // DoctorWithdrawal 提现记录 func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdrawal) (string, error) { header := []utils.HeaderCellData{ @@ -81,14 +137,7 @@ func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdr var interfaceSlice []interface{} for _, v := range doctorWithdrawals { // 审核状态 - examineStatus := "未知" - if v.ExamineStatus == 1 { - examineStatus = "审核中" - } else if v.ExamineStatus == 2 { - examineStatus = "审核通过" - } else if v.ExamineStatus == 3 { - examineStatus = "审核未通过" - } + examineStatus := utils.WithdrawalExamineStatusToString(v.ExamineStatus) // 审核人员 examineBy := "" @@ -250,11 +299,8 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do if v.OrderInquiry != nil { patientName = v.OrderInquiry.PatientName - if v.OrderInquiry.PatientSex == 1 { - patientSex = "男" - } else if v.OrderInquiry.PatientSex == 2 { - patientSex = "女" - } + // 患者性别 + patientSex = utils.SexToString(v.OrderInquiry.PatientSex) // 患者年龄 patientAge = fmt.Sprintf("%d", v.OrderInquiry.PatientAge) @@ -265,32 +311,13 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do } // 支付渠道 - if v.OrderInquiry.InquiryPayChannel == 1 { - payChannel = "小程序支付" - } else if v.OrderInquiry.InquiryPayChannel == 2 { - payChannel = "微信扫码支付" - } else if v.OrderInquiry.InquiryPayChannel == 3 { - payChannel = "模拟支付" - } + payChannel = utils.PayChannelToString(v.OrderInquiry.InquiryPayChannel) inquiryNo = v.OrderInquiry.InquiryNo escrowTradeNo = v.OrderInquiry.EscrowTradeNo - if v.OrderInquiry.InquiryStatus == 1 { - inquiryStatus = "待支付" - } else if v.OrderInquiry.InquiryStatus == 2 { - inquiryStatus = "待分配" - } else if v.OrderInquiry.InquiryStatus == 3 { - inquiryStatus = "待接诊" - } else if v.OrderInquiry.InquiryStatus == 4 { - inquiryStatus = "已接诊" - } else if v.OrderInquiry.InquiryStatus == 5 { - inquiryStatus = "已完成" - } else if v.OrderInquiry.InquiryStatus == 6 { - inquiryStatus = "已结束" - } else if v.OrderInquiry.InquiryStatus == 7 { - inquiryStatus = "已取消" - } + // 问诊订单状态 + inquiryStatus = utils.InquiryStatusToString(v.OrderInquiry.InquiryStatus) amountTotal = v.OrderInquiry.AmountTotal couponAmountTotal = v.OrderInquiry.CouponAmountTotal @@ -347,3 +374,311 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do ossPath = utils.AddOssDomain("/" + ossPath) return ossPath, nil } + +// UserDoctor 医生列表 +func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, error) { + header := []utils.HeaderCellData{ + {Value: "医生姓名", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "医生状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "实名认证状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "身份认证状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "身份认证审核时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "身份认证失败原因", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "多点执业认证状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "多点执业审核时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "多点执业认证失败原因", CellType: "string", NumberFmt: "", ColWidth: 25}, + {Value: "首页推荐", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "头像", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "医生职称", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "科室名称", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "科室电话", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "医院名称", CellType: "string", NumberFmt: "", ColWidth: 35}, + {Value: "服务患者数量", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "好评率(百分制)", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "平均响应时间(分钟制)", CellType: "string", NumberFmt: "", ColWidth: 25}, + {Value: "被关注数量", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "在线", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "平台深度合作医生", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "企业深度合作医生", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "先思达合作医生", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "分享二维码", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "擅长", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "医生简介", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "创建时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "手机号", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "年龄", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "性别", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "注册方式", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "创建者", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "服务类型", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "证件类型", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "证件姓名", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "证件号码", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "医师执业证", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "医师资格证", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "医师资格证号", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "医师工作证", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "多点执业备案信息", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "身份证正面图片", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "身份证背面图片", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "签名图片", CellType: "string", NumberFmt: "", ColWidth: 50}, + {Value: "ca证书申请时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "ca证书过期时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "银行名称", CellType: "string", NumberFmt: "", ColWidth: 25}, + {Value: "银行卡号", CellType: "string", NumberFmt: "", ColWidth: 27}, + {Value: "银行地址", CellType: "string", NumberFmt: "", ColWidth: 46}, + } + + var interfaceSlice []interface{} + for _, v := range userDoctors { + userDoctorData := UserDoctorData{ + UserName: v.UserName, + Status: utils.UserDoctorStatusToString(v.Status), + IdcardStatus: utils.IdcardStatusToString(v.IdcardStatus), + IdenAuthStatus: utils.IdenAuthStatusToString(v.IdenAuthStatus), + IdenAuthFailReason: v.IdenAuthFailReason, + MultiPointStatus: utils.MultiPointStatusToString(v.MultiPointStatus), + MultiPointFailReason: v.MultiPointFailReason, + IsRecommend: utils.IsRecommendToString(v.IsRecommend), + Avatar: utils.AddOssDomain(v.Avatar), + DoctorTitle: utils.DoctorTitleToString(v.DoctorTitle), + DepartmentCustomName: v.DepartmentCustomName, + DepartmentCustomMobile: v.DepartmentCustomMobile, + ServedPatientsNum: fmt.Sprintf("%d", v.ServedPatientsNum), + PraiseRate: v.PraiseRate, + AvgResponseTime: v.AvgResponseTime, + NumberOfFans: fmt.Sprintf("%d", v.NumberOfFans), + IsOnline: utils.IsOnlineToString(v.IsOnline), + IsPlatformDeepCooperation: utils.IsPlatformDeepCooperationToString(v.IsPlatformDeepCooperation), + IsEnterpriseDeepCooperation: utils.IsEnterpriseDeepCooperationToString(v.IsEnterpriseDeepCooperation), + IsSysDiagnoCooperation: utils.IsSysDiagnoCooperationToString(v.IsSysDiagnoCooperation), + QrCode: utils.AddOssDomain(v.QrCode), + BeGoodAt: v.BeGoodAt, + BriefIntroduction: v.BriefIntroduction, + } + + if v.User != nil { + // 性别 + userDoctorData.Sex = utils.SexToString(v.User.Sex) + + // 注册方式 + userDoctorData.RegisterMethod = utils.RegisterMethodToString(v.User.RegisterMethod) + + // 手机号 + userDoctorData.Mobile = v.User.Mobile + + // 年龄 + userDoctorData.Age = fmt.Sprintf("%d", v.User.Age) + + // 性别 + userDoctorData.Sex = utils.SexToString(v.User.Sex) + + // 创建者 + if v.User.CreatedBy != "" { + if v.User.RegisterMethod == 1 { + // 注册方式-微信小程序 + userDoctorData.CreatedBy = v.User.UserName + } else { + // 注册方式-后台添加 + userId, err := strconv.ParseInt(v.User.CreatedBy, 10, 64) + if err == nil { + // 获取用户详情 + AdminUserDao := dao.AdminUserDao{} + adminUser, _ := AdminUserDao.GetAdminUserFirstById(userId) + if adminUser != nil { + userDoctorData.CreatedBy = adminUser.NickName + } + } + + } + } else { + // 注册方式-微信小程序 + userDoctorData.CreatedBy = v.User.UserName + } + } + + if v.UserDoctorInfo != nil { + // 身份类型 + userDoctorData.CardType = utils.CardTypeToString(v.UserDoctorInfo.CardType) + + // 证件姓名 + userDoctorData.CardName = v.UserDoctorInfo.CardName + + // 证件号码 + userDoctorData.CardNum = v.UserDoctorInfo.CardNum + + // 医师执业证 + var licenseCertSlice []string + if v.UserDoctorInfo.LicenseCert != "" { + result := strings.Split(v.UserDoctorInfo.LicenseCert, ",") + if len(result) > 0 { + for _, v := range result { + v = utils.AddOssDomain(v) + licenseCertSlice = append(licenseCertSlice, v) + } + + userDoctorData.LicenseCert = strings.Join(licenseCertSlice, ",") + } + } + + // 医师资格证 + var QualificationCertSlice []string + if v.UserDoctorInfo.QualificationCert != "" { + result := strings.Split(v.UserDoctorInfo.QualificationCert, ",") + if len(result) > 0 { + for _, v := range result { + v = utils.AddOssDomain(v) + QualificationCertSlice = append(QualificationCertSlice, v) + } + + userDoctorData.QualificationCert = strings.Join(QualificationCertSlice, ",") + } + } + + // 医师资格证号 + userDoctorData.QualificationCertNum = v.UserDoctorInfo.QualificationCertNum + + // 医师工作证 + var WorkCertSlice []string + if v.UserDoctorInfo.QualificationCert != "" { + result := strings.Split(v.UserDoctorInfo.QualificationCert, ",") + if len(result) > 0 { + for _, v := range result { + v = utils.AddOssDomain(v) + WorkCertSlice = append(WorkCertSlice, v) + } + + userDoctorData.WorkCert = strings.Join(WorkCertSlice, ",") + } + } + + // 多点执业备案信息 + var MultiPointImagesSlice []string + if v.UserDoctorInfo.MultiPointImages != "" { + result := strings.Split(v.UserDoctorInfo.MultiPointImages, ",") + if len(result) > 0 { + for _, v := range result { + v = utils.AddOssDomain(v) + MultiPointImagesSlice = append(MultiPointImagesSlice, v) + } + + userDoctorData.MultiPointImages = strings.Join(MultiPointImagesSlice, ",") + } + } + + // 身份证正面图片 + userDoctorData.IdCardFront = utils.AddOssDomain(v.UserDoctorInfo.IdCardFront) + + // 身份证背面图片 + userDoctorData.IdCardBack = utils.AddOssDomain(v.UserDoctorInfo.IdCardBack) + + // 签名图片 + userDoctorData.SignImage = utils.AddOssDomain(v.UserDoctorInfo.SignImage) + } + + // 医院名称 + if v.Hospital != nil { + userDoctorData.HospitalName = v.Hospital.HospitalName + } + + // 获取银行卡数据 + doctorBankCardDao := dao.DoctorBankCardDao{} + doctorBankCard, _ := doctorBankCardDao.GetDoctorBankCardByDoctorId(v.DoctorId) + if doctorBankCard != nil { + basicBankDao := dao.BasicBankDao{} + basicBank, _ := basicBankDao.GetBasicBankById(doctorBankCard.BankId) + if basicBank != nil { + // 银行名称 + userDoctorData.BankName = basicBank.BankName + } + + // 银行卡号 + userDoctorData.BankCardCode = doctorBankCard.BankCardCode + + // 开户行地址 + userDoctorData.BankCardAddress = doctorBankCard.Province + doctorBankCard.City + doctorBankCard.County + } + + // 身份审核时间 + if v.IdenAuthTime != (model.LocalTime{}) { + t := time.Time(v.IdenAuthTime) + userDoctorData.IdenAuthTime = t + } + + // 多点审核时间 + if v.MultiPointTime != (model.LocalTime{}) { + t := time.Time(v.MultiPointTime) + userDoctorData.MultiPointTime = t + } + + // 创建时间 + if v.CreatedAt != (model.LocalTime{}) { + t := time.Time(v.CreatedAt) + userDoctorData.CreatedAt = t + } + + // 获取ca证书 + userCaCertDao := dao.UserCaCertDao{} + userCaCert, _ := userCaCertDao.GetUserCaCertByUserId(v.UserId) + if userCaCert != nil { + // ca证书申请时间 + if userCaCert.CertApplicationTime != (model.LocalTime{}) { + t := time.Time(userCaCert.CertApplicationTime) + userDoctorData.CertApplicationTime = t + } + + // ca证书过期时间 + if userCaCert.CertExpireTime != (model.LocalTime{}) { + t := time.Time(userCaCert.CertExpireTime) + userDoctorData.CertExpireTime = t + } + } + + if len(v.DoctorInquiryConfig) > 0 { + var inquiryTypes []string + for _, v := range v.DoctorInquiryConfig { + if v.InquiryType == 1 && v.InquiryMode == 1 && v.IsEnable == 1 { + inquiryTypes = append(inquiryTypes, "专家问诊") + } + + if v.InquiryType == 2 && v.InquiryMode == 1 && v.IsEnable == 1 { + inquiryTypes = append(inquiryTypes, "快速问诊") + } + + if v.InquiryType == 3 && v.InquiryMode == 1 && v.IsEnable == 1 { + inquiryTypes = append(inquiryTypes, "公益问诊") + } + + if v.InquiryType == 4 && v.InquiryMode == 1 && v.IsEnable == 1 { + inquiryTypes = append(inquiryTypes, "问诊购药") + } + } + + if len(inquiryTypes) > 0 { + // 服务类型 + userDoctorData.InquiryType = strings.Join(inquiryTypes, ",") + } + } + interfaceSlice = append(interfaceSlice, userDoctorData) + } + + file, err := utils.Export(header, interfaceSlice) + if err != nil { + return "", err + } + + // 设置文件名字 + now := time.Now() + dateTimeString := now.Format("20060102150405") // 当前时间字符串 + rand.Seed(time.Now().UnixNano()) // 设置随机数 + ossPath := "admin/export/output" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx" + + // 上传oss + _, err = aliyun.PutObjectByte(ossPath, file.Bytes()) + if err != nil { + return "", err + } + + ossPath = utils.AddOssDomain("/" + ossPath) + return ossPath, nil +} diff --git a/output.xlsx b/output.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..0ebf1a1717a27995b937a56bcc715b12b09ade73 GIT binary patch literal 26753 zcmb@sbx@n#+b)W`Yw$pD5AH6(r4%d09f}tyMT>iIcW)^aFJ9c;tvD1fE|y_y77Le_il)LWBjzJ$MqTwcVTeV^xB)6GW6k#i}1a zmaH<*eA6$4K9xzZ)WjBip&OCbvbC`3(d_zsdGUfDcinlBl1)N^NFiFA*@kHpgin@- z*UZ1eZ{u3b{b^xfr@@6}Ca}n9!Urg}bB|d15%KU_smMp-;x~GM_8#OA*1M>K(J%;L zzj~1IOo~4(p|LW~&-tBC+(~#DP!Q>^74DE=A$_I3N5-OAXscaZa_&QVD>5idZ1eHd zzp%MQ&7(8I#cfc5>F_uG68CXH#m7gkGy9zfQ8>7l7flsZG}rZ6`-4|=>>$9wY5pG# zM)V(px!an#Sy{gEaI{iRpcuwPo zy>DF42LaEdz|Oms>X$r8qYmHQRgHDO&j%NJCXWZhDKyV}-Jv5l8mFRu_akQkE@}P` zrz>|bn$8(L&Vc);_;sV7k3I3~ifJ!9t0`w4?SZsAq#ZM)Tz;Q>@s-_38-_G{a!>kTWO>z~4(iWa9EJ4N10bdCi@dVDzYHfRyp7NmZl zND?2JUP>Dq+f5XB=M}*D!fB9swT+wDWs;e)xpSlIP`p?)*S@!>DZ+o@>BZOHdZt)? zKc(mFHGpyLX?(YfAK);(V13#AxmEN~vAV&jDmh^C@xFq_KcUTg74dX>yWUe1#ma~6 z)6?n#^*u#VYTV7{ zKejH;_?9{9kY6A5p^*Bu>&BT4EnZtz?3J02hIgzj)3EAPSKd#Rg*I_f!yE{QR^!$= z)E!aU49GYKLa#opt+QSIY!;p@@ANS-5N@|kQ|si+5R}xqotwHbUOv`Z^%YKDU4L?M zT?(<{e>|G&|E+C+xc2UO6LMi%@A?-=w#be}%fz3BIP}2veK+rE%U?ubx=#D@P;Nr` z;Gv@vY+!8tG5u?f;=ytB-rkYhtWf2Q7(gjiclfB@soh>8oq7HEq;?3EA!&~D-SWjq z%C^Uj*1)r^mUTXoYGoS zE^4NBtz6@NlWu#&y5X&XEj5wLA4|ftG^5EWFH)}egZsw_Vd+xHWLpsYL1>5(Is=}p zri}7#+RLM?nKs3oPm!^+&cdaiZhBQgisi0ui@+NIKV#@7;|Of%l2}qp#dws7>*igP z;&eF7zc96~YHR#G=F3~frwx~9=h_A;@AVsXr8$LaE{q`&+duKUms&CaF%0AgZ**@ahD*Q8h95-##lfs#q%~Z+# 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 literal 0 HcmV?d00001 diff --git a/utils/export.go b/utils/export.go index 50a43e5..a726458 100644 --- a/utils/export.go +++ b/utils/export.go @@ -283,14 +283,16 @@ func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) } } - // 保存文件 - // if err := f.SaveAs("output.xlsx"); err != nil { - // return nil, err - // } buffer, err := f.WriteToBuffer() if err != nil { return nil, err } return buffer, nil + + // 保存文件 + // if err := f.SaveAs("output.xlsx"); err != nil { + // return nil, err + // } + // return nil, errors.New("已导出文件") } diff --git a/utils/intToString.go b/utils/intToString.go new file mode 100644 index 0000000..470ab70 --- /dev/null +++ b/utils/intToString.go @@ -0,0 +1,235 @@ +package utils + +// int抓字符串 + +// UserDoctorStatusToString 用户状态(0:禁用 1:正常 2:删除) +func UserDoctorStatusToString(i int) string { + switch i { + case 0: + return "禁用" + case 1: + return "正常" + case 2: + return "删除" + default: + return "未知" + } +} + +// IdcardStatusToString 实名认证状态(0:未认证 1:认证通过 2:认证失败) +func IdcardStatusToString(i int) string { + switch i { + case 0: + return "未认证" + case 1: + return "认证通过" + case 2: + return "认证失败" + default: + return "未知" + } +} + +// IdenAuthStatusToString 身份认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) +func IdenAuthStatusToString(i int) string { + switch i { + case 0: + return "未认证" + case 1: + return "认证通过" + case 2: + return "审核中" + case 3: + return "认证失败" + default: + return "未知" + } +} + +// MultiPointStatusToString 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) +func MultiPointStatusToString(i int) string { + switch i { + case 0: + return "未认证" + case 1: + return "认证通过" + case 2: + return "审核中" + case 3: + return "认证失败" + default: + return "未知" + } +} + +// IsRecommendToString 是否首页推荐(0:否 1:是) +func IsRecommendToString(i int) string { + switch i { + case 0: + return "否" + case 1: + return "是" + default: + return "" + } +} + +// DoctorTitleToString 医生职称(1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师) +func DoctorTitleToString(i int) string { + switch i { + case 1: + return "主任医师" + case 2: + return "主任中医师" + case 3: + return "副主任医师" + case 4: + return "副主任中医师" + case 5: + return "主治医师" + case 6: + return "住院医师" + default: + return "" + } +} + +// IsOnlineToString 是否在线(0:不在线 1:在线) +func IsOnlineToString(i int) string { + switch i { + case 0: + return "不在线" + case 1: + return "在线" + default: + return "" + } +} + +// IsPlatformDeepCooperationToString 是否平台深度合作医生(0:否 1:是) +func IsPlatformDeepCooperationToString(i int) string { + switch i { + case 0: + return "否" + case 1: + return "是" + default: + return "" + } +} + +// IsEnterpriseDeepCooperationToString 是否企业深度合作医生(0:否 1:是) +func IsEnterpriseDeepCooperationToString(i int) string { + switch i { + case 0: + return "否" + case 1: + return "是" + default: + return "" + } +} + +// IsSysDiagnoCooperationToString 是否先思达合作医生(0:否 1:是) +func IsSysDiagnoCooperationToString(i int) string { + switch i { + case 0: + return "否" + case 1: + return "是" + default: + return "" + } +} + +// SexToString 性别(0:未知 1:男 2:女) +func SexToString(i int) string { + switch i { + case 0: + return "未知" + case 1: + return "男" + case 2: + return "女" + default: + return "未知" + } +} + +// RegisterMethodToString 注册方式(1:微信小程序 2:后台添加 ) +func RegisterMethodToString(i int) string { + switch i { + case 1: + return "微信小程序" + case 2: + return "后台添加" + default: + return "" + } +} + +// CardTypeToString 身份类型(1:身份证 2:护照 3:港澳通行证 4:台胞证) +func CardTypeToString(i int) string { + switch i { + case 1: + return "身份证" + case 2: + return "护照" + case 3: + return "港澳通行证" + case 4: + return "台胞证" + default: + return "" + } +} + +// PayChannelToString 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) +func PayChannelToString(i int) string { + switch i { + case 1: + return "小程序支付" + case 2: + return "微信扫码支付" + case 3: + return "模拟支付" + default: + return "" + } +} + +// InquiryStatusToString 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) +func InquiryStatusToString(i int) string { + switch i { + case 1: + return "待支付" + case 2: + return "待分配" + case 3: + return "待接诊" + case 4: + return "已接诊" + case 5: + return "已完成" + case 6: + return "已结束" + case 7: + return "已取消" + default: + return "未知" + } +} + +// WithdrawalExamineStatusToString 提现审核状态(1:审核中 2:审核通过 3:审核未通过) +func WithdrawalExamineStatusToString(i int) string { + switch i { + case 1: + return "审核中" + case 2: + return "审核通过" + case 3: + return "审核未通过" + default: + return "未知" + } +}