Files
assets/dao/procurement/purchase_order_item_dao.go
2026-03-18 10:18:03 +08:00

142 lines
4.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dao
import (
"assets/consts/public"
dto "assets/model/dto/procurement"
entity "assets/model/entity/procurement"
"context"
"gitea.com/red-future/common/db/mongo"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"go.mongodb.org/mongo-driver/v2/bson"
)
var PurchaseOrderItem = new(purchaseOrderItem)
type purchaseOrderItem struct{}
// Insert 插入采购订单明细
func (d *purchaseOrderItem) Insert(ctx context.Context, req *dto.CreatePurchaseOrderItemReq) (ids []any, err error) {
var result *entity.PurchaseOrderItem
if err = gconv.Struct(req, &result); err != nil {
return
}
ids, err = mongo.DB().Insert(ctx, []interface{}{&result}, public.PurchaseOrderItemCollection)
return
}
// BatchInsert 批量插入采购订单明细
func (d *purchaseOrderItem) BatchInsert(ctx context.Context, req *dto.BatchCreatePurchaseOrderItemsReq) (ids []any, err error) {
items := make([]*entity.PurchaseOrderItem, 0, len(req.Items))
for _, item := range req.Items {
var result *entity.PurchaseOrderItem
if err = gconv.Struct(item, &result); err != nil {
return
}
items = append(items, result)
}
// 转换为 interface{} 切片
interfaces := make([]interface{}, len(items))
for i, item := range items {
interfaces[i] = item
}
ids, err = mongo.DB().Insert(ctx, interfaces, public.PurchaseOrderItemCollection)
return
}
// GetOne 获取单个采购订单明细
func (d *purchaseOrderItem) GetOne(ctx context.Context, id *bson.ObjectID) (item *entity.PurchaseOrderItem, err error) {
filter := bson.M{"_id": id}
err = mongo.DB().FindOne(ctx, filter, &item, public.PurchaseOrderItemCollection)
return
}
// Update 更新采购订单明细
func (d *purchaseOrderItem) Update(ctx context.Context, req *dto.UpdatePurchaseOrderItemReq) (err error) {
buildUpdateData, err := mongo.BuildUpdateData(ctx, req)
if err != nil {
return
}
filter := bson.M{"_id": req.ID}
update := bson.M{"$set": buildUpdateData}
_, err = mongo.DB().Update(ctx, filter, update, public.PurchaseOrderItemCollection)
return
}
// IncrementInboundQty 原子增加已入库数量(并发安全)
// 使用$inc + $expr条件inboundQty + deltaQty <= passQuantity防止并发超量入库
func (d *purchaseOrderItem) IncrementInboundQty(ctx context.Context, id *bson.ObjectID, deltaQty int) (err error) {
filter := bson.M{
"_id": id,
"$expr": bson.M{
"$lte": bson.A{
bson.M{"$add": bson.A{"$inboundQty", deltaQty}},
"$passQuantity",
},
},
}
update := bson.M{
"$inc": bson.M{
"inboundQty": deltaQty,
},
}
modifiedCount, err := mongo.DB().Update(ctx, filter, update, public.PurchaseOrderItemCollection)
if err != nil {
return
}
if modifiedCount == 0 {
return gerror.Newf("入库数量超出签收数量限制,本次入库%d", deltaQty)
}
return
}
// DeleteFake 删除采购订单明细-根据id进行假删
func (d *purchaseOrderItem) DeleteFake(ctx context.Context, id *bson.ObjectID) (err error) {
filter := bson.M{"_id": id}
_, err = mongo.DB().DeleteSoft(ctx, filter, public.PurchaseOrderItemCollection)
return
}
// List 获取采购订单明细列表
func (d *purchaseOrderItem) List(ctx context.Context, req *dto.ListPurchaseOrderItemsReq) (res []*entity.PurchaseOrderItem, total int64, err error) {
filter, err := d.buildListFilter(ctx, req)
if err != nil {
return
}
total, err = mongo.DB().Find(ctx, filter, &res, public.PurchaseOrderItemCollection, nil, nil)
return
}
// ListByOrderId 根据订单ID获取采购订单明细列表
func (d *purchaseOrderItem) ListByOrderId(ctx context.Context, orderId *bson.ObjectID) (res []*entity.PurchaseOrderItem, err error) {
filter := bson.M{"orderId": orderId}
_, err = mongo.DB().Find(ctx, filter, &res, public.PurchaseOrderItemCollection, nil, nil)
return
}
// buildListFilter 构建列表查询的过滤条件
func (d *purchaseOrderItem) buildListFilter(ctx context.Context, req *dto.ListPurchaseOrderItemsReq) (filter bson.M, err error) {
_ = ctx
filter = bson.M{}
if req.OrderId != nil {
filter["orderId"] = req.OrderId
}
if req.AssetId != nil {
filter["assetId"] = req.AssetId
}
if req.AssetSkuId != nil {
filter["assetSkuId"] = req.AssetSkuId
}
if !g.IsEmpty(req.ProductName) {
filter["productName"] = bson.M{"$regex": req.ProductName, "$options": "i"}
}
if !g.IsEmpty(req.Brand) {
filter["brand"] = bson.M{"$regex": req.Brand, "$options": "i"}
}
return
}