From c0e5ca8c335f094328cb2c1c220bdb0109319f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Tue, 23 Aug 2022 11:07:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(report):=E5=AE=8C=E6=88=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8D=95=E4=B8=80=E6=8A=84=E8=A1=A8=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/end_user.go | 92 ++++++++++++++++++++++++++++++++++++++++ model/end_user_detail.go | 11 ++--- service/end_user.go | 14 ++++++ 3 files changed, 112 insertions(+), 5 deletions(-) diff --git a/controller/end_user.go b/controller/end_user.go index 0a5572d..25bab71 100644 --- a/controller/end_user.go +++ b/controller/end_user.go @@ -2,6 +2,7 @@ package controller import ( "electricity_bill_calc/excel" + "electricity_bill_calc/global" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" @@ -10,12 +11,14 @@ import ( "github.com/gin-gonic/gin" "github.com/samber/lo" + "github.com/shopspring/decimal" ) func InitializeEndUserController(router *gin.Engine) { router.GET("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport) router.GET("/report/:rid/meter/template", security.EnterpriseAuthorize, downloadEndUserRegisterTemplate) router.POST("/report/:rid/meter/batch", security.EnterpriseAuthorize, uploadEndUserRegisterTemplate) + router.PUT("/report/:rid/submeter/:pid/:mid", security.EnterpriseAuthorize, modifyEndUserRegisterRecord) } func fetchEndUserInReport(c *gin.Context) { @@ -121,3 +124,92 @@ func uploadEndUserRegisterTemplate(c *gin.Context) { } result.Json(http.StatusOK, "已经成功完成抄表记录的导入。", gin.H{"errors": make([]error, 0)}) } + +type ModifyEndUserRegisterFormData struct { + CurrentPeriodOverall decimal.NullDecimal `json:"currentPeriodOverall" form:"currentPeriodOverall"` + CurrentPeriodCritical decimal.NullDecimal `json:"currentPeriodCritical" form:"currentPeriodCritical"` + CurrentPeriodPeak decimal.NullDecimal `json:"currentPeriodPeak" form:"currentPeriodPeak"` + CurrentPeriodValley decimal.NullDecimal `json:"currentPeriodValley" form:"currentPeriodValley"` + AdjustOverall decimal.NullDecimal `json:"adjustOverall" form:"adjustOverall"` + AdjustCritical decimal.NullDecimal `json:"adjustCritical" form:"adjustCritical"` + AdjustPeak decimal.NullDecimal `json:"adjustPeak" form:"adjustPeak"` + AdjustValley decimal.NullDecimal `json:"adjustValley" form:"adjustValley"` +} + +func modifyEndUserRegisterRecord(c *gin.Context) { + result := response.NewResult(c) + requestReportId := c.Param("rid") + if !ensureReportBelongs(c, result, requestReportId) { + return + } + meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId) + if err != nil { + result.Error(http.StatusInternalServerError, err.Error()) + return + } + if meterType == -1 { + result.NotFound("未能确定用户表计类型。") + return + } + requestParkId := c.Param("pid") + requestMeterId := c.Param("mid") + formData := new(ModifyEndUserRegisterFormData) + c.BindJSON(formData) + meter, err := service.EndUserService.FetchSpecificEndUserRecord(requestReportId, requestParkId, requestMeterId) + if err != nil { + result.NotFound(err.Error()) + return + } + if formData.CurrentPeriodOverall.Valid { + meter.CurrentPeriodOverall = formData.CurrentPeriodOverall.Decimal + } + if formData.CurrentPeriodCritical.Valid { + meter.CurrentPeriodCritical = formData.CurrentPeriodCritical.Decimal + } + if formData.CurrentPeriodPeak.Valid { + meter.CurrentPeriodPeak = formData.CurrentPeriodPeak.Decimal + } + if formData.CurrentPeriodValley.Valid { + meter.CurrentPeriodValley = formData.CurrentPeriodValley.Decimal + } + if formData.AdjustOverall.Valid { + meter.AdjustOverall = formData.AdjustOverall.Decimal + } + if formData.AdjustCritical.Valid { + meter.AdjustCritical = formData.AdjustCritical.Decimal + } + if formData.AdjustPeak.Valid { + meter.AdjustPeak = formData.AdjustPeak.Decimal + } + if formData.AdjustValley.Valid { + meter.AdjustValley = formData.AdjustValley.Decimal + } + valid, err := meter.Validate() + if err != nil { + result.Error(http.StatusInternalServerError, err.Error()) + return + } + if !valid { + result.NotAccept("抄表数据合法性验证失败。") + return + } + tx := global.DBConn.NewSession() + if err = tx.Begin(); err != nil { + result.Error(http.StatusInternalServerError, err.Error()) + return + } + defer tx.Close() + err = service.EndUserService.UpdateEndUserRegisterRecord(tx, *meter) + if err != nil { + tx.Rollback() + result.Error(http.StatusInternalServerError, err.Error()) + return + } + err = tx.Commit() + if err != nil { + tx.Rollback() + result.Error(http.StatusInternalServerError, err.Error()) + return + } + result.Success("指定终端用户抄表记录已经更新。") +} diff --git a/model/end_user_detail.go b/model/end_user_detail.go index 8fe23ed..ed35164 100644 --- a/model/end_user_detail.go +++ b/model/end_user_detail.go @@ -71,11 +71,12 @@ func (d EndUserDetail) Validate() (bool, error) { } func (d *EndUserDetail) CalculatePeriod() { - d.Overall = decimal.NewNullDecimal(d.CurrentPeriodOverall.Sub(d.LastPeriodOverall).Add(d.AdjustOverall).RoundBank(2)) - d.Critical = decimal.NewNullDecimal(d.CurrentPeriodCritical.Sub(d.LastPeriodCritical).Add(d.AdjustCritical).RoundBank(2)) - d.Peak = decimal.NewNullDecimal(d.CurrentPeriodPeak.Sub(d.LastPeriodPeak).Add(d.AdjustPeak).RoundBank(2)) - d.Flat = decimal.NewNullDecimal(d.CurrentPeriodFlat.Sub(d.LastPeriodFlat).Add(d.AdjustFlat).RoundBank(2)) - d.Valley = decimal.NewNullDecimal(d.CurrentPeriodValley.Sub(d.LastPeriodValley).Add(d.AdjustValley).RoundBank(2)) + d.CurrentPeriodFlat = d.CurrentPeriodOverall.Sub(d.CurrentPeriodCritical).Sub(d.CurrentPeriodPeak).Sub(d.CurrentPeriodValley) + d.Overall = decimal.NewNullDecimal(d.CurrentPeriodOverall.Sub(d.LastPeriodOverall).Mul(d.Ratio).Add(d.AdjustOverall).RoundBank(2)) + d.Critical = decimal.NewNullDecimal(d.CurrentPeriodCritical.Sub(d.LastPeriodCritical).Mul(d.Ratio).Add(d.AdjustCritical).RoundBank(2)) + d.Peak = decimal.NewNullDecimal(d.CurrentPeriodPeak.Sub(d.LastPeriodPeak).Mul(d.Ratio).Add(d.AdjustPeak).RoundBank(2)) + d.Flat = decimal.NewNullDecimal(d.CurrentPeriodFlat.Sub(d.LastPeriodFlat).Mul(d.Ratio).Add(d.AdjustFlat).RoundBank(2)) + d.Valley = decimal.NewNullDecimal(d.CurrentPeriodValley.Sub(d.LastPeriodValley).Mul(d.Ratio).Add(d.AdjustValley).RoundBank(2)) } type EndUserImport struct { diff --git a/service/end_user.go b/service/end_user.go index 8f50802..e21f8f7 100644 --- a/service/end_user.go +++ b/service/end_user.go @@ -56,6 +56,15 @@ func (_EndUserService) AllEndUserRecord(reportId string) ([]model.EndUserDetail, return users, err } +func (_EndUserService) FetchSpecificEndUserRecord(reportId, parkId, meterId string) (*model.EndUserDetail, error) { + record := new(model.EndUserDetail) + _, err := global.DBConn. + ID(schemas.NewPK(reportId, parkId, meterId)). + NoAutoCondition(). + Get(record) + return record, err +} + func (_EndUserService) UpdateEndUserRegisterRecord(tx *xorm.Session, record model.EndUserDetail) (err error) { record.CalculatePeriod() _, err = tx.ID(schemas.NewPK(record.ReportId, record.ParkId, record.MeterId)). @@ -70,6 +79,11 @@ func (_EndUserService) UpdateEndUserRegisterRecord(tx *xorm.Session, record mode "adjust_peak", "adjust_flat", "adjust_valley", + "overall", + "critical", + "peak", + "flat", + "valley", ). Update(record) return