// 库存明细DAO层(逻辑库存) // 职责:批量插入/删除、按SKU统计数量、查询列表 // 紧密耦合:service.StockDetails、service.StockManage(入库出库) // 注意:GetStockCountBySkuId使用NoCache()跳过缓存,BatchInsert用于批量入库 package dao import ( "assets/consts/public" dto "assets/model/dto/stock" entity "assets/model/entity/stock" "context" "gitea.com/red-future/common/db/gfdb" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/util/gconv" ) var StockDetails = new(stockDetails) type stockDetails struct { } // BatchInsert 批量插入库存 func (d *stockDetails) BatchInsert(ctx context.Context, req []*dto.CreateSockDetailsReq) (rows int64, err error) { var res []*entity.StockDetails if err = gconv.Structs(req, &res); err != nil { return } r, err := gfdb.DB(ctx).Model(ctx, public.TableNameStockDetails).Data(res).Save() if err != nil { return } return r.RowsAffected() } func (d *stockDetails) Delete(ctx context.Context, req []dto.DeleteSockDetailsReq) (rows int64, err error) { r, err := gfdb.DB(ctx).Model(ctx, public.TableNameStockDetails).Where(entity.StockDetailsCol.Id, &req).Delete() if err != nil { return } return r.RowsAffected() } func (d *stockDetails) Count(ctx context.Context, req *dto.GetSockDetailsReq) (count int, err error) { return d.buildListFilter(ctx, req).Count() } func (d *stockDetails) List(ctx context.Context, req *dto.GetSockDetailsReq, fields ...string) (res []entity.StockDetails, total int, err error) { model := d.buildListFilter(ctx, req).Fields(fields) model.OrderDesc(entity.StockDetailsCol.CreatedAt) if req.Page != nil { model.Page(int(req.Page.PageNum), int(req.Page.PageSize)) } r, total, err := model.AllAndCount(false) if err != nil { return } err = r.Structs(&res) return } // buildListFilter 构建列表查询的过滤条件 func (d *stockDetails) buildListFilter(ctx context.Context, req *dto.GetSockDetailsReq) *gdb.Model { model := gfdb.DB(ctx).Model(ctx, public.TableNameStockDetails).Model model.Where(entity.StockDetailsCol.Id, req.Id) model.Where(entity.StockDetailsCol.AssetId, req.AssetId) model.Where(entity.StockDetailsCol.AssetSkuId, req.AssetSkuId) model.Where(entity.StockDetailsCol.Status, req.Status) return model }