Files
assets/service/procurement/purchase_order_service.go

200 lines
6.4 KiB
Go
Raw Permalink Normal View History

2026-03-18 10:18:03 +08:00
package service
import (
"assets/consts/procurement"
"assets/dao/procurement"
"assets/model/dto/procurement"
"assets/model/entity/procurement"
"context"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/errors/gerror"
"go.mongodb.org/mongo-driver/v2/bson"
)
type purchaseOrder struct{}
// PurchaseOrder 采购订单服务
var PurchaseOrder = new(purchaseOrder)
// CreatePurchaseOrder 创建采购订单
func (s *purchaseOrder) CreatePurchaseOrder(ctx context.Context, req *dto.CreatePurchaseOrderReq) (*dto.CreatePurchaseOrderRes, error) {
// 保存到数据库
ids, err := dao.PurchaseOrder.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.CreatePurchaseOrderRes{ID: id}, nil
}
// BatchCreatePurchaseOrders 批量创建采购订单
func (s *purchaseOrder) BatchCreatePurchaseOrders(ctx context.Context, req *dto.BatchCreatePurchaseOrdersReq) (*dto.BatchCreatePurchaseOrdersRes, error) {
// 保存到数据库
ids, err := dao.PurchaseOrder.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.BatchCreatePurchaseOrdersRes{IDs: idList}, nil
}
// UpdatePurchaseOrder 更新采购订单
func (s *purchaseOrder) UpdatePurchaseOrder(ctx context.Context, req *dto.UpdatePurchaseOrderReq) error {
// 更新到数据库
err := dao.PurchaseOrder.Update(ctx, req)
if err != nil {
return gerror.Wrap(err, "更新采购订单失败")
}
return nil
}
// DeletePurchaseOrder 删除采购订单
func (s *purchaseOrder) DeletePurchaseOrder(ctx context.Context, id *bson.ObjectID) error {
return dao.PurchaseOrder.DeleteFake(ctx, id)
}
// GetPurchaseOrder 获取采购订单详情
func (s *purchaseOrder) GetPurchaseOrder(ctx context.Context, id *bson.ObjectID) (*dto.GetPurchaseOrderRes, error) {
order, err := dao.PurchaseOrder.GetOne(ctx, id)
if err != nil {
return nil, gerror.Wrap(err, "获取采购订单失败")
}
// 转换为响应
res := &dto.GetPurchaseOrderRes{
ID: order.Id,
OrderNo: order.OrderNo,
Title: order.Title,
Description: order.Description,
OrderType: order.OrderType,
BuyerId: order.BuyerId,
BuyerName: order.BuyerName,
BuyerType: order.BuyerType,
Status: order.Status,
StatusText: consts.GetPurchaseOrderStatusText(order.Status),
Priority: order.Priority,
ExpectedDelivery: formatGTime(order.ExpectedDelivery),
ExpiryTime: formatGTime(order.ExpiryTime),
CreatedAt: order.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: order.UpdatedAt.Format("2006-01-02 15:04:05"),
}
// 转换指定供应商模式信息
if order.DirectPurchase != nil {
res.DirectPurchase = &dto.DirectPurchaseInfoRes{
SupplierId: order.DirectPurchase.SupplierId,
SupplierName: order.DirectPurchase.SupplierName,
SupplierCode: order.DirectPurchase.SupplierCode,
AssignReason: order.DirectPurchase.AssignReason,
DeliveryAddress: order.DirectPurchase.DeliveryAddress,
ContactPerson: order.DirectPurchase.ContactPerson,
ContactPhone: order.DirectPurchase.ContactPhone,
ResponseStatus: order.DirectPurchase.ResponseStatus,
AssignedAt: formatGTime(order.DirectPurchase.AssignedAt),
AcceptedAt: formatGTime(order.DirectPurchase.AcceptedAt),
RejectedAt: formatGTime(order.DirectPurchase.RejectedAt),
DeliveredAt: formatGTime(order.DirectPurchase.DeliveredAt),
}
}
// 转换竞价模式信息
if order.BiddingInfo != nil {
res.BiddingInfo = &dto.BiddingInfoRes{
BidMode: order.BiddingInfo.BidMode,
BidModeText: consts.GetBidModeText(order.BiddingInfo.BidMode),
MinSuppliers: order.BiddingInfo.MinSuppliers,
MaxSuppliers: order.BiddingInfo.MaxSuppliers,
BidDuration: order.BiddingInfo.BidDuration,
BidSupplierCount: order.BiddingInfo.BidSupplierCount,
BidStartAt: formatGTime(order.BiddingInfo.BidStartAt),
BidEndAt: formatGTime(order.BiddingInfo.BidEndAt),
ResultPublishedAt: formatGTime(order.BiddingInfo.ResultPublishedAt),
}
}
return res, nil
}
// ListPurchaseOrders 获取采购订单列表
func (s *purchaseOrder) ListPurchaseOrders(ctx context.Context, req *dto.ListPurchaseOrdersReq) (*dto.ListPurchaseOrdersRes, error) {
// 获取数据
orders, total, err := dao.PurchaseOrder.List(ctx, req)
if err != nil {
return nil, gerror.Wrap(err, "获取采购订单列表失败")
}
// 转换为响应
listItems := make([]*dto.PurchaseOrderListItem, 0, len(orders))
for _, order := range orders {
listItems = append(listItems, &dto.PurchaseOrderListItem{
ID: order.Id,
OrderNo: order.OrderNo,
Title: order.Title,
OrderType: order.OrderType,
OrderTypeText: consts.GetPurchaseOrderTypeText(order.OrderType),
BuyerName: order.BuyerName,
BuyerType: order.BuyerType,
Status: order.Status,
StatusText: consts.GetPurchaseOrderStatusText(order.Status),
Priority: order.Priority,
ExpectedDelivery: formatGTime(order.ExpectedDelivery),
ExpiryTime: formatGTime(order.ExpiryTime),
CreatedAt: order.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: order.UpdatedAt.Format("2006-01-02 15:04:05"),
})
}
return &dto.ListPurchaseOrdersRes{
List: listItems,
Total: total,
}, nil
}
// ListByBuyerId 根据采购方ID获取采购订单列表
func (s *purchaseOrder) ListByBuyerId(ctx context.Context, buyerId *bson.ObjectID) ([]*entity.PurchaseOrder, error) {
orders, err := dao.PurchaseOrder.ListByBuyerId(ctx, buyerId)
if err != nil {
return nil, gerror.Wrap(err, "获取订单列表失败")
}
return orders, nil
}
// GenerateTestData 生成测试数据
func (s *purchaseOrder) GenerateTestData(ctx context.Context) error {
testData := &dto.BatchCreatePurchaseOrdersReq{}
_, err := s.BatchCreatePurchaseOrders(ctx, testData)
if err != nil {
return gerror.Wrap(err, "生成测试数据失败")
}
return nil
}
// formatGTime 格式化时间
func formatGTime(t *gtime.Time) string {
if t == nil {
return ""
}
return t.Format("2006-01-02 15:04:05")
}