From d95814ad9564d34e724bc2f86f7eab5566d75b55 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 11 Sep 2024 14:34:01 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E9=9B=B6=E5=94=AE=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E5=92=8C=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E6=B5=AE=E7=82=B9=E5=9E=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=9B=9B=E8=88=8D=E4=BA=94=E5=85=A5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/erpordermanage/erp_order.go | 2 ++ app/admin/models/erp_order.go | 21 ++++++++++++++- tools/utils.go | 30 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index b8d5284..9ba1973 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -35,6 +35,8 @@ func ErpOrderCreate(c *gin.Context) { return } + tools.RoundFloatFields(req) + // 如果用户是会员,手机号不能为空 if req.MemberType == model.ErpOrderMemberTypeMember && req.Tel == "" { app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号") diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index b2a2d3a..c9b3d74 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -1416,9 +1416,25 @@ func mergeOrderCommodities(orderCommodities []ErpOrderCommodity) []ErpOrderCommo // 将map转换回orderCommodities列表 var mergedCommodities []ErpOrderCommodity for _, commodity := range commodityMap { + // 对float64类型的字段进行四舍五入处理 + commodity.SalesProfit = tools.RoundFloat(commodity.SalesProfit) + commodity.StaffProfit = tools.RoundFloat(commodity.StaffProfit) + commodity.SaleDiscount = tools.RoundFloat(commodity.SaleDiscount) + commodity.MemberDiscount = tools.RoundFloat(commodity.MemberDiscount) + commodity.ReceivedAmount = tools.RoundFloat(commodity.ReceivedAmount) + commodity.RejectedPrice = tools.RoundFloat(commodity.RejectedPrice) + commodity.RejectedAmount = tools.RoundFloat(commodity.RejectedAmount) + commodity.StaffCostPrice = tools.RoundFloat(commodity.StaffCostPrice) + commodity.WholesalePrice = tools.RoundFloat(commodity.WholesalePrice) + mergedCommodities = append(mergedCommodities, *commodity) } + // 对mergedCommodities按ErpCommodityId进行排序 + sort.Slice(mergedCommodities, func(i, j int) bool { + return mergedCommodities[i].ID < mergedCommodities[j].ID + }) + return mergedCommodities } @@ -4970,6 +4986,8 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error { if err != nil { return err } + // 四舍五入 + tools.RoundFloatFields(req) begin := orm.Eloquent.Begin() if req.Tel != "" { @@ -5470,6 +5488,7 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { } req.ErpOrderCommodities = respErpOrderCommodities + tools.RoundFloatFields(erpOrder) // 判断线上支付金额是否>0 if req.RetailType == RetailTypeSale { @@ -5515,7 +5534,7 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { // 订单总优惠 if req.RetailType == RetailTypeSale { - erpOrder.TotalDiscount = erpOrder.TotalRetailPrice - erpOrder.TotalAmount + erpOrder.TotalDiscount = math.Round((erpOrder.TotalRetailPrice-erpOrder.TotalAmount)*100) / 100 } return erpOrder, nil diff --git a/tools/utils.go b/tools/utils.go index a39cd96..dc7fa11 100644 --- a/tools/utils.go +++ b/tools/utils.go @@ -6,6 +6,7 @@ import ( "gorm.io/gorm" "log" "math" + "reflect" "runtime" "strconv" "time" @@ -134,3 +135,32 @@ func StringSliceContains(slice []string, val string) bool { } return false } + +// RoundFloat 保留 float64 两位小数 +func RoundFloat(f float64) float64 { + return math.Round(f*100) / 100 +} + +// RoundFloatFields 递归处理结构体中的 float64 字段,四舍五入保留两位小数 +func RoundFloatFields(v interface{}) { + val := reflect.ValueOf(v).Elem() + + for i := 0; i < val.NumField(); i++ { + field := val.Field(i) + switch field.Kind() { + case reflect.Float64: + // 对 float64 类型进行四舍五入 + field.SetFloat(RoundFloat(field.Float())) + case reflect.Struct: + // 递归处理子结构体 + RoundFloatFields(field.Addr().Interface()) + case reflect.Slice: + // 对于 slice 中的结构体,逐个处理 + for j := 0; j < field.Len(); j++ { + if field.Index(j).Kind() == reflect.Struct { + RoundFloatFields(field.Index(j).Addr().Interface()) + } + } + } + } +}