Files
assets/service/procurement/purchase_order_item_service.go
2026-03-18 10:18:03 +08:00

183 lines
5.6 KiB
Go

package service
import (
"assets/dao/procurement"
"assets/model/dto/procurement"
"assets/model/entity/procurement"
"context"
"github.com/gogf/gf/v2/errors/gerror"
"go.mongodb.org/mongo-driver/v2/bson"
)
type purchaseOrderItem struct{}
// PurchaseOrderItem 采购订单明细服务
var PurchaseOrderItem = new(purchaseOrderItem)
// CreatePurchaseOrderItem 创建采购订单明细
func (s *purchaseOrderItem) CreatePurchaseOrderItem(ctx context.Context, req *dto.CreatePurchaseOrderItemReq) (*dto.CreatePurchaseOrderItemRes, error) {
// 自动计算总价(如果未提供)
if req.TotalPrice == 0 {
req.TotalPrice = req.UnitPrice * req.Quantity
}
// 默认折扣价为单价(如果未提供)
if req.DiscountPrice == 0 {
req.DiscountPrice = req.UnitPrice
}
// 保存到数据库
ids, err := dao.PurchaseOrderItem.Insert(ctx, req)
if err != nil {
return nil, gerror.Wrap(err, "创建采购订单明细失败")
}
var id *bson.ObjectID
if len(ids) > 0 {
if objectID, ok := ids[0].(bson.ObjectID); ok {
id = &objectID
}
}
return &dto.CreatePurchaseOrderItemRes{ID: id}, nil
}
// BatchCreatePurchaseOrderItems 批量创建采购订单明细
func (s *purchaseOrderItem) BatchCreatePurchaseOrderItems(ctx context.Context, req *dto.BatchCreatePurchaseOrderItemsReq) (*dto.BatchCreatePurchaseOrderItemsRes, error) {
// 自动计算总价和设置默认折扣价
for i := range req.Items {
if req.Items[i].TotalPrice == 0 {
req.Items[i].TotalPrice = req.Items[i].UnitPrice * req.Items[i].Quantity
}
if req.Items[i].DiscountPrice == 0 {
req.Items[i].DiscountPrice = req.Items[i].UnitPrice
}
}
// 保存到数据库
ids, err := dao.PurchaseOrderItem.BatchInsert(ctx, req)
if err != nil {
return nil, gerror.Wrap(err, "批量创建采购订单明细失败")
}
// 转换ID列表
idList := make([]*bson.ObjectID, 0, len(ids))
for _, id := range ids {
if objectID, ok := id.(bson.ObjectID); ok {
idList = append(idList, &objectID)
}
}
return &dto.BatchCreatePurchaseOrderItemsRes{IDs: idList}, nil
}
// UpdatePurchaseOrderItem 更新采购订单明细
func (s *purchaseOrderItem) UpdatePurchaseOrderItem(ctx context.Context, req *dto.UpdatePurchaseOrderItemReq) error {
// 自动计算总价(如果提供了数量和单价)
if req.Quantity > 0 && req.UnitPrice > 0 && req.TotalPrice == 0 {
req.TotalPrice = req.UnitPrice * req.Quantity
}
// 更新到数据库
err := dao.PurchaseOrderItem.Update(ctx, req)
if err != nil {
return gerror.Wrap(err, "更新采购订单明细失败")
}
return nil
}
// DeletePurchaseOrderItem 删除采购订单明细
func (s *purchaseOrderItem) DeletePurchaseOrderItem(ctx context.Context, id *bson.ObjectID) error {
return dao.PurchaseOrderItem.DeleteFake(ctx, id)
}
// GetPurchaseOrderItem 获取采购订单明细详情
func (s *purchaseOrderItem) GetPurchaseOrderItem(ctx context.Context, id *bson.ObjectID) (*dto.GetPurchaseOrderItemRes, error) {
item, err := dao.PurchaseOrderItem.GetOne(ctx, id)
if err != nil {
return nil, gerror.Wrap(err, "获取采购订单明细失败")
}
// 转换为响应
res := &dto.GetPurchaseOrderItemRes{
ID: item.Id,
OrderId: item.OrderId,
AssetId: item.AssetId,
AssetSkuId: item.AssetSkuId,
ProductName: item.ProductName,
Specification: item.Specification,
Brand: item.Brand,
Quantity: item.Quantity,
Unit: item.Unit,
UnitPrice: item.UnitPrice,
TotalPrice: item.TotalPrice,
DiscountPrice: item.DiscountPrice,
RequirementDesc: item.RequirementDesc,
DeliveryAddress: item.DeliveryAddress,
CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"),
}
return res, nil
}
// ListPurchaseOrderItems 获取采购订单明细列表
func (s *purchaseOrderItem) ListPurchaseOrderItems(ctx context.Context, req *dto.ListPurchaseOrderItemsReq) (*dto.ListPurchaseOrderItemsRes, error) {
// 获取数据
items, total, err := dao.PurchaseOrderItem.List(ctx, req)
if err != nil {
return nil, gerror.Wrap(err, "获取采购订单明细列表失败")
}
// 转换为响应
listItems := make([]*dto.PurchaseOrderItemListItem, 0, len(items))
for _, item := range items {
listItems = append(listItems, &dto.PurchaseOrderItemListItem{
ID: item.Id,
OrderId: item.OrderId,
AssetId: item.AssetId,
AssetSkuId: item.AssetSkuId,
ProductName: item.ProductName,
Specification: item.Specification,
Brand: item.Brand,
Quantity: item.Quantity,
Unit: item.Unit,
UnitPrice: item.UnitPrice,
TotalPrice: item.TotalPrice,
DiscountPrice: item.DiscountPrice,
RequirementDesc: item.RequirementDesc,
DeliveryAddress: item.DeliveryAddress,
CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"),
})
}
return &dto.ListPurchaseOrderItemsRes{
List: listItems,
Total: total,
}, nil
}
// ListByOrderId 根据订单ID获取采购订单明细列表
func (s *purchaseOrderItem) ListByOrderId(ctx context.Context, orderId *bson.ObjectID) ([]*entity.PurchaseOrderItem, error) {
items, err := dao.PurchaseOrderItem.ListByOrderId(ctx, orderId)
if err != nil {
return nil, gerror.Wrap(err, "获取订单明细列表失败")
}
return items, nil
}
// GenerateTestData 生成测试数据
func (s *purchaseOrderItem) GenerateTestData(ctx context.Context) error {
testData := &dto.BatchCreatePurchaseOrderItemsReq{}
_, err := s.BatchCreatePurchaseOrderItems(ctx, testData)
if err != nil {
return gerror.Wrap(err, "生成测试数据失败")
}
return nil
}