156 lines
5.3 KiB
Go
156 lines
5.3 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"psi/database"
|
|
"psi/models"
|
|
systemReq "psi/models/request"
|
|
systemRes "psi/models/response"
|
|
"psi/utils"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PurchaseService struct{}
|
|
|
|
// GetPurchaseOrderList 获取采购订单列表
|
|
func (s *PurchaseService) GetPurchaseOrderList(req systemReq.GetPurchaseOrderListRequest, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.PurchaseOrderListResponse, error) {
|
|
databaseConn := database.OptionalDB(db...)
|
|
|
|
if req.Page < 1 {
|
|
req.Page = 1
|
|
}
|
|
if req.PageSize < 1 || req.PageSize > 100 {
|
|
req.PageSize = 20
|
|
}
|
|
|
|
query := databaseConn.Model(&models.PurchaseOrder{}).Where("purchase_order.is_del = ?", 0)
|
|
if role == 128 {
|
|
query = query.Where("purchase_order.creator_id = ?", creatorID)
|
|
}
|
|
if req.Status > 0 {
|
|
query = query.Where("purchase_order.status = ?", req.Status)
|
|
}
|
|
if req.SupplierID > 0 {
|
|
query = query.Where("purchase_order.supplier_id = ?", req.SupplierID)
|
|
}
|
|
if req.WarehouseID > 0 {
|
|
query = query.Where("purchase_order.warehouse_id = ?", req.WarehouseID)
|
|
}
|
|
if req.PoNo != "" {
|
|
query = query.Where("purchase_order.po_no LIKE ?", "%"+req.PoNo+"%")
|
|
}
|
|
if req.StartDate > 0 {
|
|
query = query.Where("purchase_order.created_at >= ?", req.StartDate)
|
|
}
|
|
if req.EndDate > 0 {
|
|
query = query.Where("purchase_order.created_at <= ?", req.EndDate)
|
|
}
|
|
|
|
var total int64
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, utils.NewError("查询总数失败")
|
|
}
|
|
|
|
if total == 0 {
|
|
return &systemRes.PurchaseOrderListResponse{
|
|
List: []systemRes.PurchaseOrderItem{},
|
|
Total: 0,
|
|
Page: req.Page,
|
|
PageSize: req.PageSize,
|
|
}, nil
|
|
}
|
|
|
|
var orders []systemRes.OrderWithInfo
|
|
offset := (req.Page - 1) * req.PageSize
|
|
if err := query.Select("purchase_order.*, s.name as supplier_name, w.name as warehouse_name").
|
|
Joins("LEFT JOIN supplier s ON purchase_order.supplier_id = s.id AND s.is_del = 0").
|
|
Joins("LEFT JOIN warehouse w ON purchase_order.warehouse_id = w.id AND w.is_del = 0").
|
|
Order("purchase_order.created_at DESC").
|
|
Offset(offset).
|
|
Limit(req.PageSize).
|
|
Find(&orders).Error; err != nil {
|
|
return nil, utils.NewError("查询采购订单列表失败")
|
|
}
|
|
|
|
orderItems := make([]systemRes.PurchaseOrderItem, 0, len(orders))
|
|
for _, order := range orders {
|
|
orderItems = append(orderItems, systemRes.ConvertPurchaseOrderToItem(
|
|
order.PurchaseOrder,
|
|
order.SupplierName,
|
|
order.WarehouseName,
|
|
))
|
|
}
|
|
|
|
return &systemRes.PurchaseOrderListResponse{
|
|
List: orderItems,
|
|
Total: total,
|
|
Page: req.Page,
|
|
PageSize: req.PageSize,
|
|
}, nil
|
|
}
|
|
|
|
// GetPurchaseOrderDetail 获取采购订单详情
|
|
func (s *PurchaseService) GetPurchaseOrderDetail(id int64, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.PurchaseOrderDetailResponse, error) {
|
|
databaseConn := database.OptionalDB(db...)
|
|
|
|
query := databaseConn.Model(&models.PurchaseOrder{}).
|
|
Select("purchase_order.*, s.name as supplier_name, w.name as warehouse_name").
|
|
Joins("LEFT JOIN supplier s ON purchase_order.supplier_id = s.id AND s.is_del = 0").
|
|
Joins("LEFT JOIN warehouse w ON purchase_order.warehouse_id = w.id AND w.is_del = 0").
|
|
Where("purchase_order.id = ? AND purchase_order.is_del = ?", id, 0)
|
|
|
|
if role == 128 {
|
|
query = query.Where("purchase_order.creator_id = ?", creatorID)
|
|
}
|
|
|
|
var order systemRes.OrderWithInfo
|
|
result := query.First(&order)
|
|
|
|
if result.Error != nil {
|
|
return nil, utils.NewError("采购订单不存在")
|
|
}
|
|
|
|
var items []systemRes.ItemWithProduct
|
|
databaseConn.Model(&models.PurchaseOrderItem{}).
|
|
Select("purchase_order_item.*, p.name as product_name, p.barcode as product_code, p.category_id,p.sale_price, c.name as category_name, p.live_image, roi.location_id, l.code as location_code").
|
|
Joins("LEFT JOIN product p ON purchase_order_item.product_id = p.id AND p.is_del = 0").
|
|
Joins("LEFT JOIN product_category c ON p.category_id = c.id AND c.is_del = 0").
|
|
Joins("LEFT JOIN receiving_order ro ON ro.purchase_order_id = purchase_order_item.purchase_order_id AND ro.is_del = 0").
|
|
Joins("LEFT JOIN receiving_order_item roi ON roi.receiving_order_id = ro.id AND roi.product_id = purchase_order_item.product_id AND roi.is_del = 0").
|
|
Joins("LEFT JOIN location l ON roi.location_id = l.id AND l.is_del = 0").
|
|
Where("purchase_order_item.purchase_order_id = ? AND purchase_order_item.is_del = ?", order.ID, 0).
|
|
Find(&items)
|
|
|
|
detailItems := make([]systemRes.PurchaseOrderDetailItem, 0, len(items))
|
|
for _, item := range items {
|
|
var imageList []string
|
|
if len(item.LiveImage) > 0 {
|
|
json.Unmarshal(item.LiveImage, &imageList)
|
|
}
|
|
|
|
detailItems = append(detailItems, systemRes.PurchaseOrderDetailItem{
|
|
ID: item.ID,
|
|
PurchaseOrderID: item.PurchaseOrderID,
|
|
ProductID: item.ProductID,
|
|
ProductName: item.ProductName,
|
|
ProductCode: item.ProductCode,
|
|
SalePrice: item.SalePrice,
|
|
CategoryID: item.CategoryID,
|
|
CategoryName: item.CategoryName,
|
|
LiveImage: imageList,
|
|
Quantity: item.Quantity,
|
|
ReceivedQuantity: item.ReceivedQuantity,
|
|
UnitPrice: item.UnitPrice,
|
|
Amount: item.Amount,
|
|
LocationID: item.LocationID,
|
|
LocationCode: item.LocationCode,
|
|
CreatedAt: item.CreatedAt,
|
|
UpdatedAt: item.UpdatedAt,
|
|
})
|
|
}
|
|
|
|
detail := systemRes.ConvertPurchaseOrderToDetail(order.PurchaseOrder, order.SupplierName, order.WarehouseName, detailItems)
|
|
return &detail, nil
|
|
}
|