feat(report):完成获取公示用数据接口的功能。

This commit is contained in:
徐涛 2022-08-24 11:26:17 +08:00
parent ad19169ac5
commit 4919c7152f
4 changed files with 289 additions and 0 deletions

View File

@ -36,6 +36,7 @@ func InitializeReportController(router *gin.Engine) {
router.PUT("/report/:rid/step/meter/register", security.EnterpriseAuthorize, progressEndUserRegister)
router.POST("/report/:rid/publish", security.EnterpriseAuthorize, publishReport)
router.GET("/reports", security.MustAuthenticated, searchReports)
router.GET("/report/:rid", security.MustAuthenticated, fetchReportPublicity)
}
func ensureReportBelongs(c *gin.Context, result *response.Result, requestReportId string) bool {
@ -444,3 +445,19 @@ func searchReports(c *gin.Context) {
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))
}

View File

@ -1,5 +1,7 @@
package exceptions
import "fmt"
type NotFoundError struct {
Message string
}
@ -8,6 +10,10 @@ func NewNotFoundError(msg string) *NotFoundError {
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 {
return e.Message
}

113
model/publicity.go Normal file
View 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"`
}

View File

@ -430,3 +430,156 @@ func (_ReportService) SearchReport(requestUser, requestPark, requestKeyword stri
Find(&records)
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
}