mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	支持默认价格设置
This commit is contained in:
		@@ -31,13 +31,24 @@ func init() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateOrUpdateServerBill 创建账单
 | 
					// CreateOrUpdateServerBill 创建账单
 | 
				
			||||||
func (this *ServerBillDAO) CreateOrUpdateServerBill(tx *dbs.Tx, userId int64, serverId int64, month string, userPlanId int64, planId int64, totalTrafficBytes int64, bandwidthPercentileBytes int64, bandwidthPercentile int, fee float64) error {
 | 
					func (this *ServerBillDAO) CreateOrUpdateServerBill(tx *dbs.Tx,
 | 
				
			||||||
 | 
						userId int64,
 | 
				
			||||||
 | 
						serverId int64,
 | 
				
			||||||
 | 
						month string,
 | 
				
			||||||
 | 
						userPlanId int64,
 | 
				
			||||||
 | 
						planId int64,
 | 
				
			||||||
 | 
						totalTrafficBytes int64,
 | 
				
			||||||
 | 
						bandwidthPercentileBytes int64,
 | 
				
			||||||
 | 
						bandwidthPercentile int,
 | 
				
			||||||
 | 
						priceType string,
 | 
				
			||||||
 | 
						fee float64) error {
 | 
				
			||||||
	fee = math.Floor(fee*100) / 100
 | 
						fee = math.Floor(fee*100) / 100
 | 
				
			||||||
	return this.Query(tx).
 | 
						return this.Query(tx).
 | 
				
			||||||
		InsertOrUpdateQuickly(maps.Map{
 | 
							InsertOrUpdateQuickly(maps.Map{
 | 
				
			||||||
			"userId":                   userId,
 | 
								"userId":                   userId,
 | 
				
			||||||
			"serverId":                 serverId,
 | 
								"serverId":                 serverId,
 | 
				
			||||||
			"month":                    month,
 | 
								"month":                    month,
 | 
				
			||||||
 | 
								"priceType":                priceType,
 | 
				
			||||||
			"amount":                   fee,
 | 
								"amount":                   fee,
 | 
				
			||||||
			"userPlanId":               userPlanId,
 | 
								"userPlanId":               userPlanId,
 | 
				
			||||||
			"planId":                   planId,
 | 
								"planId":                   planId,
 | 
				
			||||||
@@ -47,6 +58,7 @@ func (this *ServerBillDAO) CreateOrUpdateServerBill(tx *dbs.Tx, userId int64, se
 | 
				
			|||||||
			"createdAt":                time.Now().Unix(),
 | 
								"createdAt":                time.Now().Unix(),
 | 
				
			||||||
		}, maps.Map{
 | 
							}, maps.Map{
 | 
				
			||||||
			"userId":                   userId,
 | 
								"userId":                   userId,
 | 
				
			||||||
 | 
								"priceType":                priceType,
 | 
				
			||||||
			"amount":                   fee,
 | 
								"amount":                   fee,
 | 
				
			||||||
			"userPlanId":               userPlanId,
 | 
								"userPlanId":               userPlanId,
 | 
				
			||||||
			"planId":                   planId,
 | 
								"planId":                   planId,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ func TestServerBillDAO_CreateOrUpdateServerBill(t *testing.T) {
 | 
				
			|||||||
	var dao = NewServerBillDAO()
 | 
						var dao = NewServerBillDAO()
 | 
				
			||||||
	var tx *dbs.Tx
 | 
						var tx *dbs.Tx
 | 
				
			||||||
	var month = timeutil.Format("Y02")
 | 
						var month = timeutil.Format("Y02")
 | 
				
			||||||
	err := dao.CreateOrUpdateServerBill(tx, 1, 2, month, 4, 5, 6, 7, 95, 100)
 | 
						err := dao.CreateOrUpdateServerBill(tx, 1, 2, month, 4, 5, 6, 7, 95, "", 100)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@ type ServerBill struct {
 | 
				
			|||||||
	TotalTrafficBytes        uint64  `field:"totalTrafficBytes"`        // 总流量
 | 
						TotalTrafficBytes        uint64  `field:"totalTrafficBytes"`        // 总流量
 | 
				
			||||||
	BandwidthPercentileBytes uint64  `field:"bandwidthPercentileBytes"` // 带宽百分位字节
 | 
						BandwidthPercentileBytes uint64  `field:"bandwidthPercentileBytes"` // 带宽百分位字节
 | 
				
			||||||
	BandwidthPercentile      uint8   `field:"bandwidthPercentile"`      // 带宽百分位
 | 
						BandwidthPercentile      uint8   `field:"bandwidthPercentile"`      // 带宽百分位
 | 
				
			||||||
 | 
						PriceType                string  `field:"priceType"`                // 计费类型
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ServerBillOperator struct {
 | 
					type ServerBillOperator struct {
 | 
				
			||||||
@@ -27,6 +28,7 @@ type ServerBillOperator struct {
 | 
				
			|||||||
	TotalTrafficBytes        interface{} // 总流量
 | 
						TotalTrafficBytes        interface{} // 总流量
 | 
				
			||||||
	BandwidthPercentileBytes interface{} // 带宽百分位字节
 | 
						BandwidthPercentileBytes interface{} // 带宽百分位字节
 | 
				
			||||||
	BandwidthPercentile      interface{} // 带宽百分位
 | 
						BandwidthPercentile      interface{} // 带宽百分位
 | 
				
			||||||
 | 
						PriceType                interface{} // 计费类型
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewServerBillOperator() *ServerBillOperator {
 | 
					func NewServerBillOperator() *ServerBillOperator {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,6 +158,24 @@ func (this *SysSettingDAO) ReadUserServerConfig(tx *dbs.Tx) (*userconfigs.UserSe
 | 
				
			|||||||
	return config, nil
 | 
						return config, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ReadUserFinanceConfig 读取用户服务配置
 | 
				
			||||||
 | 
					func (this *SysSettingDAO) ReadUserFinanceConfig(tx *dbs.Tx) (*userconfigs.UserFinanceConfig, error) {
 | 
				
			||||||
 | 
						valueJSON, err := this.ReadSetting(tx, systemconfigs.SettingCodeUserFinanceConfig)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(valueJSON) == 0 {
 | 
				
			||||||
 | 
							return userconfigs.DefaultUserFinanceConfig(), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var config = userconfigs.DefaultUserFinanceConfig()
 | 
				
			||||||
 | 
						err = json.Unmarshal(valueJSON, config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return config, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ReadAdminUIConfig 读取管理员界面配置
 | 
					// ReadAdminUIConfig 读取管理员界面配置
 | 
				
			||||||
func (this *SysSettingDAO) ReadAdminUIConfig(tx *dbs.Tx, cacheMap *utils.CacheMap) (*systemconfigs.AdminUIConfig, error) {
 | 
					func (this *SysSettingDAO) ReadAdminUIConfig(tx *dbs.Tx, cacheMap *utils.CacheMap) (*systemconfigs.AdminUIConfig, error) {
 | 
				
			||||||
	var cacheKey = this.Table + ":ReadAdminUIConfig"
 | 
						var cacheKey = this.Table + ":ReadAdminUIConfig"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -182,6 +182,12 @@ func (this *UserBillDAO) GenerateBills(tx *dbs.Tx, month string) error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 默认计费方式
 | 
				
			||||||
 | 
						userFinanceConfig, err := SharedSysSettingDAO.ReadUserFinanceConfig(tx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 计算服务套餐费用
 | 
						// 计算服务套餐费用
 | 
				
			||||||
	plans, err := SharedPlanDAO.FindAllEnabledPlans(tx)
 | 
						plans, err := SharedPlanDAO.FindAllEnabledPlans(tx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -212,52 +218,103 @@ func (this *UserBillDAO) GenerateBills(tx *dbs.Tx, month string) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		userIds = append(userIds, userId)
 | 
							userIds = append(userIds, userId)
 | 
				
			||||||
		if userPlanId == 0 {
 | 
							if userPlanId == 0 {
 | 
				
			||||||
			var fee float64
 | 
					 | 
				
			||||||
			for _, region := range regions {
 | 
					 | 
				
			||||||
				var regionId = int64(region.Id)
 | 
					 | 
				
			||||||
				var pricesMap = region.DecodePriceMap()
 | 
					 | 
				
			||||||
				if len(pricesMap) == 0 {
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				trafficBytes, err := SharedServerDailyStatDAO.SumServerMonthlyWithRegion(tx, serverId, regionId, month)
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if trafficBytes == 0 {
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				var itemId = SharedNodePriceItemDAO.SearchItemsWithBytes(priceItems, trafficBytes)
 | 
					 | 
				
			||||||
				if itemId == 0 {
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				price, ok := pricesMap[itemId]
 | 
					 | 
				
			||||||
				if !ok {
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if price <= 0 {
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				var regionFee = float64(trafficBytes) / 1000 / 1000 / 1000 * 8 * price
 | 
					 | 
				
			||||||
				fee += regionFee
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// 总流量
 | 
								// 总流量
 | 
				
			||||||
			totalTrafficBytes, err := SharedServerDailyStatDAO.SumMonthlyBytes(tx, serverId, month)
 | 
								totalTrafficBytes, err := SharedServerDailyStatDAO.SumMonthlyBytes(tx, serverId, month)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 百分位
 | 
								// 默认计费方式
 | 
				
			||||||
			var percentile = 95
 | 
								if userFinanceConfig != nil && userFinanceConfig.IsOn { // 默认计费方式
 | 
				
			||||||
			percentileBytes, err := SharedServerDailyStatDAO.FindMonthlyPercentile(tx, serverId, month, percentile)
 | 
									switch userFinanceConfig.PriceType {
 | 
				
			||||||
			if err != nil {
 | 
									case serverconfigs.PlanPriceTypeTraffic:
 | 
				
			||||||
				return err
 | 
										var config = userFinanceConfig.TrafficPriceConfig
 | 
				
			||||||
			}
 | 
										var fee float64 = 0
 | 
				
			||||||
 | 
										if config != nil && config.Base > 0 {
 | 
				
			||||||
 | 
											fee = float64(totalTrafficBytes) / 1024 / 1024 / 1024 * float64(config.Base)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, userId, serverId, month, userPlanId, 0, totalTrafficBytes, percentileBytes, percentile, fee)
 | 
										// 百分位
 | 
				
			||||||
			if err != nil {
 | 
										var percentile = 95
 | 
				
			||||||
				return err
 | 
										percentileBytes, err := SharedServerDailyStatDAO.FindMonthlyPercentile(tx, serverId, month, percentile)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, userId, serverId, month, userPlanId, 0, totalTrafficBytes, percentileBytes, percentile, userFinanceConfig.PriceType, fee)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									case serverconfigs.PlanPriceTypeBandwidth:
 | 
				
			||||||
 | 
										// 百分位
 | 
				
			||||||
 | 
										var percentile = 95
 | 
				
			||||||
 | 
										var config = userFinanceConfig.BandwidthPriceConfig
 | 
				
			||||||
 | 
										if config != nil {
 | 
				
			||||||
 | 
											percentile = config.Percentile
 | 
				
			||||||
 | 
											if percentile <= 0 {
 | 
				
			||||||
 | 
												percentile = 95
 | 
				
			||||||
 | 
											} else if percentile > 100 {
 | 
				
			||||||
 | 
												percentile = 100
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										percentileBytes, err := SharedServerDailyStatDAO.FindMonthlyPercentile(tx, serverId, month, percentile)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var mb = float32(percentileBytes) / 1024 / 1024
 | 
				
			||||||
 | 
										var price float32
 | 
				
			||||||
 | 
										if config != nil {
 | 
				
			||||||
 | 
											price = config.LookupPrice(mb)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var fee = float64(price)
 | 
				
			||||||
 | 
										err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, userId, serverId, month, userPlanId, 0, totalTrafficBytes, percentileBytes, percentile, userFinanceConfig.PriceType, fee)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else { // 区域流量计费
 | 
				
			||||||
 | 
									var fee float64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for _, region := range regions {
 | 
				
			||||||
 | 
										var regionId = int64(region.Id)
 | 
				
			||||||
 | 
										var pricesMap = region.DecodePriceMap()
 | 
				
			||||||
 | 
										if len(pricesMap) == 0 {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										trafficBytes, err := SharedServerDailyStatDAO.SumServerMonthlyWithRegion(tx, serverId, regionId, month)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if trafficBytes == 0 {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var itemId = SharedNodePriceItemDAO.SearchItemsWithBytes(priceItems, trafficBytes)
 | 
				
			||||||
 | 
										if itemId == 0 {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										price, ok := pricesMap[itemId]
 | 
				
			||||||
 | 
										if !ok {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if price <= 0 {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										var regionFee = float64(trafficBytes) / 1000 / 1000 / 1000 * 8 * price
 | 
				
			||||||
 | 
										fee += regionFee
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// 百分位
 | 
				
			||||||
 | 
									var percentile = 95
 | 
				
			||||||
 | 
									percentileBytes, err := SharedServerDailyStatDAO.FindMonthlyPercentile(tx, serverId, month, percentile)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, userId, serverId, month, userPlanId, 0, totalTrafficBytes, percentileBytes, percentile, "", fee)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			userPlan, err := SharedUserPlanDAO.FindUserPlanWithoutState(tx, userPlanId, cacheMap)
 | 
								userPlan, err := SharedUserPlanDAO.FindUserPlanWithoutState(tx, userPlanId, cacheMap)
 | 
				
			||||||
@@ -291,7 +348,7 @@ func (this *UserBillDAO) GenerateBills(tx *dbs.Tx, month string) error {
 | 
				
			|||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, fee)
 | 
									err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, plan.PriceType, fee)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -309,7 +366,7 @@ func (this *UserBillDAO) GenerateBills(tx *dbs.Tx, month string) error {
 | 
				
			|||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, fee)
 | 
									err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, plan.PriceType, fee)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -335,7 +392,7 @@ func (this *UserBillDAO) GenerateBills(tx *dbs.Tx, month string) error {
 | 
				
			|||||||
					price = config.LookupPrice(mb)
 | 
										price = config.LookupPrice(mb)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				var fee = float64(price)
 | 
									var fee = float64(price)
 | 
				
			||||||
				err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, fee)
 | 
									err = SharedServerBillDAO.CreateOrUpdateServerBill(tx, int64(userPlan.UserId), serverId, month, userPlanId, int64(userPlan.PlanId), totalTrafficBytes, percentileBytes, percentile, plan.PriceType, fee)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,6 +114,7 @@ func (this *ServerBillService) ListServerBills(ctx context.Context, req *pb.List
 | 
				
			|||||||
			UserId:                   int64(bill.UserId),
 | 
								UserId:                   int64(bill.UserId),
 | 
				
			||||||
			ServerId:                 int64(bill.ServerId),
 | 
								ServerId:                 int64(bill.ServerId),
 | 
				
			||||||
			Amount:                   float32(bill.Amount),
 | 
								Amount:                   float32(bill.Amount),
 | 
				
			||||||
 | 
								PriceType:                bill.PriceType,
 | 
				
			||||||
			CreatedAt:                int64(bill.CreatedAt),
 | 
								CreatedAt:                int64(bill.CreatedAt),
 | 
				
			||||||
			UserPlanId:               int64(bill.UserPlanId),
 | 
								UserPlanId:               int64(bill.UserPlanId),
 | 
				
			||||||
			PlanId:                   int64(bill.PlanId),
 | 
								PlanId:                   int64(bill.PlanId),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user