新增添加用户签章配置

This commit is contained in:
wucongxing 2023-10-27 13:58:29 +08:00
parent c3591615f9
commit 6438942e18
6 changed files with 379 additions and 236 deletions

View File

@ -2,9 +2,11 @@ package controller
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"hospital-admin-api/api/requests"
"hospital-admin-api/api/responses" "hospital-admin-api/api/responses"
"hospital-admin-api/api/service" "hospital-admin-api/api/service"
"hospital-admin-api/global" "hospital-admin-api/global"
"hospital-admin-api/utils"
"strconv" "strconv"
) )
@ -116,36 +118,36 @@ func (r *UserCaCert) RemoveUserCloudCert(c *gin.Context) {
} }
// AddUserSignConfig 添加用户签章配置 // AddUserSignConfig 添加用户签章配置
// func (r *UserCaCert) AddUserSignConfig(c *gin.Context) { func (r *UserCaCert) AddUserSignConfig(c *gin.Context) {
// userCaCertRequest := requests.UserCaCertRequest{} userCaCertRequest := requests.UserCaCertRequest{}
// req := userCaCertRequest.AddUserSignConfig req := userCaCertRequest.AddUserSignConfig
// if err := c.ShouldBind(&req); err != nil { if err := c.ShouldBind(&req); err != nil {
// responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
// return return
// } }
//
// // 参数验证 // 参数验证
// if err := global.Validate.Struct(req); err != nil { if err := global.Validate.Struct(req); err != nil {
// responses.FailWithMessage(utils.Translate(err), c) responses.FailWithMessage(utils.Translate(err), c)
// return return
// } }
//
// // 业务处理 // 业务处理
// tx := global.Db.Begin() tx := global.Db.Begin()
// defer func() { defer func() {
// if r := recover(); r != nil { if r := recover(); r != nil {
// tx.Rollback() tx.Rollback()
// } }
// }() }()
//
// userCaCertService := service.UserCaCertService{} userCaCertService := service.UserCaCertService{}
// _, err := userCaCertService.AddUserSignConfig(tx, req) _, err := userCaCertService.AddUserSignConfig(tx, req)
// if err != nil { if err != nil {
// tx.Rollback() tx.Rollback()
// responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
// return return
// } }
//
// tx.Commit() tx.Commit()
// responses.Ok(c) responses.Ok(c)
// } }

View File

@ -575,10 +575,7 @@ func privateRouter(r *gin.Engine, api controller.Api) {
signGroup := caGroup.Group("/sign") signGroup := caGroup.Group("/sign")
{ {
// 添加签章配置 // 添加签章配置
// signGroup.POST("", api.UserCaCert.AddUserSignConfig) signGroup.POST("", api.UserCaCert.AddUserSignConfig)
// 更新签章配置
signGroup.GET("/:user_id", api.OrderPrescription.GetOrderPrescriptionPage)
} }
} }

View File

@ -1,13 +1,18 @@
package service package service
import ( import (
"encoding/base64"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"gorm.io/gorm" "gorm.io/gorm"
"hospital-admin-api/api/dao" "hospital-admin-api/api/dao"
"hospital-admin-api/api/model" "hospital-admin-api/api/model"
"hospital-admin-api/api/requests"
"hospital-admin-api/extend/aliyun"
"hospital-admin-api/extend/ca" "hospital-admin-api/extend/ca"
"strconv" "strconv"
"strings"
"time" "time"
) )
@ -89,8 +94,8 @@ func (r *UserCaCertService) GetUserCloudCert(tx *gorm.DB, userId int64) (bool, e
PersonalPhone: user.Mobile, PersonalPhone: user.Mobile,
PersonalName: cardName, PersonalName: cardName,
PersonalIdNumber: cardNum, PersonalIdNumber: cardNum,
OrgName: "", OrgName: "成都金牛欣欣相照互联网医院有限公司",
OrgNumber: "", OrgNumber: "91510106MABTJY4K9R",
Pin: fmt.Sprintf("%d", userId), Pin: fmt.Sprintf("%d", userId),
OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门 OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门
Province: "四川省", Province: "四川省",
@ -224,8 +229,8 @@ func (r *UserCaCertService) EditUserCloudCert(tx *gorm.DB, userId int64) (bool,
PersonalPhone: user.Mobile, PersonalPhone: user.Mobile,
PersonalName: cardName, PersonalName: cardName,
PersonalIdNumber: cardNum, PersonalIdNumber: cardNum,
OrgName: "", OrgName: "成都金牛欣欣相照互联网医院有限公司",
OrgNumber: "", OrgNumber: "91510106MABTJY4K9R",
Pin: fmt.Sprintf("%d", userId), Pin: fmt.Sprintf("%d", userId),
OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门 OrgDept: hospitalDepartment.DepartmentName, // // 卫生证书:医院部门
Province: "四川省", Province: "四川省",
@ -238,7 +243,6 @@ func (r *UserCaCertService) EditUserCloudCert(tx *gorm.DB, userId int64) (bool,
cloudCertResponse, err := ca.EditCloudCert(cloudCertRequestData) cloudCertResponse, err := ca.EditCloudCert(cloudCertRequestData)
if err != nil || cloudCertResponse == nil { if err != nil || cloudCertResponse == nil {
tx.Rollback()
return false, errors.New(err.Error()) return false, errors.New(err.Error())
} }
@ -249,7 +253,6 @@ func (r *UserCaCertService) EditUserCloudCert(tx *gorm.DB, userId int64) (bool,
data["cert_serial_number"] = cloudCertResponse.CertSerialnumber data["cert_serial_number"] = cloudCertResponse.CertSerialnumber
err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data)
if err != nil { if err != nil {
tx.Rollback()
return false, errors.New("审核失败") return false, errors.New("审核失败")
} }
@ -325,7 +328,6 @@ func (r *UserCaCertService) RenewUserCloudCert(tx *gorm.DB, userId int64) (bool,
cloudCertResponse, err := ca.RenewCloudCert(cloudCertRequestData) cloudCertResponse, err := ca.RenewCloudCert(cloudCertRequestData)
if err != nil || cloudCertResponse == nil { if err != nil || cloudCertResponse == nil {
tx.Rollback()
return false, errors.New(err.Error()) return false, errors.New(err.Error())
} }
@ -336,7 +338,6 @@ func (r *UserCaCertService) RenewUserCloudCert(tx *gorm.DB, userId int64) (bool,
data["cert_serial_number"] = cloudCertResponse.CertSerialnumber data["cert_serial_number"] = cloudCertResponse.CertSerialnumber
err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data)
if err != nil { if err != nil {
tx.Rollback()
return false, errors.New("审核失败") return false, errors.New("审核失败")
} }
@ -400,14 +401,12 @@ func (r *UserCaCertService) RemoveUserCloudCert(tx *gorm.DB, userId int64) (bool
_, err = ca.RemoveCloudCert(cloudCertRequestData) _, err = ca.RemoveCloudCert(cloudCertRequestData)
if err != nil { if err != nil {
tx.Rollback()
return false, errors.New(err.Error()) return false, errors.New(err.Error())
} }
// 修改ca监管证书表-注销 // 修改ca监管证书表-注销
err = userCaCertDao.DeleteUserCaCertById(tx, userCaCert.CertId) err = userCaCertDao.DeleteUserCaCertById(tx, userCaCert.CertId)
if err != nil { if err != nil {
tx.Rollback()
return false, errors.New("注销失败") return false, errors.New("注销失败")
} }
@ -415,149 +414,179 @@ func (r *UserCaCertService) RemoveUserCloudCert(tx *gorm.DB, userId int64) (bool
} }
// AddUserSignConfig 添加用户签章配置 // AddUserSignConfig 添加用户签章配置
// func (r *UserCaCertService) AddUserSignConfig(tx *gorm.DB, req requests.AddUserSignConfig) (bool, error) { func (r *UserCaCertService) AddUserSignConfig(tx *gorm.DB, req requests.AddUserSignConfig) (bool, error) {
// userCaCertDao := dao.UserCaCert{} userCaCertDao := dao.UserCaCert{}
//
// var entityId string // 唯一标识 var entityId string // 唯一标识
// var cardNum string // 身份证号/信用代码 var cardNum string // 身份证号/信用代码
// var signImagePath string // 签名图片地址
// // 医院-固定
// if req.Type == 1 { // 医院-固定
// entityId = "5345345461" if req.Type == 1 {
// cardNum = "91510106MABTJY4K9R" entityId = "5345345461"
// } cardNum = "91510106MABTJY4K9R"
// signImagePath = "basic/file/hospital_signature.png"
// // 医生 }
// if req.Type == 2 {
// if req.UserId == "" { // 医生
// return false, errors.New("缺少用户标识") if req.Type == 2 {
// } if req.UserId == "" {
// return false, errors.New("缺少用户标识")
// entityId = req.UserId }
//
// // 将 id 转换为 int64 类型 entityId = req.UserId
// userId, err := strconv.ParseInt(req.UserId, 10, 64)
// if err != nil { // 将 id 转换为 int64 类型
// return false, errors.New("用户标识错误") 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 { userDoctorDao := dao.UserDoctorDao{}
// return false, errors.New("医生数据错误") 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 { userDoctorInfoDao := dao.UserDoctorInfoDao{}
// return false, errors.New("医生详情数据错误") 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.IdenAuthStatus != 1 {
// return false, errors.New("请先通过身份认证")
// if userDoctor.MultiPointStatus != 1 { }
// return false, errors.New("请先完成多点执业认证")
// } if userDoctor.MultiPointStatus != 1 {
// return false, errors.New("请先完成多点执业认证")
// cardNum = userDoctorInfo.CardNum }
// }
// cardNum = userDoctorInfo.CardNum
// // 药师 signImagePath = strings.TrimLeft(userDoctorInfo.SignImage, "/")
// if req.Type == 3 { }
// if req.UserId == "" {
// return false, errors.New("缺少用户标识") // 药师
// } if req.Type == 3 {
// if req.UserId == "" {
// entityId = req.UserId return false, errors.New("缺少用户标识")
// }
// // 将 id 转换为 int64 类型
// userId, err := strconv.ParseInt(req.UserId, 10, 64) entityId = req.UserId
// if err != nil {
// return false, errors.New("用户标识错误") // 将 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("药师详情数据错误") userPharmacistInfoDao := dao.UserPharmacistInfoDao{}
// } userPharmacistInfo, err := userPharmacistInfoDao.GetUserPharmacistInfoByUserId(userId)
// if err != nil || userPharmacistInfo == nil {
// cardNum = userPharmacistInfo.CardNum return false, errors.New("药师详情数据错误")
// } }
//
// // 检测是否存在云证书 cardNum = userPharmacistInfo.CardNum
// maps := make(map[string]interface{}) signImagePath = strings.TrimLeft(userPharmacistInfo.SignImage, "/")
// maps["ca_pin"] = entityId }
// maps["type"] = 2
// userCaCert, _ := userCaCertDao.GetUserCaCert(maps) // 检测是否存在云证书
// if userCaCert == nil { maps := make(map[string]interface{})
// return false, errors.New("医生未申请云证书,请申请后添加签章配置") maps["ca_pin"] = entityId
// } maps["type"] = 2
// userCaCert, _ := userCaCertDao.GetUserCaCert(maps)
// // 处理签章图片 if userCaCert == nil {
// var signImage string // 签章图片base64格式 return false, errors.New("医生未申请云证书,请申请后添加签章配置")
// }
// // 处理签章配置
// var signParam string // 签章配置,JSON if userCaCert.IsSignConfig == 1 {
// fmt.Println(signParam) return false, errors.New("医生已存在签章配置,请勿重复添加")
// var signParams []map[string]interface{} }
// if req.Type == 1 {
// // 医院 // 下载签章图片
// signParam := map[string]interface{}{ var style string
// "llx": "370", if req.Type == 1 {
// "lly": "210", style = "image/resize,w_300,h_300"
// "urx": "520", } else {
// "ury": "360", style = "image/resize,m_lfit,w_100,h_350"
// "pageList": []int{1}, }
// "sealImg": signImage, // 请替换为你的签名图像路径
// } signImage, err := aliyun.GetCusTomObjectToRAM(signImagePath, style)
// signParams = append(signParams, signParam) if err != nil {
// return false, err
// } }
//
// // 申请云证书 signImage = base64.StdEncoding.EncodeToString([]byte(signImage))
// cloudCertRequestData := &ca.AddUserSignConfigRequest{
// UserId: entityId, // 签章配置,JSON
// ConfigKey: entityId, var signParam map[string]interface{}
// KeypairType: "3", var signParams []map[string]interface{}
// CertSn: cardNum,
// SignType: "4", // 医院
// SignParam: "", if req.Type == 1 {
// SealImg: "", signParam = map[string]interface{}{
// SealType: "4", "llx": "370",
// SignTemplate: "0", "lly": "210",
// } "urx": "520",
// "ury": "360",
// cloudCertResponse, err := ca.AddCloudCert(cloudCertRequestData) }
// if err != nil || cloudCertResponse == nil { }
// return false, errors.New(err.Error())
// } // 医生
// if req.Type == 2 {
// // 新增ca监管证书表 signParam = map[string]interface{}{
// userCaCert = &model.UserCaCert{ "llx": "120",
// UserId: &userId, "lly": "190",
// IsSystem: 0, "urx": "190",
// IsLatest: 1, "ury": "140",
// Type: 2, }
// CertBase64: cloudCertResponse.CertBase64, }
// CertChainP7: cloudCertResponse.CertP7,
// CertSerialNumber: cloudCertResponse.CertSerialnumber, // 药师
// CaPin: fmt.Sprintf("%d", userId), if req.Type == 2 {
// IsSignConfig: 0, signParam = map[string]interface{}{
// SignConfig: "", "llx": "350",
// CertApplicationTime: model.LocalTime(time.Now()), "lly": "190",
// CertExpireTime: model.LocalTime(time.Now().AddDate(0, 0, 180)), // 180天以后的时间 "urx": "440",
// } "ury": "140",
// }
// userCaCert, err = userCaCertDao.AddUserCaCert(tx, userCaCert) }
// if err != nil || userCaCert == nil {
// return false, errors.New(err.Error()) signParam["pageList"] = []int{1}
// } signParam["sealImg"] = signImage
//
// return true, nil signParams = append(signParams, signParam)
// }
signParamJson, err := json.Marshal(signParams)
if err != nil {
return false, err
}
// 添加签章配置
cloudCertRequestData := &ca.AddUserSignConfigRequest{
UserId: fmt.Sprintf("%d", entityId),
ConfigKey: fmt.Sprintf("%d", entityId),
CertSn: cardNum,
SignParam: string(signParamJson),
SealImg: signImage,
}
_, err = ca.AddUserSignConfig(cloudCertRequestData)
if err != nil {
return false, errors.New(err.Error())
}
// 修改ca监管证书表
data := make(map[string]interface{})
data["is_sign_config"] = 1
data["sign_config"] = string(signParamJson)
err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data)
if err != nil {
return false, errors.New("修改签证配置失败")
}
return true, nil
}

View File

@ -5,7 +5,11 @@ import (
"crypto/sha1" "crypto/sha1"
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"hospital-admin-api/config" "hospital-admin-api/config"
"io"
"os"
"strings" "strings"
"time" "time"
) )
@ -54,3 +58,108 @@ func GetOssSign(dir string) (*GetOssSignResponse, error) {
return response, nil return response, nil
} }
// CreateClient 创建客户端
func CreateClient() (*oss.Client, error) {
// 创建OSSClient实例。
client, err := oss.New(config.C.Oss.OssEndpoint, config.C.Oss.OssAccessKey, config.C.Oss.OssAccessKeySecret)
if err != nil {
return nil, err
}
return client, nil
}
// GetCusTomObjectToRAM 下载自定义风格文件到内存
func GetCusTomObjectToRAM(filename string, style string) (string, error) {
if style == "" {
style = "image/resize"
}
ossClient, err := CreateClient()
if err != nil {
return "", err
}
// yourBucketName填写存储空间名称。
bucket, err := ossClient.Bucket(config.C.Oss.OssBucket)
if err != nil {
return "", err
}
// 下载文件到流。
body, err := bucket.GetObject(filename, oss.Process(style))
if err != nil {
return "", err
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
defer func(body io.ReadCloser) {
_ = body.Close()
}(body)
data, err := io.ReadAll(body)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
return string(data), nil
}
// GetObjectToRAM 下载文件到内存
func GetObjectToRAM(filename string) (string, error) {
ossClient, err := CreateClient()
if err != nil {
return "", err
}
// yourBucketName填写存储空间名称。
bucket, err := ossClient.Bucket(config.C.Oss.OssBucket)
if err != nil {
return "", err
}
// 下载文件到流。
body, err := bucket.GetObject(filename)
if err != nil {
return "", err
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
defer func(body io.ReadCloser) {
_ = body.Close()
}(body)
data, err := io.ReadAll(body)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
return string(data), nil
}
// GetObjectToLocal 下载文件到本地
func GetObjectToLocal(filename, local string) (bool, error) {
ossClient, err := CreateClient()
if err != nil {
return false, err
}
// yourBucketName填写存储空间名称。
bucket, err := ossClient.Bucket(config.C.Oss.OssBucket)
if err != nil {
return false, err
}
// 下载文件到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
// 依次填写Object完整路径例如exampledir/exampleobject.txt和本地文件的完整路径(例如D:\\localpath\\examplefile.txt)。Object完整路径中不能包含Bucket名称。
err = bucket.GetObjectToFile(filename, local)
if err != nil {
return false, err
}
return true, nil
}

View File

@ -76,7 +76,7 @@ type AddUserSignConfigRequest struct {
KeypairType string `json:"keypairType"` // 秘钥类型(3云证书) KeypairType string `json:"keypairType"` // 秘钥类型(3云证书)
CertSn string `json:"certSn"` // 证书序列号,使用医生身份证号即可 CertSn string `json:"certSn"` // 证书序列号,使用医生身份证号即可
SignType string `json:"signType"` // 签章方式(签章类型; 4客户端坐标签章;5客户端关键字签章;) SignType string `json:"signType"` // 签章方式(签章类型; 4客户端坐标签章;5客户端关键字签章;)
SignParam string `json:"authNoticeType"` // 签章配置,JSON SignParam string `json:"signParam"` // 签章配置,JSON
SealImg string `json:"sealImg"` // 签章图片base64格式 SealImg string `json:"sealImg"` // 签章图片base64格式
SealType string `json:"sealType"` SealType string `json:"sealType"`
SignTemplate string `json:"signTemplate"` SignTemplate string `json:"signTemplate"`

View File

@ -352,39 +352,45 @@ func RemoveCloudCert(d *RemoveCloudCertRequest) (bool, error) {
} }
// AddUserSignConfig 添加用户签章配置 // AddUserSignConfig 添加用户签章配置
// func AddUserSignConfig(d *AddUserSignConfigRequest) (bool, error) { func AddUserSignConfig(d *AddUserSignConfigRequest) (bool, error) {
// if d == nil { if d == nil {
// return false, errors.New("获取云证书失败") return false, errors.New("获取云证书失败")
// } }
//
// // 获取签名 // 获取签名
// requestDataMap := make(map[string]interface{}) requestDataMap := make(map[string]interface{})
// requestDataMap["entityId"] = d.EntityId requestDataMap["userId"] = d.UserId
// requestDataMap["pin"] = d.Pin requestDataMap["configKey"] = d.UserId
// requestDataMap["authType"] = d.AuthType requestDataMap["keypairType"] = "3"
// requestDataMap["authTime"] = d.AuthTime requestDataMap["certSn"] = d.CertSn
// requestDataMap["authResult"] = d.AuthResult requestDataMap["signType"] = "4"
// requestDataMap["authNoticeType"] = d.AuthNoticeType requestDataMap["signParam"] = d.SignParam
// signature := GenerateSignature(requestDataMap) requestDataMap["sealImg"] = d.SealImg
// if signature == "" { requestDataMap["sealType"] = "4"
// return false, errors.New("云证书签名错误") requestDataMap["signTemplate"] = "0"
// } signature := GenerateSignature(requestDataMap)
// if signature == "" {
// formData := url.Values{} return false, errors.New("云证书签名错误")
// formData.Set("entityId", d.EntityId) }
// formData.Set("pin", d.Pin)
// formData.Set("authType", d.AuthType) formData := url.Values{}
// formData.Set("authTime", d.AuthTime) formData.Set("userId", d.UserId)
// formData.Set("authResult", d.AuthResult) formData.Set("configKey", d.UserId)
// formData.Set("authNoticeType", d.AuthNoticeType) formData.Set("keypairType", "3")
// formData.Set("certSn", d.CertSn)
// // 构建请求 URL formData.Set("signType", "4")
// requestUrl := config.C.CaOnline.CaOnlineApiUrl + "/cloud-certificate-service/api/cloudCert/open/v2/cert/certRevoke" formData.Set("signParam", d.SignParam)
// formData.Set("sealImg", d.SealImg)
// _, err := postRequest(requestUrl, formData, signature) formData.Set("sealType", "4")
// if err != nil { formData.Set("signTemplate", "0")
// return false, errors.New(err.Error())
// } // 构建请求 URL
// requestUrl := config.C.CaOnline.CaOnlineApiUrl + "/signature-server/api/open/signature/userSignConfig"
// return true, nil
// } _, err := postRequest(requestUrl, formData, signature)
if err != nil {
return false, errors.New(err.Error())
}
return true, nil
}