feat(report):完成获取公示用数据接口的功能。
This commit is contained in:
parent
ad19169ac5
commit
4919c7152f
|
@ -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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user