ce1cbf404c
后端: - fix(backend): InventoryLog 增加 Product/Warehouse 关联,Logs 接口加 Preload 修复流水记录显示"-" - feat(backend): 新增 /inventory/batches 批次追踪接口 - feat(backend): 新增财务记录、编号规则接口(finance、number_rule handler) - fix(backend): service/stock_test.go 修复 model.Date 类型错误 前端: - feat(client): 入库/出库管理 Tab 调换顺序(审核在前),审核 Tab 加新建按钮,列表 Tab 无按钮 - feat(client): 入库单/出库单增加详情弹窗,显示完整单据信息和商品明细 - feat(client): 完善出库单新建表单(StockOutFormScreen),支持选客户/仓库/商品 - fix(client): StockInItem/StockOutItem.fromJson 修复读取嵌套 product 对象而非平铺字段 - feat(client): 批次追踪页面(BatchTrackingScreen)及侧边栏入口 - feat(client): 财务管理、盘点、编号规则接入真实后端 API - fix(client): 入库/出库审核通过后 invalidate inventoryListProvider 刷新库存 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/wangjia/jiu/backend/internal/middleware"
|
|
"github.com/wangjia/jiu/backend/internal/model"
|
|
)
|
|
|
|
type FinanceHandler struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewFinanceHandler(db *gorm.DB) *FinanceHandler {
|
|
return &FinanceHandler{db: db}
|
|
}
|
|
|
|
// ListRecords GET /api/v1/finance/records
|
|
func (h *FinanceHandler) ListRecords(c *gin.Context) {
|
|
shopID := middleware.GetShopID(c)
|
|
|
|
var q struct {
|
|
Type string `form:"type"`
|
|
Month string `form:"month"` // e.g. "2026-04"
|
|
Page int `form:"page,default=1"`
|
|
PageSize int `form:"page_size,default=50"`
|
|
}
|
|
if err := c.ShouldBindQuery(&q); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
if q.PageSize <= 0 {
|
|
q.PageSize = 50
|
|
}
|
|
if q.Page <= 0 {
|
|
q.Page = 1
|
|
}
|
|
|
|
base := h.db.Model(&model.FinanceRecord{}).Where("shop_id = ?", shopID)
|
|
if q.Type != "" {
|
|
base = base.Where("type = ?", q.Type)
|
|
}
|
|
if q.Month != "" {
|
|
base = base.Where("DATE_FORMAT(record_date, '%Y-%m') = ?", q.Month)
|
|
}
|
|
|
|
var total int64
|
|
base.Count(&total)
|
|
|
|
var records []model.FinanceRecord
|
|
offset := (q.Page - 1) * q.PageSize
|
|
base.Preload("Partner").Order("record_date DESC, id DESC").Offset(offset).Limit(q.PageSize).Find(&records)
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"data": records,
|
|
"total": total,
|
|
"page": q.Page,
|
|
"page_size": q.PageSize,
|
|
})
|
|
}
|