// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. package bills import ( "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/userconfigs" "github.com/iwind/TeaGo/maps" timeutil "github.com/iwind/TeaGo/utils/time" ) type BillAction struct { actionutils.ParentAction } func (this *BillAction) Init() { this.Nav("", "", "index") } func (this *BillAction) RunGet(params struct { BillId int64 }) { userBillResp, err := this.RPC().UserBillRPC().FindUserBill(this.AdminContext(), &pb.FindUserBillRequest{UserBillId: params.BillId}) if err != nil { this.ErrorPage(err) return } var bill = userBillResp.UserBill if bill == nil { this.NotFound("user bill", params.BillId) return } var userMap maps.Map = nil if bill.User != nil { userMap = maps.Map{ "id": bill.User.Id, "fullname": bill.User.Fullname, "username": bill.User.Username, } } var month = bill.Month var dayFrom = bill.DayFrom var dayTo = bill.DayTo if len(month) == 6 { month = month[:4] + "-" + month[4:] } if len(dayFrom) == 8 { dayFrom = dayFrom[:4] + "-" + dayFrom[4:6] + "-" + dayFrom[6:] } if len(dayTo) == 8 { dayTo = dayTo[:4] + "-" + dayTo[4:6] + "-" + dayTo[6:] } this.Data["bill"] = maps.Map{ "id": bill.Id, "isPaid": bill.IsPaid, "month": month, "dayFrom": dayFrom, "dayTo": dayTo, "amount": numberutils.FormatFloat(bill.Amount, 2), "typeName": bill.TypeName, "user": userMap, "description": bill.Description, "code": bill.Code, "canPay": bill.CanPay, "pricePeriodName": userconfigs.PricePeriodName(bill.PricePeriod), "pricePeriod": bill.PricePeriod, } // 子账单 var serverBillMaps = []maps.Map{} if (bill.Type == "traffic" || bill.Type == "trafficAndBandwidth") && bill.User != nil { countResp, err := this.RPC().ServerBillRPC().CountAllServerBills(this.AdminContext(), &pb.CountAllServerBillsRequest{ UserId: bill.User.Id, Month: bill.Month, }) if err != nil { this.ErrorPage(err) return } var count = countResp.Count var page = this.NewPage(count) this.Data["page"] = page.AsHTML() serverBillsResp, err := this.RPC().ServerBillRPC().ListServerBills(this.AdminContext(), &pb.ListServerBillsRequest{ UserId: bill.User.Id, Month: bill.Month, Offset: page.Offset, Size: page.Size, }) if err != nil { this.ErrorPage(err) return } for _, serverBill := range serverBillsResp.ServerBills { // server var serverMap = maps.Map{"id": 0} if serverBill.Server != nil { serverMap = maps.Map{ "id": serverBill.Server.Id, "name": serverBill.Server.Name, } } // plan var planMap = maps.Map{"id": 0} if serverBill.Plan != nil { planMap = maps.Map{ "id": serverBill.Plan.Id, "name": serverBill.Plan.Name, "priceType": serverBill.Plan.PriceType, } } serverBillMaps = append(serverBillMaps, maps.Map{ "id": serverBill.Id, "server": serverMap, "plan": planMap, "traffic": numberutils.FormatBytes(serverBill.TotalTrafficBytes), "bandwidthPercentile": serverBill.BandwidthPercentile, "bandwidthPercentileSize": numberutils.FormatBytes(serverBill.BandwidthPercentileBytes), "createdTime": timeutil.FormatTime("Y-m-d H:i:s", serverBill.CreatedAt), "amount": numberutils.FormatFloat(serverBill.Amount, 2), "priceType": serverBill.PriceType, }) } } this.Data["serverBills"] = serverBillMaps // traffic bills var trafficBillMaps = []maps.Map{} trafficBillsResp, err := this.RPC().UserTrafficBillRPC().FindUserTrafficBills(this.AdminContext(), &pb.FindUserTrafficBillsRequest{UserBillId: bill.Id}) if err != nil { this.ErrorPage(err) return } for _, trafficBill := range trafficBillsResp.UserTrafficBills { var regionMap = maps.Map{"id": 0} var nodeRegion = trafficBill.NodeRegion if nodeRegion != nil { regionMap = maps.Map{ "id": nodeRegion.Id, "name": nodeRegion.Name, } } else if trafficBill.NodeRegionId > 0 { regionMap = maps.Map{ "id": trafficBill.NodeRegionId, "name": "[" + this.Lang(codes.AdminCommon_Canceled) + "]", } } trafficBillMaps = append(trafficBillMaps, maps.Map{ "priceType": trafficBill.PriceType, "priceTypeName": userconfigs.PriceTypeName(trafficBill.PriceType), "trafficGB": numberutils.FormatBytes(int64(trafficBill.TrafficGB * (1 << 30))), "trafficPackageGB": numberutils.FormatBytes(int64(trafficBill.TrafficPackageGB * (1 << 30))), "bandwidthMB": numberutils.FormatBits(int64(trafficBill.BandwidthMB * (1 << 20))), "bandwidthPercentile": trafficBill.BandwidthPercentile, "amount": numberutils.FormatFloat(trafficBill.Amount, 2), "pricePerUnit": trafficBill.PricePerUnit, "region": regionMap, }) } this.Data["trafficBills"] = trafficBillMaps this.Show() }