Procházet zdrojové kódy

feat: 数字票API+路由+VehicleEntry集成——所有入场统一创建数字票

lq před 1 měsícem
rodič
revize
780f4f5dd8

+ 4 - 0
internal/initialize/router.go

@@ -8,6 +8,7 @@ import (
 	"wails-app/internal/middleware"
 	"wails-app/internal/middleware"
 	"wails-app/internal/router"
 	"wails-app/internal/router"
 	"wails-app/internal/router/owner"
 	"wails-app/internal/router/owner"
+	"wails-app/internal/modules/digital-ticket"
 	"wails-app/internal/modules/monthly"
 	"wails-app/internal/modules/monthly"
 	"wails-app/internal/modules/payment"
 	"wails-app/internal/modules/payment"
 	"wails-app/internal/router/parking"
 	"wails-app/internal/router/parking"
@@ -113,6 +114,9 @@ func Routers() *gin.Engine {
 		// 包月车管理路由
 		// 包月车管理路由
 		monthly.SetupMonthlyCardRouter(PrivateGroup)
 		monthly.SetupMonthlyCardRouter(PrivateGroup)
 
 
+		// 数字票路由
+		digital_ticket.SetupDigitalTicketRouter(PrivateGroup)
+
 		// UHF读写器路由
 		// UHF读写器路由
 		//uhf.SetupUHFRouter(PrivateGroup)
 		//uhf.SetupUHFRouter(PrivateGroup)
 	}
 	}

+ 87 - 0
internal/modules/digital-ticket/api.go

@@ -0,0 +1,87 @@
+package digital_ticket
+
+import (
+	"github.com/gin-gonic/gin"
+	"wails-app/internal/model/common/response"
+	"wails-app/internal/modules/digital-ticket/repository"
+	"wails-app/internal/modules/digital-ticket/service"
+)
+
+var ticketSvc = service.NewTicketService()
+
+func GetTicket(c *gin.Context) {
+	t, err := ticketSvc.GetByTicketNo(c.Param("ticketNo"))
+	if err != nil {
+		response.FailWithMessage("票不存在", c)
+		return
+	}
+	response.OkWithData(t, c)
+}
+
+type payReq struct {
+	PaymentMethod  string  `json:"payment_method"`
+	PaymentOrderNo string  `json:"payment_order_no"`
+	PaidAmount     float64 `json:"paid_amount"`
+}
+
+func PayTicket(c *gin.Context) {
+	var req payReq
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	t, err := ticketSvc.GetByTicketNo(c.Param("ticketNo"))
+	if err != nil {
+		response.FailWithMessage("票不存在", c)
+		return
+	}
+	extra := map[string]interface{}{
+		"payment_method": req.PaymentMethod, "payment_order_no": req.PaymentOrderNo,
+		"paid_amount": req.PaidAmount,
+	}
+	if err := ticketSvc.Transition(t.ID, service.StatePaid, extra); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("支付成功", c)
+}
+
+func ExitTicket(c *gin.Context) {
+	t, err := ticketSvc.GetByTicketNo(c.Param("ticketNo"))
+	if err != nil {
+		response.FailWithMessage("票不存在", c)
+		return
+	}
+	if err := ticketSvc.Transition(t.ID, service.StateExited, nil); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("已离场", c)
+}
+
+func ListTickets(c *gin.Context) {
+	var q repository.TicketListQuery
+	if err := c.ShouldBindQuery(&q); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	list, total, err := ticketSvc.List(q)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithDetailed(response.PageResult{List: list, Total: total, Page: q.Page, PageSize: q.PageSize}, "查询成功", c)
+}
+
+func SetupDigitalTicketRouter(router *gin.RouterGroup) {
+	dt := router.Group("/digital-ticket")
+	{
+		dt.GET("/:ticketNo", GetTicket)
+		dt.POST("/:ticketNo/pay", PayTicket)
+		dt.POST("/:ticketNo/exit", ExitTicket)
+	}
+	dt2 := router.Group("/digital-ticket")
+	{
+		dt2.GET("/list", ListTickets)
+	}
+}

+ 6 - 0
internal/service/vehicle/vehicle.go

@@ -8,6 +8,7 @@ import (
 	"wails-app/internal/global"
 	"wails-app/internal/global"
 	"wails-app/internal/model/vehicle/request"
 	"wails-app/internal/model/vehicle/request"
 	vehicleResponse "wails-app/internal/model/vehicle/response"
 	vehicleResponse "wails-app/internal/model/vehicle/response"
+	ticketService "wails-app/internal/modules/digital-ticket/service"
 	paymentService "wails-app/internal/modules/payment/service"
 	paymentService "wails-app/internal/modules/payment/service"
 
 
 	"gorm.io/gorm"
 	"gorm.io/gorm"
@@ -223,6 +224,11 @@ func (s *VehicleService) VehicleEntry(req request.VehicleEntry) (request.Vehicle
 		return request.VehicleEntryResponse{}, err
 		return request.VehicleEntryResponse{}, err
 	}
 	}
 
 
+	// 创建数字票(统一入口)
+	ticketSvc := ticketService.NewTicketService()
+	triggerMode := "manual"
+	if req.RFIDTag != "" { triggerMode = "rfid" }
+	ticketSvc.Create(req.PlateNumber, triggerMode, record.ID)
 	// 更新车辆最近入场时间
 	// 更新车辆最近入场时间
 	vehicle.LastEntryTime = &entryTime
 	vehicle.LastEntryTime = &entryTime
 	global.GVA_DB.Save(&vehicle)
 	global.GVA_DB.Save(&vehicle)