1、零售订单新建和列表接口增加对浮点型数据的四舍五入;

This commit is contained in:
chenlin 2024-09-11 14:34:01 +08:00
parent 16e12f85cb
commit d95814ad95
3 changed files with 52 additions and 1 deletions

View File

@ -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("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号")

View File

@ -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

View File

@ -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())
}
}
}
}
}