package controller import ( "electricity_bill_calc/model" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/jinzhu/copier" "github.com/samber/lo" "github.com/shopspring/decimal" ) func InitializeMaintenanceFeeController(router *gin.Engine) { 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 *gin.Context, result *response.Result, requestMaintenanceFeeId string) bool { userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return false } sure, err := service.MaintenanceFeeService.EnsureFeeBelongs(userSession.Uid, requestMaintenanceFeeId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return false } if !sure { result.Unauthorized("所操作维护费记录不属于当前用户。") return false } return true } func listMaintenanceFees(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } requestPark := c.DefaultQuery("park", "") requestPeriod := c.DefaultQuery("period", "") requestPage, err := strconv.Atoi(c.DefaultQuery("page", "1")) if err != nil { result.Error(http.StatusInternalServerError, "不能解析给定的参数[page]。") return } if len(requestPark) > 0 { if userSession.Type == model.USER_TYPE_ENT { if !ensureParkBelongs(c, result, requestPark) { result.Unauthorized("只能访问属于自己的园区。") return } } fees, total, err := service.MaintenanceFeeService.ListMaintenanceFees([]string{requestPark}, requestPeriod, requestPage) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Json( http.StatusOK, "已获取指定园区下的维护费记录", response.NewPagedResponse(requestPage, total).ToMap(), gin.H{"fees": fees}, ) } else { parkIds, err := service.ParkService.AllParkIds(userSession.Uid) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } fees, total, err := service.MaintenanceFeeService.ListMaintenanceFees(parkIds, requestPeriod, requestPage) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Json( http.StatusOK, "已获取指定用户下的所有维护费记录。", response.NewPagedResponse(requestPage, total).ToMap(), gin.H{"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 *gin.Context) { result := response.NewResult(c) formData := new(_FeeCreationFormData) c.BindJSON(formData) if !ensureParkBelongs(c, result, formData.ParkId) { return } newMaintenanceFee := &model.MaintenanceFee{} copier.Copy(newMaintenanceFee, formData) err := service.MaintenanceFeeService.CreateMaintenanceFeeRecord(*newMaintenanceFee) if err != nil { 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 *gin.Context) { result := response.NewResult(c) requestFee := c.Param("mid") formData := new(_FeeModificationFormData) c.BindJSON(formData) if !ensureMaintenanceFeeBelongs(c, result, requestFee) { return } newFeeState := new(model.MaintenanceFee) copier.Copy(newFeeState, formData) newFeeState.Id = requestFee err := service.MaintenanceFeeService.ModifyMaintenanceFee(*newFeeState) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Updated("指定维护费条目已更新。") } type _FeeStateFormData struct { Enabled bool `json:"enabled" form:"enabled"` } func changeMaintenanceFeeState(c *gin.Context) { result := response.NewResult(c) requestFee := c.Param("mid") formData := new(_FeeStateFormData) c.BindJSON(formData) if !ensureMaintenanceFeeBelongs(c, result, requestFee) { return } err := service.MaintenanceFeeService.ChangeMaintenanceFeeState(requestFee, formData.Enabled) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Updated("指定维护费条目状态已更新。") } func deleteMaintenanceFee(c *gin.Context) { result := response.NewResult(c) requestFee := c.Param("mid") if !ensureMaintenanceFeeBelongs(c, result, requestFee) { return } err := service.MaintenanceFeeService.DeleteMaintenanceFee(requestFee) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Deleted("指定维护费条目已删除。") } func statAdditionalCharges(c *gin.Context) { result := response.NewResult(c) session, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } requestUser := lo. If(session.Type == model.USER_TYPE_ENT, session.Uid). Else(c.DefaultQuery("user", "")) requestPark := c.DefaultQuery("park", "") if len(requestPark) > 0 && session.Type == model.USER_TYPE_ENT { if !ensureParkBelongs(c, result, requestPark) { result.Unauthorized("不能获取不属于自己的园区。") return } } period := c.DefaultQuery("period", "") keyword := c.DefaultQuery("keyword", "") requestPage, err := strconv.Atoi(c.DefaultQuery("page", "1")) if err != nil { result.Error(http.StatusInternalServerError, "不能解析给定的参数[page]。") return } fees, total, err := service.MaintenanceFeeService.QueryAdditionalCharges(requestUser, requestPark, period, keyword, requestPage) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Success( "已经成功获取到物业附加费的统计记录。", response.NewPagedResponse(requestPage, total).ToMap(), gin.H{"charges": fees}, ) }