/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.AutoMate.RedisCache;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 拼团记录表 接口实现
///
public class CoreCmsPinTuanRecordServices : BaseServices, ICoreCmsPinTuanRecordServices
{
private readonly ICoreCmsPinTuanRecordRepository _dal;
private readonly ICoreCmsPinTuanRuleRepository _pinTuanRuleRepository;
private readonly ICoreCmsUserRepository _userRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IServiceProvider _serviceProvider;
private readonly ISysTaskLogServices _taskLogServices;
private readonly IRedisOperationRepository _redisOperationRepository;
public CoreCmsPinTuanRecordServices(IUnitOfWork unitOfWork
, ICoreCmsPinTuanRecordRepository dal
, ICoreCmsPinTuanRuleRepository pinTuanRuleRepository
, ICoreCmsUserRepository userRepository, IServiceProvider serviceProvider, ISysTaskLogServices taskLogServices, IRedisOperationRepository redisOperationRepository)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_pinTuanRuleRepository = pinTuanRuleRepository;
_userRepository = userRepository;
_serviceProvider = serviceProvider;
_taskLogServices = taskLogServices;
_redisOperationRepository = redisOperationRepository;
}
///
/// 生成订单的时候,增加信息
///
/// 订单数据
/// 商品列表
/// 团队序列
///
public async Task OrderAdd(CoreCmsOrder order, List items, int teamId = 0)
{
return await _dal.OrderAdd(order, items, teamId);
}
///
/// 取得商品的所有拼团记录
///
///
///
///
///
public async Task GetRecord(int ruleId, int goodsId, int status = 0)
{
var jm = new WebApiCallBack();
var pinfo = await _pinTuanRuleRepository.QueryByIdAsync(ruleId);
if (pinfo == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
var dt = DateTime.Now;
var where = PredicateBuilder.True();
if (status != 0)
{
where = where.And(p => p.status == status);
if (status == 1) //如果取的是当前正在进行的团的话,这里取还没有结束的团记录,
{
where = where.And(p => p.closeTime > dt);
}
}
where = where.And(p => p.ruleId == ruleId && p.goodsId == goodsId && p.id == p.teamId);
var model = await _dal.QueryListByClauseAsync(where, p => p.id, OrderByType.Asc);
var resultModel = new List();
if (model != null && model.Any())
{
var userIds = model.Select(p => p.userId).ToList();
var users = await _userRepository.QueryListByClauseAsync(p => userIds.Contains(p.id));
foreach (var item in model)
{
var user = users.Find(p => p.id == item.userId);
item.userAvatar = user != null ? user.avatarImage : "";
item.nickName = user != null ? !string.IsNullOrEmpty(user.nickName) ? user.nickName : UserHelper.FormatMobile(user.mobile) : "";
//获取拼团团队记录
var teams = await _dal.QueryListByClauseAsync(p => p.teamId == item.teamId);
if (teams.Any())
{
var teamsUserIds = teams.Select(p => p.userId).ToList();
var teamsUsers = await _userRepository.QueryListByClauseAsync(p => teamsUserIds.Contains(p.id));
var teamsUserInfo = new List();
foreach (var cmsUser in teamsUsers)
{
teamsUserInfo.Add(new PinTuanRecordTeam()
{
nickName = !string.IsNullOrEmpty(cmsUser.nickName) ? cmsUser.nickName : UserHelper.FormatMobile(cmsUser.mobile),
userAvatar = cmsUser.avatarImage
});
}
item.teams = teamsUserInfo;
}
//计算还剩几个人拼成功
item.teamNums = item.teams.Count;
if (item.teamNums < pinfo.peopleNumber)
{
item.teamNums = pinfo.peopleNumber - item.teamNums;
}
else
{
continue;
//model.Remove(item);
}
TimeSpan ts = item.closeTime.Subtract(dt);
item.lastTime = (int)ts.TotalSeconds;
resultModel.Add(item);
}
}
jm.status = true;
jm.msg = "获取成功";
jm.data = resultModel;
return jm;
}
///
/// 获取拼团团队人数
///
///
///
///
public async Task GetTeamList(int teamId, string orderId)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(orderId) && teamId == 0)
{
jm.msg = GlobalErrorCodeVars.Code15606;
return jm;
}
if (teamId == 0)
{
var info = await _dal.QueryByClauseAsync(p => p.orderId == orderId);
if (info == null)
{
jm.msg = "没有找到拼团记录";
return jm;
}
teamId = info.teamId;
}
//根据teamId取发起团的信息
var firstTeam = await _dal.QueryByIdAsync(teamId);
if (firstTeam == null)
{
jm.msg = GlobalErrorCodeVars.Code15609;
return jm;
}
var dt = DateTime.Now;
TimeSpan ts = firstTeam.closeTime.Subtract(dt);
firstTeam.lastTime = (int)ts.TotalSeconds;
firstTeam.isOverdue = firstTeam.lastTime > 0;
var user = await _userRepository.QueryByIdAsync(firstTeam.userId);
firstTeam.userAvatar = user != null ? user.avatarImage : "";
firstTeam.nickName = user != null ? !string.IsNullOrEmpty(user.nickName) ? user.nickName : UserHelper.FormatMobile(user.mobile) : "";
//获取拼团团队记录
var teams = await _dal.QueryListByClauseAsync(p => p.teamId == teamId);
if (teams.Any())
{
var teamsUserIds = teams.Select(p => p.userId).ToList();
var teamsUsers = await _userRepository.QueryListByClauseAsync(p => teamsUserIds.Contains(p.id));
var teamsUserInfo = new List();
teams.ForEach(p =>
{
var tmUser = new PinTuanRecordTeam();
var user = teamsUsers.FirstOrDefault(o => o.id == p.userId);
tmUser.nickName = user != null && !string.IsNullOrEmpty(user.nickName) ? user.nickName : UserHelper.FormatMobile(user.mobile);
tmUser.userAvatar = !string.IsNullOrEmpty(user.avatarImage) ? user.avatarImage : "";
tmUser.recordId = p.id;
tmUser.userId = p.userId;
tmUser.teamId = p.teamId;
teamsUserInfo.Add(tmUser);
});
firstTeam.teams = teamsUserInfo;
}
//计算还剩几个人拼成功
firstTeam.teamNums = firstTeam.teams.Count;
var parameters = JObject.Parse(firstTeam.parameters);
var peopleNumber = 0;
if (parameters.ContainsKey("peopleNumber"))
{
peopleNumber = parameters["peopleNumber"].ObjectToInt(0);
}
if (firstTeam.teamNums < peopleNumber)
{
firstTeam.teamNums = peopleNumber - firstTeam.teamNums;
}
else
{
firstTeam.teamNums = 0;
}
firstTeam.peopleNumber = peopleNumber;
jm.status = true;
jm.msg = "获取成功";
jm.data = firstTeam;
return jm;
}
///
/// 自动取消到时间的团
///
///
public async Task AutoCancelPinTuanOrder()
{
using var container = _serviceProvider.CreateScope();
var orderServices = container.ServiceProvider.GetService();
var billRefundServices = container.ServiceProvider.GetService();
var billLadingServices = container.ServiceProvider.GetService();
var jm = new WebApiCallBack();
var dt = DateTime.Now;
//获取主开团数据
var list = await _dal.QueryListByClauseAsync(p => p.closeTime < dt && p.status == (int)GlobalEnumVars.PinTuanRecordStatus.InProgress && p.id == p.teamId);
if (list != null && list.Any())
{
foreach (var item in list)
{
//获取开团数据
var teamList = await _dal.QueryListByClauseAsync(p => p.teamId == item.id);
//更新开团失败数据
await _dal.UpdateAsync(p => new CoreCmsPinTuanRecord() { status = (int)GlobalEnumVars.PinTuanRecordStatus.Defeated }, p => p.teamId == item.id);
if (teamList == null || !teamList.Any()) continue;
{
//给这个订单作废,如果有支付,并退款
var orderId = teamList.Select(p => p.orderId).ToArray();
//await CancelOrder(ids);
//拼团订单取消,如果已支付自动退款,如果未支付,作废
foreach (var id in orderId)
{
var orderResult = await orderServices.GetOrderInfoByOrderId(id);
if (orderResult.status == false)
{
continue;
}
var orderInfo = orderResult.data as CoreCmsOrder;
if (orderInfo == null)
{
continue;
}
if (orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.Yes)
{
//如果已经发货了,就不管了,手动退款吧
if (orderInfo.receiptType == (int)GlobalEnumVars.OrderReceiptType.SelfDelivery)
{
//清理掉未使用的提货单。
await billLadingServices.DeleteAsync(p => p.orderId == orderInfo.orderId);
}
else
{
continue;
}
}
if (orderInfo.payStatus == (int)GlobalEnumVars.OrderPayStatus.No)
{
//未支付
var noPayedIds = new[] { orderInfo.orderId };
await orderServices.CancelOrder(noPayedIds);
}
else
{
//已支付,生成退款单,并直接退款,之后,更改订单状态
var res = await billRefundServices.ToAdd(orderInfo.userId, orderInfo.orderId, (int)GlobalEnumVars.OrderType.PinTuan, orderInfo.payedAmount, "");
if (res.status == false)
{
continue;
}
var refundInfo = await billRefundServices.QueryByClauseAsync(p => p.sourceId == orderInfo.orderId && p.status == (int)GlobalEnumVars.BillRefundType.Order && p.type == (int)GlobalEnumVars.OrderType.PinTuan);
if (refundInfo == null)
{
//没有找到退款单
continue;
}
//走队列
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.RefundSubscribeQueue, JsonConvert.SerializeObject(refundInfo));
}
}
}
}
}
jm.status = true;
//插入日志
var model = new SysTaskLog
{
createTime = DateTime.Now,
isSuccess = jm.status,
name = "自动取消到时间的团",
parameters = JsonConvert.SerializeObject(jm)
};
await _taskLogServices.InsertAsync(model);
return jm;
}
//拼团订单取消,如果已支付自动退款,如果未支付,作废(方法直接并入上个方法内)
private async Task CancelOrder(string[] orderId)
{
using var container = _serviceProvider.CreateScope();
var orderServices = container.ServiceProvider.GetService();
var billRefundServices = container.ServiceProvider.GetService();
foreach (var id in orderId)
{
var orderResult = await orderServices.GetOrderInfoByOrderId(id);
if (orderResult.status == false)
{
continue;
}
var orderInfo = orderResult.data as CoreCmsOrder;
if (orderInfo == null)
{
continue;
}
if (orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.Yes)
{
//如果已经发货了,就不管了,手动退款吧
continue;
}
if (orderInfo.payStatus == (int)GlobalEnumVars.OrderPayStatus.No)
{
//未支付
var ids = new[] { orderInfo.orderId };
await orderServices.CancelOrder(ids);
}
else
{
//已支付,生成退款单,并直接退款,之后,更改订单状态
var res = await billRefundServices.ToAdd(orderInfo.userId, orderInfo.orderId, 1, orderInfo.payedAmount, "");
if (res.status == false)
{
continue;
}
var refundInfo = await billRefundServices.QueryByClauseAsync(p =>
p.sourceId == orderInfo.orderId &&
p.status == (int)GlobalEnumVars.BillRefundType.Order && p.type == 1);
if (refundInfo == null)
{
//没有找到退款单
continue;
}
//去退款
await billRefundServices.ToRefund(refundInfo.refundId, (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND);
//更新订单状态为已退款已完成
await orderServices.UpdateAsync(p => new CoreCmsOrder()
{
payStatus = (int)GlobalEnumVars.OrderPayStatus.Refunded,
status = (int)GlobalEnumVars.OrderStatus.Complete
}, p => p.orderId == orderInfo.orderId);
}
}
return true;
}
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}