forked from free-lancers/electricity_bill_calc_service
		
	feat(report):完成获取公示用数据接口的功能。
This commit is contained in:
		| @@ -36,6 +36,7 @@ func InitializeReportController(router *gin.Engine) { | |||||||
| 	router.PUT("/report/:rid/step/meter/register", security.EnterpriseAuthorize, progressEndUserRegister) | 	router.PUT("/report/:rid/step/meter/register", security.EnterpriseAuthorize, progressEndUserRegister) | ||||||
| 	router.POST("/report/:rid/publish", security.EnterpriseAuthorize, publishReport) | 	router.POST("/report/:rid/publish", security.EnterpriseAuthorize, publishReport) | ||||||
| 	router.GET("/reports", security.MustAuthenticated, searchReports) | 	router.GET("/reports", security.MustAuthenticated, searchReports) | ||||||
|  | 	router.GET("/report/:rid", security.MustAuthenticated, fetchReportPublicity) | ||||||
| } | } | ||||||
|  |  | ||||||
| func ensureReportBelongs(c *gin.Context, result *response.Result, requestReportId string) bool { | func ensureReportBelongs(c *gin.Context, result *response.Result, requestReportId string) bool { | ||||||
| @@ -444,3 +445,19 @@ func searchReports(c *gin.Context) { | |||||||
| 		gin.H{"reports": records}, | 		gin.H{"reports": records}, | ||||||
| 	) | 	) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func fetchReportPublicity(c *gin.Context) { | ||||||
|  | 	result := response.NewResult(c) | ||||||
|  | 	requestReportId := c.Param("rid") | ||||||
|  | 	publicity, err := service.ReportService.AssembleReportPublicity(requestReportId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if nfErr, ok := err.(exceptions.NotFoundError); ok { | ||||||
|  | 			result.NotFound(nfErr.Error()) | ||||||
|  | 			return | ||||||
|  | 		} else { | ||||||
|  | 			result.Error(http.StatusInternalServerError, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	result.Success("已经取得指定公示报表的发布版本。", tools.ConvertStructToMap(publicity)) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| package exceptions | package exceptions | ||||||
|  |  | ||||||
|  | import "fmt" | ||||||
|  |  | ||||||
| type NotFoundError struct { | type NotFoundError struct { | ||||||
| 	Message string | 	Message string | ||||||
| } | } | ||||||
| @@ -8,6 +10,10 @@ func NewNotFoundError(msg string) *NotFoundError { | |||||||
| 	return &NotFoundError{Message: msg} | 	return &NotFoundError{Message: msg} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func NewNotFoundErrorFromError(msg string, err error) *NotFoundError { | ||||||
|  | 	return &NotFoundError{Message: fmt.Sprintf("%s,%v", msg, err)} | ||||||
|  | } | ||||||
|  |  | ||||||
| func (e NotFoundError) Error() string { | func (e NotFoundError) Error() string { | ||||||
| 	return e.Message | 	return e.Message | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										113
									
								
								model/publicity.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								model/publicity.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | package model | ||||||
|  |  | ||||||
|  | import "github.com/shopspring/decimal" | ||||||
|  |  | ||||||
|  | type PaidPart struct { | ||||||
|  | 	Overall        decimal.Decimal     `json:"overall"` | ||||||
|  | 	OverallPrice   decimal.Decimal     `json:"overallPrice"` | ||||||
|  | 	ConsumptionFee decimal.Decimal     `json:"consumptionFee"` | ||||||
|  | 	OverallFee     decimal.Decimal     `json:"overallFee"` | ||||||
|  | 	Critical       decimal.NullDecimal `json:"critical"` | ||||||
|  | 	CriticalPrice  decimal.NullDecimal `json:"criticalPrice"` | ||||||
|  | 	CriticalFee    decimal.NullDecimal `json:"criticalFee"` | ||||||
|  | 	Peak           decimal.NullDecimal `json:"peak"` | ||||||
|  | 	PeakPrice      decimal.NullDecimal `json:"peakPrice"` | ||||||
|  | 	PeakFee        decimal.NullDecimal `json:"peakFee"` | ||||||
|  | 	Flat           decimal.NullDecimal `json:"flat"` | ||||||
|  | 	FlatPrice      decimal.NullDecimal `json:"flatPrice"` | ||||||
|  | 	FlatFee        decimal.NullDecimal `json:"flatFee"` | ||||||
|  | 	Valley         decimal.NullDecimal `json:"valley"` | ||||||
|  | 	ValleyPrice    decimal.NullDecimal `json:"valleyPrice"` | ||||||
|  | 	ValleyFee      decimal.NullDecimal `json:"valleyFee"` | ||||||
|  | 	BasicFee       decimal.Decimal     `json:"basicFee"` | ||||||
|  | 	AdjustFee      decimal.Decimal     `json:"adjustFee"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type EndUserOverallPart struct { | ||||||
|  | 	Overall       decimal.Decimal     `json:"overall"` | ||||||
|  | 	OverallPrice  decimal.Decimal     `json:"overallPrice"` | ||||||
|  | 	OverallFee    decimal.Decimal     `json:"overallFee"` | ||||||
|  | 	Critical      decimal.NullDecimal `json:"critical"` | ||||||
|  | 	CriticalPrice decimal.NullDecimal `json:"criticalPrice"` | ||||||
|  | 	CriticalFee   decimal.NullDecimal `json:"criticalFee"` | ||||||
|  | 	Peak          decimal.NullDecimal `json:"peak"` | ||||||
|  | 	PeakPrice     decimal.NullDecimal `json:"peakPrice"` | ||||||
|  | 	PeakFee       decimal.NullDecimal `json:"peakFee"` | ||||||
|  | 	Flat          decimal.NullDecimal `json:"flat"` | ||||||
|  | 	FlatPrice     decimal.NullDecimal `json:"flatPrice"` | ||||||
|  | 	FlatFee       decimal.NullDecimal `json:"flatFee"` | ||||||
|  | 	Valley        decimal.NullDecimal `json:"valley"` | ||||||
|  | 	ValleyPrice   decimal.NullDecimal `json:"valleyPrice"` | ||||||
|  | 	ValleyFee     decimal.NullDecimal `json:"valleyFee"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type PublicConsumptionOverallPart struct { | ||||||
|  | 	Overall        decimal.Decimal     `json:"overall"` | ||||||
|  | 	OverallPrice   decimal.Decimal     `json:"overallPrice"` | ||||||
|  | 	ConsumptionFee decimal.Decimal     `json:"consumptionFee"` | ||||||
|  | 	OverallFee     decimal.Decimal     `json:"overallFee"` | ||||||
|  | 	Critical       decimal.NullDecimal `json:"critical"` | ||||||
|  | 	CriticalPrice  decimal.NullDecimal `json:"criticalPrice"` | ||||||
|  | 	CriticalFee    decimal.NullDecimal `json:"criticalFee"` | ||||||
|  | 	Peak           decimal.NullDecimal `json:"peak"` | ||||||
|  | 	PeakPrice      decimal.NullDecimal `json:"peakPrice"` | ||||||
|  | 	PeakFee        decimal.NullDecimal `json:"peakFee"` | ||||||
|  | 	Flat           decimal.NullDecimal `json:"flat"` | ||||||
|  | 	FlatPrice      decimal.NullDecimal `json:"flatPrice"` | ||||||
|  | 	FlatFee        decimal.NullDecimal `json:"flatFee"` | ||||||
|  | 	Valley         decimal.NullDecimal `json:"valley"` | ||||||
|  | 	ValleyPrice    decimal.NullDecimal `json:"valleyPrice"` | ||||||
|  | 	ValleyFee      decimal.NullDecimal `json:"valleyFee"` | ||||||
|  | 	Proportion     decimal.Decimal     `json:"proportion"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type LossPart struct { | ||||||
|  | 	Quantity       decimal.Decimal `json:"quantity"` | ||||||
|  | 	Price          decimal.Decimal `json:"price"` | ||||||
|  | 	ConsumptionFee decimal.Decimal `json:"consumptionFee"` | ||||||
|  | 	Proportion     decimal.Decimal `json:"proportion"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type OtherShouldCollectionPart struct { | ||||||
|  | 	MaintenanceFee decimal.NullDecimal `json:"maintenanceFee"` | ||||||
|  | 	BasicFees      decimal.Decimal     `json:"basicFees"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type MaintenancePart struct { | ||||||
|  | 	BasicFees             decimal.Decimal `json:"basicFees"` | ||||||
|  | 	LossFee               decimal.Decimal `json:"lossFee"` | ||||||
|  | 	PublicConsumptionFee  decimal.Decimal `json:"publicConsumptionFee"` | ||||||
|  | 	MaintenanceFee        decimal.Decimal `json:"maintenanceFee"` | ||||||
|  | 	FinalMaintenance      decimal.Decimal `json:"finalMaintenance"` | ||||||
|  | 	MaintenanceProportion decimal.Decimal `json:"maintenanceProportion"` | ||||||
|  | 	MaintenancePrice      decimal.Decimal `json:"maintenancePrice"` | ||||||
|  | 	PriceRatio            decimal.Decimal `json:"priceRatio"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type EndUserSummary struct { | ||||||
|  | 	CustomerName *string             `json:"customerName"` | ||||||
|  | 	Address      *string             `json:"address"` | ||||||
|  | 	MeterId      string              `json:"meterId"` | ||||||
|  | 	Overall      decimal.Decimal     `json:"overall"` | ||||||
|  | 	OverallFee   decimal.Decimal     `json:"overallFee"` | ||||||
|  | 	Critical     decimal.NullDecimal `json:"critical"` | ||||||
|  | 	CriticalFee  decimal.NullDecimal `json:"criticalFee"` | ||||||
|  | 	Peak         decimal.NullDecimal `json:"peak"` | ||||||
|  | 	PeakFee      decimal.NullDecimal `json:"peakFee"` | ||||||
|  | 	Valley       decimal.NullDecimal `json:"valley"` | ||||||
|  | 	ValleyFee    decimal.NullDecimal `json:"valleyFee"` | ||||||
|  | 	Maintenance  decimal.Decimal     `json:"maintenance"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Publicity struct { | ||||||
|  | 	Report                   Report                       `json:"index"` | ||||||
|  | 	User                     UserDetail                   `json:"enterprise"` | ||||||
|  | 	Park                     Park                         `json:"park"` | ||||||
|  | 	Paid                     PaidPart                     `json:"paid"` | ||||||
|  | 	EndUser                  EndUserOverallPart           `json:"endUserSum"` | ||||||
|  | 	Loss                     LossPart                     `json:"loss"` | ||||||
|  | 	PublicConsumptionOverall PublicConsumptionOverallPart `json:"public"` | ||||||
|  | 	OtherCollections         OtherShouldCollectionPart    `json:"other"` | ||||||
|  | 	Maintenance              MaintenancePart              `json:"maintenance"` | ||||||
|  | 	EndUserDetails           []EndUserSummary             `json:"endUser"` | ||||||
|  | } | ||||||
| @@ -430,3 +430,156 @@ func (_ReportService) SearchReport(requestUser, requestPark, requestKeyword stri | |||||||
| 		Find(&records) | 		Find(&records) | ||||||
| 	return records, total, err | 	return records, total, err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (_ReportService) AssembleReportPublicity(reportId string) (*model.Publicity, error) { | ||||||
|  | 	// 资料准备 | ||||||
|  | 	var reportIndex = new(model.Report) | ||||||
|  | 	has, err := global.DBConn.ID(reportId).NoAutoCondition().Get(reportIndex) | ||||||
|  | 	if err != nil || !has { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未找到指定的公示报表", err) | ||||||
|  | 	} | ||||||
|  | 	var summary = new(model.ReportSummary) | ||||||
|  | 	has, err = global.DBConn.ID(reportId).NoAutoCondition().Get(summary) | ||||||
|  | 	if err != nil || !has { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未找到指定的公示报表概览", err) | ||||||
|  | 	} | ||||||
|  | 	var maintenanceFeeRecords = make([]model.WillDilutedFee, 0) | ||||||
|  | 	err = global.DBConn.Where(builder.Eq{"report_id": reportId}).Find(&maintenanceFeeRecords) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未能获取到公示报表对应的待摊薄费用信息", err) | ||||||
|  | 	} | ||||||
|  | 	var endUserDetails = make([]model.EndUserDetail, 0) | ||||||
|  | 	err = global.DBConn.Where(builder.Eq{"report_id": reportId}).Find(&endUserDetails) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未获取到公示报表对应的终端用户抄表信息", err) | ||||||
|  | 	} | ||||||
|  | 	parkDetail, err := ParkService.FetchParkDetail(reportIndex.ParkId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未找到公示报表对应的园区信息", err) | ||||||
|  | 	} | ||||||
|  | 	userDetail, err := UserService.retreiveUserDetail(parkDetail.UserId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, exceptions.NewNotFoundErrorFromError("未找到公示报表对应的企业信息", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 组合数据 | ||||||
|  | 	paidPart := model.PaidPart{ | ||||||
|  | 		Overall:        summary.Overall, | ||||||
|  | 		OverallPrice:   summary.OverallPrice.Decimal, | ||||||
|  | 		ConsumptionFee: summary.ConsumptionFee.Decimal, | ||||||
|  | 		OverallFee:     summary.OverallFee, | ||||||
|  | 		Critical:       decimal.NewNullDecimal(summary.Critical), | ||||||
|  | 		CriticalPrice:  summary.CriticalPrice, | ||||||
|  | 		CriticalFee:    decimal.NewNullDecimal(summary.CriticalFee), | ||||||
|  | 		Peak:           decimal.NewNullDecimal(summary.Peak), | ||||||
|  | 		PeakPrice:      summary.PeakPrice, | ||||||
|  | 		PeakFee:        decimal.NewNullDecimal(summary.PeakFee), | ||||||
|  | 		Flat:           decimal.NewNullDecimal(summary.Flat), | ||||||
|  | 		FlatPrice:      summary.FlatPrice, | ||||||
|  | 		FlatFee:        decimal.NewNullDecimal(summary.FlatFee), | ||||||
|  | 		Valley:         decimal.NewNullDecimal(summary.Valley), | ||||||
|  | 		ValleyPrice:    summary.ValleyPrice, | ||||||
|  | 		ValleyFee:      decimal.NewNullDecimal(summary.ValleyFee), | ||||||
|  | 		BasicFee:       summary.BasicFee, | ||||||
|  | 		AdjustFee:      summary.AdjustFee, | ||||||
|  | 	} | ||||||
|  | 	endUserSummary := model.EndUserOverallPart{ | ||||||
|  | 		Overall:       summary.CustomerConsumption.Decimal, | ||||||
|  | 		OverallPrice:  summary.OverallPrice.Decimal, | ||||||
|  | 		OverallFee:    summary.CustomerConsumptionFee.Decimal, | ||||||
|  | 		Critical:      summary.CustomerConsumptionCritical, | ||||||
|  | 		CriticalPrice: summary.CriticalPrice, | ||||||
|  | 		CriticalFee:   summary.CustomerConsumptionCriticalFee, | ||||||
|  | 		Peak:          summary.CustomerConsumptionPeak, | ||||||
|  | 		PeakPrice:     summary.PeakPrice, | ||||||
|  | 		PeakFee:       summary.CustomerConsumptionPeakFee, | ||||||
|  | 		Flat:          summary.CustomerConsumptionFlat, | ||||||
|  | 		FlatPrice:     summary.FlatPrice, | ||||||
|  | 		FlatFee:       summary.CustomerConsumptionFlatFee, | ||||||
|  | 		Valley:        summary.CustomerConsumptionValley, | ||||||
|  | 		ValleyPrice:   summary.ValleyPrice, | ||||||
|  | 		ValleyFee:     summary.CustomerConsumptionValleyFee, | ||||||
|  | 	} | ||||||
|  | 	lossPart := model.LossPart{ | ||||||
|  | 		Quantity:       summary.Loss.Decimal, | ||||||
|  | 		Price:          summary.OverallPrice.Decimal, | ||||||
|  | 		ConsumptionFee: summary.LossFee.Decimal, | ||||||
|  | 		Proportion:     summary.LossProportion.Decimal, | ||||||
|  | 	} | ||||||
|  | 	publicSummary := model.PublicConsumptionOverallPart{ | ||||||
|  | 		Overall:       summary.PublicConsumption.Decimal, | ||||||
|  | 		OverallPrice:  summary.OverallPrice.Decimal, | ||||||
|  | 		OverallFee:    summary.PublicConsumptionFee.Decimal, | ||||||
|  | 		Critical:      summary.PublicConsumptionCritical, | ||||||
|  | 		CriticalPrice: summary.CriticalPrice, | ||||||
|  | 		CriticalFee:   summary.PublicConsumptionCriticalFee, | ||||||
|  | 		Peak:          summary.PublicConsumptionPeak, | ||||||
|  | 		PeakPrice:     summary.PeakPrice, | ||||||
|  | 		PeakFee:       summary.PublicConsumptionPeakFee, | ||||||
|  | 		Flat:          summary.PublicConsumptionFlat, | ||||||
|  | 		FlatPrice:     summary.FlatPrice, | ||||||
|  | 		FlatFee:       summary.PublicConsumptionFlatFee, | ||||||
|  | 		Valley:        summary.PublicConsumptionValley, | ||||||
|  | 		ValleyPrice:   summary.ValleyPrice, | ||||||
|  | 		ValleyFee:     summary.PublicConsumptionValleyFee, | ||||||
|  | 	} | ||||||
|  | 	otherCollection := model.OtherShouldCollectionPart{ | ||||||
|  | 		MaintenanceFee: summary.FinalDilutedOverall, | ||||||
|  | 		BasicFees:      summary.BasicFee.Add(summary.AdjustFee), | ||||||
|  | 	} | ||||||
|  | 	finalMaintenance := lossPart.ConsumptionFee.Add(publicSummary.ConsumptionFee).Add(otherCollection.MaintenanceFee.Decimal).Add(otherCollection.BasicFees) | ||||||
|  | 	var maintenancePrice = decimal.Zero | ||||||
|  | 	if !endUserSummary.Overall.Equal(decimal.Zero) { | ||||||
|  | 		maintenancePrice = finalMaintenance.Div(endUserSummary.Overall).RoundBank(8) | ||||||
|  | 	} | ||||||
|  | 	var maintenanceProportion = decimal.Zero | ||||||
|  | 	if !paidPart.OverallFee.Equal(decimal.Zero) || !otherCollection.MaintenanceFee.Decimal.Equal(decimal.Zero) { | ||||||
|  | 		maintenanceProportion = finalMaintenance.Div(paidPart.OverallFee.Add(otherCollection.MaintenanceFee.Decimal)).RoundBank(8) | ||||||
|  | 	} | ||||||
|  | 	var priceRatio = decimal.Zero | ||||||
|  | 	if !summary.OverallPrice.Decimal.Equal(decimal.Zero) { | ||||||
|  | 		priceRatio = maintenancePrice.Div(summary.OverallPrice.Decimal).RoundBank(8) | ||||||
|  | 	} | ||||||
|  | 	maintenanceFees := model.MaintenancePart{ | ||||||
|  | 		BasicFees:             otherCollection.BasicFees, | ||||||
|  | 		LossFee:               lossPart.ConsumptionFee, | ||||||
|  | 		PublicConsumptionFee:  publicSummary.ConsumptionFee, | ||||||
|  | 		MaintenanceFee:        otherCollection.MaintenanceFee.Decimal, | ||||||
|  | 		FinalMaintenance:      finalMaintenance, | ||||||
|  | 		MaintenanceProportion: maintenanceProportion, | ||||||
|  | 		MaintenancePrice:      maintenancePrice, | ||||||
|  | 		PriceRatio:            priceRatio, | ||||||
|  | 	} | ||||||
|  | 	endUsers := lo.Map( | ||||||
|  | 		endUserDetails, | ||||||
|  | 		func(elem model.EndUserDetail, index int) model.EndUserSummary { | ||||||
|  | 			return model.EndUserSummary{ | ||||||
|  | 				CustomerName: elem.CustomerName, | ||||||
|  | 				Address:      elem.Address, | ||||||
|  | 				MeterId:      elem.MeterId, | ||||||
|  | 				Overall:      elem.Overall.Decimal, | ||||||
|  | 				OverallFee:   elem.OverallFee.Decimal, | ||||||
|  | 				Critical:     elem.Critical, | ||||||
|  | 				CriticalFee:  elem.CriticalFee, | ||||||
|  | 				Peak:         elem.Peak, | ||||||
|  | 				PeakFee:      elem.PeakFee, | ||||||
|  | 				Valley:       elem.Valley, | ||||||
|  | 				ValleyFee:    elem.ValleyFee, | ||||||
|  | 				Maintenance:  elem.FinalDiluted.Decimal, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	return &model.Publicity{ | ||||||
|  | 		Report:                   *reportIndex, | ||||||
|  | 		Park:                     *parkDetail, | ||||||
|  | 		User:                     *userDetail, | ||||||
|  | 		Paid:                     paidPart, | ||||||
|  | 		EndUser:                  endUserSummary, | ||||||
|  | 		Loss:                     lossPart, | ||||||
|  | 		PublicConsumptionOverall: publicSummary, | ||||||
|  | 		OtherCollections:         otherCollection, | ||||||
|  | 		Maintenance:              maintenanceFees, | ||||||
|  | 		EndUserDetails:           endUsers, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user