forked from free-lancers/electricity_bill_calc_service
refactor(changes):暂时删除全部内容,并完成基本数据库连接的创建。
This commit is contained in:
@@ -1,93 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeChargesController(app *fiber.App) {
|
||||
app.Get("/charges", security.OPSAuthorize, listAllCharges)
|
||||
app.Post("/charge", security.OPSAuthorize, recordNewCharge)
|
||||
app.Put("/charge/:uid/:seq", security.OPSAuthorize, modifyChargeState)
|
||||
}
|
||||
|
||||
func listAllCharges(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
requestKeyword := c.Query("keyword", "")
|
||||
requestBeginDate := c.Query("begin", "")
|
||||
requestEndDate := c.Query("end", "")
|
||||
charges, total, err := service.ChargeService.ListPagedChargeRecord(requestKeyword, requestBeginDate, requestEndDate, requestPage)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK, "已获取到符合条件的计费记录。",
|
||||
response.NewPagedResponse(requestPage, total).ToMap(),
|
||||
fiber.Map{"records": charges},
|
||||
)
|
||||
}
|
||||
|
||||
type _NewChargeFormData struct {
|
||||
UserId string `json:"userId" form:"userId"`
|
||||
Fee decimal.NullDecimal `json:"fee" form:"fee"`
|
||||
Discount decimal.NullDecimal `json:"discount" form:"discount"`
|
||||
Amount decimal.NullDecimal `json:"amount" form:"amount"`
|
||||
ChargeTo model.Date `json:"chargeTo" form:"chargeTo"`
|
||||
}
|
||||
|
||||
func recordNewCharge(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
formData := new(_NewChargeFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
currentTime := time.Now()
|
||||
newRecord := &model.UserCharge{
|
||||
UserId: formData.UserId,
|
||||
Fee: formData.Fee,
|
||||
Discount: formData.Discount,
|
||||
Amount: formData.Amount,
|
||||
Settled: true,
|
||||
SettledAt: ¤tTime,
|
||||
ChargeTo: formData.ChargeTo,
|
||||
}
|
||||
err := service.ChargeService.CreateChargeRecord(newRecord, true)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Created("指定用户的服务已延期。")
|
||||
}
|
||||
|
||||
type _StateChangeFormData struct {
|
||||
Cancelled bool `json:"cancelled"`
|
||||
}
|
||||
|
||||
func modifyChargeState(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
formData := new(_StateChangeFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
requestUserID := c.Params("uid")
|
||||
requestChargeSeq, err := strconv.Atoi(c.Params("seq", "-1"))
|
||||
if err != nil || requestChargeSeq == -1 {
|
||||
return result.Error(http.StatusNotAcceptable, "参数[记录流水号]解析错误。")
|
||||
}
|
||||
err = service.ChargeService.CancelCharge(int64(requestChargeSeq), requestUserID)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定用户服务延期记录状态已经更新。")
|
||||
}
|
@@ -1,237 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"electricity_bill_calc/excel"
|
||||
"electricity_bill_calc/global"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/samber/lo"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeEndUserController(router *fiber.App) {
|
||||
router.Get("/report/:rid/submeter", security.EnterpriseAuthorize, fetchEndUserInReport)
|
||||
router.Get("/report/:rid/meter/template", downloadEndUserRegisterTemplate)
|
||||
router.Post("/report/:rid/meter/batch", security.EnterpriseAuthorize, uploadEndUserRegisterTemplate)
|
||||
router.Put("/report/:rid/submeter/:pid/:mid", security.EnterpriseAuthorize, modifyEndUserRegisterRecord)
|
||||
router.Get("/end/user/adjusts", security.MustAuthenticated, statEndUserInPeriod)
|
||||
}
|
||||
|
||||
func fetchEndUserInReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
keyword := c.Query("keyword")
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
endUsers, totalItem, err := service.EndUserService.SearchEndUserRecord(requestReportId, keyword, requestPage)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已获取到符合条件的终端用户集合",
|
||||
response.NewPagedResponse(requestPage, totalItem).ToMap(),
|
||||
fiber.Map{"meters": endUsers},
|
||||
)
|
||||
}
|
||||
|
||||
func downloadEndUserRegisterTemplate(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
users, err := service.EndUserService.AllEndUserRecord(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
reportIndex, err := service.ReportService.RetreiveReportIndex(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
park, err := service.ParkService.FetchParkDetail(reportIndex.ParkId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
if meterType == -1 {
|
||||
return result.NotFound("未能确定用户表计类型。")
|
||||
}
|
||||
|
||||
c.Status(http.StatusOK)
|
||||
c.Set("Content-Type", "application/octet-stream")
|
||||
c.Set("Content-Transfer-Encoding", "binary")
|
||||
c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=抄表记录-%s-%s.xlsx", park.Name, reportIndex.Period.Format("2006-01")))
|
||||
|
||||
gen := lo.Ternary[excel.ExcelTemplateGenerator](
|
||||
meterType == 0,
|
||||
excel.NewMeterNonPVExcelTemplateGenerator(),
|
||||
excel.NewMeterPVExcelTemplateGenerator(),
|
||||
)
|
||||
defer gen.Close()
|
||||
gen.WriteMeterData(users)
|
||||
gen.WriteTo(c.Response().BodyWriter())
|
||||
return nil
|
||||
}
|
||||
|
||||
func uploadEndUserRegisterTemplate(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if meterType == -1 {
|
||||
return result.NotFound("未能确定用户表计类型。")
|
||||
}
|
||||
|
||||
uploadedFile, err := c.FormFile("data")
|
||||
if err != nil {
|
||||
return result.NotAccept("没有接收到上传的档案文件。")
|
||||
}
|
||||
archiveFile, err := uploadedFile.Open()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
if meterType == 0 {
|
||||
errs := service.EndUserService.BatchImportNonPVRegister(requestReportId, archiveFile)
|
||||
if errs.Len() > 0 {
|
||||
return result.Json(http.StatusInternalServerError, "上传抄表文件存在解析错误", fiber.Map{"errors": errs.Errs})
|
||||
}
|
||||
} else {
|
||||
errs := service.EndUserService.BatchImportPVRegister(requestReportId, archiveFile)
|
||||
if errs.Len() > 0 {
|
||||
return result.Json(http.StatusInternalServerError, "上传抄表文件存在解析错误", fiber.Map{"errors": errs.Errs})
|
||||
}
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经成功完成抄表记录的导入。", fiber.Map{"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 *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
meterType, err := service.ReportService.RetreiveParkEndUserMeterType(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if meterType == -1 {
|
||||
return result.NotFound("未能确定用户表计类型。")
|
||||
}
|
||||
requestParkId := c.Params("pid")
|
||||
requestMeterId := c.Params("mid")
|
||||
formData := new(ModifyEndUserRegisterFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
meter, err := service.EndUserService.FetchSpecificEndUserRecord(requestReportId, requestParkId, requestMeterId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
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 {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !valid {
|
||||
return result.NotAccept("抄表数据合法性验证失败。")
|
||||
}
|
||||
ctx, cancel := global.TimeoutContext()
|
||||
defer cancel()
|
||||
tx, err := global.DB.BeginTx(ctx, &sql.TxOptions{})
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
err = service.EndUserService.UpdateEndUserRegisterRecord(&tx, &ctx, *meter)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success("指定终端用户抄表记录已经更新。")
|
||||
}
|
||||
|
||||
func statEndUserInPeriod(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestUser := lo.
|
||||
If(session.Type == model.USER_TYPE_ENT, session.Uid).
|
||||
Else(c.Query("user"))
|
||||
requestPark := c.Query("park")
|
||||
if len(requestPark) > 0 && session.Type == model.USER_TYPE_ENT {
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestPark); !ensure {
|
||||
return err
|
||||
}
|
||||
}
|
||||
startDate := c.Query("start")
|
||||
endDate := c.Query("end")
|
||||
stat, err := service.EndUserService.StatEndUserRecordInPeriod(requestUser, requestPark, startDate, endDate)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success(
|
||||
"已经完成终端用户的费用统计",
|
||||
fiber.Map{"details": stat},
|
||||
)
|
||||
}
|
@@ -1,176 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/exceptions"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func InitializeGodModeController(router *fiber.App) {
|
||||
gmR := router.Group("/gm")
|
||||
{
|
||||
gmR.Delete("/report/:rid/summary", security.SingularityAuthorize, gmResetReportSummary)
|
||||
gmR.Delete("/report/:rid/maintenance", security.SingularityAuthorize, gmResetReportMaintenance)
|
||||
gmR.Delete("/report/:rid/meters", security.SingularityAuthorize, gmResetReportEndUserRecord)
|
||||
gmR.Post("/report/:rid/meters", security.SingularityAuthorize, gmResynchronizeReportEndUserRecord)
|
||||
gmR.Delete("/report/:rid", security.SingularityAuthorize, gmResetReport)
|
||||
gmR.Delete("/report/:rid/force", security.SingularityAuthorize, gmDeleteReport)
|
||||
gmR.Delete("/park/:pid/maintenance/:mid", security.SingularityAuthorize, gmDeleteSpecificMaintenance)
|
||||
gmR.Delete("/park/:pid/maintenance", security.SingularityAuthorize, gmDeleteAllMaintenance)
|
||||
gmR.Delete("/park/:pid/meters", security.SingularityAuthorize, gmDeleteAllMeters)
|
||||
gmR.Delete("/park/:pid/force", security.SingularityAuthorize, gmDeletePark)
|
||||
gmR.Delete("/enterprise/:uid/force", security.SingularityAuthorize, gmDeleteUser)
|
||||
}
|
||||
}
|
||||
|
||||
func gmResetReportSummary(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.ClearReportSummary(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功重置指定报表的园区总览部分。")
|
||||
}
|
||||
return result.Success("指定报表的园区总览已经重置。")
|
||||
}
|
||||
|
||||
func gmResetReportMaintenance(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.ClearReportMaintenances(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功重置指定报表的配电维护费部分。")
|
||||
}
|
||||
return result.Success("指定报表的配电维护费已经重置。")
|
||||
}
|
||||
|
||||
func gmResynchronizeReportEndUserRecord(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.ResynchronizeEndUser(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功重置指定报表的抄表记录基本档案。")
|
||||
}
|
||||
return result.Success("指定报表的抄表记录基本档案已经重新同步。")
|
||||
}
|
||||
|
||||
func gmResetReportEndUserRecord(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.ResetEndUserRegisterRecords(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功重置指定报表的抄表记录部分。")
|
||||
}
|
||||
return result.Success("指定报表的抄表记录已经重置。")
|
||||
}
|
||||
|
||||
func gmResetReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.ResetReport(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功重置指定报表。")
|
||||
}
|
||||
return result.Success("指定报表已经重置。")
|
||||
}
|
||||
|
||||
func gmDeleteReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
done, err := service.GodModeService.DeleteReport(requestReportId)
|
||||
if err != nil {
|
||||
if ipErr, ok := err.(exceptions.ImproperOperateError); ok {
|
||||
return result.NotAccept(ipErr.Message)
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除指定报表。")
|
||||
}
|
||||
return result.Success("指定报表已经删除。")
|
||||
}
|
||||
|
||||
func gmDeleteSpecificMaintenance(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
requestMaintenanceId := c.Params("mid")
|
||||
done, err := service.GodModeService.RemoveSpecificMaintenance(requestParkId, requestMaintenanceId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除指定的维护费用记录。")
|
||||
}
|
||||
return result.Success("指定维护费用记录已经删除。")
|
||||
}
|
||||
|
||||
func gmDeleteAllMaintenance(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
done, err := service.GodModeService.RemoveAllMaintenance(requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除全部维护费用记录。")
|
||||
}
|
||||
return result.Success("全部维护费用记录已经删除。")
|
||||
}
|
||||
|
||||
func gmDeleteAllMeters(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
done, err := service.GodModeService.RemoveAllMeters(requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除全部终端表计档案记录。")
|
||||
}
|
||||
return result.Success("全部终端表计档案记录已经删除。")
|
||||
}
|
||||
|
||||
func gmDeletePark(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
done, err := service.GodModeService.RemovePark(requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除指定的园区。")
|
||||
}
|
||||
return result.Success("指定的园区已经删除。")
|
||||
}
|
||||
|
||||
func gmDeleteUser(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestUserId := c.Params("uid")
|
||||
done, err := service.GodModeService.DeleteUser(requestUserId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !done {
|
||||
return result.Error(http.StatusInternalServerError, "未能成功删除指定的用户。")
|
||||
}
|
||||
return result.Success("指定的用户及其关联信息已经删除。")
|
||||
}
|
@@ -1,202 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/samber/lo"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeMaintenanceFeeController(router *fiber.App) {
|
||||
router.Get("/maintenance/fee", security.MustAuthenticated, listMaintenanceFees)
|
||||
router.Post("/maintenance/fee", security.EnterpriseAuthorize, createMaintenanceFeeRecord)
|
||||
router.Put("/maintenance/fee/:mid", security.EnterpriseAuthorize, modifyMaintenanceFeeRecord)
|
||||
router.Put("/maintenance/fee/:mid/enabled", security.EnterpriseAuthorize, changeMaintenanceFeeState)
|
||||
router.Delete("/maintenance/fee/:mid", security.EnterpriseAuthorize, deleteMaintenanceFee)
|
||||
router.Get("/additional/charges", security.MustAuthenticated, statAdditionalCharges)
|
||||
}
|
||||
|
||||
func ensureMaintenanceFeeBelongs(c *fiber.Ctx, result *response.Result, requestMaintenanceFeeId string) (bool, error) {
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return false, result.Unauthorized(err.Error())
|
||||
}
|
||||
sure, err := service.MaintenanceFeeService.EnsureFeeBelongs(userSession.Uid, requestMaintenanceFeeId)
|
||||
if err != nil {
|
||||
return false, result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !sure {
|
||||
return false, result.Unauthorized("所操作维护费记录不属于当前用户。")
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func listMaintenanceFees(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestPark := c.Query("park")
|
||||
requestPeriod := c.Query("period")
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, "不能解析给定的参数[page]。")
|
||||
}
|
||||
if len(requestPark) > 0 {
|
||||
if userSession.Type == model.USER_TYPE_ENT {
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestPark); !ensure {
|
||||
return err
|
||||
}
|
||||
}
|
||||
fees, total, err := service.MaintenanceFeeService.ListMaintenanceFees([]string{requestPark}, requestPeriod, requestPage)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已获取指定园区下的维护费记录",
|
||||
response.NewPagedResponse(requestPage, total).ToMap(),
|
||||
fiber.Map{"fees": fees},
|
||||
)
|
||||
} else {
|
||||
parkIds, err := service.ParkService.AllParkIds(userSession.Uid)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
fees, total, err := service.MaintenanceFeeService.ListMaintenanceFees(parkIds, requestPeriod, requestPage)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已获取指定用户下的所有维护费记录。",
|
||||
response.NewPagedResponse(requestPage, total).ToMap(),
|
||||
fiber.Map{"fees": fees},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
type _FeeCreationFormData struct {
|
||||
ParkId string `json:"parkId" form:"parkId"`
|
||||
Name string `json:"name" form:"name"`
|
||||
Period string `json:"period" form:"period"`
|
||||
Fee decimal.Decimal `json:"fee" form:"fee"`
|
||||
Memo *string `json:"memo" form:"memo"`
|
||||
}
|
||||
|
||||
func createMaintenanceFeeRecord(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
formData := new(_FeeCreationFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
if ensure, err := ensureParkBelongs(c, &result, formData.ParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
newMaintenanceFee := &model.MaintenanceFee{}
|
||||
copier.Copy(newMaintenanceFee, formData)
|
||||
err := service.MaintenanceFeeService.CreateMaintenanceFeeRecord(*newMaintenanceFee)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Created("新维护费记录已经创建。")
|
||||
}
|
||||
|
||||
type _FeeModificationFormData struct {
|
||||
Fee decimal.Decimal `json:"fee" form:"fee"`
|
||||
Memo *string `json:"memo" form:"memo"`
|
||||
}
|
||||
|
||||
func modifyMaintenanceFeeRecord(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestFee := c.Params("mid")
|
||||
formData := new(_FeeModificationFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
if ensure, err := ensureMaintenanceFeeBelongs(c, &result, requestFee); !ensure {
|
||||
return err
|
||||
}
|
||||
newFeeState := new(model.MaintenanceFee)
|
||||
copier.Copy(newFeeState, formData)
|
||||
newFeeState.Id = requestFee
|
||||
err := service.MaintenanceFeeService.ModifyMaintenanceFee(*newFeeState)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定维护费条目已更新。")
|
||||
}
|
||||
|
||||
type _FeeStateFormData struct {
|
||||
Enabled bool `json:"enabled" form:"enabled"`
|
||||
}
|
||||
|
||||
func changeMaintenanceFeeState(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestFee := c.Params("mid")
|
||||
formData := new(_FeeStateFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
if ensure, err := ensureMaintenanceFeeBelongs(c, &result, requestFee); !ensure {
|
||||
return err
|
||||
}
|
||||
err := service.MaintenanceFeeService.ChangeMaintenanceFeeState(requestFee, formData.Enabled)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定维护费条目状态已更新。")
|
||||
}
|
||||
|
||||
func deleteMaintenanceFee(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestFee := c.Params("mid")
|
||||
if ensure, err := ensureMaintenanceFeeBelongs(c, &result, requestFee); !ensure {
|
||||
return err
|
||||
}
|
||||
err := service.MaintenanceFeeService.DeleteMaintenanceFee(requestFee)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Deleted("指定维护费条目已删除。")
|
||||
}
|
||||
|
||||
func statAdditionalCharges(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestUser := lo.
|
||||
If(session.Type == model.USER_TYPE_ENT, session.Uid).
|
||||
Else(c.Query("user"))
|
||||
requestPark := c.Query("park")
|
||||
if len(requestPark) > 0 && session.Type == model.USER_TYPE_ENT {
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestPark); !ensure {
|
||||
return err
|
||||
}
|
||||
}
|
||||
period := c.Query("period", "")
|
||||
keyword := c.Query("keyword", "")
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, "不能解析给定的参数[page]。")
|
||||
}
|
||||
fees, total, err := service.MaintenanceFeeService.QueryAdditionalCharges(requestUser, requestPark, period, keyword, requestPage)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success(
|
||||
"已经成功获取到物业附加费的统计记录。",
|
||||
response.NewPagedResponse(requestPage, total).ToMap(),
|
||||
fiber.Map{"charges": fees},
|
||||
)
|
||||
}
|
@@ -1,188 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/excel"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/samber/lo"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeMeter04kVController(router *fiber.App) {
|
||||
router.Get("/park/:pid/meter/template", download04kvMeterArchiveTemplate)
|
||||
router.Get("/park/:pid/meters", security.EnterpriseAuthorize, ListPaged04kVMeter)
|
||||
router.Get("/park/:pid/meter/:code", security.EnterpriseAuthorize, fetch04kVMeterDetail)
|
||||
router.Post("/park/:pid/meter", security.EnterpriseAuthorize, createSingle04kVMeter)
|
||||
router.Post("/park/:pid/meter/batch", security.EnterpriseAuthorize, batchImport04kVMeterArchive)
|
||||
router.Put("/park/:pid/meter/:code", security.EnterpriseAuthorize, modifySingle04kVMeter)
|
||||
}
|
||||
|
||||
func download04kvMeterArchiveTemplate(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
parkDetail, err := service.ParkService.FetchParkDetail(requestParkId)
|
||||
if err != nil {
|
||||
return result.NotFound("未找到指定的园区信息。")
|
||||
}
|
||||
return c.Download("./assets/meter_04kv_template.xlsx", fmt.Sprintf("%s-户表档案.xlsx", parkDetail.Name))
|
||||
}
|
||||
|
||||
func ListPaged04kVMeter(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
requestKeyword := c.Query("keyword", "")
|
||||
meters, totalItem, err := service.Meter04kVService.ListMeterDetail(requestParkId, requestKeyword, requestPage)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已获取到符合条件的0.4kV表计集合。",
|
||||
response.NewPagedResponse(requestPage, totalItem).ToMap(),
|
||||
fiber.Map{"meters": meters},
|
||||
)
|
||||
}
|
||||
|
||||
func fetch04kVMeterDetail(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
requestMeterCode := c.Params("code")
|
||||
meter, err := service.Meter04kVService.Get04kVMeterDetail(requestParkId, requestMeterCode)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
if meter == nil {
|
||||
return result.Json(http.StatusNotFound, "指定的表计信息未能找到。", fiber.Map{"meter": nil})
|
||||
}
|
||||
return result.Json(http.StatusOK, "指定的表计信息已找到。", fiber.Map{"meter": meter})
|
||||
}
|
||||
|
||||
type _MeterModificationFormData struct {
|
||||
Address *string `json:"address" form:"address"`
|
||||
CustomerName *string `json:"customerName" form:"customerName"`
|
||||
ContactName *string `json:"contactName" form:"contactName"`
|
||||
ContactPhone *string `json:"contactPhone" form:"contactPhone"`
|
||||
Ratio decimal.Decimal `json:"ratio" form:"ratio"`
|
||||
Seq int `json:"seq" form:"seq"`
|
||||
IsPublicMeter bool `json:"isPublicMeter" form:"isPublicMeter"`
|
||||
Enabled bool `json:"enabled" form:"enabled"`
|
||||
}
|
||||
|
||||
type _MeterCreationFormData struct {
|
||||
Code string `json:"code" form:"code"`
|
||||
Address *string `json:"address" form:"address"`
|
||||
CustomerName *string `json:"customerName" form:"customerName"`
|
||||
ContactName *string `json:"contactName" form:"contactName"`
|
||||
ContactPhone *string `json:"contactPhone" form:"contactPhone"`
|
||||
Ratio decimal.Decimal `json:"ratio" form:"ratio"`
|
||||
Seq int `json:"seq" form:"seq"`
|
||||
IsPublicMeter bool `json:"isPublicMeter" form:"isPublicMeter"`
|
||||
Enabled bool `json:"enabled" form:"enabled"`
|
||||
}
|
||||
|
||||
func createSingle04kVMeter(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
formData := new(_MeterCreationFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
newMeter := new(model.Meter04KV)
|
||||
copier.Copy(newMeter, formData)
|
||||
newMeter.ParkId = requestParkId
|
||||
err := service.Meter04kVService.CreateSingleMeter(*newMeter)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Created("新0.4kV表计已经添加完成。")
|
||||
}
|
||||
|
||||
func modifySingle04kVMeter(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
requestMeterCode := c.Params("code")
|
||||
meterDetail, err := service.Meter04kVService.Get04kVMeterDetail(requestParkId, requestMeterCode)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
if meterDetail == nil {
|
||||
return result.NotFound("指定表计的信息为找到,不能修改。")
|
||||
}
|
||||
formData := new(_MeterModificationFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
copier.Copy(meterDetail, formData)
|
||||
err = service.Meter04kVService.UpdateSingleMeter(meterDetail)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定0.4kV表计信息已经更新。")
|
||||
}
|
||||
|
||||
func batchImport04kVMeterArchive(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
uploadedFile, err := c.FormFile("data")
|
||||
if err != nil {
|
||||
return result.NotAccept("没有接收到上传的档案文件。")
|
||||
}
|
||||
archiveFile, err := uploadedFile.Open()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
analyzer, err := excel.NewMeterArchiveExcelAnalyzer(archiveFile)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
records, errs := analyzer.Analysis(*new(model.Meter04KV))
|
||||
if len(errs) > 0 {
|
||||
return result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", fiber.Map{"errors": errs})
|
||||
}
|
||||
|
||||
mergedMeters := lo.Map(records, func(meter model.Meter04KV, index int) model.Meter04KV {
|
||||
meter.ParkId = requestParkId
|
||||
meter.Enabled = true
|
||||
return meter
|
||||
})
|
||||
errs = service.Meter04kVService.DuplicateMeterCodeValidate(mergedMeters)
|
||||
if len(errs) > 0 {
|
||||
return result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", fiber.Map{"errors": errs})
|
||||
}
|
||||
err = service.Meter04kVService.BatchCreateMeter(mergedMeters)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"上传的表计档案已经全部导入。",
|
||||
fiber.Map{"errors": make([]excel.ExcelAnalysisError, 0)},
|
||||
)
|
||||
}
|
@@ -1,185 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"electricity_bill_calc/tools"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/google/uuid"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeParkController(router *fiber.App) {
|
||||
router.Get("/parks", security.EnterpriseAuthorize, listAllParksUnderSessionUser)
|
||||
router.Get("/parks/:uid", security.MustAuthenticated, listAllParksUnderSpecificUser)
|
||||
router.Post("/park", security.EnterpriseAuthorize, createNewPark)
|
||||
router.Put("/park/:pid", security.EnterpriseAuthorize, modifyPark)
|
||||
router.Get("/park/:pid", security.EnterpriseAuthorize, fetchParkDetail)
|
||||
router.Put("/park/:pid/enabled", security.EnterpriseAuthorize, changeParkEnableState)
|
||||
router.Delete("/park/:pid", security.EnterpriseAuthorize, deleteSpecificPark)
|
||||
}
|
||||
|
||||
func ensureParkBelongs(c *fiber.Ctx, result *response.Result, requestParkId string) (bool, error) {
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return false, result.Unauthorized(err.Error())
|
||||
}
|
||||
sure, err := service.ParkService.EnsurePark(userSession.Uid, requestParkId)
|
||||
if err != nil {
|
||||
return false, result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !sure {
|
||||
return false, result.Unauthorized("不能访问不属于自己的园区。")
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func listAllParksUnderSessionUser(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
keyword := c.Query("keyword")
|
||||
parks, err := service.ParkService.ListAllParkBelongsTo(userSession.Uid, keyword)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已获取到指定用户下的园区。", fiber.Map{"parks": parks})
|
||||
}
|
||||
|
||||
func listAllParksUnderSpecificUser(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestUserId := c.Params("uid")
|
||||
keyword := c.Query("keyword")
|
||||
parks, err := service.ParkService.ListAllParkBelongsTo(requestUserId, keyword)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已获取到指定用户下的园区。", fiber.Map{"parks": parks})
|
||||
}
|
||||
|
||||
type _ParkInfoFormData struct {
|
||||
Name string `json:"name" form:"name"`
|
||||
Region *string `json:"region" form:"region"`
|
||||
Address *string `json:"address" form:"address"`
|
||||
Contact *string `json:"contact" form:"contact"`
|
||||
Phone *string `json:"phone" from:"phone"`
|
||||
Area decimal.NullDecimal `json:"area" from:"area"`
|
||||
Capacity decimal.NullDecimal `json:"capacity" from:"capacity"`
|
||||
TenementQuantity decimal.NullDecimal `json:"tenement" from:"tenement"`
|
||||
Category int8 `json:"category" form:"category"`
|
||||
SubmeterType int8 `json:"submeter" form:"submeter"`
|
||||
}
|
||||
|
||||
func createNewPark(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
formData := new(_ParkInfoFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
newPark := new(model.Park)
|
||||
copier.Copy(newPark, formData)
|
||||
newPark.Id = uuid.New().String()
|
||||
newPark.UserId = userSession.Uid
|
||||
nameAbbr := tools.PinyinAbbr(newPark.Name)
|
||||
newPark.Abbr = &nameAbbr
|
||||
newPark.Enabled = true
|
||||
err = service.ParkService.SaveNewPark(*newPark)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Created("新园区完成创建。")
|
||||
}
|
||||
|
||||
func modifyPark(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestParkId := c.Params("pid")
|
||||
formData := new(_ParkInfoFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
park, err := service.ParkService.FetchParkDetail(requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if userSession.Uid != park.UserId {
|
||||
return result.Unauthorized("不能修改不属于自己的园区。")
|
||||
}
|
||||
copier.Copy(park, formData)
|
||||
nameAbbr := tools.PinyinAbbr(formData.Name)
|
||||
park.Abbr = &nameAbbr
|
||||
err = service.ParkService.UpdateParkInfo(park)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定园区资料已更新。")
|
||||
}
|
||||
|
||||
func fetchParkDetail(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
park, err := service.ParkService.FetchParkDetail(requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经获取到指定园区的信息。", fiber.Map{"park": park})
|
||||
}
|
||||
|
||||
type _ParkStateFormData struct {
|
||||
Enabled bool `json:"enabled" form:"enabled"`
|
||||
}
|
||||
|
||||
func changeParkEnableState(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
formData := new(_ParkStateFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
err = service.ParkService.ChangeParkState(userSession.Uid, requestParkId, formData.Enabled)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定园区的可用性状态已成功更新。")
|
||||
}
|
||||
|
||||
func deleteSpecificPark(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestParkId := c.Params("pid")
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
err = service.ParkService.DeletePark(userSession.Uid, requestParkId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Deleted("指定园区已成功删除。")
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func InitializeRegionController(router *fiber.App) {
|
||||
router.Get("/region/:rid", fetchRegions)
|
||||
router.Get("/regions/:rid", fetchAllLeveledRegions)
|
||||
}
|
||||
|
||||
func fetchRegions(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParentId := c.Params("rid")
|
||||
regions, err := service.RegionService.FetchSubRegions(requestParentId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if len(regions) == 0 {
|
||||
return result.Json(http.StatusNotFound, "未能获取到相关的行政区划。", fiber.Map{"regions": make([]string, 0)})
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经获取到相关的行政区划。", fiber.Map{"regions": regions})
|
||||
}
|
||||
|
||||
func fetchAllLeveledRegions(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestRegionCode := c.Params("rid")
|
||||
regions, err := service.RegionService.FetchAllParentRegions(requestRegionCode)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if len(regions) == 0 {
|
||||
return result.Json(http.StatusNotFound, "未能获取到相关的行政区划。", fiber.Map{"regions": make([]string, 0)})
|
||||
}
|
||||
return result.Json(http.StatusOK, "以及获取到相关的行政区划。", fiber.Map{"regions": regions})
|
||||
}
|
@@ -1,301 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/exceptions"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"electricity_bill_calc/tools"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/samber/lo"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeReportController(router *fiber.App) {
|
||||
router.Get("/reports/with/drafts", security.EnterpriseAuthorize, fetchNewestReportOfParkWithDraft)
|
||||
router.Post("/park/:pid/report", security.EnterpriseAuthorize, initializeNewReport)
|
||||
router.Get("/report/:rid/step/state", security.EnterpriseAuthorize, fetchReportStepStates)
|
||||
router.Get("/report/:rid/summary", security.EnterpriseAuthorize, fetchReportParkSummary)
|
||||
router.Put("/report/:rid/summary", security.EnterpriseAuthorize, fillReportSummary)
|
||||
router.Get("/report/:rid/summary/calculate", security.EnterpriseAuthorize, testCalculateReportSummary)
|
||||
router.Post("/report/:rid/summary/calculate", security.EnterpriseAuthorize, progressReportSummary)
|
||||
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)
|
||||
router.Post("/report/:rid/calculate", security.EnterpriseAuthorize, calculateReport)
|
||||
}
|
||||
|
||||
func ensureReportBelongs(c *fiber.Ctx, result *response.Result, requestReportId string) (bool, error) {
|
||||
_, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return false, result.Unauthorized(err.Error())
|
||||
}
|
||||
requestReport, err := service.ReportService.RetreiveReportIndex(requestReportId)
|
||||
if err != nil {
|
||||
return false, result.NotFound(err.Error())
|
||||
}
|
||||
if requestReport == nil {
|
||||
return false, result.NotFound("指定报表未能找到。")
|
||||
}
|
||||
return ensureParkBelongs(c, result, requestReport.ParkId)
|
||||
}
|
||||
|
||||
func fetchNewestReportOfParkWithDraft(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
parks, err := service.ReportService.FetchParksWithNewestReport(userSession.Uid)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已获取到指定用户下所有园区的最新报表记录。", fiber.Map{"parks": parks})
|
||||
}
|
||||
|
||||
func initializeNewReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestParkId := c.Params("pid")
|
||||
userSession, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure {
|
||||
return err
|
||||
}
|
||||
requestPeriod := c.Query("period")
|
||||
reportPeriod, err := time.Parse("2006-01", requestPeriod)
|
||||
if err != nil {
|
||||
return result.NotAccept("提供的初始化期数格式不正确。")
|
||||
}
|
||||
valid, err := service.ReportService.IsNewPeriodValid(userSession.Uid, requestParkId, reportPeriod)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !valid {
|
||||
return result.NotAccept("只能初始化已发布报表下一个月份的新报表。")
|
||||
}
|
||||
newId, err := service.ReportService.InitializeNewReport(requestParkId, reportPeriod)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Created("新一期报表初始化成功。", fiber.Map{"reportId": newId})
|
||||
}
|
||||
|
||||
func fetchReportStepStates(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
requestReport, err := service.ReportService.RetreiveReportIndex(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经获取到指定报表的填写状态。", fiber.Map{"steps": requestReport.StepState})
|
||||
}
|
||||
|
||||
func fetchReportParkSummary(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
summary, err := service.ReportService.RetreiveReportSummary(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
if summary == nil {
|
||||
return result.NotFound("指定报表未能找到。")
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经获取到指定报表中的园区概况。", fiber.Map{"summary": summary})
|
||||
}
|
||||
|
||||
type ReportSummaryFormData struct {
|
||||
Overall decimal.Decimal `json:"overall" form:"overall"`
|
||||
OverallFee decimal.Decimal `json:"overallFee" form:"overallFee"`
|
||||
Critical decimal.Decimal `json:"critical" form:"critical"`
|
||||
CriticalFee decimal.Decimal `json:"criticalFee" form:"criticalFee"`
|
||||
Peak decimal.Decimal `json:"peak" form:"peak"`
|
||||
PeakFee decimal.Decimal `json:"peakFee" form:"peakFee"`
|
||||
Valley decimal.Decimal `json:"valley" form:"valley"`
|
||||
ValleyFee decimal.Decimal `json:"valleyFee" form:"valleyFee"`
|
||||
BasicFee decimal.Decimal `json:"basicFee" form:"basicFee"`
|
||||
AdjustFee decimal.Decimal `json:"adjustFee" from:"adjustFee"`
|
||||
}
|
||||
|
||||
func fillReportSummary(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
formData := new(ReportSummaryFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
originSummary, err := service.ReportService.RetreiveReportSummary(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
copier.Copy(originSummary, formData)
|
||||
originSummary.ReportId = requestReportId
|
||||
err = service.ReportService.UpdateReportSummary(originSummary)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Updated("指定电费公示报表中的园区概况基本数据已经完成更新。")
|
||||
}
|
||||
|
||||
func testCalculateReportSummary(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
summary, err := service.ReportService.RetreiveReportSummary(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
summary.CalculatePrices()
|
||||
calcResults := tools.ConvertStructToMap(summary)
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已完成园区概况的试计算。",
|
||||
fiber.Map{
|
||||
"result": lo.PickByKeys(
|
||||
calcResults,
|
||||
[]string{"overallPrice", "criticalPrice", "peakPrice", "flat", "flatFee", "flatPrice", "valleyPrice", "consumptionFee"},
|
||||
),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func progressReportSummary(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
err := service.ReportService.CalculateSummaryAndFinishStep(requestReportId)
|
||||
if err != nil {
|
||||
if nfErr, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound(nfErr.Error())
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
return result.Success("已经完成园区概况的计算,并可以进行到下一步骤。")
|
||||
}
|
||||
|
||||
func progressEndUserRegister(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
report, err := service.ReportService.RetreiveReportIndex(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
err = service.ReportService.ProgressReportRegisterEndUser(*report)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success("终端用户抄表编辑步骤已经完成。")
|
||||
}
|
||||
|
||||
func publishReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
report, err := service.ReportService.RetreiveReportIndex(requestReportId)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
err = service.ReportService.PublishReport(*report)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success("指定的公示报表已经发布。")
|
||||
}
|
||||
|
||||
func searchReports(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
requestUser := lo.
|
||||
If(session.Type == model.USER_TYPE_ENT, session.Uid).
|
||||
Else(c.Query("user"))
|
||||
requestPark := c.Query("park")
|
||||
if len(requestPark) > 0 && session.Type == model.USER_TYPE_ENT {
|
||||
if ensure, err := ensureParkBelongs(c, &result, requestPark); !ensure {
|
||||
return err
|
||||
}
|
||||
}
|
||||
requestPeriodString := c.Query("period")
|
||||
var requestPeriod *time.Time = nil
|
||||
if len(requestPeriodString) > 0 {
|
||||
parsedPeriod, err := time.Parse("2006-01", requestPeriodString)
|
||||
if err != nil {
|
||||
return result.NotAccept("参数[period]的格式不正确。")
|
||||
}
|
||||
requestPeriod = lo.ToPtr(parsedPeriod)
|
||||
}
|
||||
requestKeyword := c.Query("keyword")
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
requestAllReports, err := strconv.ParseBool(c.Query("all", "false"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[all]格式不正确。")
|
||||
}
|
||||
records, totalItems, err := service.ReportService.SearchReport(requestUser, requestPark, requestKeyword, requestPeriod, requestPage, !requestAllReports)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Success(
|
||||
"已经取得符合条件的公示报表记录。",
|
||||
response.NewPagedResponse(requestPage, totalItems).ToMap(),
|
||||
fiber.Map{"reports": records},
|
||||
)
|
||||
}
|
||||
|
||||
func fetchReportPublicity(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
publicity, err := service.ReportService.AssembleReportPublicity(requestReportId)
|
||||
if err != nil {
|
||||
if nfErr, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound(nfErr.Error())
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
return result.Success("已经取得指定公示报表的发布版本。", tools.ConvertStructToMap(publicity))
|
||||
}
|
||||
|
||||
func calculateReport(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
err := service.CalculateService.ComprehensivelyCalculateReport(requestReportId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success("指定公示报表中的数据已经计算完毕。")
|
||||
}
|
@@ -1,73 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func InitializeStatisticsController(router *fiber.App) {
|
||||
router.Get("/audits", security.OPSAuthorize, currentAuditAmount)
|
||||
router.Get("/stat/reports", security.MustAuthenticated, statReports)
|
||||
}
|
||||
|
||||
func currentAuditAmount(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
amount, err := service.WithdrawService.AuditWaits()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已经获取到指定的统计信息。", fiber.Map{
|
||||
"amounts": map[string]int64{
|
||||
"withdraw": amount,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func statReports(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
var (
|
||||
enterprises int64 = 0
|
||||
parks int64 = 0
|
||||
reports []model.ParkPeriodStatistics
|
||||
)
|
||||
if session.Type != 0 {
|
||||
enterprises, err = service.StatisticsService.EnabledEnterprises()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
parks, err = service.StatisticsService.EnabledParks()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
reports, err = service.StatisticsService.ParksNewestState()
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
} else {
|
||||
parks, err = service.StatisticsService.EnabledParks(session.Uid)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
reports, err = service.StatisticsService.ParksNewestState(session.Uid)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
return result.Json(http.StatusOK, "已经完成园区报告的统计。", fiber.Map{
|
||||
"statistics": fiber.Map{
|
||||
"enterprises": enterprises,
|
||||
"parks": parks,
|
||||
"reports": reports,
|
||||
},
|
||||
})
|
||||
}
|
@@ -1,357 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/cache"
|
||||
"electricity_bill_calc/exceptions"
|
||||
"electricity_bill_calc/global"
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"electricity_bill_calc/tools"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
func InitializeUserController(router *fiber.App) {
|
||||
router.Delete("/password/:uid", security.OPSAuthorize, invalidUserPassword)
|
||||
router.Delete("/login", security.MustAuthenticated, logout)
|
||||
router.Put("/password", resetUserPassword)
|
||||
router.Get("/accounts", security.ManagementAuthorize, listPagedUser)
|
||||
router.Post("/login", login)
|
||||
router.Put("/account/enabled/state", security.OPSAuthorize, switchUserEnabling)
|
||||
router.Post("/account", security.OPSAuthorize, createOPSAndManagementAccount)
|
||||
router.Get("/account/:uid", security.MustAuthenticated, getUserDetail)
|
||||
router.Post("/enterprise", security.OPSAuthorize, createEnterpriseAccount)
|
||||
router.Put("/account/:uid", security.OPSAuthorize, modifyAccountDetail)
|
||||
router.Get("/enterprise/quick/search", security.OPSAuthorize, quickSearchEnterprise)
|
||||
router.Get("/expiration", security.EnterpriseAuthorize, fetchExpiration)
|
||||
}
|
||||
|
||||
type _LoginFormData struct {
|
||||
Username string `json:"uname"`
|
||||
Password string `json:"upass"`
|
||||
Type int8 `json:"type"`
|
||||
}
|
||||
|
||||
func login(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
loginData := new(_LoginFormData)
|
||||
if err := c.BodyParser(loginData); err != nil {
|
||||
return result.Error(http.StatusInternalServerError, "表单解析失败。")
|
||||
}
|
||||
var (
|
||||
session *model.Session
|
||||
err error
|
||||
)
|
||||
if loginData.Type == model.USER_TYPE_ENT {
|
||||
session, err = service.UserService.ProcessEnterpriseUserLogin(loginData.Username, loginData.Password)
|
||||
} else {
|
||||
session, err = service.UserService.ProcessManagementUserLogin(loginData.Username, loginData.Password)
|
||||
}
|
||||
if err != nil {
|
||||
if authError, ok := err.(*exceptions.AuthenticationError); ok {
|
||||
if authError.NeedReset {
|
||||
return result.LoginNeedReset()
|
||||
}
|
||||
return result.Error(int(authError.Code), authError.Message)
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
return result.LoginSuccess(session)
|
||||
}
|
||||
|
||||
func logout(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session := c.Locals("session")
|
||||
if session == nil {
|
||||
return result.Success("用户会话已结束。")
|
||||
}
|
||||
_, err := cache.ClearSession(session.(*model.Session).Token)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Success("用户已成功登出系统。")
|
||||
}
|
||||
|
||||
func invalidUserPassword(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
targetUserId := c.Params("uid")
|
||||
verifyCode, err := service.UserService.InvalidUserPassword(targetUserId)
|
||||
if _, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound("未找到指定用户。")
|
||||
}
|
||||
if _, ok := err.(exceptions.UnsuccessfulOperationError); ok {
|
||||
return result.NotAccept("未能成功更新用户的密码。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusAccepted, "用户密码已经失效", fiber.Map{"verify": verifyCode})
|
||||
}
|
||||
|
||||
type _ResetPasswordFormData struct {
|
||||
VerifyCode string `json:"verifyCode"`
|
||||
Username string `json:"uname"`
|
||||
NewPassword string `json:"newPass"`
|
||||
}
|
||||
|
||||
func resetUserPassword(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
resetForm := new(_ResetPasswordFormData)
|
||||
if err := c.BodyParser(resetForm); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
verified, err := service.UserService.VerifyUserPassword(resetForm.Username, resetForm.VerifyCode)
|
||||
if _, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound("指定的用户不存在。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if !verified {
|
||||
return result.Error(http.StatusUnauthorized, "验证码不正确。")
|
||||
}
|
||||
completed, err := service.UserService.ResetUserPassword(resetForm.Username, resetForm.NewPassword)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if completed {
|
||||
return result.Updated("用户凭据已更新。")
|
||||
}
|
||||
return result.NotAccept("用户凭据未能成功更新。")
|
||||
}
|
||||
|
||||
func listPagedUser(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
requestKeyword := c.Query("keyword")
|
||||
requestUserType, err := strconv.Atoi(c.Query("type", "-1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[type]格式不正确。")
|
||||
}
|
||||
var requestUserStat *bool
|
||||
state, err := strconv.ParseBool(c.Query("state"))
|
||||
if err != nil {
|
||||
requestUserStat = nil
|
||||
} else {
|
||||
requestUserStat = &state
|
||||
}
|
||||
users, total, err := service.UserService.ListUserDetail(requestKeyword, requestUserType, requestUserStat, requestPage)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已取得符合条件的用户集合。",
|
||||
response.NewPagedResponse(requestPage, total).ToMap(),
|
||||
fiber.Map{"accounts": users},
|
||||
)
|
||||
}
|
||||
|
||||
type _UserStateChangeFormData struct {
|
||||
UserID string `json:"uid" form:"uid"`
|
||||
Enabled bool `json:"enabled" form:"enabled"`
|
||||
}
|
||||
|
||||
func switchUserEnabling(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
switchForm := new(_UserStateChangeFormData)
|
||||
if err := c.BodyParser(switchForm); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
err := service.UserService.SwitchUserState(switchForm.UserID, switchForm.Enabled)
|
||||
if err != nil {
|
||||
if nfErr, ok := err.(*exceptions.NotFoundError); ok {
|
||||
return result.NotFound(nfErr.Message)
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
return result.Updated("用户状态已经更新。")
|
||||
}
|
||||
|
||||
type _OPSAccountCreationFormData struct {
|
||||
Username string `json:"username" form:"username"`
|
||||
Name string `json:"name" form:"name"`
|
||||
Contact *string `json:"contact" form:"contact"`
|
||||
Phone *string `json:"phone" form:"phone"`
|
||||
Type int `json:"type" form:"type"`
|
||||
}
|
||||
|
||||
func createOPSAndManagementAccount(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
creationForm := new(_OPSAccountCreationFormData)
|
||||
if err := c.BodyParser(creationForm); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
exists, err := service.UserService.IsUsernameExists(creationForm.Username)
|
||||
if exists {
|
||||
return result.Conflict("指定的用户名已经被使用了。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
newUser := new(model.User)
|
||||
newUser.Username = creationForm.Username
|
||||
newUser.Type = int8(creationForm.Type)
|
||||
newUser.Enabled = true
|
||||
newUserDetail := new(model.UserDetail)
|
||||
newUserDetail.Name = &creationForm.Name
|
||||
newUserDetail.Contact = creationForm.Contact
|
||||
newUserDetail.Phone = creationForm.Phone
|
||||
newUserDetail.UnitServiceFee = decimal.Zero
|
||||
newUserDetail.ServiceExpiration, _ = model.ParseDate("2099-12-31")
|
||||
verifyCode, err := service.UserService.CreateUser(newUser, newUserDetail)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
cache.AbolishRelation("user")
|
||||
return result.Json(http.StatusCreated, "用户已经成功创建。", fiber.Map{"verify": verifyCode})
|
||||
}
|
||||
|
||||
func getUserDetail(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
targetUserId := c.Params("uid")
|
||||
exists, err := service.UserService.IsUserExists(targetUserId)
|
||||
if !exists {
|
||||
return result.NotFound("指定的用户不存在。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
userDetail, err := service.UserService.FetchUserDetail(targetUserId)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "用户详细信息已获取到。", fiber.Map{"user": userDetail})
|
||||
}
|
||||
|
||||
type _EnterpriseCreationFormData struct {
|
||||
Username string `json:"username" form:"username"`
|
||||
Name string `json:"name" form:"name"`
|
||||
Region *string `json:"region" form:"region"`
|
||||
Address *string `json:"address" form:"address"`
|
||||
Contact *string `json:"contact" form:"contact"`
|
||||
Phone *string `json:"phone" form:"phone"`
|
||||
UnitServiceFee *string `json:"unitServiceFee" form:"unitServiceFee"`
|
||||
}
|
||||
|
||||
func createEnterpriseAccount(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
creationForm := new(_EnterpriseCreationFormData)
|
||||
if err := c.BodyParser(creationForm); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
exists, err := service.UserService.IsUsernameExists(creationForm.Username)
|
||||
if exists {
|
||||
return result.Conflict("指定的用户名已经被使用了。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
newUser := new(model.User)
|
||||
newUser.Username = creationForm.Username
|
||||
newUser.Type = model.USER_TYPE_ENT
|
||||
newUser.Enabled = true
|
||||
newUserDetail := new(model.UserDetail)
|
||||
newUserDetail.Name = &creationForm.Name
|
||||
newUserDetail.Contact = creationForm.Contact
|
||||
newUserDetail.Phone = creationForm.Phone
|
||||
newUserDetail.UnitServiceFee, err = decimal.NewFromString(*creationForm.UnitServiceFee)
|
||||
if err != nil {
|
||||
return result.BadRequest("用户月服务费无法解析。")
|
||||
}
|
||||
newUserDetail.ServiceExpiration = model.NewEmptyDate()
|
||||
|
||||
verifyCode, err := service.UserService.CreateUser(newUser, newUserDetail)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
cache.AbolishRelation("user")
|
||||
return result.Json(http.StatusCreated, "用户已经成功创建。", fiber.Map{"verify": verifyCode})
|
||||
}
|
||||
|
||||
type _AccountModificationFormData struct {
|
||||
Name string `json:"name" form:"name"`
|
||||
Region *string `json:"region" form:"region"`
|
||||
Address *string `json:"address" form:"address"`
|
||||
Contact *string `json:"contact" form:"contact"`
|
||||
Phone *string `json:"phone" form:"phone"`
|
||||
UnitServiceFee *string `json:"unitServiceFee" form:"unitServiceFee"`
|
||||
}
|
||||
|
||||
func modifyAccountDetail(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
targetUserId := c.Params("uid")
|
||||
modForm := new(_AccountModificationFormData)
|
||||
if err := c.BodyParser(modForm); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
exists, err := service.UserService.IsUserExists(targetUserId)
|
||||
if !exists {
|
||||
return result.NotFound("指定的用户不存在。")
|
||||
}
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
newUserInfo := new(model.UserDetail)
|
||||
newUserInfo.Id = targetUserId
|
||||
newUserInfo.Name = &modForm.Name
|
||||
if len(modForm.Name) > 0 {
|
||||
abbr := tools.PinyinAbbr(modForm.Name)
|
||||
newUserInfo.Abbr = &abbr
|
||||
}
|
||||
newUserInfo.Region = modForm.Region
|
||||
newUserInfo.Address = modForm.Address
|
||||
newUserInfo.Contact = modForm.Contact
|
||||
newUserInfo.Phone = modForm.Phone
|
||||
newUserInfo.UnitServiceFee, err = decimal.NewFromString(*modForm.UnitServiceFee)
|
||||
if err != nil {
|
||||
return result.BadRequest("用户月服务费无法解析。")
|
||||
}
|
||||
_, err = global.DB.NewUpdate().Model(newUserInfo).
|
||||
WherePK().
|
||||
Column("name", "abbr", "region", "address", "contact", "phone", "unit_service_fee").
|
||||
Exec(c.Context())
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
cache.AbolishRelation(fmt.Sprintf("user:%s", targetUserId))
|
||||
return result.Updated("指定用户的信息已经更新。")
|
||||
}
|
||||
|
||||
func quickSearchEnterprise(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
keyword := c.Query("keyword")
|
||||
searchResult, err := service.UserService.SearchLimitUsers(keyword, 6)
|
||||
if err != nil {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return result.Json(http.StatusOK, "已查询到存在符合条件的企业", fiber.Map{"users": searchResult})
|
||||
}
|
||||
|
||||
func fetchExpiration(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
session, err := _retreiveSession(c)
|
||||
if err != nil {
|
||||
return result.Unauthorized(err.Error())
|
||||
}
|
||||
user, err := service.UserService.FetchUserDetail(session.Uid)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已经取得用户的服务期限信息",
|
||||
fiber.Map{"expiration": user.ServiceExpiration.Format("2006-01-02")},
|
||||
)
|
||||
}
|
@@ -1,81 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/exceptions"
|
||||
"electricity_bill_calc/response"
|
||||
"electricity_bill_calc/security"
|
||||
"electricity_bill_calc/service"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func InitializeWithdrawController(router *fiber.App) {
|
||||
router.Delete("/publicity/:pid", security.EnterpriseAuthorize, applyReportWithdraw)
|
||||
router.Get("/withdraws", security.OPSAuthorize, fetchWithdrawsWaitingAutdit)
|
||||
router.Put("/withdraw/:rid", security.OPSAuthorize, auditWithdraw)
|
||||
}
|
||||
|
||||
func applyReportWithdraw(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("pid")
|
||||
if ensure, err := ensureReportBelongs(c, &result, requestReportId); !ensure {
|
||||
return err
|
||||
}
|
||||
deleted, err := service.WithdrawService.ApplyWithdraw(requestReportId)
|
||||
if err != nil {
|
||||
if nfErr, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound(nfErr.Error())
|
||||
} else if ioErr, ok := err.(exceptions.ImproperOperateError); ok {
|
||||
return result.NotAccept(ioErr.Error())
|
||||
} else {
|
||||
return result.Error(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
if !deleted {
|
||||
return result.Error(http.StatusInternalServerError, "未能完成公示报表的申请撤回操作。")
|
||||
}
|
||||
return result.Success("指定的公示报表已经申请撤回。")
|
||||
}
|
||||
|
||||
func fetchWithdrawsWaitingAutdit(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
keyword := c.Query("keyword")
|
||||
requestPage, err := strconv.Atoi(c.Query("page", "1"))
|
||||
if err != nil {
|
||||
return result.NotAccept("查询参数[page]格式不正确。")
|
||||
}
|
||||
reports, totalitems, err := service.WithdrawService.FetchPagedWithdrawApplies(requestPage, keyword)
|
||||
if err != nil {
|
||||
return result.NotFound(err.Error())
|
||||
}
|
||||
return result.Json(
|
||||
http.StatusOK,
|
||||
"已经取得符合条件的等待审核的撤回申请。",
|
||||
response.NewPagedResponse(requestPage, totalitems).ToMap(),
|
||||
fiber.Map{"records": reports},
|
||||
)
|
||||
}
|
||||
|
||||
type WithdrawAuditFormData struct {
|
||||
Audit bool `json:"audit" form:"audit"`
|
||||
}
|
||||
|
||||
func auditWithdraw(c *fiber.Ctx) error {
|
||||
result := response.NewResult(c)
|
||||
requestReportId := c.Params("rid")
|
||||
formData := new(WithdrawAuditFormData)
|
||||
if err := c.BodyParser(formData); err != nil {
|
||||
return result.UnableToParse("无法解析提交的数据。")
|
||||
}
|
||||
err := service.WithdrawService.AuditWithdraw(requestReportId, formData.Audit)
|
||||
if err != nil {
|
||||
if nfErr, ok := err.(exceptions.NotFoundError); ok {
|
||||
return result.NotFound(nfErr.Error())
|
||||
} else {
|
||||
return result.NotAccept(err.Error())
|
||||
}
|
||||
}
|
||||
return result.Success("指定公示报表的撤回申请已经完成审核")
|
||||
}
|
Reference in New Issue
Block a user