210 lines
7.4 KiB
Go
210 lines
7.4 KiB
Go
package service
|
|
|
|
import (
|
|
"psi/database"
|
|
"psi/models"
|
|
systemReq "psi/models/request"
|
|
systemRes "psi/models/response"
|
|
"psi/utils"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ShippingService struct{}
|
|
|
|
// GetShippingOrderList 获取发货单列表
|
|
func (s *ShippingService) GetShippingOrderList(req systemReq.GetShippingOrderListRequest, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.ShippingOrderListResponse, 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.ShippingOrder{}).Where("shipping_order.is_del = ?", 0)
|
|
|
|
if req.Status > 0 {
|
|
query = query.Where("shipping_order.status = ?", req.Status)
|
|
}
|
|
if req.CustomerID > 0 {
|
|
query = query.Where("shipping_order.customer_id = ?", req.CustomerID)
|
|
}
|
|
if req.ShippingNo != "" {
|
|
query = query.Where("shipping_order.shipping_no LIKE ?", "%"+req.ShippingNo+"%")
|
|
}
|
|
if req.StartDate > 0 {
|
|
query = query.Where("shipping_order.created_at >= ?", req.StartDate)
|
|
}
|
|
if req.EndDate > 0 {
|
|
query = query.Where("shipping_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.ShippingOrderListResponse{
|
|
List: []systemRes.ShippingOrderItem{},
|
|
Total: 0,
|
|
Page: req.Page,
|
|
PageSize: req.PageSize,
|
|
}, nil
|
|
}
|
|
|
|
var orders []systemRes.ShippingOrderWithInfo
|
|
offset := (req.Page - 1) * req.PageSize
|
|
if err := query.Select("shipping_order.*, c.name as customer_name").
|
|
Joins("LEFT JOIN customer c ON shipping_order.customer_id = c.id AND c.is_del = 0").
|
|
Order("shipping_order.created_at DESC").
|
|
Offset(offset).
|
|
Limit(req.PageSize).
|
|
Find(&orders).Error; err != nil {
|
|
return nil, utils.NewError("查询发货单列表失败")
|
|
}
|
|
|
|
orderItems := make([]systemRes.ShippingOrderItem, 0, len(orders))
|
|
for _, order := range orders {
|
|
var shopList []systemRes.OutboundShopInfo
|
|
|
|
var shops []struct {
|
|
ShopName string `gorm:"column:shop_name"`
|
|
ShopType int8 `gorm:"column:shop_type"`
|
|
}
|
|
|
|
databaseConn.Table("shipping_order_item").
|
|
Select("DISTINCT so.sales_person as shop_name, so.shop_type as shop_type").
|
|
Joins("INNER JOIN outbound_order_item ooi ON shipping_order_item.outbound_order_item_id = ooi.id AND ooi.is_del = 0").
|
|
Joins("INNER JOIN sales_order so ON ooi.sales_order_id = so.id AND so.is_del = 0").
|
|
Where("shipping_order_item.shipping_order_id = ? AND shipping_order_item.is_del = ?", order.ID, 0).
|
|
Scan(&shops)
|
|
|
|
for _, shop := range shops {
|
|
shopList = append(shopList, systemRes.OutboundShopInfo{
|
|
ShopName: shop.ShopName,
|
|
ShopType: shop.ShopType,
|
|
ShopTypeText: systemRes.GetShopTypeText(shop.ShopType),
|
|
})
|
|
}
|
|
|
|
orderItems = append(orderItems, systemRes.ConvertShippingOrderToItem(
|
|
order.ShippingOrder,
|
|
order.CustomerName,
|
|
shopList,
|
|
))
|
|
}
|
|
|
|
return &systemRes.ShippingOrderListResponse{
|
|
List: orderItems,
|
|
Total: total,
|
|
Page: req.Page,
|
|
PageSize: req.PageSize,
|
|
}, nil
|
|
}
|
|
|
|
// GetShippingOrderDetail 获取发货单详情
|
|
func (s *ShippingService) GetShippingOrderDetail(id int64, creatorID int64, role int64, db ...*gorm.DB) (*systemRes.ShippingOrderDetailResponse, error) {
|
|
databaseConn := database.OptionalDB(db...)
|
|
|
|
query := databaseConn.Model(&models.ShippingOrder{}).
|
|
Select("shipping_order.*, c.name as customer_name").
|
|
Joins("LEFT JOIN customer c ON shipping_order.customer_id = c.id AND c.is_del = 0").
|
|
Where("shipping_order.id = ? AND shipping_order.is_del = ?", id, 0)
|
|
|
|
var order systemRes.ShippingOrderWithInfo
|
|
result := query.First(&order)
|
|
|
|
if result.Error != nil {
|
|
return nil, utils.NewError("发货单不存在")
|
|
}
|
|
|
|
var items []systemRes.ShippingOrderItemWithProduct
|
|
databaseConn.Model(&models.ShippingOrderItem{}).
|
|
Select(`shipping_order_item.*,
|
|
p.id as product_id,
|
|
p.name as product_name,
|
|
p.barcode as product_code,
|
|
p.category_id,
|
|
c.name as category_name,
|
|
l.id as location_id,
|
|
l.code as location_name,
|
|
w.name as warehouse_name,
|
|
w.code as warehouse_code,
|
|
w.contact_person as warehouse_contact_person,
|
|
w.contact_phone as warehouse_contact_phone,
|
|
w.province as warehouse_province,
|
|
w.city as warehouse_city,
|
|
w.district as warehouse_district,
|
|
w.address as warehouse_address,
|
|
so.so_no as sales_order_no,
|
|
oo.out_no as outbound_order_no,
|
|
ooi.unit_price,
|
|
so.created_at as sales_order_created_at,
|
|
so.sales_person_id,
|
|
so.association_order_id,
|
|
so.association_order_no,
|
|
soi.id as sales_order_item_id,
|
|
soi.created_at as so_item_created_at,
|
|
soi.receiver_name,
|
|
soi.receiver_phone,
|
|
soi.receiver_address,
|
|
soi.logistics_company,
|
|
soi.logistics_no`).
|
|
Joins("LEFT JOIN outbound_order_item ooi ON shipping_order_item.outbound_order_item_id = ooi.id AND ooi.is_del = 0").
|
|
Joins("LEFT JOIN product p ON ooi.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 location l ON ooi.location_id = l.id AND l.is_del = 0").
|
|
Joins("LEFT JOIN warehouse w ON l.warehouse_id = w.id AND w.is_del = 0").
|
|
Joins("LEFT JOIN sales_order so ON ooi.sales_order_id = so.id AND so.is_del = 0").
|
|
Joins("LEFT JOIN sales_order_item soi ON ooi.sales_order_id = soi.sales_order_id AND ooi.product_id = soi.product_id AND soi.is_del = 0").
|
|
Joins("LEFT JOIN outbound_order oo ON ooi.out_order_id = oo.id AND oo.is_del = 0").
|
|
Where("shipping_order_item.shipping_order_id = ? AND shipping_order_item.is_del = ?", order.ID, 0).
|
|
Order("l.sort ASC, l.id ASC").
|
|
Find(&items)
|
|
|
|
detailItems := make([]systemRes.ShippingOrderDetailItem, 0, len(items))
|
|
for _, item := range items {
|
|
detailItems = append(detailItems, systemRes.ShippingOrderDetailItem{
|
|
ID: item.ID,
|
|
ShippingOrderID: item.ShippingOrderID,
|
|
OutboundOrderItemID: item.OutboundOrderItemID,
|
|
SalesOrderItemID: item.SalesOrderItemID,
|
|
SalesOrderNo: item.SalesOrderNo,
|
|
OutboundOrderNo: item.OutboundOrderNo,
|
|
ProductID: item.ProductID,
|
|
ProductName: item.ProductName,
|
|
ProductCode: item.ProductCode,
|
|
CategoryID: item.CategoryID,
|
|
CategoryName: item.CategoryName,
|
|
LocationID: item.LocationID,
|
|
LocationName: item.LocationName,
|
|
WarehouseName: item.WarehouseName,
|
|
WarehouseCode: item.WarehouseCode,
|
|
WarehouseContactPerson: item.WarehouseContactPerson,
|
|
WarehouseContactPhone: item.WarehouseContactPhone,
|
|
WarehouseProvince: item.WarehouseProvince,
|
|
WarehouseCity: item.WarehouseCity,
|
|
WarehouseDistrict: item.WarehouseDistrict,
|
|
WarehouseAddress: item.WarehouseAddress,
|
|
Quantity: item.Quantity,
|
|
UnitPrice: item.UnitPrice,
|
|
SalesOrderCreatedAt: item.SalesOrderCreatedAt,
|
|
SalesPersonID: item.SalesPersonID,
|
|
AssociationOrderID: item.AssociationOrderID,
|
|
AssociationOrderNo: item.AssociationOrderNo,
|
|
SoItemCreatedAt: item.SoItemCreatedAt,
|
|
ReceiverName: item.ReceiverName,
|
|
ReceiverPhone: item.ReceiverPhone,
|
|
ReceiverAddress: item.ReceiverAddress,
|
|
LogisticsCompany: item.LogisticsCompany,
|
|
LogisticsNo: item.LogisticsNo,
|
|
})
|
|
}
|
|
|
|
detail := systemRes.ConvertShippingOrderToDetail(order.ShippingOrder, order.CustomerName, detailItems)
|
|
return &detail, nil
|
|
}
|