package service import ( "errors" "fmt" "gorm.io/gorm" "hospital-admin-api/api/dao" "hospital-admin-api/api/model" "hospital-admin-api/extend/ca" "strconv" "time" ) type UserCaCertService struct { } // GetUserCloudCert 申请云证书-个人 func (r *UserCaCertService) GetUserCloudCert(tx *gorm.DB, userId int64) (bool, error) { userCaCertDao := dao.UserCaCert{} // 检测是否存在云证书 maps := make(map[string]interface{}) maps["user_id"] = userId maps["type"] = 2 userCaCert, _ := userCaCertDao.GetUserCaCert(maps) if userCaCert != nil { return false, errors.New("医生存在正常使用的云证书,请注销后重新申请") } // 获取用户数据 userDao := dao.UserDao{} user, err := userDao.GetUserById(userId) if err != nil || user == nil { return false, errors.New("用户数据错误") } // 定义所需变量 var departmentCustomId int64 // 自定义科室id var cardName string // 身份证名称 var cardNum string // 身份证号码 // 医生 if user.UserType == 2 { // 获取医生数据 userDoctorDao := dao.UserDoctorDao{} userDoctor, err := userDoctorDao.GetUserDoctorByUserId(userId) if err != nil || userDoctor == nil { return false, errors.New("医生数据错误") } // 获取医生详情数据 userDoctorInfoDao := dao.UserDoctorInfoDao{} userDoctorInfo, err := userDoctorInfoDao.GetUserDoctorInfoByDoctorId(userDoctor.DoctorId) if err != nil || userDoctorInfo == nil { return false, errors.New("医生详情数据错误") } if userDoctor.IdenAuthStatus != 1 { return false, errors.New("请先通过身份认证") } if userDoctor.MultiPointStatus != 1 { return false, errors.New("请先完成多点执业认证") } departmentCustomId = userDoctor.DepartmentCustomId // 自定义科室id cardName = userDoctorInfo.CardName // 身份证名称 cardNum = userDoctorInfo.CardNum // 身份证号码 } // 获取自定义科室数据 hospitalDepartmentCustomDao := dao.HospitalDepartmentCustomDao{} hospitalDepartmentCustom, err := hospitalDepartmentCustomDao.GetHospitalDepartmentCustomById(departmentCustomId) if err != nil || hospitalDepartmentCustom == nil { return false, errors.New("科室错误") } // 获取标准科室数据 hospitalDepartmentDao := dao.HospitalDepartment{} hospitalDepartment, err := hospitalDepartmentDao.GetHospitalDepartmentById(hospitalDepartmentCustom.DepartmentId) if err != nil || hospitalDepartment == nil { return false, errors.New("科室错误") } // 申请云证书 cloudCertRequestData := &ca.AddCloudCertRequest{ EntityId: fmt.Sprintf("%d", userId), EntityType: "Personal", PersonalPhone: user.Mobile, PersonalName: cardName, PersonalIdNumber: cardNum, OrgName: "", OrgNumber: "", Pin: fmt.Sprintf("%d", userId), OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门 Province: "四川省", Locality: "成都市", AuthType: "实人认证", AuthTime: strconv.FormatInt(time.Now().Unix(), 10), AuthResult: "认证通过", AuthNoticeType: "数字证书申请告知", } cloudCertResponse, err := ca.AddCloudCert(cloudCertRequestData) if err != nil || cloudCertResponse == nil { return false, errors.New(err.Error()) } // 新增ca监管证书表 userCaCert = &model.UserCaCert{ UserId: &userId, IsSystem: 0, IsLatest: 1, Type: 2, CertBase64: cloudCertResponse.CertBase64, CertChainP7: cloudCertResponse.CertP7, CertSerialNumber: cloudCertResponse.CertSerialnumber, CaPin: fmt.Sprintf("%d", userId), IsSignConfig: 0, SignConfig: "", CertApplicationTime: model.LocalTime(time.Now()), CertExpireTime: model.LocalTime(time.Now().AddDate(0, 0, 180)), // 180天以后的时间 } userCaCert, err = userCaCertDao.AddUserCaCert(tx, userCaCert) if err != nil || userCaCert == nil { return false, errors.New(err.Error()) } return true, nil } // EditUserCloudCert 修改云证书-个人 func (r *UserCaCertService) EditUserCloudCert(tx *gorm.DB, userId int64) (bool, error) { userCaCertDao := dao.UserCaCert{} // 检测是否存在云证书 maps := make(map[string]interface{}) maps["user_id"] = userId maps["type"] = 2 userCaCert, _ := userCaCertDao.GetUserCaCert(maps) if userCaCert == nil { return false, errors.New("用户未申请云证书,无法修改") } if userCaCert.IsLatest == 1 { return false, errors.New("用户云证书为最新证书,无法修改") } // 获取用户数据 userDao := dao.UserDao{} user, err := userDao.GetUserById(userId) if err != nil || user == nil { return false, errors.New("用户数据错误") } // 定义所需变量 var departmentCustomId int64 // 自定义科室id var cardName string // 身份证名称 var cardNum string // 身份证号码 // 医生 if user.UserType == 2 { // 获取医生数据 userDoctorDao := dao.UserDoctorDao{} userDoctor, err := userDoctorDao.GetUserDoctorByUserId(userId) if err != nil || userDoctor == nil { return false, errors.New("医生数据错误") } // 获取医生详情数据 userDoctorInfoDao := dao.UserDoctorInfoDao{} userDoctorInfo, err := userDoctorInfoDao.GetUserDoctorInfoByDoctorId(userDoctor.DoctorId) if err != nil || userDoctorInfo == nil { return false, errors.New("医生详情数据错误") } if userDoctor.IdenAuthStatus != 1 { return false, errors.New("请先通过身份认证") } if userDoctor.MultiPointStatus != 1 { return false, errors.New("请先完成多点执业认证") } // 检测是否存在正在审核中的处方 orderPrescriptionDao := dao.OrderPrescriptionDao{} maps := make(map[string]interface{}) maps["doctor_id"] = userDoctor.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("存在审核中的处方,请勿更新云证书") } departmentCustomId = userDoctor.DepartmentCustomId // 自定义科室id cardName = userDoctorInfo.CardName // 身份证名称 cardNum = userDoctorInfo.CardNum // 身份证号码 } // 获取自定义科室数据 hospitalDepartmentCustomDao := dao.HospitalDepartmentCustomDao{} hospitalDepartmentCustom, err := hospitalDepartmentCustomDao.GetHospitalDepartmentCustomById(departmentCustomId) if err != nil || hospitalDepartmentCustom == nil { return false, errors.New("科室错误") } // 获取标准科室数据 hospitalDepartmentDao := dao.HospitalDepartment{} hospitalDepartment, err := hospitalDepartmentDao.GetHospitalDepartmentById(hospitalDepartmentCustom.DepartmentId) if err != nil || hospitalDepartment == nil { return false, errors.New("科室错误") } // 修改云证书 cloudCertRequestData := &ca.EditCloudCertRequestData{ EntityId: fmt.Sprintf("%d", userId), EntityType: "Personal", PersonalPhone: user.Mobile, PersonalName: cardName, PersonalIdNumber: cardNum, OrgName: "", OrgNumber: "", Pin: fmt.Sprintf("%d", userId), OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门 Province: "四川省", Locality: "成都市", AuthType: "实人认证", AuthTime: strconv.FormatInt(time.Now().Unix(), 10), AuthResult: "认证通过", AuthNoticeType: "数字证书变更告知", } cloudCertResponse, err := ca.EditCloudCert(cloudCertRequestData) if err != nil || cloudCertResponse == nil { tx.Rollback() return false, errors.New(err.Error()) } // 修改ca监管证书表 data := make(map[string]interface{}) data["cert_base64"] = cloudCertResponse.CertBase64 data["cert_chain_p7"] = cloudCertResponse.CertP7 data["cert_serial_number"] = cloudCertResponse.CertSerialnumber err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) if err != nil { tx.Rollback() return false, errors.New("审核失败") } return true, nil } // RenewUserCloudCert 更新云证书-个人 func (r *UserCaCertService) RenewUserCloudCert(tx *gorm.DB, userId int64) (bool, error) { userCaCertDao := dao.UserCaCert{} // 检测是否存在云证书 maps := make(map[string]interface{}) maps["user_id"] = userId maps["type"] = 2 userCaCert, _ := userCaCertDao.GetUserCaCert(maps) if userCaCert == nil { return false, errors.New("医生未申请云证书,无法操作") } if userCaCert.IsLatest == 0 { return false, errors.New("医生云证书非最新,请执行更新") } if !userCaCert.CertExpireTime.IsEmpty() { timeDifference := time.Time(userCaCert.CertExpireTime).Sub(time.Now()) if timeDifference > 60*24*time.Hour { return false, errors.New("云证书有效期大于60天,无法更新") } } // 获取用户数据 userDao := dao.UserDao{} user, err := userDao.GetUserById(userId) if err != nil || user == nil { return false, errors.New("用户数据错误") } // 医生 if user.UserType == 2 { // 获取医生数据 userDoctorDao := dao.UserDoctorDao{} userDoctor, err := userDoctorDao.GetUserDoctorByUserId(userId) if err != nil || userDoctor == nil { return false, errors.New("医生数据错误") } // 获取医生详情数据 userDoctorInfoDao := dao.UserDoctorInfoDao{} userDoctorInfo, err := userDoctorInfoDao.GetUserDoctorInfoByDoctorId(userDoctor.DoctorId) if err != nil || userDoctorInfo == nil { return false, errors.New("医生详情数据错误") } if userDoctor.IdenAuthStatus != 1 { return false, errors.New("请先通过身份认证") } if userDoctor.MultiPointStatus != 1 { return false, errors.New("请先完成多点执业认证") } } // 修改云证书 cloudCertRequestData := &ca.RenewCloudCertRequest{ EntityId: fmt.Sprintf("%d", userId), Pin: fmt.Sprintf("%d", userId), AuthType: "实人认证", AuthTime: strconv.FormatInt(time.Now().Unix(), 10), AuthResult: "认证通过", AuthNoticeType: "数字证书更新告知", } cloudCertResponse, err := ca.RenewCloudCert(cloudCertRequestData) if err != nil || cloudCertResponse == nil { tx.Rollback() return false, errors.New(err.Error()) } // 修改ca监管证书表 data := make(map[string]interface{}) data["cert_base64"] = cloudCertResponse.CertBase64 data["cert_chain_p7"] = cloudCertResponse.CertP7 data["cert_serial_number"] = cloudCertResponse.CertSerialnumber err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) if err != nil { tx.Rollback() return false, errors.New("审核失败") } return true, nil } // RemoveUserCloudCert 注销云证书-个人 func (r *UserCaCertService) RemoveUserCloudCert(tx *gorm.DB, userId int64) (bool, error) { userCaCertDao := dao.UserCaCert{} // 检测是否存在云证书 maps := make(map[string]interface{}) maps["user_id"] = userId maps["type"] = 2 userCaCert, _ := userCaCertDao.GetUserCaCert(maps) if userCaCert == nil { return false, errors.New("用户未申请云证书,无法操作") } // 获取用户数据 userDao := dao.UserDao{} user, err := userDao.GetUserById(userId) if err != nil || user == nil { return false, errors.New("用户数据错误") } // 医生 if user.UserType == 2 { // 获取医生数据 userDoctorDao := dao.UserDoctorDao{} userDoctor, err := userDoctorDao.GetUserDoctorByUserId(userId) if err != nil || userDoctor == nil { return false, errors.New("医生数据错误") } // 获取医生详情数据 userDoctorInfoDao := dao.UserDoctorInfoDao{} userDoctorInfo, err := userDoctorInfoDao.GetUserDoctorInfoByDoctorId(userDoctor.DoctorId) if err != nil || userDoctorInfo == nil { return false, errors.New("医生详情数据错误") } if userDoctor.IdenAuthStatus != 1 { return false, errors.New("请先通过身份认证") } if userDoctor.MultiPointStatus != 1 { return false, errors.New("请先完成多点执业认证") } } // 注销云证书 cloudCertRequestData := &ca.RemoveCloudCertRequest{ EntityId: fmt.Sprintf("%d", userId), Pin: fmt.Sprintf("%d", userId), AuthType: "实人认证", AuthTime: strconv.FormatInt(time.Now().Unix(), 10), AuthResult: "认证通过", AuthNoticeType: "数字证书吊销告知", } _, err = ca.RemoveCloudCert(cloudCertRequestData) if err != nil { tx.Rollback() return false, errors.New(err.Error()) } // 修改ca监管证书表-注销 err = userCaCertDao.DeleteUserCaCertById(tx, userCaCert.CertId) if err != nil { tx.Rollback() return false, errors.New("注销失败") } return true, nil } // AddUserSignConfig 添加用户签章配置 // func (r *UserCaCertService) AddUserSignConfig(tx *gorm.DB, req requests.AddUserSignConfig) (bool, error) { // userCaCertDao := dao.UserCaCert{} // // var entityId string // 唯一标识 // var cardNum string // 身份证号/信用代码 // // // 医院-固定 // if req.Type == 1 { // entityId = "5345345461" // cardNum = "91510106MABTJY4K9R" // } // // // 医生 // if req.Type == 2 { // if req.UserId == "" { // return false, errors.New("缺少用户标识") // } // // entityId = req.UserId // // // 将 id 转换为 int64 类型 // userId, err := strconv.ParseInt(req.UserId, 10, 64) // if err != nil { // return false, errors.New("用户标识错误") // } // // // 获取医生数据 // userDoctorDao := dao.UserDoctorDao{} // userDoctor, err := userDoctorDao.GetUserDoctorByUserId(userId) // if err != nil || userDoctor == nil { // return false, errors.New("医生数据错误") // } // // // 获取医生详情数据 // userDoctorInfoDao := dao.UserDoctorInfoDao{} // userDoctorInfo, err := userDoctorInfoDao.GetUserDoctorInfoByDoctorId(userDoctor.DoctorId) // if err != nil || userDoctorInfo == nil { // return false, errors.New("医生详情数据错误") // } // // if userDoctor.IdenAuthStatus != 1 { // return false, errors.New("请先通过身份认证") // } // // if userDoctor.MultiPointStatus != 1 { // return false, errors.New("请先完成多点执业认证") // } // // cardNum = userDoctorInfo.CardNum // } // // // 药师 // if req.Type == 3 { // if req.UserId == "" { // return false, errors.New("缺少用户标识") // } // // entityId = req.UserId // // // 将 id 转换为 int64 类型 // userId, err := strconv.ParseInt(req.UserId, 10, 64) // if err != nil { // return false, errors.New("用户标识错误") // } // // // 获取药师详情数据 // userPharmacistInfoDao := dao.UserPharmacistInfoDao{} // userPharmacistInfo, err := userPharmacistInfoDao.GetUserPharmacistInfoByUserId(userId) // if err != nil || userPharmacistInfo == nil { // return false, errors.New("药师详情数据错误") // } // // cardNum = userPharmacistInfo.CardNum // } // // // 检测是否存在云证书 // maps := make(map[string]interface{}) // maps["ca_pin"] = entityId // maps["type"] = 2 // userCaCert, _ := userCaCertDao.GetUserCaCert(maps) // if userCaCert == nil { // return false, errors.New("医生未申请云证书,请申请后添加签章配置") // } // // // 处理签章图片 // var signImage string // 签章图片,base64格式 // // // 处理签章配置 // var signParam string // 签章配置,JSON // fmt.Println(signParam) // var signParams []map[string]interface{} // if req.Type == 1 { // // 医院 // signParam := map[string]interface{}{ // "llx": "370", // "lly": "210", // "urx": "520", // "ury": "360", // "pageList": []int{1}, // "sealImg": signImage, // 请替换为你的签名图像路径 // } // signParams = append(signParams, signParam) // // } // // // 申请云证书 // cloudCertRequestData := &ca.AddUserSignConfigRequest{ // UserId: entityId, // ConfigKey: entityId, // KeypairType: "3", // CertSn: cardNum, // SignType: "4", // SignParam: "", // SealImg: "", // SealType: "4", // SignTemplate: "0", // } // // cloudCertResponse, err := ca.AddCloudCert(cloudCertRequestData) // if err != nil || cloudCertResponse == nil { // return false, errors.New(err.Error()) // } // // // 新增ca监管证书表 // userCaCert = &model.UserCaCert{ // UserId: &userId, // IsSystem: 0, // IsLatest: 1, // Type: 2, // CertBase64: cloudCertResponse.CertBase64, // CertChainP7: cloudCertResponse.CertP7, // CertSerialNumber: cloudCertResponse.CertSerialnumber, // CaPin: fmt.Sprintf("%d", userId), // IsSignConfig: 0, // SignConfig: "", // CertApplicationTime: model.LocalTime(time.Now()), // CertExpireTime: model.LocalTime(time.Now().AddDate(0, 0, 180)), // 180天以后的时间 // } // // userCaCert, err = userCaCertDao.AddUserCaCert(tx, userCaCert) // if err != nil || userCaCert == nil { // return false, errors.New(err.Error()) // } // // return true, nil // }