561 lines
22 KiB
C#
561 lines
22 KiB
C#
using Infrastructure.Attribute;
|
|
using SqlSugar;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using ARW.Model;
|
|
using ARW.Repository;
|
|
using ARW.Repository.Business.OrderManage.Orders;
|
|
using ARW.Service.Api.IBusinessService.OrderManage.Orders;
|
|
using ARW.Model.Dto.Api.OrderManage.Orders;
|
|
using ARW.Model.Models.Business.OrderManage.Orders;
|
|
using ARW.Model.Vo.Api.OrderManage.Orders;
|
|
using ARW.Repository.Business.OrderManage.OrderGoodss;
|
|
using ARW.Repository.Business.GoodsManager.Goodss;
|
|
using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSkus;
|
|
using ARW.Repository.Business.GoodsManager.GoodsSpecs.Specs;
|
|
using ARW.Repository.Business.GoodsManager.GoodsSpecs.SpecValues;
|
|
using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus;
|
|
using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.SpecValues;
|
|
using ARW.Model.Models.Business.GoodsManager.GoodsComments;
|
|
using ARW.Repository.Business.GoodsManager.GoodsComments;
|
|
using ARW.Repository.Business.ShopManager.Shops;
|
|
using ARW.Model.Models.Business.ShopManager.Shops;
|
|
using Newtonsoft.Json;
|
|
using Senparc.CO2NET.Extensions;
|
|
using ARW.Repository.Business.OrderManage.OrderCustomerAddreses;
|
|
using ARW.Service.Business.IBusinessService.Custom.Regions;
|
|
using Infrastructure.Kuaidi100;
|
|
using ARW.Model.Models.Business.LogisticsManage.LogisticsCompanys;
|
|
using ARW.Repository.Business.LogisticsManage.LogisticsCompanys;
|
|
|
|
namespace ARW.Service.Api.BusinessService.OrderManage.Orders
|
|
{
|
|
/// <summary>
|
|
/// 订单接口实现类Api
|
|
///
|
|
/// @author lwh
|
|
/// @date 2023-09-01
|
|
/// </summary>
|
|
[AppService(ServiceType = typeof(IOrderServiceApi), ServiceLifetime = LifeTime.Transient)]
|
|
public class OrderServiceImplApi : BaseService<Order>, IOrderServiceApi
|
|
{
|
|
private readonly OrderRepository _OrderRepository;
|
|
private readonly OrderGoodsRepository _OrderGoodsRepository;
|
|
private readonly OrderCustomerAddressRepository _OrderCustomerAddressRepository;
|
|
private readonly GoodsRepository _GoodsRepository;
|
|
private readonly GoodsSkuRepository _GoodsSkuRepository;
|
|
private readonly GoodsCommentRepository _GoodsCommentRepository;
|
|
private readonly SpecRepository _SpecRepository;
|
|
private readonly SpecValueRepository _SpecValueRepository;
|
|
private readonly ShopRepository _ShopRepository;
|
|
private readonly LogisticsCompanyRepository _LogisticsCompanyRepository;
|
|
private readonly IRegionService _RegionService;
|
|
|
|
public OrderServiceImplApi(OrderRepository OrderRepository, OrderGoodsRepository orderGoodsRepository, GoodsRepository goodsRepository, GoodsSkuRepository goodsSkuRepository, SpecRepository specRepository, SpecValueRepository specValueRepository, GoodsCommentRepository goodsCommentRepository, ShopRepository shopRepository, OrderCustomerAddressRepository orderCustomerAddressRepository, IRegionService regionService, LogisticsCompanyRepository logisticsCompanyRepository)
|
|
{
|
|
this._OrderRepository = OrderRepository;
|
|
_OrderGoodsRepository = orderGoodsRepository;
|
|
_GoodsRepository = goodsRepository;
|
|
_GoodsSkuRepository = goodsSkuRepository;
|
|
_SpecRepository = specRepository;
|
|
_SpecValueRepository = specValueRepository;
|
|
_GoodsCommentRepository = goodsCommentRepository;
|
|
_ShopRepository = shopRepository;
|
|
_OrderCustomerAddressRepository = orderCustomerAddressRepository;
|
|
_RegionService = regionService;
|
|
_LogisticsCompanyRepository = logisticsCompanyRepository;
|
|
}
|
|
|
|
#region Api接口代码
|
|
|
|
|
|
/// <summary>
|
|
/// 查询订单列表(Api)
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<PagedInfo<OrderVoApi>> GetOrderListApi(OrderQueryDtoApi parm)
|
|
{
|
|
//开始拼装查询条件d
|
|
var predicate = Expressionable.Create<Order>();
|
|
|
|
predicate = predicate.AndIF(parm.CustomerGuid != 0, s => s.CustomerGuid == parm.CustomerGuid);
|
|
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.OrderNumber), s => s.OrderNumber.Contains(parm.OrderNumber));
|
|
predicate = predicate.AndIF(parm.OrderStatus != 0, s => s.OrderStatus == parm.OrderStatus);
|
|
predicate = predicate.AndIF(parm.PayType != null, s => s.PayType == parm.PayType);
|
|
predicate = predicate.AndIF(parm.PayStatus != null, s => s.PayStatus == parm.PayStatus);
|
|
predicate = predicate.AndIF(parm.DeliveryType != null, s => s.DeliveryType == parm.DeliveryType);
|
|
predicate = predicate.AndIF(parm.DeliveryStatus != null, s => s.DeliveryStatus == parm.DeliveryStatus);
|
|
predicate = predicate.AndIF(parm.ReceiptStatus != null, s => s.ReceiptStatus == parm.ReceiptStatus);
|
|
var query = _OrderRepository
|
|
.Queryable()
|
|
.Where(predicate.ToExpression())
|
|
.OrderBy(s => s.Create_time, OrderByType.Desc)
|
|
.Select(s => new OrderVoApi
|
|
{
|
|
OrderId = s.OrderId,
|
|
OrderGuid = s.OrderGuid,
|
|
OrderNo = s.OrderNumber,
|
|
GoodsTotalAmoun = s.GoodsTotalAmoun,
|
|
OrderAmount = s.OrderAmount,
|
|
PayPrice = s.PayPrice,
|
|
PayStatus = s.PayStatus,
|
|
ExpressPrice = s.ExpressPrice,
|
|
DeliveryStatus = s.DeliveryStatus,
|
|
ReceiptStatus = s.ReceiptStatus,
|
|
OrderStatus = s.OrderStatus,
|
|
IsComment = s.IsComment,
|
|
});
|
|
|
|
|
|
var list = await query.ToPageAsync(parm);
|
|
|
|
foreach (var item in list.Result)
|
|
{
|
|
var goodsList = new List<OrderGoodsApiVo>();
|
|
var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == item.OrderGuid);
|
|
foreach (var _item in orderGoodsList)
|
|
{
|
|
var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == _item.GoodsGuid);
|
|
var orderGood = new OrderGoodsApiVo
|
|
{
|
|
GoodsGuId = good.GoodsGuid,
|
|
Thumb = good.GoodsPicture.Split(',').First(),
|
|
Title = good.GoodsName,
|
|
SkuId = _item.GoodsSkuId,
|
|
Price = _item.GoodsPrice,
|
|
BuyQuantity = _item.GoodsTotalNum
|
|
};
|
|
if (_item.GoodsSkuId != 0)
|
|
orderGood.Specifications = await GetGoodsSpecList(_item.GoodsSkuId);
|
|
|
|
goodsList.Add(orderGood);
|
|
}
|
|
item.GoodsList = goodsList;
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 待付款取消订单
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<string> WaitPayCancelOrder(OrderDtoApi parm)
|
|
{
|
|
// 找到该订单的商品,如果是下单立减库存,将库存加回来
|
|
var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == parm.OrderGuid);
|
|
foreach (var item in orderGoodsList)
|
|
{
|
|
var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == item.GoodsGuid);
|
|
if (good.GoodsDeductStockType == 1)
|
|
{
|
|
if (item.GoodsSkuId != 0)
|
|
{
|
|
var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == item.GoodsSkuId);
|
|
sku.GoodsSkuStockNum += item.GoodsTotalNum;
|
|
good.GoodsTotalInventory += item.GoodsTotalNum;
|
|
await _GoodsSkuRepository.UpdateAsync(sku);
|
|
await _GoodsRepository.UpdateAsync(good);
|
|
}
|
|
else
|
|
{
|
|
good.GoodsTotalInventory += item.GoodsTotalNum;
|
|
await _GoodsRepository.UpdateAsync(good);
|
|
}
|
|
}
|
|
}
|
|
|
|
var res = await _OrderRepository.UpdateAsync(f => new Order
|
|
{
|
|
OrderStatus = 2,
|
|
IsSettled = 2,
|
|
}, f => f.OrderGuid == parm.OrderGuid);
|
|
if (res)
|
|
return "取消订单成功";
|
|
else
|
|
return "取消订单失败!";
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 已付款取消订单
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<string> PayCancelOrder(OrderDtoApi parm)
|
|
{
|
|
var res = await _OrderRepository.UpdateAsync(f => new Order
|
|
{
|
|
OrderStatus = 3,
|
|
}, f => f.OrderGuid == parm.OrderGuid);
|
|
if (res)
|
|
return "取消订单成功";
|
|
else
|
|
return "取消订单失败!";
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 确认收货
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<string> ConfirmReceipt(OrderDtoApi parm)
|
|
{
|
|
// 收货状态 => 已收货
|
|
// 订单状态 => 已完成
|
|
// 订单结算状态 => 已结算
|
|
var res = await _OrderRepository.UpdateAsync(f => new Order
|
|
{
|
|
ReceiptStatus = 2,
|
|
ReceiptTime = DateTime.Now,
|
|
OrderStatus = 4,
|
|
IsSettled = 2,
|
|
}, f => f.OrderGuid == parm.OrderGuid);
|
|
if (res)
|
|
return "确认收货成功";
|
|
else
|
|
return "收货失败!";
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 评价
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<string> AddComment(GoodsComment model)
|
|
{
|
|
var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == model.GoodsGuid);
|
|
var shop = await _ShopRepository.GetFirstAsync(s => s.ShopGuid == good.ShopGuid);
|
|
|
|
model.ShopGuid = shop.ShopGuid;
|
|
|
|
if (model.GoodsCommentRating < 3)
|
|
{
|
|
model.GoodsCommentRatingType = 3;
|
|
}
|
|
if (model.GoodsCommentRating < 3.5 && model.GoodsCommentRating >= 2.5)
|
|
{
|
|
model.GoodsCommentRatingType = 2;
|
|
}
|
|
if (model.GoodsCommentRating >= 3.5)
|
|
{
|
|
model.GoodsCommentRatingType = 1;
|
|
}
|
|
|
|
|
|
model.GoodsCommentRecoverStatus = 1;
|
|
model.GoodsCommentSort = 100;
|
|
var response = await _GoodsCommentRepository.InsertReturnSnowflakeIdAsync(model);
|
|
|
|
var order = await _OrderRepository.UpdateAsync(f => new Order
|
|
{
|
|
IsComment = 2
|
|
}, f => f.OrderGuid == model.OrderGuid);
|
|
|
|
return "添加成功!";
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 查询订单详情(Api)
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public async Task<string> GetOrderDetails(OrderDtoApi parm)
|
|
{
|
|
|
|
var query = _OrderRepository
|
|
.Queryable()
|
|
.Where(s => s.OrderGuid == parm.OrderGuid)
|
|
.LeftJoin<Shop>((s, c) => s.ShopGuid == c.ShopGuid)
|
|
.Select((s, c) => new OrderApiDetailsVo
|
|
{
|
|
OrderId = s.OrderId,
|
|
OrderGuid = s.OrderGuid,
|
|
StoreName = c.ShopName,
|
|
OrderNo = s.OrderNumber,
|
|
TotalAmount = s.OrderAmount,
|
|
GoodsAmount = s.GoodsTotalAmoun,
|
|
PaymentAmount = s.PayPrice,
|
|
FreightFee = s.ExpressPrice,
|
|
CouponAmount = s.CouponMoney,
|
|
Remark = s.OrderRemark,
|
|
}).Take(1);
|
|
|
|
|
|
var json = await query.ToJsonAsync();
|
|
|
|
if (json != "[]")
|
|
{
|
|
json = json.Remove(0, 1);
|
|
json = json.Substring(0, json.Length - 1);
|
|
var data = JsonConvert.DeserializeObject<OrderApiDetailsVo>(json);
|
|
|
|
var order = await _OrderRepository.GetFirstAsync(s => s.OrderGuid == data.OrderGuid);
|
|
|
|
// 订单商品
|
|
var orderItemList = new List<OrderItem>();
|
|
var orderGoodsList = await _OrderGoodsRepository.GetListAsync(s => s.OrderGuid == data.OrderGuid);
|
|
foreach (var item in orderGoodsList)
|
|
{
|
|
var orderItem = new OrderItem();
|
|
|
|
var good = await _GoodsRepository.GetFirstAsync(s => s.GoodsGuid == item.GoodsGuid);
|
|
|
|
orderItem.SpuId = item.GoodsGuid;
|
|
orderItem.SkuId = item.GoodsSkuId;
|
|
orderItem.GoodsName = good.GoodsName;
|
|
orderItem.GoodsPictureUrl = good.GoodsPicture.Split(',').First();
|
|
orderItem.BuyQuantity = item.GoodsTotalNum;
|
|
|
|
if (item.GoodsSkuId != 0)
|
|
{
|
|
orderItem.Specifications = await GetGoodsSpecList(orderItem.SkuId);
|
|
}
|
|
|
|
orderItemList.Add(orderItem);
|
|
}
|
|
data.OrderItemVOs = orderItemList;
|
|
|
|
// 用户地址
|
|
var customerAddress = await _OrderCustomerAddressRepository.GetFirstAsync(s => s.OrderGuid == data.OrderGuid);
|
|
if (customerAddress != null)
|
|
{
|
|
var logistics = new Logistics
|
|
{
|
|
ReceiverAddressId = customerAddress.CustomerAddressGuid,
|
|
ReceiverName = customerAddress.ConsigneeName,
|
|
ReceiverPhone = customerAddress.Phont,
|
|
ReceiverProvince = await _RegionService.GetRegionName(customerAddress.ProvinceId),
|
|
ReceiverCity = await _RegionService.GetRegionName(customerAddress.CityId),
|
|
receiverCountry = await _RegionService.GetRegionName(customerAddress.RegionId),
|
|
ReceiverAddress = customerAddress.Detail
|
|
};
|
|
data.LogisticsVO = logistics;
|
|
}
|
|
|
|
/* 处理物流状态 */
|
|
data = GetTrajectory(order, data);
|
|
|
|
/* 处理订单状态 */
|
|
data = GetOrderStatus(order, data);
|
|
|
|
|
|
|
|
json = data.ToJson();
|
|
}
|
|
|
|
return json;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 处理物流状态
|
|
/// </summary>
|
|
/// <param name="data"></param>
|
|
/// <returns></returns>
|
|
public OrderApiDetailsVo GetTrajectory(Order order, OrderApiDetailsVo data)
|
|
{
|
|
data.TrajectoryVos = new TrajectoryVo();
|
|
var trajectoryList = new List<Trajectory>();
|
|
|
|
// 已下单(待发货)
|
|
if (order.OrderStatus == 1)
|
|
{
|
|
var trajectoryNodeList1 = new List<TrajectoryNode> { GetTrajectoryNode("订单已提交", order.Create_time) };
|
|
var trajectory1 = GetTrajectory("", "", trajectoryNodeList1, 3);
|
|
trajectoryList.Add(trajectory1);
|
|
|
|
var trajectoryNodeList2 = new List<TrajectoryNode> { GetTrajectoryNode("订单已经支付成功,支付方式为:微信支付", order.PayTime) };
|
|
var trajectory2 = GetTrajectory("已下单", "https://cdn-we-retail.ym.tencent.com/web/trajectoryIcons/ordered.svg", trajectoryNodeList2, 2);
|
|
trajectoryList.Add(trajectory2);
|
|
|
|
// 运输中(已发货,待收货)
|
|
if (order.DeliveryStatus == 2 && order.ReceiptStatus == 1 && order.PayStatus == 2 && order.OrderStatus == 1)
|
|
{
|
|
data.TrajectoryVos.LogisticsCompanyCode = order.LogisticsTrackingNumber;
|
|
data.TrajectoryVos.LogisticsCompanyName = order.LogisticsCompany;
|
|
|
|
var trajectoryNodeList3 = new List<TrajectoryNode> { GetTrajectoryNode($"商家已发货,物流承运商:{order.LogisticsCompany}", order.DeliveryTime) };
|
|
|
|
// 对接快递100接口
|
|
//var company = _LogisticsCompanyRepository.GetFirst(s => s.LogisticsCompanyGuid == order.LogisticsCompanyGuid);
|
|
//var trackRes = Kuaidi100.GetQueryTrack(company.LogisticsCompanyCode, order.LogisticsTrackingNumber);
|
|
|
|
var trajectory3 = GetTrajectory("已发货", "deliver", trajectoryNodeList3, 1);
|
|
trajectoryList.Add(trajectory3);
|
|
}
|
|
}
|
|
|
|
//foreach (var item in trajectoryList)
|
|
//{
|
|
// item.Nodes = item.Nodes.OrderBy(s => s.Sort).ToList();
|
|
//}
|
|
trajectoryList = trajectoryList.OrderBy(s => s.Sort).ToList();
|
|
data.TrajectoryVos.Trajectorys = trajectoryList;
|
|
return data;
|
|
}
|
|
|
|
|
|
public Trajectory GetTrajectory(string title, string icon, List<TrajectoryNode> trajectoryNodeList, int sort)
|
|
{
|
|
var trajectory = new Trajectory();
|
|
trajectory.Title = title;
|
|
trajectory.Icon = icon;
|
|
trajectory.Nodes = trajectoryNodeList;
|
|
trajectory.Sort = sort;
|
|
|
|
return trajectory;
|
|
}
|
|
|
|
|
|
public TrajectoryNode GetTrajectoryNode(string status, DateTime? time)
|
|
{
|
|
var trajectoryNode = new TrajectoryNode();
|
|
trajectoryNode.Status = status;
|
|
trajectoryNode.Timestamp = time;
|
|
return trajectoryNode;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 处理订单状态
|
|
/// </summary>
|
|
/// <param name="data"></param>
|
|
/// <returns></returns>
|
|
public OrderApiDetailsVo GetOrderStatus(Order order, OrderApiDetailsVo data)
|
|
{
|
|
// 待付款
|
|
if (order.PayStatus == 1 && order.OrderStatus == 1)
|
|
{
|
|
data.AutoCancelTime = order.Create_time.AddMinutes(30); ;
|
|
data.OrderStatus = 1;
|
|
data.OrderStatusName = "待付款";
|
|
}
|
|
// 待发货
|
|
if (order.DeliveryStatus == 1 && order.PayStatus == 2 && order.OrderStatus == 1)
|
|
{
|
|
data.OrderStatus = 2;
|
|
data.OrderStatusName = "待发货";
|
|
}
|
|
// 待收货
|
|
if (order.DeliveryStatus == 2 && order.ReceiptStatus == 1 && order.PayStatus == 2 && order.OrderStatus == 1)
|
|
{
|
|
data.OrderStatus = 2;
|
|
data.OrderStatusName = "待收货";
|
|
}
|
|
// 已完成
|
|
if (order.PayStatus == 2 && order.OrderStatus == 4)
|
|
{
|
|
data.OrderStatus = 2;
|
|
data.OrderStatusName = "已完成";
|
|
}
|
|
// 已取消
|
|
if (order.OrderStatus == 2)
|
|
{
|
|
data.OrderStatus = 2;
|
|
data.OrderStatusName = "已取消";
|
|
}
|
|
// 待取消
|
|
if (order.OrderStatus == 3)
|
|
{
|
|
data.OrderStatus = 5;
|
|
data.OrderStatusName = "待取消";
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 业务方法调用
|
|
|
|
|
|
/// <summary>
|
|
/// 获取商品规格
|
|
/// </summary>
|
|
/// <param name="skuId">规格id</param>
|
|
/// <returns></returns>
|
|
public async Task<List<OrderGoodsSpecApiVo>> GetGoodsSpecList(int? skuId)
|
|
{
|
|
var list = new List<OrderGoodsSpecApiVo>();
|
|
var sku = await _GoodsSkuRepository.GetFirstAsync(s => s.GoodsSkuId == skuId);
|
|
if (sku.SpecValueId != 0)
|
|
{
|
|
var orderGoodsSpecApiVo1 = await GetGoodsSpec(sku, 1);
|
|
list.Add(orderGoodsSpecApiVo1);
|
|
|
|
if (sku.SpecSecondValueId != 0)
|
|
{
|
|
var orderGoodsSpecApiVo2 = await GetGoodsSpec(sku, 2);
|
|
list.Add(orderGoodsSpecApiVo2);
|
|
|
|
if (sku.SpecThirdValueId != 0)
|
|
{
|
|
var orderGoodsSpecApiVo3 = await GetGoodsSpec(sku, 3);
|
|
list.Add(orderGoodsSpecApiVo3);
|
|
}
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
|
|
public async Task<OrderGoodsSpecApiVo> GetGoodsSpec(GoodsSku sku, int level)
|
|
{
|
|
var orderGoodsSpecApiVo = new OrderGoodsSpecApiVo();
|
|
var specValue = new SpecValue();
|
|
switch (level)
|
|
{
|
|
case 1:
|
|
specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecValueId);
|
|
orderGoodsSpecApiVo = await GetSpecValue(specValue);
|
|
break;
|
|
case 2:
|
|
specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecSecondValueId);
|
|
orderGoodsSpecApiVo = await GetSpecValue(specValue);
|
|
break;
|
|
case 3:
|
|
specValue = await _SpecValueRepository.GetFirstAsync(s => s.SpecValueId == sku.SpecThirdValueId);
|
|
orderGoodsSpecApiVo = await GetSpecValue(specValue);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return orderGoodsSpecApiVo;
|
|
}
|
|
|
|
|
|
public async Task<OrderGoodsSpecApiVo> GetSpecValue(SpecValue specValue)
|
|
{
|
|
var spec = await _SpecRepository.GetFirstAsync(s => s.SpecId == specValue.SpecId);
|
|
OrderGoodsSpecApiVo orderGoodsSpecApiVo = new()
|
|
{
|
|
SpecTitle = spec.SpecName,
|
|
SpecValue = specValue.SpecValueName
|
|
};
|
|
return orderGoodsSpecApiVo;
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|