/** * 计算佣金 * 2020/05/22 */ package ordercalc import ( "errors" "strings" "git.tetele.net/tgo/helper" ) /** * 计算某一商品对分销商的分销价 * @param business 分销商信息 * @param productSpecialPrice 分销特殊价格 * @param distributionPrice 基础分销价 * @param percentage 分销比例 * @param productPrice 商品销售价 * 2020/05/22 * gz */ func DistributionPrice(business map[string]string, productSpecialPrice []map[string]string, distributionPrice interface{}, percentAge interface{}, productPrice interface{}) (float64, error) { product_price := helper.ToString(productPrice) if len(business) < 1 { return 0, errors.New("参数错误") } _, idExist := business["Id"] _, levelIdExist := business["LevelId"] if !idExist || !levelIdExist { return 0, errors.New("分销商参数错误") } distribution_price := helper.ToString(distributionPrice) distribution_price_float, err := helper.ToFloat64(distributionPrice) if err != nil { return 0, err } percent_age := helper.ToString(percentAge) if len(productSpecialPrice) < 1 && percent_age == "" { return distribution_price_float, nil //没有特殊价格,没有分销比例,返回原分销价 } var formula string //分销价计算公式 var is_special_price bool = false //是否使用特殊价格方式,因特殊价格中可能只能会员价,记录以供再次判断 var ok bool if len(productSpecialPrice) > 0 { //特殊价格方式 is_special_price = true //有一条特殊价格,则是使用特殊价 for _, item := range productSpecialPrice { if _, ok = item["BusinessId"]; ok { if item["BusinessId"] != "0" && item["BusinessId"] == business["Id"] { formula = item["DistributionPrice"] break } } if _, ok = item["BusinessLevelId"]; ok { if item["BusinessLevelId"] != "0" && item["BusinessLevelId"] == business["LevelId"] { formula = item["DistributionPrice"] } } } } var price []string var result float64 = 0 //最终分销价 if is_special_price { if formula != "" { formula = strings.Replace(formula, "#distribution_price#", distribution_price, 1) } else { formula = distribution_price } //计算表达式 switch { case strings.Contains(formula, "+"): price = strings.Split(formula, "+") result = FloatAdd(price[0], price[1]) case strings.Contains(formula, "-"): price = strings.Split(formula, "-") result = FloatSub(price[0], price[1]) case strings.Contains(formula, "*"): price = strings.Split(formula, "*") result = FloatMul(price[0], price[1], 2) case strings.Contains(formula, "/"): price = strings.Split(formula, "/") result = FloatQuo(price[0], price[1], 2) default: //使用固定价格或者使用基础分销价 if formula != "" { result, _ = helper.ToFloat64(formula) } else { result = distribution_price_float } } } else { //使用分销比例 if product_price == "" { return 0, errors.New("商品价格错误") } price = strings.Split(percent_age, ":") totalCommission := FloatSub(productPrice, distributionPrice) //总佣金 if totalCommission <= 0 { return helper.ToFloat64(productPrice) //总佣金为负,返回商品原价 } if _, ok = business["Grade"]; ok { level_count := len(price) //分销级数 var totalPercent, cent, commission float64 //总分配份数,分销比例,获得的佣金 switch level_count { case 3: totalPercent = FloatAdd(price[0], price[1], price[2]) if totalPercent <= 0 { result = distribution_price_float //佣金分配比例为0,返回基础分销价 } else { switch business["Grade"] { case "1": //一级分销商得到所有佣金 cent = 1 //分销比例 case "2": //二级分销商得到所有佣金 cent = FloatQuo(FloatAdd(price[0], price[1]), totalPercent) //分销比例 case "0", "3": //三级或无级别分销商得到所有佣金 cent = FloatQuo(price[0], totalPercent) //分销比例 } commission = FloatMul(totalCommission, cent, 2) result = FloatSub(productPrice, commission) //分销价=商品价-佣金 } case 2: totalPercent = FloatAdd(price[0], price[1]) if totalPercent <= 0 { result = distribution_price_float //佣金分配比例为0,返回基础分销价 } else { switch business["Grade"] { case "1": //一级分销商得到所有佣金 cent = 1 //分销比例 case "0", "2": //二级或无级别分销商得到所有佣金 cent = FloatQuo(price[0], totalPercent) //分销比例 } commission = FloatMul(totalCommission, cent, 2) result = FloatSub(productPrice, commission) //分销价=商品价-佣金 } case 1: //只有一级 result = distribution_price_float } } else { return 0, errors.New("分销商参数错误,没有分销级别") } } if result < 0 { result, _ = helper.ToFloat64(productPrice) } return result, nil } /** * 计算某一商品的VIP价 * @param productSpecialPrice 特殊价格 * @param productPrice 商品销售价 * 2020/06/05 * gz */ func VipPrice(productSpecialPrice []map[string]string, productPrice interface{}) (float64, error) { product_price := helper.ToString(productPrice) product_price_float, _ := helper.ToFloat64(productPrice) if len(productSpecialPrice) < 1 { return product_price_float, nil //没有特殊价格,返回原价 } var formula string //VIP价计算公式 var ok bool for _, item := range productSpecialPrice { if _, ok = item["RetailPrice"]; ok { if item["RetailPrice"] != "" { formula = item["RetailPrice"] break } } } if formula != "" { formula = strings.Replace(formula, "#retail_price#", product_price, 1) } else { formula = product_price } //计算表达式 var price []string var result float64 = 0 //最终VIP价 switch { case strings.Contains(formula, "+"): price = strings.Split(formula, "+") result = FloatAdd(price[0], price[1]) case strings.Contains(formula, "-"): price = strings.Split(formula, "-") result = FloatSub(price[0], price[1]) case strings.Contains(formula, "*"): price = strings.Split(formula, "*") result = FloatMul(price[0], price[1], 2) case strings.Contains(formula, "/"): price = strings.Split(formula, "/") result = FloatQuo(price[0], price[1], 2) default: result = product_price_float } if result < 0 || result > product_price_float { result = product_price_float } return result, nil }