f
This commit is contained in:
@@ -2,10 +2,11 @@ package admin_product
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"bdqr-server/app/main/api/internal/svc"
|
||||
"bdqr-server/app/main/api/internal/types"
|
||||
"bdqr-server/common/xerr"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
@@ -25,43 +26,121 @@ func NewAdminGetProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func (l *AdminGetProductListLogic) AdminGetProductList(req *types.AdminGetProductListReq) (resp *types.AdminGetProductListResp, err error) {
|
||||
// 1. 构建查询条件
|
||||
builder := l.svcCtx.ProductModel.SelectBuilder()
|
||||
// 1. 构建产品查询条件
|
||||
productBuilder := l.svcCtx.ProductModel.SelectBuilder()
|
||||
|
||||
// 2. 添加查询条件
|
||||
if req.ProductName != nil && *req.ProductName != "" {
|
||||
builder = builder.Where("product_name LIKE ?", "%"+*req.ProductName+"%")
|
||||
productBuilder = productBuilder.Where("product_name LIKE ?", "%"+*req.ProductName+"%")
|
||||
}
|
||||
if req.ProductEn != nil && *req.ProductEn != "" {
|
||||
builder = builder.Where("product_en LIKE ?", "%"+*req.ProductEn+"%")
|
||||
productBuilder = productBuilder.Where("product_en LIKE ?", "%"+*req.ProductEn+"%")
|
||||
}
|
||||
|
||||
// 3. 执行分页查询
|
||||
list, total, err := l.svcCtx.ProductModel.FindPageListByPageWithTotal(
|
||||
l.ctx, builder, req.Page, req.PageSize, "id DESC")
|
||||
// 3. 执行产品分页查询
|
||||
productList, total, err := l.svcCtx.ProductModel.FindPageListByPageWithTotal(
|
||||
l.ctx, productBuilder, req.Page, req.PageSize, "id DESC")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
|
||||
"查询产品列表失败, err: %v, req: %+v", err, req)
|
||||
}
|
||||
|
||||
// 4. 构建响应列表
|
||||
items := make([]types.ProductListItem, 0, len(list))
|
||||
for _, item := range list {
|
||||
if len(productList) == 0 {
|
||||
return &types.AdminGetProductListResp{
|
||||
Total: total,
|
||||
Items: []types.ProductListItem{},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 4. 统计每个产品关联功能的成本价之和
|
||||
// 4.1 收集产品ID列表
|
||||
productIdList := make([]string, 0, len(productList))
|
||||
for _, p := range productList {
|
||||
productIdList = append(productIdList, p.Id)
|
||||
}
|
||||
|
||||
// 4.2 查询 product_feature 记录
|
||||
productFeatureBuilder := l.svcCtx.ProductFeatureModel.SelectBuilder().
|
||||
Where(squirrel.Eq{"product_id": productIdList})
|
||||
productFeatureList, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, productFeatureBuilder, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
|
||||
"查询产品功能关联失败, err: %v, productIds: %+v", err, productIdList)
|
||||
}
|
||||
|
||||
// 4.3 没有关联功能时直接返回(成本置 0)
|
||||
if len(productFeatureList) == 0 {
|
||||
items := make([]types.ProductListItem, 0, len(productList))
|
||||
for _, item := range productList {
|
||||
listItem := types.ProductListItem{
|
||||
Id: item.Id,
|
||||
ProductName: item.ProductName,
|
||||
ProductEn: item.ProductEn,
|
||||
Description: item.Description,
|
||||
Notes: item.Notes.String,
|
||||
CostPrice: item.CostPrice,
|
||||
SellPrice: item.SellPrice,
|
||||
CostPrice: 0,
|
||||
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
|
||||
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
|
||||
}
|
||||
items = append(items, listItem)
|
||||
}
|
||||
|
||||
// 5. 返回结果
|
||||
return &types.AdminGetProductListResp{
|
||||
Total: total,
|
||||
Items: items,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 4.4 收集 featureId 列表
|
||||
featureIdList := make([]string, 0, len(productFeatureList))
|
||||
for _, pf := range productFeatureList {
|
||||
featureIdList = append(featureIdList, pf.FeatureId)
|
||||
}
|
||||
|
||||
// 4.5 查询功能表,取出每个功能的成本价
|
||||
featureBuilder := l.svcCtx.FeatureModel.SelectBuilder().
|
||||
Where(squirrel.Eq{"id": featureIdList})
|
||||
featureList, err := l.svcCtx.FeatureModel.FindAll(l.ctx, featureBuilder, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
|
||||
"查询功能成本价失败, err: %v, featureIds: %+v", err, featureIdList)
|
||||
}
|
||||
|
||||
// 4.6 构建 featureId -> cost_price 映射
|
||||
featureCostMap := make(map[string]float64, len(featureList))
|
||||
for _, f := range featureList {
|
||||
featureCostMap[f.Id] = f.CostPrice
|
||||
}
|
||||
|
||||
// 4.7 计算每个产品的成本价(所有关联 feature 的 cost_price 之和)
|
||||
productCostMap := make(map[string]float64, len(productList))
|
||||
for _, pf := range productFeatureList {
|
||||
cost, ok := featureCostMap[pf.FeatureId]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
productCostMap[pf.ProductId] += cost
|
||||
}
|
||||
|
||||
// 5. 构建响应列表
|
||||
items := make([]types.ProductListItem, 0, len(productList))
|
||||
for _, item := range productList {
|
||||
listItem := types.ProductListItem{
|
||||
Id: item.Id,
|
||||
ProductName: item.ProductName,
|
||||
ProductEn: item.ProductEn,
|
||||
Description: item.Description,
|
||||
Notes: item.Notes.String,
|
||||
SellPrice: item.SellPrice,
|
||||
CostPrice: productCostMap[item.Id],
|
||||
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
|
||||
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
|
||||
}
|
||||
items = append(items, listItem)
|
||||
}
|
||||
|
||||
// 6. 返回结果
|
||||
return &types.AdminGetProductListResp{
|
||||
Total: total,
|
||||
Items: items,
|
||||
|
||||
Reference in New Issue
Block a user