using Infrastructure.Attribute;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure;
using ARW.Model;
using ARW.Repository;
using ARW.Repository.Business.OrderManage.OrderRefunds;
using ARW.Service.Business.IBusinessService.OrderManage.OrderRefunds;
using ARW.Model.Dto.Business.OrderManage.OrderRefunds;
using ARW.Model.Models.Business.OrderManage.OrderRefunds;
using ARW.Model.Vo.Business.OrderManage.OrderRefunds;
using ARW.Model.Models.Business.Custom.Customers;
using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Service.Business.IBusinessService.OrderManage.Orders;
using ARW.Model.Models.Business.OrderManage.Orders;
using ARW.Model.Dto.Api.OrderManage.OrderRefunds;
using ARW.Model.Vo.Api.OrderManage.OrderRefunds;
using ARW.Common;
using ARW.Model.Vo.Business.OrderManage.Orders;
using Senparc.CO2NET.Extensions;
using ARW.Model.Models.Business.LogisticsManage.LogisticsCompanys;
using ARW.Model.Models.Business.ShopManager.ShopAddresss;
using ARW.Repository.Business.ShopManager.ShopAddresss;
using ARW.Service.Business.IBusinessService.Custom.Regions;
using ARW.Repository.Business.LogisticsManage.LogisticsCompanys;
namespace ARW.Service.Business.BusinessService.OrderManage.OrderRefunds
{
///
/// 售后单记录表接口实现类
///
/// @author lwh
/// @date 2023-08-29
///
[AppService(ServiceType = typeof(IOrderRefundService), ServiceLifetime = LifeTime.Transient)]
public class OrderRefundServiceImpl : BaseService, IOrderRefundService
{
private readonly OrderRefundRepository _OrderRefundRepository;
private readonly ShopAddressRepository _ShopAddressRepository;
private readonly LogisticsCompanyRepository _LogisticsCompanyRepository;
private readonly IOrderService _OrderService;
private readonly IRegionService _RegionService;
public OrderRefundServiceImpl(OrderRefundRepository OrderRefundRepository, IOrderService orderService, ShopAddressRepository shopAddressRepository, IRegionService regionService, LogisticsCompanyRepository logisticsCompanyRepository)
{
this._OrderRefundRepository = OrderRefundRepository;
_OrderService = orderService;
_ShopAddressRepository = shopAddressRepository;
_RegionService = regionService;
_LogisticsCompanyRepository = logisticsCompanyRepository;
}
#region 业务逻辑代码
///
/// 查询售后单记录表分页列表
///
public async Task> GetOrderRefundList(OrderRefundQueryDto parm)
{
//开始拼装查询条件d
var predicate = Expressionable.Create();
predicate = predicate.AndIF(parm.ShopGuid != 0, s => s.ShopGuid == parm.ShopGuid);
predicate = predicate.AndIF(parm.RefundType != null, s => s.RefundType == parm.RefundType);
predicate = predicate.AndIF(parm.RefundReason != null, s => s.RefundReason == parm.RefundReason);
predicate = predicate.AndIF(parm.GoodsReceiveStatus != null, s => s.GoodsReceiveStatus == parm.GoodsReceiveStatus);
predicate = predicate.AndIF(parm.MerchantAuditStatus != null, s => s.MerchantAuditStatus == parm.MerchantAuditStatus);
predicate = predicate.AndIF(parm.IsCustomerSend != null, s => s.IsCustomerSend == parm.IsCustomerSend);
predicate = predicate.AndIF(parm.OrderRefundStatus != null, s => s.OrderRefundStatus == parm.OrderRefundStatus);
predicate = predicate.AndIF(parm.BeginTime != DateTime.MinValue, s => s.Create_time >= parm.BeginTime);
predicate = predicate.AndIF(parm.EndTime != DateTime.MinValue, s => s.Create_time <= parm.EndTime);
var query = _OrderRefundRepository
.Queryable()
.LeftJoin((s, c) => s.CustomerGuid == c.CustomerGuid)
.LeftJoin((s, c, d) => s.OrderGuid == d.OrderGuid)
.Where(predicate.ToExpression())
.OrderBy(s => s.Create_time, OrderByType.Desc)
.Select((s, c, d) => new OrderRefundVo
{
OrderRefundId = s.OrderRefundId,
OrderRefundGuid = s.OrderRefundGuid,
OrderGuid = s.OrderGuid,
ShopGuid = s.ShopGuid,
OrderNumber = d.OrderNumber,
PayPrice = d.PayPrice,
ExpressPrice = d.ExpressPrice,
CustomerGuid = s.CustomerGuid,
CustomerNickName = c.CustomerNickname,
CustomerMobilePhoneNumber = c.CustomerMobilePhoneNumber,
CustomerAvatar = c.CustomerAvatar,
RefundType = s.RefundType,
RefundReason = s.RefundReason,
CustomerRefundDesc = s.CustomerRefundDesc,
CustomerRefundImg = s.CustomerRefundImg,
GoodsReceiveStatus = s.GoodsReceiveStatus,
MerchantAuditStatus = s.MerchantAuditStatus,
MerchantRefuseDesc = s.MerchantRefuseDesc,
RefundMoney = s.RefundMoney,
ShopRefundAddressGuid = s.ShopRefundAddressGuid,
IsCustomerSend = s.IsCustomerSend,
CustomerSendTime = s.CustomerSendTime,
LogisticsCompanyGuid = s.LogisticsCompanyGuid,
ExpressNo = s.ExpressNo,
OrderRefundStatus = s.OrderRefundStatus,
IsMerchantReceive = s.IsMerchantReceive,
CreateTime = s.Create_time.ToString("yyyy-MM-dd hh:mm")
});
var list = await query.ToPageAsync(parm);
foreach (var item in list.Result)
{
// 获取订单商品信息
item.GoodsInfoList = await _OrderService.GetOrderGoodsList(item.OrderGuid);
}
return list;
}
///
/// 查询售后单记录表详情
///
///
///
public async Task GetOrderRefundDetails(OrderRefundDetailsDto parm)
{
var query = _OrderRefundRepository
.Queryable()
.LeftJoin((s, c) => s.CustomerGuid == c.CustomerGuid)
.LeftJoin((s, c, d) => s.OrderGuid == d.OrderGuid)
.Where(s => s.OrderRefundId == parm.OrderRefundId)
.Select((s, c, d) => new OrderRefundDetailVo
{
OrderRefundId = s.OrderRefundId,
OrderRefundGuid = s.OrderRefundGuid,
ShopGuid = s.ShopGuid,
OrderGuid = s.OrderGuid,
OrderNumber = d.OrderNumber,
CustomerPhone = c.CustomerMobilePhoneNumber,
RefundType = s.RefundType,
RefundReason = s.RefundReason,
CustomerRefundDesc = s.CustomerRefundDesc,
CustomerRefundImg = s.CustomerRefundImg,
GoodsReceiveStatus = s.GoodsReceiveStatus,
MerchantAuditStatus = s.MerchantAuditStatus,
MerchantRefuseDesc = s.MerchantRefuseDesc,
RefundMoney = s.RefundActualMoney,
ShopRefundAddressGuid = s.ShopRefundAddressGuid,
IsCustomerSend = s.IsCustomerSend,
CustomerSendTime = s.CustomerSendTime,
LogisticsCompanyGuid = s.LogisticsCompanyGuid,
ExpressNo = s.ExpressNo,
OrderRefundStatus = s.OrderRefundStatus,
IsMerchantReceive = s.IsMerchantReceive,
CreateTime = s.Create_time.ToString("yyyy-MM-dd hh:mm")
}).Take(1);
var json = await query.ToJsonAsync();
if (json != "[]")
{
var data = Tools.JsonToVo(json);
data.GoodsInfoList = await _OrderService.GetOrderGoodsList(data.OrderGuid);
data.OrderReceive = await GetOrderReceive(data.ShopRefundAddressGuid);
if (data.LogisticsCompanyGuid != null)
{
var company = await _LogisticsCompanyRepository.GetFirstAsync(s => s.LogisticsCompanyGuid == data.LogisticsCompanyGuid);
data.LogisticsCompany = company.LogisticsCompanyName;
}
json = data.ToJson();
}
return json;
}
///
/// 审核售后订单
///
public async Task AuditOrderRefund(OrderRefundAuditDto parm)
{
var str = "审核成功!";
// 同意
if (parm.IsAgree == true)
{
var orderRefund = await _OrderRefundRepository.GetFirstAsync(s => s.OrderRefundGuid == parm.OrderRefundGuid);
if(orderRefund.RefundType == 1)
{
await _OrderRefundRepository.UpdateAsync(f => new OrderRefund
{
MerchantAuditStatus = 2,
ShopRefundAddressGuid = parm.ShopAddressGuid,
}, s => s.OrderRefundGuid == parm.OrderRefundGuid);
}
if(orderRefund.RefundType == 2)
{
await _OrderRefundRepository.UpdateAsync(f => new OrderRefund
{
MerchantAuditStatus = 2,
OrderRefundStatus = 3,
}, s => s.OrderRefundGuid == parm.OrderRefundGuid);
}
str = "同意申请!";
}
// 拒绝
if (parm.IsAgree == false)
{
await _OrderRefundRepository.UpdateAsync(f => new OrderRefund
{
MerchantAuditStatus = 3,
MerchantRefuseDesc = parm.MerchantRefuseDesc,
OrderRefundStatus = 2
}, s => s.OrderRefundGuid == parm.OrderRefundGuid);
str = "拒绝申请!";
}
return str;
}
///
/// 商家确认收货
///
public async Task ConfirmsReceipt(OrderRefundAuditDto parm)
{
await _OrderRefundRepository.UpdateAsync(f => new OrderRefund
{
IsMerchantReceive = 2,
MerchantReceiveTime = DateTime.Now,
OrderRefundStatus = 3
}, s => s.OrderRefundGuid == parm.OrderRefundGuid);
return "确认收货成功";
}
#region Excel处理
///
/// Excel数据导出处理
///
public async Task> HandleExportData(List data)
{
return data;
}
#endregion
///
/// 获取商家收货地址
///
/// 商家退货地址guid
///
public async Task GetOrderReceive(long? shopAddressGuid)
{
var orderReceive = new OrderReceiveVo();
var shopAddress = await _ShopAddressRepository.GetFirstAsync(s => s.ShopAddressGuid == shopAddressGuid);
if (shopAddress != null)
{
orderReceive.ConsigneeName = shopAddress.ShopAddressContactName;
orderReceive.Phone = shopAddress.ShopAddressContactNumber;
orderReceive.Detail = shopAddress.ShopAddressDetailedAddress;
// 获取地区名称
orderReceive.Region = await _RegionService.GetRegionFullName(shopAddress.ProvinceId, shopAddress.CityId, shopAddress.DistrictId);
}
return orderReceive;
}
#endregion
}
}