From 3a124aa778273b0da6265b8529ea839bb1b7b346 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 25 Sep 2024 11:56:44 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83=E6=A0=BC=EF=BC=8C?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderProduct.go | 28 +- api/model/orderProductItem.go | 1 + api/service/export.go | 237 ++++++++------- utils/export.go | 530 +++++++++++++++++++--------------- utils/exportbak.go | 298 +++++++++++++++++++ 5 files changed, 768 insertions(+), 326 deletions(-) create mode 100644 utils/exportbak.go diff --git a/api/dao/orderProduct.go b/api/dao/orderProduct.go index 91aeb9c..be4fdf5 100644 --- a/api/dao/orderProduct.go +++ b/api/dao/orderProduct.go @@ -68,6 +68,22 @@ func (r *OrderProductDao) GetOrderProductList(maps interface{}) (m []*model.Orde return m, nil } +// GetOrderProductNormalList 获取药品订单列表-正常订单 +func (r *OrderProductDao) GetOrderProductNormalList(maps interface{}, createdAt model.LocalTime) (m []*model.OrderProduct, err error) { + query := global.Db.Where(maps) + + // 格式化时间为 "Y-m-d H:i:s" + at := time.Time(createdAt).Format("2006-01-02 15:04:05") + query = query.Where("created_at < ?", at) // 有效使用时间 + + query = query.Where("order_product_status in (?)", []string{"1", "2", "3", "4"}) + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetOrderProduct 获取药品订单 func (r *OrderProductDao) GetOrderProduct(maps interface{}) (m *model.OrderProduct, err error) { err = global.Db.Where(maps).First(&m).Error @@ -334,6 +350,10 @@ func (r *OrderProductDao) GetOrderProductExportListSearch(req requests.OrderProd return db.Omit("open_id", "union_id", "wx_session_key") }) + query = query.Preload("UserDoctor.User", func(db *gorm.DB) *gorm.DB { + return db.Select("user_id", "user_name", "mobile") + }) + // 处方 query = query.Preload("OrderPrescription", func(db *gorm.DB) *gorm.DB { return db.Select("order_prescription_id", "prescription_code") @@ -349,6 +369,12 @@ func (r *OrderProductDao) GetOrderProductExportListSearch(req requests.OrderProd return db.Select("user_id", "user_name", "mobile") }) + // 药品列表 + query = query.Preload("OrderProductItem") + + // 药品列表-药品 + query = query.Preload("OrderProductItem.Product") + // 当前搜索数据 if req.Type == 1 { // 医生姓名 @@ -534,7 +560,7 @@ func (r *OrderProductDao) GetOrderProductExportListSearch(req requests.OrderProd } // 排序 - query = query.Order("created_at desc") + query = query.Order("created_at asc") err = query.Find(&m).Error if err != nil { diff --git a/api/model/orderProductItem.go b/api/model/orderProductItem.go index 5b56c51..4cab3c0 100644 --- a/api/model/orderProductItem.go +++ b/api/model/orderProductItem.go @@ -21,6 +21,7 @@ type OrderProductItem struct { ProductCoverImg string `gorm:"column:product_cover_img;type:varchar(255);comment:商品封面图" json:"product_cover_img"` ProductSpec string `gorm:"column:product_spec;type:varchar(255);comment:商品规格" json:"product_spec"` Model + Product *Product `gorm:"foreignKey:ProductId;references:product_id" json:"product"` // 药品 } func (m *OrderProductItem) TableName() string { diff --git a/api/service/export.go b/api/service/export.go index c70155a..fd8d7e3 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -245,40 +245,54 @@ type OrderInquiry struct { // OrderProductData 药品订单 type OrderProductData struct { - OrderProductNo string // 订单编号 - DoctorName string // 医生姓名 - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge string // 患者年龄-就诊人 - PatientMobile string // 患者电话 - EscrowTradeNo string // 第三方支付流水号 - PrescriptionCode string // 处方编号 - OrderProductStatus string // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) - PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付);NOT NULL - PayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - CancelReason string // 订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消) - AmountTotal float64 // 订单金额 - PaymentAmountTotal float64 // 实际付款金额 - LogisticsFee float64 // 运费金额 - LogisticsNo string // 物流编号 - LogisticsCompanyCode string // 快递公司编码 - ProductNames string // 药品列表 - DeliveryTime time.Time // 发货时间 - PayTime time.Time // 支付时间 - Remarks string // 订单备注 - RefundStatus string // 商品订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) - CancelTime time.Time // 订单取消时间 - CancelRemarks string // 订单取消备注(自动添加) - ReportPreStatus string // 上报处方平台状态(0:未上报 1:已上报 2:上报失败)) - ReportPreTime time.Time // 上报处方平台时间 - ReportPreFailReason string // 上报失败原因 - Province string // 省份 - City string // 城市 - County string // 区县 - Address string // 详细地址 - ConsigneeName string // 收货人姓名 - ConsigneeTel string // 收货人电话 - CreatedAt time.Time // 创建时间 + OrderProductNo string // 订单编号 + OrderProductStatus string // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) + AmountTotal float64 // 订单金额 + CouponAmountTotal float64 // 优惠卷总金额 + PaymentAmountTotal float64 // 实际付款金额 + LogisticsFee float64 // 运费金额 + CreatedAt string // 创建时间 + Remarks string // 订单备注 + DoctorName string // 医生姓名 + DoctorMobile string // 医生电话 + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge string // 患者年龄-就诊人 + PatientMobile string // 患者电话 + HistoryBuyCount string // 历史购买次数 + HistoryBuyOrderProductNo string // 历史购买单号(逗号分隔) + EscrowTradeNo string // 第三方支付流水号 + PayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + PayTime string // 支付时间 + PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付);NOT NULL + PrescriptionCode string // 处方编号 + ReportPreStatus string // 上报处方平台状态(0:未上报 1:已上报 2:上报失败)) + ReportPreTime string // 上报处方平台时间 + ReportPreFailReason string // 上报失败原因 + LogisticsNo string // 物流编号 + LogisticsCompanyCode string // 快递公司编码 + DeliveryTime string // 发货时间 + ProductItem []OrderProductItemData // 药品列表 + RefundStatus string // 商品订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + CancelTime string // 订单取消时间 + CancelRemarks string // 订单取消备注(自动添加) + CancelReason string // 订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消) + ConsigneeName string // 收货人姓名 + ConsigneeTel string // 收货人电话 + Province string // 省份 + City string // 城市 + County string // 区县 + Address string // 详细地址 +} + +// OrderProductItemData 药品订单-药品列表 +type OrderProductItemData struct { + ProductName string // 商品名称 + ProductPlatformCode string // 处方平台商品编码 + ProductSpec string // 商品规格 + AvailableDays float64 // 可用天数(3) + ProductAmount string // 药品数量 + ProductPrice float64 // 商品价格 } // OrderServicePackageDto 订单-服务包 @@ -383,7 +397,7 @@ func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdr {Value: "申请时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, } - var interfaceSlice []interface{} + var dataSlice []interface{} for _, v := range doctorWithdrawals { // 审核状态 examineStatus := utils.WithdrawalExamineStatusToString(v.ExamineStatus) @@ -480,10 +494,10 @@ func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdr CreatedAt: createdAt, } - interfaceSlice = append(interfaceSlice, doctorWithdrawalData) + dataSlice = append(dataSlice, doctorWithdrawalData) } - file, err := utils.Export(header, interfaceSlice) + file, err := utils.Export(header, dataSlice) if err != nil { return "", err } @@ -522,7 +536,7 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do {Value: "医生收益", CellType: "float", NumberFmt: "0.0000", ColWidth: 18}, } - var interfaceSlice []interface{} + var dataSlice []interface{} for _, v := range doctorWithdrawalOrders { // 医生姓名 doctorName := "" @@ -594,10 +608,10 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do DoctorAmount: doctorAmount, } - interfaceSlice = append(interfaceSlice, doctorWithdrawalOrderData) + dataSlice = append(dataSlice, doctorWithdrawalOrderData) } - file, err := utils.Export(header, interfaceSlice) + file, err := utils.Export(header, dataSlice) if err != nil { return "", err } @@ -673,7 +687,7 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err {Value: "银行地址", CellType: "string", NumberFmt: "", ColWidth: 46}, } - var interfaceSlice []interface{} + var dataSlice []interface{} for _, v := range userDoctors { userDoctorData := UserDoctorData{ UserName: v.UserName, @@ -914,10 +928,10 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err } } - interfaceSlice = append(interfaceSlice, userDoctorData) + dataSlice = append(dataSlice, userDoctorData) } - file, err := utils.Export(header, interfaceSlice) + file, err := utils.Export(header, dataSlice) if err != nil { return "", err } @@ -1510,42 +1524,53 @@ func (r *ExportService) OrderInquiry(d []*model.OrderInquiry) (string, error) { // OrderProduct 药品订单 func (r *ExportService) OrderProduct(d []*model.OrderProduct) (string, error) { header := []utils.HeaderCellData{ - {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: 35}, - {Value: "处方编号", CellType: "string", NumberFmt: "", ColWidth: 28}, - {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: "float64", NumberFmt: "0.0000", ColWidth: 18}, - {Value: "实际付款金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, - {Value: "运费金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, - {Value: "物流编号", CellType: "string", NumberFmt: "", ColWidth: 18}, - {Value: "快递公司编码", CellType: "string", NumberFmt: "", ColWidth: 18}, - {Value: "药品", CellType: "string", NumberFmt: "", ColWidth: 35}, - {Value: "发货时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, - {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: 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: 20}, - {Value: "城市", CellType: "string", NumberFmt: "", ColWidth: 22}, - {Value: "区县", CellType: "string", NumberFmt: "", ColWidth: 25}, - {Value: "详细地址", CellType: "string", NumberFmt: "", ColWidth: 35}, - {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, Colour: "#FFD700"}, + {Value: "订单状态", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFD700"}, + {Value: "订单金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18, Colour: "#FFD700"}, + {Value: "优惠卷总金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18, Colour: "#FFD700"}, + {Value: "实际付款金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18, Colour: "#FFD700"}, + {Value: "运费金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18, Colour: "#FFD700"}, + {Value: "创建时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30, Colour: "#FFD700"}, + {Value: "订单备注", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFD700"}, + {Value: "医生姓名", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#EE9A49"}, + {Value: "医生手机号", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#EE9A49"}, + {Value: "患者姓名-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#40E0D0"}, + {Value: "患者性别-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#40E0D0"}, + {Value: "患者年龄-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#40E0D0"}, + {Value: "患者电话", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#40E0D0"}, + {Value: "历史购买次数", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#40E0D0"}, + {Value: "历史购买单号", CellType: "string", NumberFmt: "", ColWidth: 40, Colour: "#40E0D0"}, + {Value: "第三方支付流水号", CellType: "string", NumberFmt: "", ColWidth: 35, Colour: "#90EE90"}, + {Value: "支付状态", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#90EE90"}, + {Value: "支付时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30, Colour: "#90EE90"}, + {Value: "支付渠道", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#90EE90"}, + {Value: "处方编号", CellType: "string", NumberFmt: "", ColWidth: 28, Colour: "#FFE4E1"}, + {Value: "上报处方平台状态", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFE4E1"}, + {Value: "上报处方平台时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30, Colour: "#FFE4E1"}, + {Value: "上报失败原因", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFE4E1"}, + {Value: "物流编号", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#CAE1FF"}, + {Value: "快递公司编码", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#CAE1FF"}, + {Value: "发货时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30, Colour: "#CAE1FF"}, + {Value: "药品名称", CellType: "string", NumberFmt: "", ColWidth: 40, Colour: "#AB82FF"}, + {Value: "处方平台编码", CellType: "string", NumberFmt: "", ColWidth: 30, Colour: "#AB82FF"}, + {Value: "商品规格", CellType: "string", NumberFmt: "", ColWidth: 30, Colour: "#AB82FF"}, + {Value: "用药天数", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#AB82FF"}, + {Value: "药品数量", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#AB82FF"}, + {Value: "药品价格", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18, Colour: "#AB82FF"}, + {Value: "退款状态", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#90EE90"}, + {Value: "订单取消时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30, Colour: "#90EE90"}, + {Value: "订单取消备注", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#90EE90"}, + {Value: "订单取消原因", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#90EE90"}, + {Value: "收货人姓名", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFDEAD"}, + {Value: "收货人电话", CellType: "string", NumberFmt: "", ColWidth: 18, Colour: "#FFDEAD"}, + {Value: "省份", CellType: "string", NumberFmt: "", ColWidth: 20, Colour: "#FFDEAD"}, + {Value: "城市", CellType: "string", NumberFmt: "", ColWidth: 22, Colour: "#FFDEAD"}, + {Value: "区县", CellType: "string", NumberFmt: "", ColWidth: 25, Colour: "#FFDEAD"}, + {Value: "详细地址", CellType: "string", NumberFmt: "", ColWidth: 35, Colour: "#FFDEAD"}, } + orderProductDao := dao.OrderProductDao{} + var dataSlice []interface{} for _, v := range d { data := OrderProductData{ @@ -1556,6 +1581,7 @@ func (r *ExportService) OrderProduct(d []*model.OrderProduct) (string, error) { PayStatus: utils.PayStatusToString(v.PayStatus), CancelReason: utils.ProductCancelReasonToString(v.CancelReason), AmountTotal: v.AmountTotal, + CouponAmountTotal: v.CouponAmountTotal, PaymentAmountTotal: v.PaymentAmountTotal, LogisticsFee: v.LogisticsFee, LogisticsNo: v.LogisticsNo, @@ -1576,6 +1602,11 @@ func (r *ExportService) OrderProduct(d []*model.OrderProduct) (string, error) { if v.UserDoctor != nil { // 医生姓名 data.DoctorName = v.UserDoctor.UserName + + if v.UserDoctor.User != nil { + // 医生电话 + data.DoctorMobile = v.UserDoctor.User.Mobile + } } if v.OrderInquiry != nil { @@ -1600,44 +1631,54 @@ func (r *ExportService) OrderProduct(d []*model.OrderProduct) (string, error) { } if v.DeliveryTime != (model.LocalTime{}) { - t := time.Time(v.DeliveryTime) - data.DeliveryTime = t + data.DeliveryTime = time.Time(v.DeliveryTime).Format("2006-01-02 15:04:05") } if v.PayTime != (model.LocalTime{}) { - t := time.Time(v.PayTime) - data.PayTime = t + data.PayTime = time.Time(v.PayTime).Format("2006-01-02 15:04:05") } if v.CancelTime != (model.LocalTime{}) { - t := time.Time(v.CancelTime) - data.CancelTime = t + data.CancelTime = time.Time(v.CancelTime).Format("2006-01-02 15:04:05") } if v.ReportPreTime != (model.LocalTime{}) { - t := time.Time(v.ReportPreTime) - data.ReportPreTime = t + data.ReportPreTime = time.Time(v.ReportPreTime).Format("2006-01-02 15:04:05") } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } - // 处理药品列表 - orderProductItemDao := dao.OrderProductItemDao{} - orderProductItems, err := orderProductItemDao.GetOrderProductItemByOrderProductId(v.OrderProductId) - if err == nil || len(orderProductItems) > 0 { - var products []string - for _, v := range orderProductItems { - amount := fmt.Sprintf("%d", v.Amount) - productPrice := fmt.Sprintf("%.2f", v.ProductPrice) - product := v.ProductName + "(N:" + amount + " " + "P:" + productPrice + ")" + // 历史购买次数 + maps := make(map[string]interface{}) + maps["patient_id"] = v.PatientId + orderProducts, err := orderProductDao.GetOrderProductNormalList(maps, v.CreatedAt) + if err != nil { + return "", err + } + data.HistoryBuyCount = fmt.Sprintf("%d", len(orderProducts)) - products = append(products, product) + // 历史购买单号(逗号分隔) + var HistoryBuyOrderProductNo []string + for _, product := range orderProducts { + HistoryBuyOrderProductNo = append(HistoryBuyOrderProductNo, fmt.Sprintf("%s", product.OrderProductNo)) + } + + data.HistoryBuyOrderProductNo = strings.Join(HistoryBuyOrderProductNo, ",") + + // 处理药品列表 + for _, item := range v.OrderProductItem { + productItem := OrderProductItemData{ + ProductName: item.ProductName, + ProductPlatformCode: item.ProductPlatformCode, + ProductSpec: item.ProductSpec, + AvailableDays: item.Product.AvailableDays, + ProductAmount: fmt.Sprintf("%d", item.Amount), + ProductPrice: item.ProductPrice, } - data.ProductNames = strings.Join(products, "; ") + data.ProductItem = append(data.ProductItem, productItem) } dataSlice = append(dataSlice, data) diff --git a/utils/export.go b/utils/export.go index a726458..71c6e00 100644 --- a/utils/export.go +++ b/utils/export.go @@ -2,109 +2,40 @@ package utils import ( "bytes" + "errors" "fmt" "github.com/xuri/excelize/v2" "reflect" - "strconv" ) -// func Export(widths []int) (bool, error) { -// f := excelize.NewFile() -// defer func() { -// _ = f.Close() -// }() -// -// // 创建一个工作表 -// index, err := f.NewSheet("Sheet1") -// if err != nil { -// return false, err -// } -// -// // 设置工作簿的默认工作表 -// f.SetActiveSheet(index) -// -// // 单元格对齐样式 -// alignment := &excelize.Alignment{ -// Horizontal: "center", -// Vertical: "center", -// } -// -// // 单元格颜色填充样式 -// fill := excelize.Fill{ -// Type: "pattern", -// Pattern: 1, -// Color: []string{"#c9daf8"}, -// Shading: 0, -// } -// -// // 第一行的左、右、下边框 -// border := []excelize.Border{ -// { -// Type: "left,right,bottom", -// Color: "", -// Style: 1, -// }, -// } -// -// // 工作表样式 -// style, err := f.NewStyle( -// &excelize.Style{ -// Fill: fill, -// Alignment: alignment, -// Border: border, -// }, -// ) -// if err != nil { -// return false, err -// } -// -// // 依次设置每一列的列宽 -// widths = []int{18, 18, 18, 18, 18, 20, 23, 46, 18, 30, 30, 18, 18, 30, 18, 30} -// for col, width := range widths { -// // 获取列名 -// colName, err := excelize.ColumnNumberToName(col + 1) -// if err != nil { -// return false, err -// } -// -// // 设置列宽 -// err = f.SetColWidth("Sheet1", colName, colName, float64(width)) -// if err != nil { -// return false, err -// } -// -// // 设置列背景颜色 -// err = f.SetCellStyle("Sheet1", colName+"1", colName+"1", style) -// if err != nil { -// return false, err -// } -// } -// -// // 设置行高 -// err = f.SetRowStyle("Sheet1", 1, 10, style) -// if err != nil { -// return false, err -// } -// -// if err := f.SaveAs("output.xlsx"); err != nil { -// return false, err -// } -// -// return true, nil -// } - // HeaderCellData 表头内容 type HeaderCellData struct { Value string // 值 CellType string // 类型 NumberFmt string // 格式化方式 ColWidth int // 列宽 + Colour string // 颜色 } -func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) { - sheetName := "Sheet1" +// GenerateSheet 生成表格 +func GenerateSheet(header []HeaderCellData, sheetName string) (f *excelize.File, err error) { + // 创建工作表 + err, f = createSheet(sheetName) + if err != nil { + return nil, err + } - f := excelize.NewFile() + // 设置表头 + if err := setHeader(f, sheetName, header); err != nil { + return nil, err + } + + return f, nil +} + +// 创建工作表 +func createSheet(sheetName string) (err error, f *excelize.File) { + f = excelize.NewFile() defer func() { _ = f.Close() }() @@ -112,7 +43,7 @@ func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) // 创建一个工作表 index, err := f.NewSheet(sheetName) if err != nil { - return nil, err + return err, nil } // 设置工作簿的默认工作表 @@ -121,178 +52,323 @@ func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) // 设置工作表默认字体 err = f.SetDefaultFont("宋体") if err != nil { - return nil, err - } - - // 统一单元格对齐样式 - alignment := &excelize.Alignment{ - Horizontal: "center", - Vertical: "center", + return err, nil } // 设置行高 35-第一行 err = f.SetRowHeight(sheetName, 1, 35) if err != nil { - return nil, err + return err, nil } - // 处理工作表表头 + return nil, f +} + +// 设置表头 +func setHeader(f *excelize.File, sheetName string, header []HeaderCellData) error { for c, cell := range header { // 获取列名 colName, err := excelize.ColumnNumberToName(c + 1) if err != nil { - return nil, err + return err } // 添加单元格的值 - err = f.SetCellValue(sheetName, colName+"1", cell.Value) - if err != nil { - return nil, err + if err := f.SetCellValue(sheetName, colName+"1", cell.Value); err != nil { + return err } // 单元格颜色填充样式 - fill := excelize.Fill{ - Type: "pattern", - Pattern: 1, - Color: []string{"#c9daf8"}, - Shading: 0, + var fill excelize.Fill + if cell.Colour != "" { + fill = excelize.Fill{ + Type: "pattern", + Pattern: 1, + Color: []string{cell.Colour}, + Shading: 0, + } } // 第一行的左、右、下边框 border := []excelize.Border{ - { - Type: "left", - Color: "#000000", - Style: 1, - }, - { - Type: "right", - Color: "#000000", - Style: 1, - }, - { - Type: "bottom", - Color: "#000000", - Style: 1, - }, + {Type: "left", Color: "#000000", Style: 1}, + {Type: "right", Color: "#000000", Style: 1}, + {Type: "bottom", Color: "#000000", Style: 1}, } // 设置单元格值类型和格式 - style, _ := f.NewStyle(&excelize.Style{ - Alignment: alignment, // 字体居中 - Fill: fill, // 背景颜色 - Border: border, // 边框 + style, err := f.NewStyle(&excelize.Style{ + Alignment: &excelize.Alignment{ + Horizontal: "center", + Vertical: "center", + }, + Fill: fill, + Border: border, }) - err = f.SetCellStyle(sheetName, colName+"1", colName+"1", style) if err != nil { - return nil, err + return err } - // 设置列宽 - err = f.SetColWidth(sheetName, colName, colName, float64(cell.ColWidth)) - if err != nil { - return nil, err + if err := f.SetCellStyle(sheetName, colName+"1", colName+"1", style); err != nil { + return err + } + + if err := f.SetColWidth(sheetName, colName, colName, float64(cell.ColWidth)); err != nil { + return err } } + return nil +} - // 设置单元格格式 - row := len(data) - for i, cell := range header { - // 获取列名 - colName, err := excelize.ColumnNumberToName(i + 1) - if err != nil { - return nil, err - } - - // 字体居中 - style := &excelize.Style{} - style = &excelize.Style{ - Alignment: alignment, - } - - if cell.CellType == "float" { - style.NumFmt = 2 - customNumFmt := "0.000" - style.CustomNumFmt = &customNumFmt - } - - if cell.CellType == "date" { - style.NumFmt = 22 - customNumFmt := "yyyy-mm-dd hh:mm:ss" - style.CustomNumFmt = &customNumFmt - } - - newStyle, _ := f.NewStyle(style) - err = f.SetCellStyle(sheetName, colName+"2", colName+strconv.Itoa(row), newStyle) - if err != nil { - return nil, err - } - } - - // 填充数据 - for r, rowData := range data { - rv := reflect.ValueOf(rowData) - for c := 0; c < rv.NumField(); c++ { - cellValue := rv.Field(c).Interface() - // 获取列名 - colName, err := excelize.ColumnNumberToName(c + 1) - if err != nil { - return nil, err - } - - axis := colName + fmt.Sprintf("%d", r+2) - - // 设置单元格值 - err = f.SetCellValue(sheetName, axis, cellValue) - if err != nil { - return nil, err - } - - // 设置单元格值类型 - cellType := header[c].CellType - - // 字体居中 - style := &excelize.Style{} - style = &excelize.Style{ - Alignment: alignment, - } - - if cellType == "float" { - style.NumFmt = 2 - customNumFmt := "0.000" - style.CustomNumFmt = &customNumFmt - } - - if cellType == "date" { - style.NumFmt = 22 - customNumFmt := "yyyy-mm-dd hh:mm:ss" - style.CustomNumFmt = &customNumFmt - } - - newStyle, _ := f.NewStyle(style) - err = f.SetCellStyle(sheetName, axis, axis, newStyle) - if err != nil { - return nil, err - } - - // 设置行高 35-第一行 - err = f.SetRowHeight(sheetName, r+2, 35) - if err != nil { - return nil, err - } - } - } - - buffer, err := f.WriteToBuffer() +// Export 导出 +func Export(header []HeaderCellData, data []interface{}) (b *bytes.Buffer, err error) { + sheetName := "Sheet1" + // 生成表格 + f, err := GenerateSheet(header, sheetName) if err != nil { return nil, err } - return buffer, nil + alignment := &excelize.Alignment{ + Horizontal: "center", + Vertical: "center", + } + + row := 1 + for _, item := range data { + var err error + row, err = fillDataWithMerge(f, sheetName, header, item, row, alignment) + if 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("已导出文件") + if err := f.SaveAs("output.xlsx"); err != nil { + return nil, err + } + return nil, errors.New("已导出文件") +} + +// 填充数据 +func fillDataWithMerge(f *excelize.File, sheetName string, header []HeaderCellData, data interface{}, row int, alignment *excelize.Alignment) (int, error) { + v := reflect.ValueOf(data) + + // 判断是否是结构体或指向结构体的指针 + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if v.Kind() != reflect.Struct { + panic("data must be a struct or a pointer to struct") + } + + var axis string // 坐标值 + + colOffset := 0 // 列偏移量 + mergeNum := 0 // 合并单元格数量。默认为0,每次+1,当存在切片时启用 + var mergeNumSlice []string // 需合并单元格列名。默认为空,当存在切片时启用["A","B"] + filedNumSlice := 1 // 切片数量,默认为1,此数量为其余需合并的数量 + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + + // 获取字段类型 + valueType := field.Kind() + if valueType != reflect.Slice { + // 获取字段值 + cellValue := field.Interface() + + // 获取列名 + colName, err := excelize.ColumnNumberToName(colOffset + 1) + if err != nil { + return 0, err + } + + // 获取坐标,+1表示去除header行 + axis = colName + fmt.Sprintf("%d", row+1) + + // 填入值 + err = f.SetCellValue(sheetName, axis, cellValue) + if err != nil { + return 0, err + } + + // 设置单元格样式 + err = setCellStyle(f, sheetName, axis, header[i], alignment) + if err != nil { + return 0, err + } + + // 设置行高 35-第一行 + err = f.SetRowHeight(sheetName, row+1, 35) + if err != nil { + return 0, err + } + + // 合并单元格数量 + mergeNum = mergeNum + 1 + mergeNumSlice = append(mergeNumSlice, colName) + } else { + var sliceFieldNum int // 切片字段数量 + + // 最大切片数量,此数量为其余需合并的数量 + if filedNumSlice < field.Len() { + filedNumSlice = field.Len() + } + + for j := 0; j < field.Len(); j++ { + item := field.Index(j).Interface() + v1 := reflect.ValueOf(item) + + for i2 := 0; i2 < field.Index(j).NumField(); i2++ { + // 获取字段值 + cellValue := v1.Field(i2).Interface() + + // 获取列名 + colName, err := excelize.ColumnNumberToName(i + i2 + 1) + if err != nil { + return 0, err + } + + // 获取坐标,+1表示去除header行 + axis = colName + fmt.Sprintf("%d", row+j+1) + + // 填入值 + err = f.SetCellValue(sheetName, axis, cellValue) + if err != nil { + return 0, err + } + + // 设置单元格样式 + err = setCellStyle(f, sheetName, axis, header[i+i2], alignment) + if err != nil { + return row, err + } + + // 设置行高 35-第一行 + err = f.SetRowHeight(sheetName, row+j+1, 35) + if err != nil { + return row, err + } + + sliceFieldNum = i2 + } + + } + + // 列偏移量需增加上切片字段数量 + colOffset = colOffset + sliceFieldNum + } + + colOffset++ + } + + // 合并单元格 + if filedNumSlice > 1 { + for _, s := range mergeNumSlice { + // 设置单元格样式 + for i := 0; i < filedNumSlice; i++ { + axis = s + fmt.Sprintf("%d", row+i+1) + err := setCellStyle(f, sheetName, axis, header[row+i], alignment) + if err != nil { + return row, err + } + } + + startCell := s + fmt.Sprintf("%d", row+1) + endCell := s + fmt.Sprintf("%d", row+filedNumSlice) + err := f.MergeCell(sheetName, startCell, endCell) + if err != nil { + return 0, err + } + } + } + + // 行数 = 切片数量,如不存在切片filedNumSlice默认为1 + row = row + filedNumSlice + + // 返回当前处理到的行数 + return row, nil +} + +// 设置单元格样式 +func setCellStyle(f *excelize.File, sheetName, axis string, header HeaderCellData, alignment *excelize.Alignment) error { + // 获取现有样式id + styleID, err := f.GetCellStyle(sheetName, axis) + if err != nil { + return err + } + + // 处理样式问题 + var style *excelize.Style + if styleID == 0 { + // 新样式 + style = &excelize.Style{ + Alignment: alignment, + } + } else { + // 存在现有样式,直接获取 + style, err = f.GetStyle(styleID) + if err != nil { + return err + } + } + + if header.CellType == "float" { + style.NumFmt = 2 + customNumFmt := "0.000" + style.CustomNumFmt = &customNumFmt + } + + if header.CellType == "date" { + style.NumFmt = 22 + customNumFmt := "yyyy-mm-dd hh:mm:ss" + style.CustomNumFmt = &customNumFmt + } + + // 颜色-可用,但是目前无需使用 + if header.Colour != "" { + // 单元格颜色 + //fill := excelize.Fill{ + // Type: "pattern", + // Pattern: 1, + // Color: []string{header.Colour}, + // Shading: 0, + //} + // + //style.Fill = fill + // + //// 字体颜色 + //font := &excelize.Font{ + // Color: header.Colour, + //} + // + //style.Font = font + } + + // 边框 + border := []excelize.Border{ + {Type: "left", Color: "#000000", Style: 1}, + {Type: "right", Color: "#000000", Style: 1}, + {Type: "bottom", Color: "#000000", Style: 1}, + } + + style.Border = border + + newStyle, err := f.NewStyle(style) + if err != nil { + return err + } + + if err := f.SetCellStyle(sheetName, axis, axis, newStyle); err != nil { + return err + } + + return nil } diff --git a/utils/exportbak.go b/utils/exportbak.go new file mode 100644 index 0000000..e6557a5 --- /dev/null +++ b/utils/exportbak.go @@ -0,0 +1,298 @@ +package utils + +import ( + "bytes" + "fmt" + "github.com/xuri/excelize/v2" + "reflect" + "strconv" +) + +// func Export(widths []int) (bool, error) { +// f := excelize.NewFile() +// defer func() { +// _ = f.Close() +// }() +// +// // 创建一个工作表 +// index, err := f.NewSheet("Sheet1") +// if err != nil { +// return false, err +// } +// +// // 设置工作簿的默认工作表 +// f.SetActiveSheet(index) +// +// // 单元格对齐样式 +// alignment := &excelize.Alignment{ +// Horizontal: "center", +// Vertical: "center", +// } +// +// // 单元格颜色填充样式 +// fill := excelize.Fill{ +// Type: "pattern", +// Pattern: 1, +// Color: []string{"#c9daf8"}, +// Shading: 0, +// } +// +// // 第一行的左、右、下边框 +// border := []excelize.Border{ +// { +// Type: "left,right,bottom", +// Color: "", +// Style: 1, +// }, +// } +// +// // 工作表样式 +// style, err := f.NewStyle( +// &excelize.Style{ +// Fill: fill, +// Alignment: alignment, +// Border: border, +// }, +// ) +// if err != nil { +// return false, err +// } +// +// // 依次设置每一列的列宽 +// widths = []int{18, 18, 18, 18, 18, 20, 23, 46, 18, 30, 30, 18, 18, 30, 18, 30} +// for col, width := range widths { +// // 获取列名 +// colName, err := excelize.ColumnNumberToName(col + 1) +// if err != nil { +// return false, err +// } +// +// // 设置列宽 +// err = f.SetColWidth("Sheet1", colName, colName, float64(width)) +// if err != nil { +// return false, err +// } +// +// // 设置列背景颜色 +// err = f.SetCellStyle("Sheet1", colName+"1", colName+"1", style) +// if err != nil { +// return false, err +// } +// } +// +// // 设置行高 +// err = f.SetRowStyle("Sheet1", 1, 10, style) +// if err != nil { +// return false, err +// } +// +// if err := f.SaveAs("output.xlsx"); err != nil { +// return false, err +// } +// +// return true, nil +// } + +// HeaderCellData1 表头内容 +type HeaderCellData1 struct { + Value string // 值 + CellType string // 类型 + NumberFmt string // 格式化方式 + ColWidth int // 列宽 +} + +func Export2(header []HeaderCellData1, data []interface{}) (*bytes.Buffer, error) { + sheetName := "Sheet1" + + f := excelize.NewFile() + defer func() { + _ = f.Close() + }() + + // 创建一个工作表 + index, err := f.NewSheet(sheetName) + if err != nil { + return nil, err + } + + // 设置工作簿的默认工作表 + f.SetActiveSheet(index) + + // 设置工作表默认字体 + err = f.SetDefaultFont("宋体") + if err != nil { + return nil, err + } + + // 统一单元格对齐样式 + alignment := &excelize.Alignment{ + Horizontal: "center", + Vertical: "center", + } + + // 设置行高 35-第一行 + err = f.SetRowHeight(sheetName, 1, 35) + if err != nil { + return nil, err + } + + // 处理工作表表头 + for c, cell := range header { + // 获取列名 + colName, err := excelize.ColumnNumberToName(c + 1) + if err != nil { + return nil, err + } + + // 添加单元格的值 + err = f.SetCellValue(sheetName, colName+"1", cell.Value) + if err != nil { + return nil, err + } + + // 单元格颜色填充样式 + fill := excelize.Fill{ + Type: "pattern", + Pattern: 1, + Color: []string{"#c9daf8"}, + Shading: 0, + } + + // 第一行的左、右、下边框 + border := []excelize.Border{ + { + Type: "left", + Color: "#000000", + Style: 1, + }, + { + Type: "right", + Color: "#000000", + Style: 1, + }, + { + Type: "bottom", + Color: "#000000", + Style: 1, + }, + } + + // 设置单元格值类型和格式 + style, _ := f.NewStyle(&excelize.Style{ + Alignment: alignment, // 字体居中 + Fill: fill, // 背景颜色 + Border: border, // 边框 + }) + err = f.SetCellStyle(sheetName, colName+"1", colName+"1", style) + if err != nil { + return nil, err + } + + // 设置列宽 + err = f.SetColWidth(sheetName, colName, colName, float64(cell.ColWidth)) + if err != nil { + return nil, err + } + } + + // 设置单元格格式 + row := len(data) + for i, cell := range header { + // 获取列名 + colName, err := excelize.ColumnNumberToName(i + 1) + if err != nil { + return nil, err + } + + // 字体居中 + style := &excelize.Style{} + style = &excelize.Style{ + Alignment: alignment, + } + + if cell.CellType == "float" { + style.NumFmt = 2 + customNumFmt := "0.000" + style.CustomNumFmt = &customNumFmt + } + + if cell.CellType == "date" { + style.NumFmt = 22 + customNumFmt := "yyyy-mm-dd hh:mm:ss" + style.CustomNumFmt = &customNumFmt + } + + newStyle, _ := f.NewStyle(style) + err = f.SetCellStyle(sheetName, colName+"2", colName+strconv.Itoa(row), newStyle) + if err != nil { + return nil, err + } + } + + // 填充数据 + for r, rowData := range data { + rv := reflect.ValueOf(rowData) + for c := 0; c < rv.NumField(); c++ { + cellValue := rv.Field(c).Interface() + // 获取列名 + colName, err := excelize.ColumnNumberToName(c + 1) + if err != nil { + return nil, err + } + + axis := colName + fmt.Sprintf("%d", r+2) + + // 设置单元格值 + err = f.SetCellValue(sheetName, axis, cellValue) + if err != nil { + return nil, err + } + + // 设置单元格值类型 + cellType := header[c].CellType + + // 字体居中 + style := &excelize.Style{} + style = &excelize.Style{ + Alignment: alignment, + } + + if cellType == "float" { + style.NumFmt = 2 + customNumFmt := "0.000" + style.CustomNumFmt = &customNumFmt + } + + if cellType == "date" { + style.NumFmt = 22 + customNumFmt := "yyyy-mm-dd hh:mm:ss" + style.CustomNumFmt = &customNumFmt + } + + newStyle, _ := f.NewStyle(style) + err = f.SetCellStyle(sheetName, axis, axis, newStyle) + if err != nil { + return nil, err + } + + // 设置行高 35-第一行 + err = f.SetRowHeight(sheetName, r+2, 35) + if 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("已导出文件") +} From c6adc376c89ea936f05b01ba6b01f4044efba0e8 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 14 Oct 2024 13:17:28 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9token=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/middlewares/auth.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index d6b7b49..8fe0fac 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -56,6 +56,18 @@ func Auth() gin.HandlerFunc { return } + if adminUser.IsDisabled == 1 { + responses.FailWithMessage("用户已禁用", c) + c.Abort() + return + } + + if adminUser.IsDeleted == 1 { + responses.FailWithMessage("用户错误", c) + c.Abort() + return + } + // 获取角色数据 adminRoleDao := dao.AdminRoleDao{} adminRole, err := adminRoleDao.GetAdminRoleFirstById(roleId) From 99d050cda133852005c409d05a38cc9849b5343f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 16 Oct 2024 08:51:14 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=91=E6=99=AE?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/BasicArticleClass.go | 232 ++++++++++++++++++++++++ api/controller/area.go | 6 +- api/controller/basic.go | 3 +- api/controller/diseaseClassExpertise.go | 4 +- api/dao/ArticleScience.go | 158 ++++++++++++++++ api/dao/ArticleScienceClass.go | 158 ++++++++++++++++ api/dao/ArticleScienceSource.go | 158 ++++++++++++++++ api/dao/BasicArticleClass.go | 213 ++++++++++++++++++++++ api/dto/ArticleScience.go | 62 +++++++ api/dto/ArticleScienceClass.go | 49 +++++ api/dto/ArticleScienceSource.go | 50 +++++ api/dto/BasicArticleClass.go | 49 +++++ api/model/ArticleScience.go | 37 ++++ api/model/ArticleScienceClass.go | 33 ++++ api/model/ArticleScienceSource.go | 33 ++++ api/model/BasicArticleClass.go | 33 ++++ api/requests/BasicArticleClass.go | 43 +++++ api/router/router.go | 135 ++++++++------ 18 files changed, 1393 insertions(+), 63 deletions(-) create mode 100644 api/controller/BasicArticleClass.go create mode 100644 api/dao/ArticleScience.go create mode 100644 api/dao/ArticleScienceClass.go create mode 100644 api/dao/ArticleScienceSource.go create mode 100644 api/dao/BasicArticleClass.go create mode 100644 api/dto/ArticleScience.go create mode 100644 api/dto/ArticleScienceClass.go create mode 100644 api/dto/ArticleScienceSource.go create mode 100644 api/dto/BasicArticleClass.go create mode 100644 api/model/ArticleScience.go create mode 100644 api/model/ArticleScienceClass.go create mode 100644 api/model/ArticleScienceSource.go create mode 100644 api/model/BasicArticleClass.go create mode 100644 api/requests/BasicArticleClass.go diff --git a/api/controller/BasicArticleClass.go b/api/controller/BasicArticleClass.go new file mode 100644 index 0000000..b236a62 --- /dev/null +++ b/api/controller/BasicArticleClass.go @@ -0,0 +1,232 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/api/responses" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" +) + +// BasicArticleClass 科普分类 +type BasicArticleClass struct { +} + +// GetBasicArticleClassPage 获取科普分类列表-分页 +func (b *BasicArticleClass) GetBasicArticleClassPage(c *gin.Context) { + basicArticleClassRequest := requests.BasicArticleClassRequest{} + req := basicArticleClassRequest.GetBasicArticleClassPage + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + // 获取分类数据 + basicArticleClassDao := dao.BasicArticleClassDao{} + basicArticleClass, total, err := basicArticleClassDao.GetBasicArticleClassPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := dto.GetBasicArticleClassListDto(basicArticleClass) + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = g + responses.OkWithData(result, c) +} + +// GetBasicArticleClassList 获取科普分类列表 +func (b *BasicArticleClass) GetBasicArticleClassList(c *gin.Context) { + basicArticleClassRequest := requests.BasicArticleClassRequest{} + req := basicArticleClassRequest.GetBasicArticleClassList + 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 + } + + // 获取分类数据 + basicArticleClassDao := dao.BasicArticleClassDao{} + basicArticleClass, err := basicArticleClassDao.GetBasicArticleClassListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := dto.GetBasicArticleClassListDto(basicArticleClass) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(g, c) +} + +// GetBasicArticleClass 获取科普分类详情 +func (b *BasicArticleClass) GetBasicArticleClass(c *gin.Context) { + id := c.Param("basic_class_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + basicClassId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + basicArticleClassDao := dao.BasicArticleClassDao{} + basicArticleClass, err := basicArticleClassDao.GetBasicArticleClassById(basicClassId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 处理返回值 + g := dto.GetBasicArticleClassDto(basicArticleClass) + + responses.OkWithData(g, c) +} + +// PutBasicArticleClass 修改科普分类 +func (b *BasicArticleClass) PutBasicArticleClass(c *gin.Context) { + basicArticleClassRequest := requests.BasicArticleClassRequest{} + req := basicArticleClassRequest.PutBasicArticleClass + 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 + } + + id := c.Param("basic_class_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + basicClassId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + basicArticleClassDao := dao.BasicArticleClassDao{} + basicArticleClass, err := basicArticleClassDao.GetBasicArticleClassById(basicClassId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 修改值 + basicArticleClassData := make(map[string]interface{}) + + // 分类名称 + if req.BasicClassName != basicArticleClass.BasicClassName { + basicArticleClassData["basic_class_name"] = req.BasicClassName + } + + // 排序值 + if req.BasicClassSort != basicArticleClass.BasicClassSort { + basicArticleClassData["basic_class_sort"] = req.BasicClassSort + } + + if len(basicArticleClassData) > 0 { + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + err = basicArticleClassDao.EditBasicArticleClassById(tx, basicClassId, basicArticleClassData) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + tx.Commit() + } + + responses.Ok(c) +} + +// AddBasicArticleClass 新增科普分类 +func (b *BasicArticleClass) AddBasicArticleClass(c *gin.Context) { + basicArticleClassRequest := requests.BasicArticleClassRequest{} + req := basicArticleClassRequest.PutBasicArticleClass + 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 + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + basicArticleClass := &model.BasicArticleClass{ + BasicClassName: req.BasicClassName, + BasicClassSort: req.BasicClassSort, + } + + basicArticleClassDao := dao.BasicArticleClassDao{} + basicArticleClass, err := basicArticleClassDao.AddBasicArticleClass(tx, basicArticleClass) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + + tx.Commit() + responses.Ok(c) +} diff --git a/api/controller/area.go b/api/controller/area.go index abf04c6..e3fc958 100644 --- a/api/controller/area.go +++ b/api/controller/area.go @@ -15,7 +15,7 @@ import ( type Area struct{} // GetAreaList 获取地区列表 -func (b *Area) GetAreaList(c *gin.Context) { +func (r *Area) GetAreaList(c *gin.Context) { areaRequest := requests.AreaRequest{} req := areaRequest.GetAreaList if err := c.ShouldBind(&req); err != nil { @@ -43,8 +43,8 @@ func (b *Area) GetAreaList(c *gin.Context) { } // 处理返回值 - r := dto.GetAreaListDto(area) - responses.OkWithData(r, c) + g := dto.GetAreaListDto(area) + responses.OkWithData(g, c) } // AddArea 新增地区 diff --git a/api/controller/basic.go b/api/controller/basic.go index 9683a6b..4e9765e 100644 --- a/api/controller/basic.go +++ b/api/controller/basic.go @@ -1,5 +1,6 @@ package controller type Basic struct { - Area // 省市区 + Area // 省市区 + BasicArticleClass // 科普分类 } diff --git a/api/controller/diseaseClassExpertise.go b/api/controller/diseaseClassExpertise.go index 2143af5..e1cd05f 100644 --- a/api/controller/diseaseClassExpertise.go +++ b/api/controller/diseaseClassExpertise.go @@ -36,6 +36,6 @@ func (b *DiseaseClassExpertise) GetExpertiseList(c *gin.Context) { } // 处理返回值 - getExpertiseListResponse := dto.GetDiseaseClassExpertiseListDto(diseaseClassExpertises) - responses.OkWithData(getExpertiseListResponse, c) + g := dto.GetDiseaseClassExpertiseListDto(diseaseClassExpertises) + responses.OkWithData(g, c) } diff --git a/api/dao/ArticleScience.go b/api/dao/ArticleScience.go new file mode 100644 index 0000000..9853ed8 --- /dev/null +++ b/api/dao/ArticleScience.go @@ -0,0 +1,158 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type ArticleScienceDao struct { +} + +// GetArticleScienceById 获取数据-id +func (r *ArticleScienceDao) GetArticleScienceById(articleId int64) (m *model.ArticleScience, err error) { + err = global.Db.First(&m, articleId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleSciencePreloadById 获取数据-加载全部关联-id +func (r *ArticleScienceDao) GetArticleSciencePreloadById(articleId int64) (m *model.ArticleScience, err error) { + err = global.Db.Preload(clause.Associations).First(&m, articleId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteArticleScience 删除 +func (r *ArticleScienceDao) DeleteArticleScience(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.ArticleScience{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteArticleScienceById 删除-id +func (r *ArticleScienceDao) DeleteArticleScienceById(tx *gorm.DB, articleId int64) error { + if err := tx.Delete(&model.ArticleScience{}, articleId).Error; err != nil { + return err + } + return nil +} + +// EditArticleScience 修改 +func (r *ArticleScienceDao) EditArticleScience(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.ArticleScience{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditArticleScienceById 修改-id +func (r *ArticleScienceDao) EditArticleScienceById(tx *gorm.DB, articleId int64, data interface{}) error { + err := tx.Model(&model.ArticleScience{}).Where("article_id = ?", articleId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceList 获取列表 +func (r *ArticleScienceDao) GetArticleScienceList(maps interface{}) (m []*model.ArticleScience, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceCount 获取数量 +func (r *ArticleScienceDao) GetArticleScienceCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.ArticleScience{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetArticleScienceListRand 获取列表-随机 +func (r *ArticleScienceDao) GetArticleScienceListRand(maps interface{}, limit int) (m []*model.ArticleScience, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddArticleScience 新增 +func (r *ArticleScienceDao) AddArticleScience(tx *gorm.DB, model *model.ArticleScience) (*model.ArticleScience, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetArticleScience 获取 +func (r *ArticleScienceDao) GetArticleScience(maps interface{}) (m *model.ArticleScience, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceOrderLimitList 获取列表-排序、限制数量 +func (r *ArticleScienceDao) GetArticleScienceOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.ArticleScience, err error) { + err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Inc 自增 +func (r *ArticleScienceDao) Inc(tx *gorm.DB, articleId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScience{}).Where("article_id = ?", articleId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// Dec 自减 +func (r *ArticleScienceDao) Dec(tx *gorm.DB, articleId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScience{}).Where("article_id = ?", articleId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceSum 获取数量 +func (r *ArticleScienceDao) GetArticleScienceSum(maps interface{}, field string) (total float64, err error) { + var result struct { + Sum float64 + } + + err = global.Db.Model(&model.ArticleScience{}).Where(maps).Select("SUM(" + field + ") as sum").Scan(&result).Error + if err != nil { + return 0, err + } + + return result.Sum, nil +} + +// GetArticleScienceListByTime 获取列表-开始时间/过期时间 +func (r *ArticleScienceDao) GetArticleScienceListByTime(maps interface{}, startTime, endTime, field string) (m []*model.ArticleScience, err error) { + err = global.Db.Where(maps).Where(field+" BETWEEN ? AND ?", startTime, endTime).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/ArticleScienceClass.go b/api/dao/ArticleScienceClass.go new file mode 100644 index 0000000..52c2d75 --- /dev/null +++ b/api/dao/ArticleScienceClass.go @@ -0,0 +1,158 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type ArticleScienceClassDao struct { +} + +// GetArticleScienceClassById 获取数据-id +func (r *ArticleScienceClassDao) GetArticleScienceClassById(classId int64) (m *model.ArticleScienceClass, err error) { + err = global.Db.First(&m, classId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceClassPreloadById 获取数据-加载全部关联-id +func (r *ArticleScienceClassDao) GetArticleScienceClassPreloadById(classId int64) (m *model.ArticleScienceClass, err error) { + err = global.Db.Preload(clause.Associations).First(&m, classId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteArticleScienceClass 删除 +func (r *ArticleScienceClassDao) DeleteArticleScienceClass(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.ArticleScienceClass{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteArticleScienceClassById 删除-id +func (r *ArticleScienceClassDao) DeleteArticleScienceClassById(tx *gorm.DB, articleId int64) error { + if err := tx.Delete(&model.ArticleScienceClass{}, articleId).Error; err != nil { + return err + } + return nil +} + +// EditArticleScienceClass 修改 +func (r *ArticleScienceClassDao) EditArticleScienceClass(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.ArticleScienceClass{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditArticleScienceClassById 修改-id +func (r *ArticleScienceClassDao) EditArticleScienceClassById(tx *gorm.DB, classId int64, data interface{}) error { + err := tx.Model(&model.ArticleScienceClass{}).Where("class_id = ?", classId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceClassList 获取列表 +func (r *ArticleScienceClassDao) GetArticleScienceClassList(maps interface{}) (m []*model.ArticleScienceClass, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceClassCount 获取数量 +func (r *ArticleScienceClassDao) GetArticleScienceClassCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.ArticleScienceClass{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetArticleScienceClassListRand 获取列表-随机 +func (r *ArticleScienceClassDao) GetArticleScienceClassListRand(maps interface{}, limit int) (m []*model.ArticleScienceClass, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddArticleScienceClass 新增 +func (r *ArticleScienceClassDao) AddArticleScienceClass(tx *gorm.DB, model *model.ArticleScienceClass) (*model.ArticleScienceClass, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetArticleScienceClass 获取 +func (r *ArticleScienceClassDao) GetArticleScienceClass(maps interface{}) (m *model.ArticleScienceClass, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceClassOrderLimitList 获取列表-排序、限制数量 +func (r *ArticleScienceClassDao) GetArticleScienceClassOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.ArticleScienceClass, err error) { + err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Inc 自增 +func (r *ArticleScienceClassDao) Inc(tx *gorm.DB, classId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScienceClass{}).Where("class_id = ?", classId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// Dec 自减 +func (r *ArticleScienceClassDao) Dec(tx *gorm.DB, classId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScienceClass{}).Where("class_id = ?", classId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceClassSum 获取数量 +func (r *ArticleScienceClassDao) GetArticleScienceClassSum(maps interface{}, field string) (total float64, err error) { + var result struct { + Sum float64 + } + + err = global.Db.Model(&model.ArticleScienceClass{}).Where(maps).Select("SUM(" + field + ") as sum").Scan(&result).Error + if err != nil { + return 0, err + } + + return result.Sum, nil +} + +// GetArticleScienceClassListByTime 获取列表-开始时间/过期时间 +func (r *ArticleScienceClassDao) GetArticleScienceClassListByTime(maps interface{}, startTime, endTime, field string) (m []*model.ArticleScienceClass, err error) { + err = global.Db.Where(maps).Where(field+" BETWEEN ? AND ?", startTime, endTime).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/ArticleScienceSource.go b/api/dao/ArticleScienceSource.go new file mode 100644 index 0000000..ed5168d --- /dev/null +++ b/api/dao/ArticleScienceSource.go @@ -0,0 +1,158 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type ArticleScienceSourceDao struct { +} + +// GetArticleScienceSourceById 获取数据-id +func (r *ArticleScienceSourceDao) GetArticleScienceSourceById(sourceId int64) (m *model.ArticleScienceSource, err error) { + err = global.Db.First(&m, sourceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceSourcePreloadById 获取数据-加载全部关联-id +func (r *ArticleScienceSourceDao) GetArticleScienceSourcePreloadById(sourceId int64) (m *model.ArticleScienceSource, err error) { + err = global.Db.Preload(clause.Associations).First(&m, sourceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteArticleScienceSource 删除 +func (r *ArticleScienceSourceDao) DeleteArticleScienceSource(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.ArticleScienceSource{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteArticleScienceSourceById 删除-id +func (r *ArticleScienceSourceDao) DeleteArticleScienceSourceById(tx *gorm.DB, sourceId int64) error { + if err := tx.Delete(&model.ArticleScienceSource{}, sourceId).Error; err != nil { + return err + } + return nil +} + +// EditArticleScienceSource 修改 +func (r *ArticleScienceSourceDao) EditArticleScienceSource(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.ArticleScienceSource{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditArticleScienceSourceById 修改-id +func (r *ArticleScienceSourceDao) EditArticleScienceSourceById(tx *gorm.DB, sourceId int64, data interface{}) error { + err := tx.Model(&model.ArticleScienceSource{}).Where("source_id = ?", sourceId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceSourceList 获取列表 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceList(maps interface{}) (m []*model.ArticleScienceSource, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceSourceCount 获取数量 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.ArticleScienceSource{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetArticleScienceSourceListRand 获取列表-随机 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceListRand(maps interface{}, limit int) (m []*model.ArticleScienceSource, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddArticleScienceSource 新增 +func (r *ArticleScienceSourceDao) AddArticleScienceSource(tx *gorm.DB, model *model.ArticleScienceSource) (*model.ArticleScienceSource, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetArticleScienceSource 获取 +func (r *ArticleScienceSourceDao) GetArticleScienceSource(maps interface{}) (m *model.ArticleScienceSource, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetArticleScienceSourceOrderLimitList 获取列表-排序、限制数量 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.ArticleScienceSource, err error) { + err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Inc 自增 +func (r *ArticleScienceSourceDao) Inc(tx *gorm.DB, sourceId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScienceSource{}).Where("source_id = ?", sourceId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// Dec 自减 +func (r *ArticleScienceSourceDao) Dec(tx *gorm.DB, sourceId int64, field string, numeral int) error { + err := tx.Model(&model.ArticleScienceSource{}).Where("source_id = ?", sourceId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// GetArticleScienceSourceSum 获取数量 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceSum(maps interface{}, field string) (total float64, err error) { + var result struct { + Sum float64 + } + + err = global.Db.Model(&model.ArticleScienceSource{}).Where(maps).Select("SUM(" + field + ") as sum").Scan(&result).Error + if err != nil { + return 0, err + } + + return result.Sum, nil +} + +// GetArticleScienceSourceListByTime 获取列表-开始时间/过期时间 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceListByTime(maps interface{}, startTime, endTime, field string) (m []*model.ArticleScienceSource, err error) { + err = global.Db.Where(maps).Where(field+" BETWEEN ? AND ?", startTime, endTime).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/BasicArticleClass.go b/api/dao/BasicArticleClass.go new file mode 100644 index 0000000..b6cba1e --- /dev/null +++ b/api/dao/BasicArticleClass.go @@ -0,0 +1,213 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type BasicArticleClassDao struct { +} + +// GetBasicArticleClassById 获取数据-id +func (r *BasicArticleClassDao) GetBasicArticleClassById(BasicClassId int64) (m *model.BasicArticleClass, err error) { + err = global.Db.First(&m, BasicClassId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetBasicArticleClassPreloadById 获取数据-加载全部关联-id +func (r *BasicArticleClassDao) GetBasicArticleClassPreloadById(BasicClassId int64) (m *model.BasicArticleClass, err error) { + err = global.Db.Preload(clause.Associations).First(&m, BasicClassId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteBasicArticleClass 删除 +func (r *BasicArticleClassDao) DeleteBasicArticleClass(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.BasicArticleClass{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteBasicArticleClassById 删除-id +func (r *BasicArticleClassDao) DeleteBasicArticleClassById(tx *gorm.DB, BasicArticleClassId int64) error { + if err := tx.Delete(&model.BasicArticleClass{}, BasicArticleClassId).Error; err != nil { + return err + } + return nil +} + +// EditBasicArticleClass 修改 +func (r *BasicArticleClassDao) EditBasicArticleClass(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.BasicArticleClass{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditBasicArticleClassById 修改-id +func (r *BasicArticleClassDao) EditBasicArticleClassById(tx *gorm.DB, BasicClassId int64, data interface{}) error { + err := tx.Model(&model.BasicArticleClass{}).Where("basic_class_id = ?", BasicClassId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetBasicArticleClassList 获取列表 +func (r *BasicArticleClassDao) GetBasicArticleClassList(maps interface{}) (m []*model.BasicArticleClass, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetBasicArticleClassCount 获取数量 +func (r *BasicArticleClassDao) GetBasicArticleClassCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.BasicArticleClass{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetBasicArticleClassListRand 获取列表-随机 +func (r *BasicArticleClassDao) GetBasicArticleClassListRand(maps interface{}, limit int) (m []*model.BasicArticleClass, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddBasicArticleClass 新增 +func (r *BasicArticleClassDao) AddBasicArticleClass(tx *gorm.DB, model *model.BasicArticleClass) (*model.BasicArticleClass, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetBasicArticleClass 获取 +func (r *BasicArticleClassDao) GetBasicArticleClass(maps interface{}) (m *model.BasicArticleClass, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetBasicArticleClassOrderLimitList 获取列表-排序、限制数量 +func (r *BasicArticleClassDao) GetBasicArticleClassOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.BasicArticleClass, err error) { + err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// Inc 自增 +func (r *BasicArticleClassDao) Inc(tx *gorm.DB, BasicArticleClassId int64, field string, numeral int) error { + err := tx.Model(&model.BasicArticleClass{}).Where("basic_class_id = ?", BasicArticleClassId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// Dec 自减 +func (r *BasicArticleClassDao) Dec(tx *gorm.DB, BasicArticleClassId int64, field string, numeral int) error { + err := tx.Model(&model.BasicArticleClass{}).Where("basic_class_id = ?", BasicArticleClassId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// GetBasicArticleClassSum 获取数量 +func (r *BasicArticleClassDao) GetBasicArticleClassSum(maps interface{}, field string) (total float64, err error) { + var result struct { + Sum float64 + } + + err = global.Db.Model(&model.BasicArticleClass{}).Where(maps).Select("SUM(" + field + ") as sum").Scan(&result).Error + if err != nil { + return 0, err + } + + return result.Sum, nil +} + +// GetBasicArticleClassListByTime 获取列表-开始时间/过期时间 +func (r *BasicArticleClassDao) GetBasicArticleClassListByTime(maps interface{}, startTime, endTime, field string) (m []*model.BasicArticleClass, err error) { + err = global.Db.Where(maps).Where(field+" BETWEEN ? AND ?", startTime, endTime).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetBasicArticleClassPageSearch 获取列表-分页 +func (r *BasicArticleClassDao) GetBasicArticleClassPageSearch(req requests.GetBasicArticleClassPage, page, pageSize int) (m []*model.BasicArticleClass, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.BasicArticleClass{}) + + // 分类名称 + if req.BasicClassName != "" { + query = query.Where("basic_class_name LIKE ?", "%"+req.BasicClassName+"%") + } + + // 排序 + if req.Order != nil { + if req.Order.BasicClassSort != "" { + query = query.Order("basic_class_sort " + req.Order.BasicClassSort) + } + } + + // 排序 + query = query.Order("created_at desc") + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} + +// GetBasicArticleClassListSearch 获取列表 +func (r *BasicArticleClassDao) GetBasicArticleClassListSearch(req requests.GetBasicArticleClassList) (m []*model.BasicArticleClass, err error) { + // 构建查询条件 + query := global.Db.Model(&model.BasicArticleClass{}) + + /// 分类名称 + if req.BasicClassName != "" { + query = query.Where("basic_class_name LIKE ?", "%"+req.BasicClassName+"%") + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Scopes(model.Paginate(1, 10)).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/ArticleScience.go b/api/dto/ArticleScience.go new file mode 100644 index 0000000..7c8bf73 --- /dev/null +++ b/api/dto/ArticleScience.go @@ -0,0 +1,62 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" + "hospital-admin-api/utils" +) + +// ArticleScienceDto 文章-科普 +type ArticleScienceDto struct { + ArticleId string `json:"article_id"` // 主键id + ArticleTitle string `json:"article_title"` // 文章标题 + ArticleStatus int `json:"article_status"` // 文章状态(1:正常 2:禁用) + IsTop int `json:"is_top"` // 是否置顶(0:否 1:是) + ArticleImage string `json:"article_image"` // 文章图片(1张) + SourceId string `json:"source_id"` // 文章来源id + ArticleUrl string `json:"article_url"` // 文章地址 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 +} + +// GetArticleScienceDto 详情 +func GetArticleScienceDto(m *model.ArticleScience) *ArticleScienceDto { + return &ArticleScienceDto{ + ArticleId: fmt.Sprintf("%d", m.ArticleId), + ArticleTitle: m.ArticleTitle, + ArticleStatus: m.ArticleStatus, + IsTop: m.IsTop, + ArticleImage: utils.AddOssDomain(m.ArticleImage), + SourceId: fmt.Sprintf("%d", m.SourceId), + ArticleUrl: m.ArticleUrl, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetArticleScienceListDto 列表 +func GetArticleScienceListDto(m []*model.ArticleScience) []*ArticleScienceDto { + // 处理返回值 + responses := make([]*ArticleScienceDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &ArticleScienceDto{ + ArticleId: fmt.Sprintf("%d", v.ArticleId), + ArticleTitle: v.ArticleTitle, + ArticleStatus: v.ArticleStatus, + IsTop: v.IsTop, + ArticleImage: utils.AddOssDomain(v.ArticleImage), + SourceId: fmt.Sprintf("%d", v.SourceId), + ArticleUrl: v.ArticleUrl, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/ArticleScienceClass.go b/api/dto/ArticleScienceClass.go new file mode 100644 index 0000000..0244dcd --- /dev/null +++ b/api/dto/ArticleScienceClass.go @@ -0,0 +1,49 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// ArticleScienceClassDto 文章-科普-分类 +type ArticleScienceClassDto struct { + ClassId string `json:"class_id"` // 主键id + ArticleId string `json:"article_id"` // 文章-科普id + BasicClassId string `json:"basic_class_id"` // 基础数据-科普-分类id + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 +} + +// GetArticleScienceClassDto 详情 +func GetArticleScienceClassDto(m *model.ArticleScienceClass) *ArticleScienceClassDto { + return &ArticleScienceClassDto{ + ClassId: fmt.Sprintf("%d", m.BasicClassId), + ArticleId: fmt.Sprintf("%d", m.BasicClassId), + BasicClassId: fmt.Sprintf("%d", m.BasicClassId), + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetArticleScienceClassListDto 列表 +func GetArticleScienceClassListDto(m []*model.ArticleScienceClass) []*ArticleScienceClassDto { + // 处理返回值 + responses := make([]*ArticleScienceClassDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &ArticleScienceClassDto{ + ClassId: fmt.Sprintf("%d", v.BasicClassId), + ArticleId: fmt.Sprintf("%d", v.BasicClassId), + BasicClassId: fmt.Sprintf("%d", v.BasicClassId), + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/ArticleScienceSource.go b/api/dto/ArticleScienceSource.go new file mode 100644 index 0000000..1fdaf29 --- /dev/null +++ b/api/dto/ArticleScienceSource.go @@ -0,0 +1,50 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" + "hospital-admin-api/utils" +) + +// ArticleScienceSourceDto 文章-科普-来源 +type ArticleScienceSourceDto struct { + SourceId string `json:"source_id"` // 主键id + SourceName string `json:"source_name"` // 来源名称 + SourceImage string `json:"source_image"` // 来源图片 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 +} + +// GetArticleScienceSourceDto 详情 +func GetArticleScienceSourceDto(m *model.ArticleScienceSource) *ArticleScienceSourceDto { + return &ArticleScienceSourceDto{ + SourceId: fmt.Sprintf("%d", m.SourceId), + SourceName: m.SourceName, + SourceImage: utils.AddOssDomain(m.SourceImage), + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetArticleScienceSourceListDto 列表 +func GetArticleScienceSourceListDto(m []*model.ArticleScienceSource) []*ArticleScienceSourceDto { + // 处理返回值 + responses := make([]*ArticleScienceSourceDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &ArticleScienceSourceDto{ + SourceId: fmt.Sprintf("%d", v.SourceId), + SourceName: v.SourceName, + SourceImage: utils.AddOssDomain(v.SourceImage), + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/BasicArticleClass.go b/api/dto/BasicArticleClass.go new file mode 100644 index 0000000..b327382 --- /dev/null +++ b/api/dto/BasicArticleClass.go @@ -0,0 +1,49 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// BasicArticleClassDto 基础数据-科普-分类 +type BasicArticleClassDto struct { + BasicClassId string `json:"basic_class_id"` // 主键id + BasicClassName string `json:"basic_class_name"` // 分类名称 + BasicClassSort uint `json:"basic_class_sort"` // 排序(越大排序越靠前) + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 +} + +// GetBasicArticleClassDto 详情 +func GetBasicArticleClassDto(m *model.BasicArticleClass) *BasicArticleClassDto { + return &BasicArticleClassDto{ + BasicClassId: fmt.Sprintf("%d", m.BasicClassId), + BasicClassName: m.BasicClassName, + BasicClassSort: m.BasicClassSort, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetBasicArticleClassListDto 列表 +func GetBasicArticleClassListDto(m []*model.BasicArticleClass) []*BasicArticleClassDto { + // 处理返回值 + responses := make([]*BasicArticleClassDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &BasicArticleClassDto{ + BasicClassId: fmt.Sprintf("%d", v.BasicClassId), + BasicClassName: v.BasicClassName, + BasicClassSort: v.BasicClassSort, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/model/ArticleScience.go b/api/model/ArticleScience.go new file mode 100644 index 0000000..e2d1346 --- /dev/null +++ b/api/model/ArticleScience.go @@ -0,0 +1,37 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// ArticleScience 文章-科普 +type ArticleScience struct { + ArticleId int64 `gorm:"column:article_id;type:bigint(19);primary_key;comment:主键id" json:"article_id"` + ArticleTitle string `gorm:"column:article_title;type:varchar(255);comment:文章标题" json:"article_title"` + ArticleStatus int `gorm:"column:article_status;type:tinyint(1);default:1;comment:文章状态(1:正常 2:禁用)" json:"article_status"` + IsTop int `gorm:"column:is_top;type:tinyint(1);default:0;comment:是否置顶(0:否 1:是)" json:"is_top"` + ArticleImage string `gorm:"column:article_image;type:varchar(255);comment:文章图片(1张)" json:"article_image"` + SourceId int64 `gorm:"column:source_id;type:bigint(19);comment:文章来源id;NOT NULL" json:"source_id"` + ArticleUrl string `gorm:"column:article_url;type:varchar(255);comment:文章地址;NOT NULL" json:"article_url"` + Model +} + +func (m *ArticleScience) TableName() string { + return "gdxz_article_science" +} + +func (m *ArticleScience) BeforeCreate(tx *gorm.DB) error { + if m.ArticleId == 0 { + m.ArticleId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/model/ArticleScienceClass.go b/api/model/ArticleScienceClass.go new file mode 100644 index 0000000..7a0e2e1 --- /dev/null +++ b/api/model/ArticleScienceClass.go @@ -0,0 +1,33 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// ArticleScienceClass 文章-科普-分类 +type ArticleScienceClass struct { + ClassId int64 `gorm:"column:class_id;type:bigint(19);primary_key;comment:主键id" json:"class_id"` + ArticleId int64 `gorm:"column:article_id;type:bigint(19);comment:文章-科普id;NOT NULL" json:"article_id"` + BasicClassId int64 `gorm:"column:basic_class_id;type:bigint(19);comment:基础数据-科普-分类id;NOT NULL" json:"basic_class_id"` + Model +} + +func (m *ArticleScienceClass) TableName() string { + return "gdxz_article_science_class" +} + +func (m *ArticleScienceClass) BeforeCreate(tx *gorm.DB) error { + if m.ClassId == 0 { + m.ClassId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/model/ArticleScienceSource.go b/api/model/ArticleScienceSource.go new file mode 100644 index 0000000..4442866 --- /dev/null +++ b/api/model/ArticleScienceSource.go @@ -0,0 +1,33 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// ArticleScienceSource 文章-科普-来源 +type ArticleScienceSource struct { + SourceId int64 `gorm:"column:source_id;type:bigint(19);primary_key;comment:主键id" json:"source_id"` + SourceName string `gorm:"column:source_name;type:varchar(200);comment:来源名称" json:"source_name"` + SourceImage string `gorm:"column:source_image;type:varchar(200);comment:来源图片" json:"source_image"` + Model +} + +func (m *ArticleScienceSource) TableName() string { + return "gdxz_article_science_source" +} + +func (m *ArticleScienceSource) BeforeCreate(tx *gorm.DB) error { + if m.SourceId == 0 { + m.SourceId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/model/BasicArticleClass.go b/api/model/BasicArticleClass.go new file mode 100644 index 0000000..187d93d --- /dev/null +++ b/api/model/BasicArticleClass.go @@ -0,0 +1,33 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// BasicArticleClass 基础数据-科普-分类 +type BasicArticleClass struct { + BasicClassId int64 `gorm:"column:basic_class_id;type:bigint(19);primary_key;comment:主键id" json:"basic_class_id"` + BasicClassName string `gorm:"column:basic_class_name;type:varchar(255);comment:分类名称" json:"basic_class_name"` + BasicClassSort uint `gorm:"column:basic_class_sort;type:int(5);default:1;comment:排序(越大排序越靠前)" json:"basic_class_sort"` + Model +} + +func (m *BasicArticleClass) TableName() string { + return "gdxz_basic_article_class" +} + +func (m *BasicArticleClass) BeforeCreate(tx *gorm.DB) error { + if m.BasicClassId == 0 { + m.BasicClassId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/requests/BasicArticleClass.go b/api/requests/BasicArticleClass.go new file mode 100644 index 0000000..92258e1 --- /dev/null +++ b/api/requests/BasicArticleClass.go @@ -0,0 +1,43 @@ +package requests + +type BasicArticleClassRequest struct { + GetBasicArticleClassPage // 获取科普分类列表-分页 + GetBasicArticleClassList // 获取科普分类列表 + PutBasicArticleClass // 修改科普分类 + AddBasicArticleClass // 新增科普分类 +} + +// GetBasicArticleClassPage 获取科普分类列表-分页 +type GetBasicArticleClassPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称"` + Order *GetBasicArticleClassPageOrder `json:"order" form:"order" label:"排序"` +} + +// GetBasicArticleClassPageOrder 获取科普分类列表-分页-排序条件 +type GetBasicArticleClassPageOrder struct { + BasicClassSort string `json:"basic_class_sort" form:"basic_class_sort" label:"排序"` // 排序(越大排序越靠前) +} + +// GetBasicArticleClassList 获取科普分类列表 +type GetBasicArticleClassList struct { + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称"` +} + +// GetBasicArticleClassListOrder 获取科普分类列表-排序条件 +type GetBasicArticleClassListOrder struct { + BasicClassSort string `json:"basic_class_sort" form:"basic_class_sort" label:"排序"` // 排序(越大排序越靠前) +} + +// PutBasicArticleClass 修改科普分类 +type PutBasicArticleClass struct { + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` + BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` +} + +// AddBasicArticleClass 新增科普分类 +type AddBasicArticleClass struct { + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` + BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` +} diff --git a/api/router/router.go b/api/router/router.go index 4438bcd..0a67a9f 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -127,66 +127,68 @@ func adminRouter(r *gin.Engine, api controller.Api) { // basicRouter 基础数据-验证权限 func basicRouter(r *gin.Engine, api controller.Api) { + // 此处为基础数据的获取数据 basicGroup := r.Group("/basic") - - // 科室管理-基础数据 - departmentGroup := basicGroup.Group("/department") { - // 自定义科室 - customGroup := departmentGroup.Group("/custom") + // 科室管理-基础数据 + departmentGroup := basicGroup.Group("/department") { - // 获取自定义科室列表 - customGroup.GET("/list", api.Department.GetDepartmentCustomList) + // 自定义科室 + customGroup := departmentGroup.Group("/custom") + { + // 获取自定义科室列表 + customGroup.GET("/list", api.Department.GetDepartmentCustomList) + } } + + // 医院管理-基础数据 + hospitalGroup := basicGroup.Group("/hospital") + { + // 获取医院列表-限制条数 + hospitalGroup.GET("/list", api.Hospital.GetHospitalList) + } + + // 医生专长管理-基础数据 + expertiseGroup := basicGroup.Group("/expertise") + { + // 获取医生专长列表 + expertiseGroup.GET("/list", api.DiseaseClassExpertise.GetExpertiseList) + + // 获取医生专长列表-分页 + + // 医生专长详情 + + // 修改医生专长 + + // 新增医生专长 + } + + // 银行管理-基础数据 + bankGroup := basicGroup.Group("/bank") + { + // 获取银行列表 + bankGroup.GET("/list", api.Bank.GetBankList) + + // 获取银行列表-分页 + + // 银行详情 + + // 修改银行 + + // 新增银行 + } + + //// 地区管理-基础数据 + //areaGroup := basicGroup.Group("/area") + //{ + // // 获取地区列表 + // areaGroup.GET("/list", api.Basic.Area.GetAreaList) + // + // // 修改地区 + // + // // 新增地区 + //} } - - // 医院管理-基础数据 - hospitalGroup := basicGroup.Group("/hospital") - { - // 获取医院列表-限制条数 - hospitalGroup.GET("/list", api.Hospital.GetHospitalList) - } - - // 专长管理-基础数据 - expertiseGroup := basicGroup.Group("/expertise") - { - // 获取专长列表 - expertiseGroup.GET("/list", api.DiseaseClassExpertise.GetExpertiseList) - - // 获取专长列表-分页 - - // 专长详情 - - // 修改专长 - - // 新增专长 - } - - // 银行管理-基础数据 - bankGroup := basicGroup.Group("/bank") - { - // 获取银行列表 - bankGroup.GET("/list", api.Bank.GetBankList) - - // 获取银行列表-分页 - - // 银行详情 - - // 修改银行 - - // 新增银行 - } - - //// 地区管理-基础数据 - //areaGroup := basicGroup.Group("/area") - //{ - // // 获取地区列表 - // areaGroup.GET("/list", api.Basic.Area.GetAreaList) - // - // // 修改地区 - // - // // 新增地区 - //} } // privateRouter 私有路由-验证权限 @@ -820,14 +822,14 @@ func privateRouter(r *gin.Engine, api controller.Api) { } } - // 基础数据 + // 基础数据管理 basicGroup := adminGroup.Group("/basic") { // 地区管理 areaGroup := basicGroup.Group("/area") { // 获取地区列表 - areaGroup.GET("", api.Area.GetAreaList) + areaGroup.GET("", api.Basic.Area.GetAreaList) // 新增地区 areaGroup.POST("", api.Basic.Area.AddArea) @@ -854,5 +856,24 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 修改医院 hospitalGroup.PUT("/:hospital_id", api.Hospital.PutHospital) } + + // 科普分类管理 + articleClassGroup := basicGroup.Group("/article/class") + { + // 获取基础分类列表-分页 + articleClassGroup.POST("/page", api.Basic.BasicArticleClass.GetBasicArticleClassPage) + + // 获取基础分类列表 + articleClassGroup.POST("/list", api.Basic.BasicArticleClass.GetBasicArticleClassList) + + // 获取基础分类详情 + articleClassGroup.GET("/:basic_class_id", api.Basic.BasicArticleClass.GetBasicArticleClass) + + // 修改基础分类 + articleClassGroup.PUT("/:basic_class_id", api.Basic.BasicArticleClass.PutBasicArticleClass) + + // 新增基础分类 + articleClassGroup.POST("", api.Basic.BasicArticleClass.AddBasicArticleClass) + } } } From 1eacef3a2dc53030e291eef9e3782e53e8ef41e3 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 16 Oct 2024 13:47:58 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E6=9D=83=E9=99=90=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=A0=81=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/middlewares/auth.go | 66 ++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index 8fe0fac..ddcecfe 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -33,31 +33,51 @@ func Auth() gin.HandlerFunc { adminUserDao := dao.AdminUserDao{} adminUser, err := adminUserDao.GetAdminUserFirstById(userId) if err != nil || adminUser == nil { - responses.FailWithMessage("用户数据错误", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户数据错误", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminUser.Status == 2 { - responses.FailWithMessage("用户审核中", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户审核中", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminUser.Status == 3 { - responses.FailWithMessage("用户已删除或禁用", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户已删除或禁用", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminUser.RoleID == 0 { - responses.FailWithMessage("用户角色错误", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户角色错误", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminUser.IsDisabled == 1 { - responses.FailWithMessage("用户已禁用", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户已禁用", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } @@ -72,14 +92,22 @@ func Auth() gin.HandlerFunc { adminRoleDao := dao.AdminRoleDao{} adminRole, err := adminRoleDao.GetAdminRoleFirstById(roleId) if err != nil || adminRole == nil { - responses.FailWithMessage("角色错误", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "角色错误", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } // 检测角色是否已被禁用 if adminRole.RoleStatus == 2 { - responses.FailWithMessage("角色已被禁用", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "角色已被禁用", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } @@ -95,13 +123,21 @@ func Auth() gin.HandlerFunc { adminDeptDao := dao.AdminDeptDao{} adminDept, err := adminDeptDao.GetAdminDeptById(adminUser.DeptID) if err != nil || adminDept == nil { - responses.FailWithMessage("用户部门数据错误", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户部门数据错误", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminDept.DeptStatus == 2 { - responses.FailWithMessage("您所在的部门已被删除,请联系管理员修改", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "您所在的部门已被删除,请联系管理员修改", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } @@ -112,13 +148,21 @@ func Auth() gin.HandlerFunc { adminPostDao := dao.AdminPostDao{} adminPost, err := adminPostDao.GetAdminPostById(adminUser.PostID) if err != nil || adminPost == nil { - responses.FailWithMessage("用户岗位数据错误", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "用户岗位数据错误", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } if adminPost.PostStatus == 2 { - responses.FailWithMessage("您所在的岗位已被删除,请联系管理员修改", c) + c.JSON(http.StatusUnauthorized, gin.H{ + "message": "您所在的岗位已被删除,请联系管理员修改", + "code": consts.UserStatusError, + "data": "", + }) c.Abort() return } From 74b70036207421736b3675c8f61181abfd57751d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 16 Oct 2024 13:50:31 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=91=E6=99=AE?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/ArticleScience.go | 55 +++++++++++++++++++++++++++++++ api/controller/base.go | 6 ++++ api/dao/ArticleScience.go | 56 ++++++++++++++++++++++++++++++++ api/dto/ArticleScience.go | 47 ++++++++++++++++++++++----- api/model/ArticleScience.go | 2 ++ api/model/ArticleScienceClass.go | 2 ++ api/requests/ArticleScience.go | 50 ++++++++++++++++++++++++++++ api/router/router.go | 33 +++++++++++++++++++ 8 files changed, 242 insertions(+), 9 deletions(-) create mode 100644 api/controller/ArticleScience.go create mode 100644 api/requests/ArticleScience.go diff --git a/api/controller/ArticleScience.go b/api/controller/ArticleScience.go new file mode 100644 index 0000000..2491df7 --- /dev/null +++ b/api/controller/ArticleScience.go @@ -0,0 +1,55 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/requests" + "hospital-admin-api/api/responses" + "hospital-admin-api/global" + "hospital-admin-api/utils" +) + +type ArticleScience struct{} + +// GetArticleSciencePage 获取科普文章列表-分页 +func (b *ArticleScience) GetArticleSciencePage(c *gin.Context) { + ArticleScienceRequest := requests.ArticleScienceRequest{} + req := ArticleScienceRequest.GetArticleSciencePage + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + // 获取分类数据 + articleScienceDao := dao.ArticleScienceDao{} + articleScience, total, err := articleScienceDao.GetArticleSciencePageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := dto.GetArticleScienceListDto(articleScience) + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = g + responses.OkWithData(result, c) +} diff --git a/api/controller/base.go b/api/controller/base.go index 0b9e332..73237f5 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -18,6 +18,7 @@ type Api struct { productManage // 商品管理 couponManage // 优惠卷管理 basicManage // 基础数据管理 + articleManage // 文章管理 } // SysSetting 系统设置 @@ -105,3 +106,8 @@ type couponManage struct { type basicManage struct { Basic } + +// 文章管理 +type articleManage struct { + ArticleScience +} diff --git a/api/dao/ArticleScience.go b/api/dao/ArticleScience.go index 9853ed8..a50056d 100644 --- a/api/dao/ArticleScience.go +++ b/api/dao/ArticleScience.go @@ -4,6 +4,7 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/global" ) @@ -156,3 +157,58 @@ func (r *ArticleScienceDao) GetArticleScienceListByTime(maps interface{}, startT } return m, nil } + +// GetArticleSciencePageSearch 获取列表-分页 +func (r *ArticleScienceDao) GetArticleSciencePageSearch(req requests.GetArticleSciencePage, page, pageSize int) (m []*model.ArticleScience, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.ArticleScience{}) + + // 来源 + query = query.Preload("ArticleScienceSource") + + // 分类 + query = query.Preload("ArticleScienceClass.ArticleScience") + + // 文章标题 + if req.ArticleTitle != "" { + query = query.Where("article_title LIKE ?", "%"+req.ArticleTitle+"%") + } + + // 文章状态 + if req.ArticleStatus != nil { + query = query.Where("article_status = ?", req.ArticleStatus) + } + + // 是否置顶 + if req.IsTop != nil { + query = query.Where("is_top = ?", req.IsTop) + } + + // 文章来源 + if req.SourceId != "" { + query = query.Where("source_id = ?", req.SourceId) + } + + // 排序 + if req.Order != nil { + if req.Order.UpdatedAt != "" { + query = query.Order("updated_at " + req.Order.UpdatedAt) + } + } + + // 排序 + query = query.Order("created_at desc") + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} diff --git a/api/dto/ArticleScience.go b/api/dto/ArticleScience.go index 7c8bf73..9b6b3cc 100644 --- a/api/dto/ArticleScience.go +++ b/api/dto/ArticleScience.go @@ -8,15 +8,17 @@ import ( // ArticleScienceDto 文章-科普 type ArticleScienceDto struct { - ArticleId string `json:"article_id"` // 主键id - ArticleTitle string `json:"article_title"` // 文章标题 - ArticleStatus int `json:"article_status"` // 文章状态(1:正常 2:禁用) - IsTop int `json:"is_top"` // 是否置顶(0:否 1:是) - ArticleImage string `json:"article_image"` // 文章图片(1张) - SourceId string `json:"source_id"` // 文章来源id - ArticleUrl string `json:"article_url"` // 文章地址 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + ArticleId string `json:"article_id"` // 主键id + ArticleTitle string `json:"article_title"` // 文章标题 + ArticleStatus int `json:"article_status"` // 文章状态(1:正常 2:禁用) + IsTop int `json:"is_top"` // 是否置顶(0:否 1:是) + ArticleImage string `json:"article_image"` // 文章图片(1张) + SourceId string `json:"source_id"` // 文章来源id + ArticleUrl string `json:"article_url"` // 文章地址 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + ArticleScienceSource *ArticleScienceSourceDto `json:"article_science_source"` // 文章来源 + ArticleScienceClass []*BasicArticleClassDto `json:"article_science_class"` // 文章分类 } // GetArticleScienceDto 详情 @@ -53,6 +55,11 @@ func GetArticleScienceListDto(m []*model.ArticleScience) []*ArticleScienceDto { UpdatedAt: v.UpdatedAt, } + // 加载文章来源 + if v.ArticleScienceSource != nil { + response = response.LoadArticleScienceSource(v.ArticleScienceSource) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } @@ -60,3 +67,25 @@ func GetArticleScienceListDto(m []*model.ArticleScience) []*ArticleScienceDto { return responses } + +// LoadArticleScienceSource 加载文章来源 +func (r *ArticleScienceDto) LoadArticleScienceSource(m *model.ArticleScienceSource) *ArticleScienceDto { + if m != nil { + r.ArticleScienceSource = GetArticleScienceSourceDto(m) + } + return r +} + +// LoadArticleScienceClass 加载文章分类 +func (r *ArticleScienceDto) LoadArticleScienceClass(m []*model.ArticleScienceClass) *ArticleScienceDto { + if len(m) > 0 { + for _, v := range m { + if v.BasicArticleClass != nil { + basicArticleClass := GetBasicArticleClassDto(v.BasicArticleClass) + + r.ArticleScienceClass = append(r.ArticleScienceClass, basicArticleClass) + } + } + } + return r +} diff --git a/api/model/ArticleScience.go b/api/model/ArticleScience.go index e2d1346..3ae4e65 100644 --- a/api/model/ArticleScience.go +++ b/api/model/ArticleScience.go @@ -16,6 +16,8 @@ type ArticleScience struct { SourceId int64 `gorm:"column:source_id;type:bigint(19);comment:文章来源id;NOT NULL" json:"source_id"` ArticleUrl string `gorm:"column:article_url;type:varchar(255);comment:文章地址;NOT NULL" json:"article_url"` Model + ArticleScienceSource *ArticleScienceSource `gorm:"foreignKey:SourceId;references:source_id" json:"article_science_source"` + ArticleScienceClass []*ArticleScienceClass `gorm:"foreignKey:ArticleId;references:article_id" json:"article_science_class"` } func (m *ArticleScience) TableName() string { diff --git a/api/model/ArticleScienceClass.go b/api/model/ArticleScienceClass.go index 7a0e2e1..3ee7b3f 100644 --- a/api/model/ArticleScienceClass.go +++ b/api/model/ArticleScienceClass.go @@ -12,6 +12,8 @@ type ArticleScienceClass struct { ArticleId int64 `gorm:"column:article_id;type:bigint(19);comment:文章-科普id;NOT NULL" json:"article_id"` BasicClassId int64 `gorm:"column:basic_class_id;type:bigint(19);comment:基础数据-科普-分类id;NOT NULL" json:"basic_class_id"` Model + ArticleScience *ArticleScience `gorm:"foreignKey:ArticleId;references:article_id" json:"article_science"` + BasicArticleClass *BasicArticleClass `gorm:"foreignKey:BasicClassId;references:basic_class_id" json:"basic_article_class"` } func (m *ArticleScienceClass) TableName() string { diff --git a/api/requests/ArticleScience.go b/api/requests/ArticleScience.go new file mode 100644 index 0000000..53ddefd --- /dev/null +++ b/api/requests/ArticleScience.go @@ -0,0 +1,50 @@ +package requests + +type ArticleScienceRequest struct { + GetArticleSciencePage // 获取科普文章列表-分页 + GetArticleScienceList // 获取科普文章列表 + PutArticleScience // 修改科普文章 + AddArticleScience // 新增科普文章 +} + +// GetArticleSciencePage 获取科普文章列表-分页 +type GetArticleSciencePage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 + ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) + IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id + Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` +} + +// GetArticleSciencePageOrder 获取科普文章列表-分页-排序条件 +type GetArticleSciencePageOrder struct { + UpdatedAt string `json:"updated_at" form:"updated_at" label:"排序"` // 修改时间 +} + +// GetArticleScienceList 获取科普文章列表 +type GetArticleScienceList struct { + ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 + ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) + IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id + Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` +} + +// GetArticleScienceListOrder 获取科普文章列表-排序条件 +type GetArticleScienceListOrder struct { + BasicClassSort string `json:"basic_class_sort" form:"basic_class_sort" label:"排序"` // 排序(越大排序越靠前) +} + +// PutArticleScience 修改科普文章 +type PutArticleScience struct { + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` + BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` +} + +// AddArticleScience 新增科普文章 +type AddArticleScience struct { + BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` + BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` +} diff --git a/api/router/router.go b/api/router/router.go index 0a67a9f..7762ad1 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -876,4 +876,37 @@ func privateRouter(r *gin.Engine, api controller.Api) { articleClassGroup.POST("", api.Basic.BasicArticleClass.AddBasicArticleClass) } } + + // 文章管理 + articleGroup := adminGroup.Group("/article") + { + // 科普文章 + scienceGroup := articleGroup.Group("science") + { + // 获取科普文章列表-分页 + scienceGroup.POST("/page", api.ArticleScience.GetArticleSciencePage) + + // 获取科普文章详情 + + // 修改科普文章 + + // 新增科普文章 + + // 科普文章来源 + sourceGroup := scienceGroup.Group("source") + { + // 获取来源列表-分页 + sourceGroup.POST("/page", api.ArticleScience.GetArticleSciencePage) + + // 获取来源列表 + + // 获取来源详情 + + // 修改来源文章 + + // 新增来源文章 + } + } + + } } From aab466b4eacef628c9adf1d2108dad8c351f4c9b Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 16 Oct 2024 15:32:02 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=91=E6=99=AE?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/ArticleScience.go | 404 ++++++++++++++++++++++++++++ api/controller/BasicArticleClass.go | 2 +- api/dao/ArticleScienceClass.go | 4 +- api/dto/ArticleScience.go | 12 +- api/requests/ArticleScience.go | 61 +++-- api/router/router.go | 9 + 6 files changed, 459 insertions(+), 33 deletions(-) diff --git a/api/controller/ArticleScience.go b/api/controller/ArticleScience.go index 2491df7..0d34fb9 100644 --- a/api/controller/ArticleScience.go +++ b/api/controller/ArticleScience.go @@ -4,10 +4,12 @@ import ( "github.com/gin-gonic/gin" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" "hospital-admin-api/api/requests" "hospital-admin-api/api/responses" "hospital-admin-api/global" "hospital-admin-api/utils" + "strconv" ) type ArticleScience struct{} @@ -53,3 +55,405 @@ func (b *ArticleScience) GetArticleSciencePage(c *gin.Context) { result["data"] = g responses.OkWithData(result, c) } + +// GetArticleScience 获取科普文章详情 +func (b *ArticleScience) GetArticleScience(c *gin.Context) { + id := c.Param("article_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + articleId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普文章数据 + articleScienceDao := dao.ArticleScienceDao{} + articleScience, err := articleScienceDao.GetArticleScienceById(articleId) + if err != nil { + responses.FailWithMessage("异常", c) + return + } + + // 处理返回值 + g := dto.GetArticleScienceDto(articleScience) + + // 加载文章来源 + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := articleScienceSourceDao.GetArticleScienceSourceById(articleScience.SourceId) + if err != nil { + responses.FailWithMessage("异常", c) + return + } + g.LoadArticleScienceSource(articleScienceSource) + + // 加载文章分类 + articleScienceClassDao := dao.ArticleScienceClassDao{} + maps := make(map[string]interface{}) + maps["article_id"] = articleScience.ArticleId + articleScienceClass, err := articleScienceClassDao.GetArticleScienceClassList(maps) + if len(articleScienceClass) > 0 { + basicArticleClassDao := dao.BasicArticleClassDao{} + for _, class := range articleScienceClass { + basicArticleClass, err := basicArticleClassDao.GetBasicArticleClassById(class.BasicClassId) + if err != nil { + responses.FailWithMessage("异常", c) + return + } + + // 加载文章分类 + g.LoadArticleScienceClass(basicArticleClass) + } + + } + + responses.OkWithData(g, c) +} + +// AddArticleScience 新增科普文章 +func (b *ArticleScience) AddArticleScience(c *gin.Context) { + articleScienceRequest := requests.ArticleScienceRequest{} + req := articleScienceRequest.AddArticleScience + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 参数验证 + for _, item := range req.ArticleScienceClass { + if err := global.Validate.Struct(item); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + } + + // 检测来源是否正确 + sourceId, err := strconv.ParseInt(req.SourceId, 10, 64) + if err != nil { + responses.FailWithMessage("来源错误", c) + return + } + + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := articleScienceSourceDao.GetArticleScienceSourceById(sourceId) + if err != nil { + responses.FailWithMessage("来源错误", c) + return + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + articleScience := &model.ArticleScience{ + ArticleTitle: req.ArticleTitle, + ArticleStatus: req.ArticleStatus, + IsTop: req.IsTop, + ArticleImage: utils.RemoveOssDomain(req.ArticleImage), + SourceId: articleScienceSource.SourceId, + ArticleUrl: req.ArticleUrl, + } + + articleScienceDao := dao.ArticleScienceDao{} + articleScience, err = articleScienceDao.AddArticleScience(tx, articleScience) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + + // 新增文章分类 + articleScienceClassDao := dao.ArticleScienceClassDao{} + for _, i2 := range req.ArticleScienceClass { + basicClassId, err := strconv.ParseInt(i2.BasicClassId, 10, 64) + if err != nil { + responses.FailWithMessage("分类错误", c) + return + } + + articleScienceClass := &model.ArticleScienceClass{ + ArticleId: articleScience.ArticleId, + BasicClassId: basicClassId, + } + articleScienceClass, err = articleScienceClassDao.AddArticleScienceClass(tx, articleScienceClass) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + } + + tx.Commit() + responses.Ok(c) +} + +// PutArticleScience 修改科普文章 +func (b *ArticleScience) PutArticleScience(c *gin.Context) { + articleScienceRequest := requests.ArticleScienceRequest{} + req := articleScienceRequest.PutArticleScience + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("article_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + articleId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + articleScienceDao := dao.ArticleScienceDao{} + articleScience, err := articleScienceDao.GetArticleScienceById(articleId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 修改值 + articleScienceData := make(map[string]interface{}) + + // 文章标题 + if req.ArticleTitle != articleScience.ArticleTitle { + articleScienceData["article_title"] = req.ArticleTitle + } + + // 文章状态 + if req.ArticleStatus != articleScience.ArticleStatus { + articleScienceData["article_status"] = req.ArticleStatus + } + + // 是否置顶 + if req.IsTop != articleScience.IsTop { + articleScienceData["is_top"] = req.IsTop + } + + // 文章图片 + articleImage := utils.RemoveOssDomain(req.ArticleImage) + if articleImage != articleScience.ArticleImage { + articleScienceData["article_image"] = req.ArticleImage + } + + // 文章来源 + sourceId, err := strconv.ParseInt(req.SourceId, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + if sourceId != articleScience.SourceId { + articleScienceData["source_id"] = req.SourceId + } + + // 文章地址 + if req.ArticleUrl != articleScience.ArticleUrl { + articleScienceData["article_url"] = req.ArticleUrl + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if len(articleScienceData) > 0 { + err = articleScienceDao.EditArticleScienceById(tx, articleId, articleScienceData) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + tx.Commit() + } + + // 删除文章分类 + articleScienceClassDao := dao.ArticleScienceClassDao{} + maps := make(map[string]interface{}) + maps["article_id"] = articleScience.ArticleId + err = articleScienceClassDao.DeleteArticleScienceClass(tx, maps) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + // 新增文章分类 + for _, i2 := range req.ArticleScienceClass { + basicClassId, err := strconv.ParseInt(i2.BasicClassId, 10, 64) + if err != nil { + tx.Rollback() + responses.FailWithMessage("分类错误", c) + return + } + + articleScienceClass := &model.ArticleScienceClass{ + ArticleId: articleScience.ArticleId, + BasicClassId: basicClassId, + } + articleScienceClass, err = articleScienceClassDao.AddArticleScienceClass(tx, articleScienceClass) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + } + + tx.Commit() + responses.Ok(c) +} + +// PutArticleScienceStatus 操作科普文章状态 +func (b *ArticleScience) PutArticleScienceStatus(c *gin.Context) { + articleScienceRequest := requests.ArticleScienceRequest{} + req := articleScienceRequest.PutArticleScienceStatus + 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 + } + + id := c.Param("article_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + articleId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + articleScienceDao := dao.ArticleScienceDao{} + articleScience, err := articleScienceDao.GetArticleScienceById(articleId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 检测状态 + if articleScience.ArticleStatus == req.ArticleStatus { + responses.Ok(c) + return + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + articleScienceData := make(map[string]interface{}) + articleScienceData["article_status"] = req.ArticleStatus + err = articleScienceDao.EditArticleScienceById(tx, articleId, articleScienceData) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + tx.Commit() + responses.Ok(c) +} + +// PutArticleScienceTop 操作科普文章置顶状态 +func (b *ArticleScience) PutArticleScienceTop(c *gin.Context) { + articleScienceRequest := requests.ArticleScienceRequest{} + req := articleScienceRequest.PutArticleScienceTop + 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 + } + + id := c.Param("article_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + articleId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + articleScienceDao := dao.ArticleScienceDao{} + articleScience, err := articleScienceDao.GetArticleScienceById(articleId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 检测置顶状态 + if articleScience.IsTop == req.IsTop { + responses.Ok(c) + return + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + articleScienceData := make(map[string]interface{}) + articleScienceData["is_top"] = req.IsTop + err = articleScienceDao.EditArticleScienceById(tx, articleId, articleScienceData) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + tx.Commit() + responses.Ok(c) +} diff --git a/api/controller/BasicArticleClass.go b/api/controller/BasicArticleClass.go index b236a62..a6eff06 100644 --- a/api/controller/BasicArticleClass.go +++ b/api/controller/BasicArticleClass.go @@ -194,7 +194,7 @@ func (b *BasicArticleClass) PutBasicArticleClass(c *gin.Context) { // AddBasicArticleClass 新增科普分类 func (b *BasicArticleClass) AddBasicArticleClass(c *gin.Context) { basicArticleClassRequest := requests.BasicArticleClassRequest{} - req := basicArticleClassRequest.PutBasicArticleClass + req := basicArticleClassRequest.AddBasicArticleClass if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return diff --git a/api/dao/ArticleScienceClass.go b/api/dao/ArticleScienceClass.go index 52c2d75..b3a8806 100644 --- a/api/dao/ArticleScienceClass.go +++ b/api/dao/ArticleScienceClass.go @@ -38,8 +38,8 @@ func (r *ArticleScienceClassDao) DeleteArticleScienceClass(tx *gorm.DB, maps int } // DeleteArticleScienceClassById 删除-id -func (r *ArticleScienceClassDao) DeleteArticleScienceClassById(tx *gorm.DB, articleId int64) error { - if err := tx.Delete(&model.ArticleScienceClass{}, articleId).Error; err != nil { +func (r *ArticleScienceClassDao) DeleteArticleScienceClassById(tx *gorm.DB, classId int64) error { + if err := tx.Delete(&model.ArticleScienceClass{}, classId).Error; err != nil { return err } return nil diff --git a/api/dto/ArticleScience.go b/api/dto/ArticleScience.go index 9b6b3cc..b389044 100644 --- a/api/dto/ArticleScience.go +++ b/api/dto/ArticleScience.go @@ -77,15 +77,11 @@ func (r *ArticleScienceDto) LoadArticleScienceSource(m *model.ArticleScienceSour } // LoadArticleScienceClass 加载文章分类 -func (r *ArticleScienceDto) LoadArticleScienceClass(m []*model.ArticleScienceClass) *ArticleScienceDto { - if len(m) > 0 { - for _, v := range m { - if v.BasicArticleClass != nil { - basicArticleClass := GetBasicArticleClassDto(v.BasicArticleClass) +func (r *ArticleScienceDto) LoadArticleScienceClass(m *model.BasicArticleClass) *ArticleScienceDto { + if m != nil { + basicArticleClass := GetBasicArticleClassDto(m) - r.ArticleScienceClass = append(r.ArticleScienceClass, basicArticleClass) - } - } + r.ArticleScienceClass = append(r.ArticleScienceClass, basicArticleClass) } return r } diff --git a/api/requests/ArticleScience.go b/api/requests/ArticleScience.go index 53ddefd..ad8131a 100644 --- a/api/requests/ArticleScience.go +++ b/api/requests/ArticleScience.go @@ -1,10 +1,11 @@ package requests type ArticleScienceRequest struct { - GetArticleSciencePage // 获取科普文章列表-分页 - GetArticleScienceList // 获取科普文章列表 - PutArticleScience // 修改科普文章 - AddArticleScience // 新增科普文章 + GetArticleSciencePage // 获取科普文章列表-分页 + PutArticleScience // 修改科普文章 + AddArticleScience // 新增科普文章 + PutArticleScienceStatus // 操作科普文章状态 + PutArticleScienceTop // 操作科普文章置顶状态 } // GetArticleSciencePage 获取科普文章列表-分页 @@ -23,28 +24,44 @@ type GetArticleSciencePageOrder struct { UpdatedAt string `json:"updated_at" form:"updated_at" label:"排序"` // 修改时间 } -// GetArticleScienceList 获取科普文章列表 -type GetArticleScienceList struct { - ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 - ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) - IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) - SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id - Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` -} - -// GetArticleScienceListOrder 获取科普文章列表-排序条件 -type GetArticleScienceListOrder struct { - BasicClassSort string `json:"basic_class_sort" form:"basic_class_sort" label:"排序"` // 排序(越大排序越靠前) -} - // PutArticleScience 修改科普文章 type PutArticleScience struct { - BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` - BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` + ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题" validate:"required"` // 文章标题 + ArticleStatus int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) + IsTop int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + ArticleImage string `json:"article_image" form:"is_top" label:"文章图片" validate:"required"` + SourceId string `json:"source_id" form:"source_id" label:"文章来源" validate:"required"` + ArticleUrl string `json:"article_url" form:"article_url" label:"文章地址" validate:"required"` + ArticleScienceClass []*PutArticleScienceClass `json:"article_science_class" form:"article_science_class" label:"文章分类" validate:"required"` +} + +// PutArticleScienceClass 修改科普文章-文章分类 +type PutArticleScienceClass struct { + BasicClassId string `json:"basic_class_id" form:"basic_class_id" label:"分类" validate:"required"` } // AddArticleScience 新增科普文章 type AddArticleScience struct { - BasicClassName string `json:"basic_class_name" form:"basic_class_name" label:"分类名称" validate:"required"` - BasicClassSort uint `json:"basic_class_sort" form:"basic_class_sort" label:"排序值" validate:"required,number,min=1"` + ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题" validate:"required"` // 文章标题 + ArticleStatus int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) + IsTop int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + ArticleImage string `json:"article_image" form:"is_top" label:"文章图片" validate:"required"` + SourceId string `json:"source_id" form:"source_id" label:"文章来源" validate:"required"` + ArticleUrl string `json:"article_url" form:"article_url" label:"文章地址" validate:"required"` + ArticleScienceClass []*AddArticleScienceClass `json:"article_science_class" form:"article_science_class" label:"文章分类" validate:"required"` +} + +// AddArticleScienceClass 新增科普文章-文章分类 +type AddArticleScienceClass struct { + BasicClassId string `json:"basic_class_id" form:"basic_class_id" label:"分类" validate:"required"` +} + +// PutArticleScienceStatus 操作科普文章状态 +type PutArticleScienceStatus struct { + ArticleStatus int `json:"article_status" form:"article_status" label:"状态" validate:"required,oneof=1 2"` // 文章状态(1:正常 2:禁用) +} + +// PutArticleScienceTop 操作科普文章置顶状态 +type PutArticleScienceTop struct { + IsTop int `json:"is_top" form:"is_top" label:"状态" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) } diff --git a/api/router/router.go b/api/router/router.go index 7762ad1..01aa1bd 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -887,10 +887,19 @@ func privateRouter(r *gin.Engine, api controller.Api) { scienceGroup.POST("/page", api.ArticleScience.GetArticleSciencePage) // 获取科普文章详情 + scienceGroup.GET("/:article_id", api.ArticleScience.GetArticleScience) // 修改科普文章 + scienceGroup.PUT("/:article_id", api.ArticleScience.PutArticleScience) // 新增科普文章 + scienceGroup.POST("", api.ArticleScience.AddArticleScience) + + // 操作科普文章状态 + scienceGroup.PUT("/status/:article_id", api.ArticleScience.PutArticleScienceStatus) + + // 操作科普文章置顶状态 + scienceGroup.PUT("/top/:article_id", api.ArticleScience.PutArticleScienceTop) // 科普文章来源 sourceGroup := scienceGroup.Group("source") From 653694d98deebcfa728255e74ba20bd831d21a85 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 16 Oct 2024 15:58:41 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=91=E6=99=AE?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=9D=A5=E6=BA=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/ArticleScienceSource.go | 228 +++++++++++++++++++++++++ api/controller/base.go | 1 + api/dao/ArticleScienceSource.go | 55 ++++++ api/requests/ArticleScienceSource.go | 38 +++++ api/router/router.go | 16 +- 5 files changed, 332 insertions(+), 6 deletions(-) create mode 100644 api/controller/ArticleScienceSource.go create mode 100644 api/requests/ArticleScienceSource.go diff --git a/api/controller/ArticleScienceSource.go b/api/controller/ArticleScienceSource.go new file mode 100644 index 0000000..f1ac3e3 --- /dev/null +++ b/api/controller/ArticleScienceSource.go @@ -0,0 +1,228 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/api/responses" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" +) + +type ArticleScienceSource struct{} + +// GetArticleScienceSourcePage 获取科普文章来源列表-分页 +func (b *ArticleScienceSource) GetArticleScienceSourcePage(c *gin.Context) { + ArticleScienceSourceRequest := requests.ArticleScienceSourceRequest{} + req := ArticleScienceSourceRequest.GetArticleScienceSourcePage + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + // 获取分类数据 + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, total, err := articleScienceSourceDao.GetArticleScienceSourcePageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := dto.GetArticleScienceSourceListDto(articleScienceSource) + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = g + responses.OkWithData(result, c) +} + +// GetArticleScienceSourceList 获取科普文章来源列表 +func (b *ArticleScienceSource) GetArticleScienceSourceList(c *gin.Context) { + ArticleScienceSourceRequest := requests.ArticleScienceSourceRequest{} + req := ArticleScienceSourceRequest.GetArticleScienceSourceList + 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 + } + + // 获取分类数据 + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := articleScienceSourceDao.GetArticleScienceSourceListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := dto.GetArticleScienceSourceListDto(articleScienceSource) + + responses.OkWithData(g, c) +} + +// GetArticleScienceSource 获取科普文章来源详情 +func (b *ArticleScienceSource) GetArticleScienceSource(c *gin.Context) { + id := c.Param("source_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + sourceId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普文章来源数据 + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := articleScienceSourceDao.GetArticleScienceSourceById(sourceId) + if err != nil { + responses.FailWithMessage("异常", c) + return + } + + // 处理返回值 + g := dto.GetArticleScienceSourceDto(articleScienceSource) + + responses.OkWithData(g, c) +} + +// AddArticleScienceSource 新增科普文章来源 +func (b *ArticleScienceSource) AddArticleScienceSource(c *gin.Context) { + ArticleScienceSourceRequest := requests.ArticleScienceSourceRequest{} + req := ArticleScienceSourceRequest.AddArticleScienceSource + 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 + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + articleScienceSource := &model.ArticleScienceSource{ + SourceName: req.SourceName, + SourceImage: utils.RemoveOssDomain(req.SourceImage), + } + + ArticleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := ArticleScienceSourceDao.AddArticleScienceSource(tx, articleScienceSource) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + + tx.Commit() + responses.Ok(c) +} + +// PutArticleScienceSource 修改科普文章来源 +func (b *ArticleScienceSource) PutArticleScienceSource(c *gin.Context) { + ArticleScienceSourceRequest := requests.ArticleScienceSourceRequest{} + req := ArticleScienceSourceRequest.PutArticleScienceSource + 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 + } + + id := c.Param("source_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + sourceId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取科普分类数据 + articleScienceSourceDao := dao.ArticleScienceSourceDao{} + articleScienceSource, err := articleScienceSourceDao.GetArticleScienceSourceById(sourceId) + if err != nil { + responses.FailWithMessage("分类异常", c) + return + } + + // 修改值 + articleScienceSourceData := make(map[string]interface{}) + + // 来源名称 + if req.SourceName != articleScienceSource.SourceName { + articleScienceSourceData["source_name"] = req.SourceName + } + + // 来源图片 + sourceImage := utils.RemoveOssDomain(req.SourceImage) + if sourceImage != articleScienceSource.SourceImage { + articleScienceSourceData["source_image"] = sourceImage + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if len(articleScienceSourceData) > 0 { + err = articleScienceSourceDao.EditArticleScienceSourceById(tx, sourceId, articleScienceSourceData) + if err != nil { + tx.Rollback() + responses.FailWithMessage("操作失败", c) + return + } + + tx.Commit() + } + + tx.Commit() + responses.Ok(c) +} diff --git a/api/controller/base.go b/api/controller/base.go index 73237f5..3dbea4e 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -110,4 +110,5 @@ type basicManage struct { // 文章管理 type articleManage struct { ArticleScience + ArticleScienceSource } diff --git a/api/dao/ArticleScienceSource.go b/api/dao/ArticleScienceSource.go index ed5168d..df03d8a 100644 --- a/api/dao/ArticleScienceSource.go +++ b/api/dao/ArticleScienceSource.go @@ -4,6 +4,7 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/global" ) @@ -156,3 +157,57 @@ func (r *ArticleScienceSourceDao) GetArticleScienceSourceListByTime(maps interfa } return m, nil } + +// GetArticleScienceSourcePageSearch 获取列表-分页 +func (r *ArticleScienceSourceDao) GetArticleScienceSourcePageSearch(req requests.GetArticleScienceSourcePage, page, pageSize int) (m []*model.ArticleScienceSource, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.ArticleScienceSource{}) + + // 来源名称 + if req.SourceName != "" { + query = query.Where("source_name LIKE ?", "%"+req.SourceName+"%") + } + + // 排序 + if req.Order != nil { + if req.Order.UpdatedAt != "" { + query = query.Order("updated_at " + req.Order.UpdatedAt) + } + } + + // 排序 + query = query.Order("created_at desc") + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} + +// GetArticleScienceSourceListSearch 获取列表 +func (r *ArticleScienceSourceDao) GetArticleScienceSourceListSearch(req requests.GetArticleScienceSourceList) (m []*model.ArticleScienceSource, err error) { + // 构建查询条件 + query := global.Db.Model(&model.ArticleScienceSource{}) + + // 来源名称 + if req.SourceName != "" { + query = query.Where("source_name LIKE ?", "%"+req.SourceName+"%") + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Scopes(model.Paginate(1, 10)).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/requests/ArticleScienceSource.go b/api/requests/ArticleScienceSource.go new file mode 100644 index 0000000..01bc103 --- /dev/null +++ b/api/requests/ArticleScienceSource.go @@ -0,0 +1,38 @@ +package requests + +type ArticleScienceSourceRequest struct { + GetArticleScienceSourcePage // 获取科普文章来源列表-分页 + GetArticleScienceSourceList // 获取科普文章来源列表 + PutArticleScienceSource // 修改科普文章来源 + AddArticleScienceSource // 新增科普文章来源 +} + +// GetArticleScienceSourcePage 获取科普文章来源列表-分页 +type GetArticleScienceSourcePage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + SourceName string `json:"source_name" form:"source_name" label:"来源名称"` // 来源名称 + Order *GetArticleScienceSourcePageOrder `json:"order" form:"order" label:"排序"` +} + +// GetArticleScienceSourcePageOrder 获取科普文章来源列表-分页-排序条件 +type GetArticleScienceSourcePageOrder struct { + UpdatedAt string `json:"updated_at" form:"updated_at" label:"排序"` // 修改时间 +} + +// GetArticleScienceSourceList 获取科普文章来源列表 +type GetArticleScienceSourceList struct { + SourceName string `json:"source_name" form:"source_name" label:"来源名称"` // 来源名称 +} + +// PutArticleScienceSource 修改科普文章来源 +type PutArticleScienceSource struct { + SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 + SourceImage string `json:"source_image" form:"source_image" label:"来源图片" validate:"required"` // 来源图片 +} + +// AddArticleScienceSource 新增科普文章来源 +type AddArticleScienceSource struct { + SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 + SourceImage string `json:"source_image" form:"source_image" label:"来源名称" validate:"required"` // 来源图片 +} diff --git a/api/router/router.go b/api/router/router.go index 01aa1bd..70c6b7f 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -904,16 +904,20 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 科普文章来源 sourceGroup := scienceGroup.Group("source") { - // 获取来源列表-分页 - sourceGroup.POST("/page", api.ArticleScience.GetArticleSciencePage) + // 获取科普文章来源列表-分页 + sourceGroup.POST("/page", api.ArticleScienceSource.GetArticleScienceSourcePage) - // 获取来源列表 + // 获取科普文章来源列表 + sourceGroup.GET("/list", api.ArticleScienceSource.GetArticleScienceSourceList) - // 获取来源详情 + // 获取科普文章来源详情 + sourceGroup.GET("/:source_id", api.ArticleScienceSource.GetArticleScienceSource) - // 修改来源文章 + // 修改科普文章来源 + sourceGroup.PUT("/:source_id", api.ArticleScienceSource.PutArticleScienceSource) - // 新增来源文章 + // 新增科普文章来源 + sourceGroup.POST("", api.ArticleScienceSource.AddArticleScienceSource) } } From ac3fc6dc55b649f632107062d632d935c4dedaab Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 17 Oct 2024 16:30:17 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=91=E6=99=AE?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=9D=A5=E6=BA=90=E7=AE=A1=E7=90=861?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/router/router.go | 1 - 1 file changed, 1 deletion(-) diff --git a/api/router/router.go b/api/router/router.go index 70c6b7f..a8ed1f7 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -920,6 +920,5 @@ func privateRouter(r *gin.Engine, api controller.Api) { sourceGroup.POST("", api.ArticleScienceSource.AddArticleScienceSource) } } - } } From 6cc83c6a567a4ea60d6119a383abc39bc1a157fc Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 18 Oct 2024 17:08:11 +0800 Subject: [PATCH 09/27] 1 --- utils/export.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/utils/export.go b/utils/export.go index 71c6e00..dbf1cc9 100644 --- a/utils/export.go +++ b/utils/export.go @@ -2,7 +2,6 @@ package utils import ( "bytes" - "errors" "fmt" "github.com/xuri/excelize/v2" "reflect" @@ -143,18 +142,18 @@ func Export(header []HeaderCellData, data []interface{}) (b *bytes.Buffer, err e } } - //buffer, err := f.WriteToBuffer() - //if err != nil { - // return nil, err - //} - - //return buffer, nil - - // 保存文件 - if err := f.SaveAs("output.xlsx"); err != nil { + buffer, err := f.WriteToBuffer() + if err != nil { return nil, err } - return nil, errors.New("已导出文件") + + return buffer, nil + + // 保存文件 + //if err := f.SaveAs("output.xlsx"); err != nil { + // return nil, err + //} + //return nil, errors.New("已导出文件") } // 填充数据 From 0d3f26038bb2dcbd32ff805352a85f9e66602e0f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 18 Oct 2024 17:16:55 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E4=B8=8A=E4=B8=80=E6=9D=A1git=E4=B9=9F=E6=98=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/export.go | 110 +++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/api/service/export.go b/api/service/export.go index fd8d7e3..f22ce52 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -60,56 +60,56 @@ 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 // 科室名称(如未自己输入,填入标准科室名称) - DepartmentName string // 标准科室名称 - DepartmentCode string // 标准科室编码 - DepartmentCustomMobile string // 科室电话 - HospitalName string // 医院名称 - ServedPatientsNum string // 服务患者数量(订单结束时统计) - PraiseRate float64 // 好评率(百分制。订单平均评价中超过4-5分的订单总数 / 总订单数 * 5) - AvgResponseTime float64 // 平均响应时间(分钟制) - NumberOfFans string // 被关注数量 - 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 // 开户银行地址 + 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 // 科室名称(如未自己输入,填入标准科室名称) + DepartmentName string // 标准科室名称 + DepartmentCode string // 标准科室编码 + DepartmentCustomMobile string // 科室电话 + HospitalName string // 医院名称 + ServedPatientsNum string // 服务患者数量(订单结束时统计) + PraiseRate float64 // 好评率(百分制。订单平均评价中超过4-5分的订单总数 / 总订单数 * 5) + AvgResponseTime float64 // 平均响应时间(分钟制) + NumberOfFans string // 被关注数量 + 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 // 开户银行地址 } // DoctorBankCardData 医生银行卡列表 @@ -859,19 +859,19 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err // 身份审核时间 if v.IdenAuthTime != (model.LocalTime{}) { t := time.Time(v.IdenAuthTime) - userDoctorData.IdenAuthTime = t + userDoctorData.IdenAuthTime = &t } // 多点审核时间 if v.MultiPointTime != (model.LocalTime{}) { t := time.Time(v.MultiPointTime) - userDoctorData.MultiPointTime = t + userDoctorData.MultiPointTime = &t } // 创建时间 if v.CreatedAt != (model.LocalTime{}) { t := time.Time(v.CreatedAt) - userDoctorData.CreatedAt = t + userDoctorData.CreatedAt = &t } // 获取ca证书 @@ -881,13 +881,13 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err // ca证书申请时间 if userCaCert.CertApplicationTime != (model.LocalTime{}) { t := time.Time(userCaCert.CertApplicationTime) - userDoctorData.CertApplicationTime = t + userDoctorData.CertApplicationTime = &t } // ca证书过期时间 if userCaCert.CertExpireTime != (model.LocalTime{}) { t := time.Time(userCaCert.CertExpireTime) - userDoctorData.CertExpireTime = t + userDoctorData.CertExpireTime = &t } } From 2af42b2d40ae8b9629afa50a8a03eab60e0319d6 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 18 Oct 2024 17:22:18 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E4=B8=8A=E4=B8=80=E6=9D=A1git=E4=B9=9F=E6=98=AF1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/export.go | 115 ++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/api/service/export.go b/api/service/export.go index f22ce52..f579b4c 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -60,56 +60,56 @@ 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 // 科室名称(如未自己输入,填入标准科室名称) - DepartmentName string // 标准科室名称 - DepartmentCode string // 标准科室编码 - DepartmentCustomMobile string // 科室电话 - HospitalName string // 医院名称 - ServedPatientsNum string // 服务患者数量(订单结束时统计) - PraiseRate float64 // 好评率(百分制。订单平均评价中超过4-5分的订单总数 / 总订单数 * 5) - AvgResponseTime float64 // 平均响应时间(分钟制) - NumberOfFans string // 被关注数量 - 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 // 开户银行地址 + UserName string // 用户名称 + Status string // 状态(0:禁用 1:正常 2:删除) + IdcardStatus string // 实名认证状态(0:未认证 1:认证通过 2:认证失败) + IdenAuthStatus string // 身份认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + IdenAuthTime string // 审核时间 + IdenAuthFailReason string // 身份认证失败原因 + MultiPointStatus string // 医生多点执业认证状态(0:未认证 1:认证通过 2:审核中 3:认证失败) + MultiPointTime string // 审核时间 + MultiPointFailReason string // 多点执业认证失败原因 + IsRecommend string // 是否首页推荐(0:否 1:是) + Avatar string // 头像 + DoctorTitle string // 医生职称(1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师) + DepartmentCustomName string // 科室名称(如未自己输入,填入标准科室名称) + DepartmentName string // 标准科室名称 + DepartmentCode string // 标准科室编码 + DepartmentCustomMobile string // 科室电话 + HospitalName string // 医院名称 + ServedPatientsNum string // 服务患者数量(订单结束时统计) + PraiseRate float64 // 好评率(百分制。订单平均评价中超过4-5分的订单总数 / 总订单数 * 5) + AvgResponseTime float64 // 平均响应时间(分钟制) + NumberOfFans string // 被关注数量 + IsPlatformDeepCooperation string // 是否平台深度合作医生(0:否 1:是) + IsEnterpriseDeepCooperation string // 是否企业深度合作医生(0:否 1:是) + IsSysDiagnoCooperation string // 是否先思达合作医生(0:否 1:是) + QrCode string // 分享二维码 + BeGoodAt string // 擅长 + BriefIntroduction string // 医生简介 + CreatedAt string // 创建时间 + 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 string // ca证书申请时间 + CertExpireTime string // ca证书过期时间 + BankName string // 开户银行名称 + BankCardCode string // 开户银行卡号 + BankCardAddress string // 开户银行地址 } // DoctorBankCardData 医生银行卡列表 @@ -858,20 +858,17 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err // 身份审核时间 if v.IdenAuthTime != (model.LocalTime{}) { - t := time.Time(v.IdenAuthTime) - userDoctorData.IdenAuthTime = &t + userDoctorData.IdenAuthTime = time.Time(v.IdenAuthTime).Format("2006-01-02 15:04:05") } // 多点审核时间 if v.MultiPointTime != (model.LocalTime{}) { - t := time.Time(v.MultiPointTime) - userDoctorData.MultiPointTime = &t + userDoctorData.MultiPointTime = time.Time(v.MultiPointTime).Format("2006-01-02 15:04:05") } // 创建时间 if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - userDoctorData.CreatedAt = &t + userDoctorData.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } // 获取ca证书 @@ -880,14 +877,12 @@ func (r *ExportService) UserDoctor(userDoctors []*model.UserDoctor) (string, err if userCaCert != nil { // ca证书申请时间 if userCaCert.CertApplicationTime != (model.LocalTime{}) { - t := time.Time(userCaCert.CertApplicationTime) - userDoctorData.CertApplicationTime = &t + userDoctorData.CertApplicationTime = time.Time(userCaCert.CertApplicationTime).Format("2006-01-02 15:04:05") } // ca证书过期时间 if userCaCert.CertExpireTime != (model.LocalTime{}) { - t := time.Time(userCaCert.CertExpireTime) - userDoctorData.CertExpireTime = &t + userDoctorData.CertExpireTime = time.Time(userCaCert.CertExpireTime).Format("2006-01-02 15:04:05") } } From 5eee45a64b0f4ea5f9acfb2d960d39fd2af48bd4 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 18 Oct 2024 17:30:54 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E4=B8=8A=E4=B8=80=E6=9D=A1git=E4=B9=9F=E6=98=AF2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/export.go | 505 ++++++++++++++++++++---------------------- 1 file changed, 235 insertions(+), 270 deletions(-) diff --git a/api/service/export.go b/api/service/export.go index f579b4c..48a48e5 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -20,41 +20,41 @@ type ExportService struct { // DoctorWithdrawalData 提现记录数据 type DoctorWithdrawalData struct { - WithdrawalId string // 提现编号 - DoctorName string // 医生姓名 - Mobile string // 医生手机号 - DoctorCardNum string // 医生证件号码 - AppliedWithdrawalAmount float64 // 提现金额 - ActualWithdrawalAmount float64 // 实际提现金额 - IncomeTax float64 // 提现所得税金额 - BankName string // 提现银行名称 - BankCardCode string // 银行卡号 - BankCardAddress string // 银行地址 - ExamineStatus string // 审核状态(1:审核中 2:审核通过 3:审核未通过) - ExamineFailReason string // 审核失败原因 - ExamineTime time.Time // 审核日期 - ExamineBy string // 审核人员名称 - PaymentStatus string // 财务打款状态(0:否 1:是) - PaymentTime time.Time // 财务打款时间 - PaymentBy string // 财务打款人员id(后台用户id) - CreatedAt time.Time // 创建时间 + WithdrawalId string // 提现编号 + DoctorName string // 医生姓名 + Mobile string // 医生手机号 + DoctorCardNum string // 医生证件号码 + AppliedWithdrawalAmount float64 // 提现金额 + ActualWithdrawalAmount float64 // 实际提现金额 + IncomeTax float64 // 提现所得税金额 + BankName string // 提现银行名称 + BankCardCode string // 银行卡号 + BankCardAddress string // 银行地址 + ExamineStatus string // 审核状态(1:审核中 2:审核通过 3:审核未通过) + ExamineFailReason string // 审核失败原因 + ExamineTime string // 审核日期 + ExamineBy string // 审核人员名称 + PaymentStatus string // 财务打款状态(0:否 1:是) + PaymentTime string // 财务打款时间 + PaymentBy string // 财务打款人员id(后台用户id) + CreatedAt string // 创建时间 } // DoctorWithdrawalOrderData 提现记录-关联订单 type DoctorWithdrawalOrderData struct { - DoctorName string // 医生姓名 - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge string // 患者年龄-就诊人 - PatientMobile string // 患者电话 - PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - PayTime time.Time // 支付时间 - InquiryNo string // 系统订单编号 - EscrowTradeNo string // 第三方支付流水号 - AmountTotal float64 // 订单金额 - CouponAmountTotal float64 // 优惠卷金额 - PaymentAmountTotal float64 // 实际付款金额 - DoctorAmount float64 // 医生收益 + DoctorName string // 医生姓名 + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge string // 患者年龄-就诊人 + PatientMobile string // 患者电话 + PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayTime string // 支付时间 + InquiryNo string // 系统订单编号 + EscrowTradeNo string // 第三方支付流水号 + AmountTotal float64 // 订单金额 + CouponAmountTotal float64 // 优惠卷金额 + PaymentAmountTotal float64 // 实际付款金额 + DoctorAmount float64 // 医生收益 } @@ -114,14 +114,14 @@ type UserDoctorData struct { // DoctorBankCardData 医生银行卡列表 type DoctorBankCardData struct { - DoctorName string // 医生姓名 - DoctorMobile string // 医生手机号 - BankName string // 银行名称 - BankCardCode string // 银行卡号 - Province string // 省份 - City string // 城市 - County string // 区县 - CreatedAt time.Time // 创建时间 + DoctorName string // 医生姓名 + DoctorMobile string // 医生手机号 + BankName string // 银行名称 + BankCardCode string // 银行卡号 + Province string // 省份 + City string // 城市 + County string // 区县 + CreatedAt string // 创建时间 } // DoctorAccountData 医生账户 @@ -139,108 +139,108 @@ type DoctorAccountData struct { // OrderInquiryForAccount 医生账户-关联订单 type OrderInquiryForAccount struct { - InquiryNo string // 系统订单编号 - DoctorName string // 医生姓名 - UserName string // 用户姓名(患者) - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge string // 患者年龄-就诊人 - PatientMobile string // 患者电话 - InquiryType string // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) - InquiryMode string // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) - InquiryStatus string // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) - IsDelete string // 删除状态(0:否 1:是) - InquiryRefundStatus string // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) - InquiryPayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - InquiryPayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - EscrowTradeNo string // 第三方支付流水号 - AmountTotal float64 // 订单金额 - CouponAmountTotal float64 // 优惠卷总金额 - PaymentAmountTotal float64 // 实际付款金额 - DoctorAmount float64 // 医生收益 - PayTime time.Time // 支付时间 - ReceptionTime time.Time // 接诊时间(已接诊) - CompleteTime time.Time // 订单完成时间(问诊完成时间) - FinishTime time.Time // 订单结束时间 - StatisticsStatus string // 订单统计状态(0:未统计 1:已统计 2:统计失败) - StatisticsTime time.Time // 订单统计时间 - IsWithdrawal string // 是否提现(0:否 1:是 2:提现中) - WithdrawalTime time.Time // 提现时间 - CancelTime time.Time // 订单取消时间 - CancelReason string // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) - CancelRemarks string // 取消订单备注(自动添加) - EntryStatus string // 入账状态(0:未入账 1:已入账 2:入账中 3:入账失败) - CreatedAt time.Time // 创建时间 + InquiryNo string // 系统订单编号 + DoctorName string // 医生姓名 + UserName string // 用户姓名(患者) + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge string // 患者年龄-就诊人 + PatientMobile string // 患者电话 + InquiryType string // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) + InquiryMode string // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) + InquiryStatus string // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + IsDelete string // 删除状态(0:否 1:是) + InquiryRefundStatus string // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + InquiryPayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + InquiryPayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + EscrowTradeNo string // 第三方支付流水号 + AmountTotal float64 // 订单金额 + CouponAmountTotal float64 // 优惠卷总金额 + PaymentAmountTotal float64 // 实际付款金额 + DoctorAmount float64 // 医生收益 + PayTime string // 支付时间 + ReceptionTime string // 接诊时间(已接诊) + CompleteTime string // 订单完成时间(问诊完成时间) + FinishTime string // 订单结束时间 + StatisticsStatus string // 订单统计状态(0:未统计 1:已统计 2:统计失败) + StatisticsTime string // 订单统计时间 + IsWithdrawal string // 是否提现(0:否 1:是 2:提现中) + WithdrawalTime string // 提现时间 + CancelTime string // 订单取消时间 + CancelReason string // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + CancelRemarks string // 取消订单备注(自动添加) + EntryStatus string // 入账状态(0:未入账 1:已入账 2:入账中 3:入账失败) + CreatedAt string // 创建时间 } // UserPatientData 患者列表 type UserPatientData struct { - UserName string // 用户名称 - Status string // 状态(0:禁用 1:正常 2:删除) - Mobile string // 手机号 - Avatar string // 头像 - DisableReason string // 禁用理由 - PatientFamilyCount string // 家庭成员数量 - CreatedAt time.Time // 创建时间 + UserName string // 用户名称 + Status string // 状态(0:禁用 1:正常 2:删除) + Mobile string // 手机号 + Avatar string // 头像 + DisableReason string // 禁用理由 + PatientFamilyCount string // 家庭成员数量 + CreatedAt string // 创建时间 } // PatientFamilyData 就诊人列表 type PatientFamilyData struct { - UserName string `json:"user_name"` // 账号名称 - CardName string `json:"card_name"` // 患者姓名 - Relation string `json:"relation"` // 与患者关系(1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他) - Status string `json:"status"` // 状态(1:正常 2:删除) - Mobile string `json:"mobile"` // 用户电话 - IsDefault string `json:"is_default"` // 是否默认(0:否 1:是) - Type string `json:"type"` // 身份类型(1:身份证 2:护照 3:港澳通行证 4:台胞证) - IdNumber string `json:"id_number"` // 证件号码 - Sex string `json:"sex"` // 性别(0:未知 1:男 2:女) - Age string `json:"age"` // 年龄 - Province string `json:"province"` // 省份 - City string `json:"city"` // 城市 - County string `json:"county"` // 区县 - Height string `json:"height"` // 身高(cm) - Weight string `json:"weight"` // 体重(kg) - MaritalStatus string `json:"marital_status"` // 婚姻状况(0:未婚 1:已婚 2:离异) - NationName string `json:"nation_name"` // 民族名称 - JobName string `json:"job_name"` // 职业名称 - CreatedAt time.Time `json:"created_at"` // 创建时间 + UserName string `json:"user_name"` // 账号名称 + CardName string `json:"card_name"` // 患者姓名 + Relation string `json:"relation"` // 与患者关系(1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他) + Status string `json:"status"` // 状态(1:正常 2:删除) + Mobile string `json:"mobile"` // 用户电话 + IsDefault string `json:"is_default"` // 是否默认(0:否 1:是) + Type string `json:"type"` // 身份类型(1:身份证 2:护照 3:港澳通行证 4:台胞证) + IdNumber string `json:"id_number"` // 证件号码 + Sex string `json:"sex"` // 性别(0:未知 1:男 2:女) + Age string `json:"age"` // 年龄 + Province string `json:"province"` // 省份 + City string `json:"city"` // 城市 + County string `json:"county"` // 区县 + Height string `json:"height"` // 身高(cm) + Weight string `json:"weight"` // 体重(kg) + MaritalStatus string `json:"marital_status"` // 婚姻状况(0:未婚 1:已婚 2:离异) + NationName string `json:"nation_name"` // 民族名称 + JobName string `json:"job_name"` // 职业名称 + CreatedAt string `json:"created_at"` // 创建时间 } // OrderInquiry 问诊订单 type OrderInquiry struct { - InquiryNo string // 系统订单编号 - DoctorName string // 医生姓名 - UserName string // 用户姓名(患者) - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge string // 患者年龄-就诊人 - PatientMobile string // 患者电话 - InquiryType string // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) - InquiryMode string // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) - InquiryStatus string // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) - IsDelete string // 删除状态(0:否 1:是) - InquiryRefundStatus string // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) - InquiryPayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - InquiryPayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - EscrowTradeNo string // 第三方支付流水号 - AmountTotal float64 // 订单金额 - CouponAmountTotal float64 // 优惠卷总金额 - PaymentAmountTotal float64 // 实际付款金额 - DoctorAmount float64 // 医生收益 - PayTime time.Time // 支付时间 - ReceptionTime time.Time // 接诊时间(已接诊) - CompleteTime time.Time // 订单完成时间(问诊完成时间) - FinishTime time.Time // 订单结束时间 - StatisticsStatus string // 订单统计状态(0:未统计 1:已统计 2:统计失败) - StatisticsTime time.Time // 订单统计时间 - IsWithdrawal string // 是否提现(0:否 1:是 2:提现中) - WithdrawalTime time.Time // 提现时间 - CancelTime time.Time // 订单取消时间 - CancelReason string // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) - CancelRemarks string // 取消订单备注(自动添加) - EntryStatus string // 入账状态(0:未入账 1:已入账 2:入账中 3:入账失败) - CreatedAt time.Time // 创建时间 + InquiryNo string // 系统订单编号 + DoctorName string // 医生姓名 + UserName string // 用户姓名(患者) + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge string // 患者年龄-就诊人 + PatientMobile string // 患者电话 + InquiryType string // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) + InquiryMode string // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) + InquiryStatus string // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + IsDelete string // 删除状态(0:否 1:是) + InquiryRefundStatus string // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + InquiryPayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + InquiryPayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + EscrowTradeNo string // 第三方支付流水号 + AmountTotal float64 // 订单金额 + CouponAmountTotal float64 // 优惠卷总金额 + PaymentAmountTotal float64 // 实际付款金额 + DoctorAmount float64 // 医生收益 + PayTime string // 支付时间 + ReceptionTime string // 接诊时间(已接诊) + CompleteTime string // 订单完成时间(问诊完成时间) + FinishTime string // 订单结束时间 + StatisticsStatus string // 订单统计状态(0:未统计 1:已统计 2:统计失败) + StatisticsTime string // 订单统计时间 + IsWithdrawal string // 是否提现(0:否 1:是 2:提现中) + WithdrawalTime string // 提现时间 + CancelTime string // 订单取消时间 + CancelReason string // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + CancelRemarks string // 取消订单备注(自动添加) + EntryStatus string // 入账状态(0:未入账 1:已入账 2:入账中 3:入账失败) + CreatedAt string // 创建时间 } // OrderProductData 药品订单 @@ -297,81 +297,81 @@ type OrderProductItemData struct { // OrderServicePackageDto 订单-服务包 type OrderServicePackageDto struct { - OrderServiceNo string // 系统订单编号 - DoctorName string // 医生姓名 - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge int // 患者年龄-就诊人 - PatientMobile string // 患者电话 - EscrowTradeNo string // 第三方支付流水号 - OrderServiceType string // 服务包类型(1:健康包 2:随访包) - OrderServiceStatus string // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) - PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - PayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - CancelReason string // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) - AmountTotal float64 // 订单金额 - PaymentAmountTotal float64 // 实际付款金额 - PayTime time.Time // 支付时间 - StartTime time.Time // 开始服务时间 - FinishTime time.Time // 结束服务时间 - RefundStatus string // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) - CancelTime time.Time // 订单取消时间 - CancelRemarks string // 取消订单备注 - AddFinishStatus string // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) - AddFinishTime time.Time // 添加完成订单延迟队列时间 - AddFinishFailReason string // 添加完成订单延迟队列失败原因 - CreatedAt time.Time // 创建时间 + OrderServiceNo string // 系统订单编号 + DoctorName string // 医生姓名 + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge int // 患者年龄-就诊人 + PatientMobile string // 患者电话 + EscrowTradeNo string // 第三方支付流水号 + OrderServiceType string // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus string // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + CancelReason string // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + AmountTotal float64 // 订单金额 + PaymentAmountTotal float64 // 实际付款金额 + PayTime string // 支付时间 + StartTime string // 开始服务时间 + FinishTime string // 结束服务时间 + RefundStatus string // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + CancelTime string // 订单取消时间 + CancelRemarks string // 取消订单备注 + AddFinishStatus string // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime string // 添加完成订单延迟队列时间 + AddFinishFailReason string // 添加完成订单延迟队列失败原因 + CreatedAt string // 创建时间 } // OrderPrescriptionData 处方 type OrderPrescriptionData struct { - DoctorName string // 医生姓名 - PharmacistName string // 药师姓名 - PrescriptionStatus string // 处方状态(1:待审核 2:待使用 3:已失效 4:已使用) - PharmacistAuditStatus string // 药师审核状态(0:审核中 1:审核成功 2:审核驳回) - PharmacistVerifyTime time.Time // 药师审核时间 - PharmacistFailReason string // 药师审核驳回原因 - PlatformAuditStatus string // 处方平台审核状态(0:审核中 1:审核成功 2:审核驳回) - PlatformFailTime time.Time // 平台审核失败时间 - PlatformFailReason string // 处方平台驳回原因 - IsAutoPharVerify string // 是否药师自动审核(0:否 1:是) - DoctorCreatedTime time.Time // 医生开具处方时间 - ExpiredTime time.Time // 处方过期时间 - IsDelete string // 是否删除(0:否 1:是) - PrescriptionCode string // 处方编号 - ProductNames string // 药品列表 - PatientName string // 患者姓名-就诊人 - PatientSex string // 患者性别-就诊人(1:男 2:女) - PatientAge string // 患者年龄-就诊人 - PatientMobile string // 患者电话 - DoctorAdvice string // 医嘱 - OrderPrescriptionIcd string // 处方诊断疾病 - CreatedAt time.Time // 创建时间 + DoctorName string // 医生姓名 + PharmacistName string // 药师姓名 + PrescriptionStatus string // 处方状态(1:待审核 2:待使用 3:已失效 4:已使用) + PharmacistAuditStatus string // 药师审核状态(0:审核中 1:审核成功 2:审核驳回) + PharmacistVerifyTime string // 药师审核时间 + PharmacistFailReason string // 药师审核驳回原因 + PlatformAuditStatus string // 处方平台审核状态(0:审核中 1:审核成功 2:审核驳回) + PlatformFailTime string // 平台审核失败时间 + PlatformFailReason string // 处方平台驳回原因 + IsAutoPharVerify string // 是否药师自动审核(0:否 1:是) + DoctorCreatedTime string // 医生开具处方时间 + ExpiredTime string // 处方过期时间 + IsDelete string // 是否删除(0:否 1:是) + PrescriptionCode string // 处方编号 + ProductNames string // 药品列表 + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(1:男 2:女) + PatientAge string // 患者年龄-就诊人 + PatientMobile string // 患者电话 + DoctorAdvice string // 医嘱 + OrderPrescriptionIcd string // 处方诊断疾病 + CreatedAt string // 创建时间 } // ProductData 系统商品 type ProductData struct { - ProductName string // 商品名称 - CommonName string // 商品通用名 - Stock string // 库存 - ProductStatus string // 商品状态(1:正常 2:下架) - IsDelete string // 是否删除(0:否 1:是) - PrescriptionNum string // 处方可开具的数量 - ProductPrice float64 // 商品价格 - MnemonicCode string // 商品助记码(首字母简拼) - ProductType string // 药品类型(0:未知 1:中成药 2:西药) - ProductPlatformCode string // 处方平台商品编码 - ProductPharmacyCode string // 第三方药店商品编码 - ProductSpec string // 商品规格 - LicenseNumber string // 批准文号 - Manufacturer string // 生产厂家 - SingleUnit string // 单次剂量(例:1次1包) - SingleUse string // 单次用法(例:口服) - PackagingUnit string // 基本包装单位(例:盒/瓶) - FrequencyUse string // 使用频率(例:1天3次) - AvailableDays float64 // 可用天数(3) - ProductRemarks string // 商品备注 - CreatedAt time.Time // 创建时间 + ProductName string // 商品名称 + CommonName string // 商品通用名 + Stock string // 库存 + ProductStatus string // 商品状态(1:正常 2:下架) + IsDelete string // 是否删除(0:否 1:是) + PrescriptionNum string // 处方可开具的数量 + ProductPrice float64 // 商品价格 + MnemonicCode string // 商品助记码(首字母简拼) + ProductType string // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string // 处方平台商品编码 + ProductPharmacyCode string // 第三方药店商品编码 + ProductSpec string // 商品规格 + LicenseNumber string // 批准文号 + Manufacturer string // 生产厂家 + SingleUnit string // 单次剂量(例:1次1包) + SingleUse string // 单次用法(例:口服) + PackagingUnit string // 基本包装单位(例:盒/瓶) + FrequencyUse string // 使用频率(例:1天3次) + AvailableDays float64 // 可用天数(3) + ProductRemarks string // 商品备注 + CreatedAt string // 创建时间 } // DoctorWithdrawal 提现记录 @@ -455,22 +455,19 @@ func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdr } // 时间处理 - var examineTime time.Time + var examineTime string if v.ExamineTime != (model.LocalTime{}) { - t := time.Time(v.ExamineTime) - examineTime = t + examineTime = time.Time(v.ExamineTime).Format("2006-01-02 15:04:05") } - var paymentTime time.Time + var paymentTime string if v.PaymentTime != (model.LocalTime{}) { - t := time.Time(v.PaymentTime) - paymentTime = t + paymentTime = time.Time(v.PaymentTime).Format("2006-01-02 15:04:05") } - var createdAt time.Time + var createdAt string if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - createdAt = t + createdAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } doctorWithdrawalData := DoctorWithdrawalData{ @@ -556,7 +553,7 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do var couponAmountTotal float64 var paymentAmountTotal float64 var doctorAmount float64 - var payTime time.Time + var payTime string if v.Order.OrderInquiry != nil { patientName = v.Order.OrderInquiry.PatientName @@ -587,8 +584,7 @@ func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.Do // 时间处理 if v.Order.OrderInquiry.PayTime != (model.LocalTime{}) { - t := time.Time(v.Order.OrderInquiry.PayTime) - payTime = t + payTime = time.Time(v.Order.OrderInquiry.PayTime).Format("2006-01-02 15:04:05") } } @@ -985,8 +981,7 @@ func (r *ExportService) UserDoctorBankCard(d []*model.DoctorBankCard) (string, e // 创建时间 if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } dataSlice = append(dataSlice, data) @@ -1157,43 +1152,35 @@ func (r *ExportService) OrderInquiryForAccount(d []*model.OrderInquiry) (string, } if v.PayTime != (model.LocalTime{}) { - t := time.Time(v.PayTime) - data.PayTime = t + data.PayTime = time.Time(v.PayTime).Format("2006-01-02 15:04:05") } if v.ReceptionTime != (model.LocalTime{}) { - t := time.Time(v.ReceptionTime) - data.ReceptionTime = t + data.ReceptionTime = time.Time(v.ReceptionTime).Format("2006-01-02 15:04:05") } if v.CompleteTime != (model.LocalTime{}) { - t := time.Time(v.CompleteTime) - data.CompleteTime = t + data.CompleteTime = time.Time(v.CompleteTime).Format("2006-01-02 15:04:05") } if v.FinishTime != (model.LocalTime{}) { - t := time.Time(v.FinishTime) - data.FinishTime = t + data.FinishTime = time.Time(v.FinishTime).Format("2006-01-02 15:04:05") } if v.StatisticsTime != (model.LocalTime{}) { - t := time.Time(v.StatisticsTime) - data.StatisticsTime = t + data.StatisticsTime = time.Time(v.StatisticsTime).Format("2006-01-02 15:04:05") } if v.WithdrawalTime != (model.LocalTime{}) { - t := time.Time(v.WithdrawalTime) - data.WithdrawalTime = t + data.WithdrawalTime = time.Time(v.WithdrawalTime).Format("2006-01-02 15:04:05") } if v.CancelTime != (model.LocalTime{}) { - t := time.Time(v.CancelTime) - data.CancelTime = t + data.CancelTime = time.Time(v.CancelTime).Format("2006-01-02 15:04:05") } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } // 处理入账状态(0:未入账 1:已入账 2:入账中 3:入账失败 4:入账取消) @@ -1253,8 +1240,7 @@ func (r *ExportService) UserPatient(d []*model.UserPatient) (string, error) { } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } if len(v.PatientFamily) > 0 { @@ -1340,8 +1326,7 @@ func (r *ExportService) PatientFamily(d []*model.PatientFamily) (string, error) } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } dataSlice = append(dataSlice, data) @@ -1446,43 +1431,35 @@ func (r *ExportService) OrderInquiry(d []*model.OrderInquiry) (string, error) { } if v.PayTime != (model.LocalTime{}) { - t := time.Time(v.PayTime) - data.PayTime = t + data.PayTime = time.Time(v.PayTime).Format("2006-01-02 15:04:05") } if v.ReceptionTime != (model.LocalTime{}) { - t := time.Time(v.ReceptionTime) - data.ReceptionTime = t + data.ReceptionTime = time.Time(v.ReceptionTime).Format("2006-01-02 15:04:05") } if v.CompleteTime != (model.LocalTime{}) { - t := time.Time(v.CompleteTime) - data.CompleteTime = t + data.CompleteTime = time.Time(v.CompleteTime).Format("2006-01-02 15:04:05") } if v.FinishTime != (model.LocalTime{}) { - t := time.Time(v.FinishTime) - data.FinishTime = t + data.FinishTime = time.Time(v.FinishTime).Format("2006-01-02 15:04:05") } if v.StatisticsTime != (model.LocalTime{}) { - t := time.Time(v.StatisticsTime) - data.StatisticsTime = t + data.StatisticsTime = time.Time(v.StatisticsTime).Format("2006-01-02 15:04:05") } if v.WithdrawalTime != (model.LocalTime{}) { - t := time.Time(v.WithdrawalTime) - data.WithdrawalTime = t + data.WithdrawalTime = time.Time(v.WithdrawalTime).Format("2006-01-02 15:04:05") } if v.CancelTime != (model.LocalTime{}) { - t := time.Time(v.CancelTime) - data.CancelTime = t + data.CancelTime = time.Time(v.CancelTime).Format("2006-01-02 15:04:05") } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } // 处理入账状态(0:未入账 1:已入账 2:入账中 3:入账失败 4:入账取消) @@ -1762,33 +1739,27 @@ func (r *ExportService) OrderServicePackage(d []*model.OrderServicePackage) (str } if v.PayTime != (model.LocalTime{}) { - t := time.Time(v.PayTime) - data.PayTime = t + data.PayTime = time.Time(v.PayTime).Format("2006-01-02 15:04:05") } if v.StartTime != (model.LocalTime{}) { - t := time.Time(v.StartTime) - data.StartTime = t + data.StartTime = time.Time(v.StartTime).Format("2006-01-02 15:04:05") } if v.FinishTime != (model.LocalTime{}) { - t := time.Time(v.FinishTime) - data.FinishTime = t + data.FinishTime = time.Time(v.FinishTime).Format("2006-01-02 15:04:05") } if v.CancelTime != (model.LocalTime{}) { - t := time.Time(v.CancelTime) - data.CancelTime = t + data.CancelTime = time.Time(v.CancelTime).Format("2006-01-02 15:04:05") } if v.AddFinishTime != (model.LocalTime{}) { - t := time.Time(v.AddFinishTime) - data.AddFinishTime = t + data.AddFinishTime = time.Time(v.AddFinishTime).Format("2006-01-02 15:04:05") } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } dataSlice = append(dataSlice, data) @@ -1886,28 +1857,23 @@ func (r *ExportService) OrderPrescription(d []*model.OrderPrescription) (string, } if v.PharmacistVerifyTime != (model.LocalTime{}) { - t := time.Time(v.PharmacistVerifyTime) - data.PharmacistVerifyTime = t + data.PharmacistVerifyTime = time.Time(v.PharmacistVerifyTime).Format("2006-01-02 15:04:05") } if v.PlatformFailTime != (model.LocalTime{}) { - t := time.Time(v.PlatformFailTime) - data.PlatformFailTime = t + data.PlatformFailTime = time.Time(v.PlatformFailTime).Format("2006-01-02 15:04:05") } if v.DoctorCreatedTime != (model.LocalTime{}) { - t := time.Time(v.DoctorCreatedTime) - data.DoctorCreatedTime = t + data.DoctorCreatedTime = time.Time(v.DoctorCreatedTime).Format("2006-01-02 15:04:05") } if v.ExpiredTime != (model.LocalTime{}) { - t := time.Time(v.ExpiredTime) - data.ExpiredTime = t + data.ExpiredTime = time.Time(v.ExpiredTime).Format("2006-01-02 15:04:05") } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } // 处理厨房药品列表 @@ -2004,8 +1970,7 @@ func (r *ExportService) Product(d []*model.Product) (string, error) { } if v.CreatedAt != (model.LocalTime{}) { - t := time.Time(v.CreatedAt) - data.CreatedAt = t + data.CreatedAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05") } dataSlice = append(dataSlice, data) From 68c11baa23f0a3e3e351386f258c3ebfa1311230 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 21 Oct 2024 14:11:37 +0800 Subject: [PATCH 13/27] 1 --- api/dao/doctorBankCard.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/dao/doctorBankCard.go b/api/dao/doctorBankCard.go index 6b2abaf..3c7a822 100644 --- a/api/dao/doctorBankCard.go +++ b/api/dao/doctorBankCard.go @@ -204,11 +204,11 @@ func (r *DoctorBankCardDao) GetDoctorBankCardExportListSearch(req requests.UserD // 用户名称 if req.UserName != "" { - subQuery := global.Db.Model(&model.User{}). + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). Select("doctor_id"). Where("user_name LIKE ?", "%"+req.UserName+"%") - query = query.Where(gorm.Expr("doctor_id IN (?)", subQuery)) + query = query.Where(gorm.Expr("doctor_id IN (?)", doctorSubQuery)) } // 银行卡号 From 9883d1d5fbda1a44a7fa0b199bfeb56e5715c224 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 21 Oct 2024 14:18:59 +0800 Subject: [PATCH 14/27] 333 --- api/dao/doctorBankCard.go | 4 ++-- api/service/export.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/dao/doctorBankCard.go b/api/dao/doctorBankCard.go index 3c7a822..822197b 100644 --- a/api/dao/doctorBankCard.go +++ b/api/dao/doctorBankCard.go @@ -130,11 +130,11 @@ func (r *DoctorBankCardDao) GetDoctorBankCardPage(req requests.GetUserDoctorBank // 用户名称 if req.UserName != "" { - subQuery := global.Db.Model(&model.User{}). + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). Select("doctor_id"). Where("user_name LIKE ?", "%"+req.UserName+"%") - query = query.Where(gorm.Expr("doctor_id IN (?)", subQuery)) + query = query.Where(gorm.Expr("doctor_id IN (?)", doctorSubQuery)) } // 银行卡号 diff --git a/api/service/export.go b/api/service/export.go index 48a48e5..93a8878 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -416,7 +416,7 @@ func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdr paymentStatus := "未知" if v.PaymentStatus == 0 { paymentStatus = "未打款" - } else if v.ExamineStatus == 1 { + } else if v.PaymentStatus == 1 { paymentStatus = "已打款" } From 5564d05b03cc943e57cc3dd8140a8902ab9c6455 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 25 Oct 2024 13:41:04 +0800 Subject: [PATCH 15/27] 111 --- api/dto/Product.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/dto/Product.go b/api/dto/Product.go index 0443e60..3b31d18 100644 --- a/api/dto/Product.go +++ b/api/dto/Product.go @@ -78,7 +78,7 @@ func GetProductListDto(m []*model.Product) []*ProductDto { IsDelete: v.IsDelete, PrescriptionNum: v.PrescriptionNum, ProductName: v.ProductName, - CommonName: v.ProductName, + CommonName: v.CommonName, ProductPrice: v.ProductPrice, MnemonicCode: v.MnemonicCode, ProductType: v.ProductType, From 32269617eccb0071e42552ce9050c60fcc785443 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 25 Oct 2024 14:23:02 +0800 Subject: [PATCH 16/27] 333 --- api/dao/product.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/dao/product.go b/api/dao/product.go index 2b7bbce..eac9694 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -340,6 +340,10 @@ func (r *ProductDao) GetProductListSearch(req requests.GetProductList) (m []*mod query = query.Order("gdxz_product.created_at desc") + if req.Limit == 0 { + req.Limit = 20 + } + err = query.Limit(req.Limit).Find(&m).Error if err != nil { return nil, err From 5ce2ad98795532a0dbcdc21973d32eea7e699143 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 25 Oct 2024 14:24:27 +0800 Subject: [PATCH 17/27] 34444 --- api/dao/productPlatform.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/dao/productPlatform.go b/api/dao/productPlatform.go index 97d6366..bc9719b 100644 --- a/api/dao/productPlatform.go +++ b/api/dao/productPlatform.go @@ -153,7 +153,7 @@ func (r *ProductPlatformDao) GetPlatformProductListSearch(req requests.GetPlatfo // 排序 query = query.Order("created_at desc") - err = query.Scopes(model.Paginate(1, 10)).Find(&m).Error + err = query.Scopes(model.Paginate(1, 20)).Find(&m).Error if err != nil { return nil, err } From dd8d57b862efc14a90079df04554a53ce567d1fe Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 28 Oct 2024 11:19:40 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/requests/admin.go | 2 +- api/service/admin.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/api/requests/admin.go b/api/requests/admin.go index c294540..69722ca 100644 --- a/api/requests/admin.go +++ b/api/requests/admin.go @@ -18,7 +18,7 @@ type Login struct { // GetOssSign 获取oss签名 type GetOssSign struct { UserType int `json:"user_type" form:"user_type" validate:"required,oneof=1 2 3 4" label:"用户类型"` // (1:患者 2:医生 3:药师 4:后台) - Scene int `json:"scene" form:"scene" validate:"required,oneof=1 2 3 4" label:"场景"` // (1:头像 2:证书 3:名片) + Scene int `json:"scene" form:"scene" validate:"required,oneof=1 2 3 4" label:"场景"` // (1:头像 2:证书 3:名片 4:文章) } // GetDecryptCardNum 获取用户身份证号 diff --git a/api/service/admin.go b/api/service/admin.go index aafbabb..1f6a083 100644 --- a/api/service/admin.go +++ b/api/service/admin.go @@ -87,6 +87,8 @@ func (a *AdminService) GetOssSign(getOssSignRequest requests.GetOssSign) (*aliyu dir = dir + "cert/" } else if getOssSignRequest.Scene == 3 { dir = dir + "card/" + } else if getOssSignRequest.Scene == 3 { + dir = dir + "article/" } } From c8b5aa4f6c61773f2b371ec0b563306565c2daa3 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 29 Oct 2024 13:41:04 +0800 Subject: [PATCH 19/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/requests/ArticleScienceSource.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/requests/ArticleScienceSource.go b/api/requests/ArticleScienceSource.go index 01bc103..68464ca 100644 --- a/api/requests/ArticleScienceSource.go +++ b/api/requests/ArticleScienceSource.go @@ -34,5 +34,5 @@ type PutArticleScienceSource struct { // AddArticleScienceSource 新增科普文章来源 type AddArticleScienceSource struct { SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 - SourceImage string `json:"source_image" form:"source_image" label:"来源名称" validate:"required"` // 来源图片 + SourceImage string `json:"source_image" form:"source_image" label:"来源图片" validate:"required"` // 来源图片 } From b02e8238a5cb93f6821f45db8366196644d02b22 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 29 Oct 2024 13:45:30 +0800 Subject: [PATCH 20/27] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A01111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/admin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/service/admin.go b/api/service/admin.go index 1f6a083..c51ca63 100644 --- a/api/service/admin.go +++ b/api/service/admin.go @@ -87,7 +87,7 @@ func (a *AdminService) GetOssSign(getOssSignRequest requests.GetOssSign) (*aliyu dir = dir + "cert/" } else if getOssSignRequest.Scene == 3 { dir = dir + "card/" - } else if getOssSignRequest.Scene == 3 { + } else if getOssSignRequest.Scene == 4 { dir = dir + "article/" } } From 317cb49db68475f7b8ac92a36642fd2113638ab8 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 1 Nov 2024 11:26:21 +0800 Subject: [PATCH 21/27] 1 --- api/controller/ArticleScience.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/controller/ArticleScience.go b/api/controller/ArticleScience.go index 0d34fb9..724f594 100644 --- a/api/controller/ArticleScience.go +++ b/api/controller/ArticleScience.go @@ -292,8 +292,6 @@ func (b *ArticleScience) PutArticleScience(c *gin.Context) { responses.FailWithMessage("操作失败", c) return } - - tx.Commit() } // 删除文章分类 From 0fea9c2e5124e26938a79ee305ca7e9fa05527f8 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 1 Nov 2024 11:33:28 +0800 Subject: [PATCH 22/27] 333 --- api/controller/ArticleScience.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/controller/ArticleScience.go b/api/controller/ArticleScience.go index 724f594..c65d2c0 100644 --- a/api/controller/ArticleScience.go +++ b/api/controller/ArticleScience.go @@ -258,7 +258,7 @@ func (b *ArticleScience) PutArticleScience(c *gin.Context) { // 文章图片 articleImage := utils.RemoveOssDomain(req.ArticleImage) if articleImage != articleScience.ArticleImage { - articleScienceData["article_image"] = req.ArticleImage + articleScienceData["article_image"] = articleImage } // 文章来源 From 397f20c15cd3df7c691a37a125db3c1ad10eaf78 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 4 Nov 2024 15:35:05 +0800 Subject: [PATCH 23/27] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86=E6=8E=92=E5=BA=8F=E5=80=BC=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/ArticleScience.go | 6 ++++++ api/dto/ArticleScience.go | 1 + api/model/ArticleScience.go | 1 + api/requests/ArticleScience.go | 7 +++++-- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/api/controller/ArticleScience.go b/api/controller/ArticleScience.go index c65d2c0..2a9d7e4 100644 --- a/api/controller/ArticleScience.go +++ b/api/controller/ArticleScience.go @@ -163,6 +163,7 @@ func (b *ArticleScience) AddArticleScience(c *gin.Context) { ArticleTitle: req.ArticleTitle, ArticleStatus: req.ArticleStatus, IsTop: req.IsTop, + Sort: req.Sort, ArticleImage: utils.RemoveOssDomain(req.ArticleImage), SourceId: articleScienceSource.SourceId, ArticleUrl: req.ArticleUrl, @@ -255,6 +256,11 @@ func (b *ArticleScience) PutArticleScience(c *gin.Context) { articleScienceData["is_top"] = req.IsTop } + // 排序值 + if req.Sort != articleScience.Sort { + articleScienceData["sort"] = req.Sort + } + // 文章图片 articleImage := utils.RemoveOssDomain(req.ArticleImage) if articleImage != articleScience.ArticleImage { diff --git a/api/dto/ArticleScience.go b/api/dto/ArticleScience.go index b389044..98f4873 100644 --- a/api/dto/ArticleScience.go +++ b/api/dto/ArticleScience.go @@ -12,6 +12,7 @@ type ArticleScienceDto struct { ArticleTitle string `json:"article_title"` // 文章标题 ArticleStatus int `json:"article_status"` // 文章状态(1:正常 2:禁用) IsTop int `json:"is_top"` // 是否置顶(0:否 1:是) + Sort int `json:"sort"` // 排序值(越大越靠前) ArticleImage string `json:"article_image"` // 文章图片(1张) SourceId string `json:"source_id"` // 文章来源id ArticleUrl string `json:"article_url"` // 文章地址 diff --git a/api/model/ArticleScience.go b/api/model/ArticleScience.go index 3ae4e65..4d85d24 100644 --- a/api/model/ArticleScience.go +++ b/api/model/ArticleScience.go @@ -12,6 +12,7 @@ type ArticleScience struct { ArticleTitle string `gorm:"column:article_title;type:varchar(255);comment:文章标题" json:"article_title"` ArticleStatus int `gorm:"column:article_status;type:tinyint(1);default:1;comment:文章状态(1:正常 2:禁用)" json:"article_status"` IsTop int `gorm:"column:is_top;type:tinyint(1);default:0;comment:是否置顶(0:否 1:是)" json:"is_top"` + Sort int `gorm:"column:sort;type:int(5);default:1;comment:排序值(越大越靠前)" json:"sort"` ArticleImage string `gorm:"column:article_image;type:varchar(255);comment:文章图片(1张)" json:"article_image"` SourceId int64 `gorm:"column:source_id;type:bigint(19);comment:文章来源id;NOT NULL" json:"source_id"` ArticleUrl string `gorm:"column:article_url;type:varchar(255);comment:文章地址;NOT NULL" json:"article_url"` diff --git a/api/requests/ArticleScience.go b/api/requests/ArticleScience.go index ad8131a..6979cba 100644 --- a/api/requests/ArticleScience.go +++ b/api/requests/ArticleScience.go @@ -15,7 +15,8 @@ type GetArticleSciencePage struct { ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) - SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id + Sort int `json:"sort" form:"sort" label:"排序值" validate:"required,numeric,min=1"` + SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` } @@ -28,7 +29,8 @@ type GetArticleSciencePageOrder struct { type PutArticleScience struct { ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题" validate:"required"` // 文章标题 ArticleStatus int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) - IsTop int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + IsTop int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` + Sort int `json:"sort" form:"sort" label:"排序值" validate:"required,numeric,min=1"` // 是否置顶(0:否 1:是) ArticleImage string `json:"article_image" form:"is_top" label:"文章图片" validate:"required"` SourceId string `json:"source_id" form:"source_id" label:"文章来源" validate:"required"` ArticleUrl string `json:"article_url" form:"article_url" label:"文章地址" validate:"required"` @@ -45,6 +47,7 @@ type AddArticleScience struct { ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题" validate:"required"` // 文章标题 ArticleStatus int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) IsTop int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + Sort int `json:"sort" form:"sort" label:"排序值" validate:"required,numeric,min=1"` // 是否置顶(0:否 1:是) ArticleImage string `json:"article_image" form:"is_top" label:"文章图片" validate:"required"` SourceId string `json:"source_id" form:"source_id" label:"文章来源" validate:"required"` ArticleUrl string `json:"article_url" form:"article_url" label:"文章地址" validate:"required"` From ff24ed4e0c9a18b87f8b08ef37bb3224666dde3a Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 4 Nov 2024 15:40:06 +0800 Subject: [PATCH 24/27] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86=E6=8E=92=E5=BA=8F=E5=80=BC=E5=AD=97=E6=AE=B5111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/ArticleScience.go | 4 ++++ api/requests/ArticleScience.go | 17 +++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/api/dao/ArticleScience.go b/api/dao/ArticleScience.go index a50056d..d521ea8 100644 --- a/api/dao/ArticleScience.go +++ b/api/dao/ArticleScience.go @@ -196,6 +196,10 @@ func (r *ArticleScienceDao) GetArticleSciencePageSearch(req requests.GetArticleS if req.Order.UpdatedAt != "" { query = query.Order("updated_at " + req.Order.UpdatedAt) } + + if req.Order.Sort != "" { + query = query.Order("sort " + req.Order.Sort) + } } // 排序 diff --git a/api/requests/ArticleScience.go b/api/requests/ArticleScience.go index 6979cba..dddd5e5 100644 --- a/api/requests/ArticleScience.go +++ b/api/requests/ArticleScience.go @@ -10,19 +10,20 @@ type ArticleScienceRequest struct { // GetArticleSciencePage 获取科普文章列表-分页 type GetArticleSciencePage struct { - Page int `json:"page" form:"page" label:"页码"` - PageSize int `json:"page_size" form:"page_size" label:"每页个数"` - ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 - ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) - IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) - Sort int `json:"sort" form:"sort" label:"排序值" validate:"required,numeric,min=1"` - SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id - Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + ArticleTitle string `json:"article_title" form:"article_title" label:"文章标题"` // 文章标题 + ArticleStatus *int `json:"article_status" form:"article_status" label:"文章状态" validate:"omitempty,numeric,oneof=1 2"` // 文章状态(1:正常 2:禁用) + IsTop *int `json:"is_top" form:"is_top" label:"是否置顶" validate:"omitempty,numeric,oneof=0 1"` // 是否置顶(0:否 1:是) + + SourceId string `json:"source_id" form:"source_id" label:"文章来源"` // 文章来源id + Order *GetArticleSciencePageOrder `json:"order" form:"order" label:"排序"` } // GetArticleSciencePageOrder 获取科普文章列表-分页-排序条件 type GetArticleSciencePageOrder struct { UpdatedAt string `json:"updated_at" form:"updated_at" label:"排序"` // 修改时间 + Sort string `json:"sort" form:"sort" label:"排序值"` // 排序值 } // PutArticleScience 修改科普文章 From d2b41220c48636a037eb6913348760b0959c4136 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 4 Nov 2024 15:55:00 +0800 Subject: [PATCH 25/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=BB=AD?= =?UTF-8?q?=E7=BA=A6=E4=BA=91=E8=AF=81=E4=B9=A6=E8=BF=87=E6=9C=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/UserCaCert.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/api/service/UserCaCert.go b/api/service/UserCaCert.go index 272ae0e..1e1d667 100644 --- a/api/service/UserCaCert.go +++ b/api/service/UserCaCert.go @@ -355,11 +355,19 @@ func (r *UserCaCertService) RenewUserCloudCert(tx *gorm.DB, userId int64) (bool, return false, errors.New(err.Error()) } + // 到期时间-测试:180,正式:365 + CertExpireTime := model.LocalTime(time.Now().AddDate(0, 0, 180)) + if config.C.Env == "prod" { + CertExpireTime = model.LocalTime(time.Now().AddDate(0, 0, 365)) + } + // 修改ca监管证书表 data := make(map[string]interface{}) data["cert_base64"] = cloudCertResponse.CertBase64 data["cert_chain_p7"] = cloudCertResponse.CertP7 data["cert_serial_number"] = cloudCertResponse.CertSerialnumber + data["cert_application_time"] = model.LocalTime(time.Now()) + data["cert_expire_time"] = CertExpireTime err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) if err != nil { return false, errors.New("审核失败") @@ -410,11 +418,19 @@ func (r *UserCaCertService) RenewHospitalCloudCert(tx *gorm.DB) (bool, error) { return false, errors.New(err.Error()) } + // 到期时间-测试:180,正式:365 + CertExpireTime := model.LocalTime(time.Now().AddDate(0, 0, 180)) + if config.C.Env == "prod" { + CertExpireTime = model.LocalTime(time.Now().AddDate(0, 0, 365)) + } + // 修改ca监管证书表 data := make(map[string]interface{}) data["cert_base64"] = cloudCertResponse.CertBase64 data["cert_chain_p7"] = cloudCertResponse.CertP7 data["cert_serial_number"] = cloudCertResponse.CertSerialnumber + data["cert_application_time"] = model.LocalTime(time.Now()) + data["cert_expire_time"] = CertExpireTime err = userCaCertDao.EditUserCaCertById(tx, userCaCert.CertId, data) if err != nil { return false, errors.New("更新失败") From 2b31f64d39028affb0b705266ffb980ef23b7c5d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 4 Nov 2024 17:14:42 +0800 Subject: [PATCH 26/27] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86=E6=8E=92=E5=BA=8F=E5=80=BC=E5=AD=97=E6=AE=B51111?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/ArticleScience.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/dto/ArticleScience.go b/api/dto/ArticleScience.go index 98f4873..52a6350 100644 --- a/api/dto/ArticleScience.go +++ b/api/dto/ArticleScience.go @@ -29,6 +29,7 @@ func GetArticleScienceDto(m *model.ArticleScience) *ArticleScienceDto { ArticleTitle: m.ArticleTitle, ArticleStatus: m.ArticleStatus, IsTop: m.IsTop, + Sort: m.Sort, ArticleImage: utils.AddOssDomain(m.ArticleImage), SourceId: fmt.Sprintf("%d", m.SourceId), ArticleUrl: m.ArticleUrl, @@ -49,6 +50,7 @@ func GetArticleScienceListDto(m []*model.ArticleScience) []*ArticleScienceDto { ArticleTitle: v.ArticleTitle, ArticleStatus: v.ArticleStatus, IsTop: v.IsTop, + Sort: v.Sort, ArticleImage: utils.AddOssDomain(v.ArticleImage), SourceId: fmt.Sprintf("%d", v.SourceId), ArticleUrl: v.ArticleUrl, From 4ad5d2d226685cb477191f5021d9f80f34089823 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 5 Nov 2024 16:10:05 +0800 Subject: [PATCH 27/27] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E5=9B=BE=E7=89=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/requests/ArticleScienceSource.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/requests/ArticleScienceSource.go b/api/requests/ArticleScienceSource.go index 68464ca..c0774ab 100644 --- a/api/requests/ArticleScienceSource.go +++ b/api/requests/ArticleScienceSource.go @@ -27,12 +27,12 @@ type GetArticleScienceSourceList struct { // PutArticleScienceSource 修改科普文章来源 type PutArticleScienceSource struct { - SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 - SourceImage string `json:"source_image" form:"source_image" label:"来源图片" validate:"required"` // 来源图片 + SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 + SourceImage string `json:"source_image" form:"source_image" label:"来源图片"` // 来源图片 } // AddArticleScienceSource 新增科普文章来源 type AddArticleScienceSource struct { - SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 - SourceImage string `json:"source_image" form:"source_image" label:"来源图片" validate:"required"` // 来源图片 + SourceName string `json:"source_name" form:"source_name" label:"来源名称" validate:"required"` // 来源名称 + SourceImage string `json:"source_image" form:"source_image" label:"来源图片"` // 来源图片 }