package fin import ( "bytes" "encoding/json" "errors" "io" "time" "git.apinb.com/bsm-sdk/core/errcode" "git.apinb.com/bsm-sdk/core/infra" "git.apinb.com/heqiapp/platforms/backend/api/internal/logic/common" "git.apinb.com/heqiapp/platforms/backend/api/internal/models" "github.com/gin-gonic/gin" ) func FinSettlementHandlers() (gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc, gin.HandlerFunc) { fields := []string{"settlement_no", "subject_type", "subject_id", "period_start", "period_end"} return func(ctx *gin.Context) { common.ListResource(ctx, &models.FinSettlement{}) }, func(ctx *gin.Context) { if err := rewriteSettlementSubject(ctx); err != nil { infra.Response.Error(ctx, errcode.ErrInvalidArgument) return } _, create, _, _ := common.ResourceHandlers(&models.FinSettlement{}, fields, fields) create(ctx) }, func(ctx *gin.Context) { common.GetResource(ctx, &models.FinSettlement{}) }, func(ctx *gin.Context) { if err := rewriteSettlementSubject(ctx); err != nil { infra.Response.Error(ctx, errcode.ErrInvalidArgument) return } _, _, _, update := common.ResourceHandlers(&models.FinSettlement{}, fields, fields) update(ctx) } } func rewriteSettlementSubject(ctx *gin.Context) error { var input map[string]any if err := ctx.ShouldBindJSON(&input); err != nil { return err } if !validSettlementPeriod(input["period_start"], input["period_end"]) { return errors.New("invalid settlement period") } subjectType, _ := input["subject_type"].(string) identity, _ := input["subject_identity"].(string) var model any switch subjectType { case "gas", "gas_basic": model = &models.GasBasic{} case "delivery", "delivery_basic": model = &models.DeliveryBasic{} case "staff", "staff_account": model = &models.StaffAccount{} default: return errors.New("invalid settlement subject") } id, err := common.ResolveIdentityID(model, identity, true) if err != nil { return err } delete(input, "subject_identity") input["subject_id"] = id encoded, err := json.Marshal(input) if err != nil { return err } ctx.Request.Body = io.NopCloser(bytes.NewReader(encoded)) return nil } func validSettlementPeriod(startValue, endValue any) bool { startText, startOK := startValue.(string) endText, endOK := endValue.(string) if !startOK || !endOK { return false } start, startErr := time.Parse(time.RFC3339, startText) end, endErr := time.Parse(time.RFC3339, endText) return startErr == nil && endErr == nil && end.After(start) }