mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 17:23:26 +08:00
添加项目文件。
This commit is contained in:
33
CoreCms.Net.Services/Advert/CoreCmsAdvertPositionServices.cs
Normal file
33
CoreCms.Net.Services/Advert/CoreCmsAdvertPositionServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 广告位置表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAdvertPositionServices : BaseServices<CoreCmsAdvertPosition>, ICoreCmsAdvertPositionServices
|
||||
{
|
||||
private readonly ICoreCmsAdvertPositionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsAdvertPositionServices(IUnitOfWork unitOfWork, ICoreCmsAdvertPositionRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/Advert/CoreCmsAdvertisementServices.cs
Normal file
33
CoreCms.Net.Services/Advert/CoreCmsAdvertisementServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 广告表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAdvertisementServices : BaseServices<CoreCmsAdvertisement>, ICoreCmsAdvertisementServices
|
||||
{
|
||||
private readonly ICoreCmsAdvertisementRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsAdvertisementServices(IUnitOfWork unitOfWork, ICoreCmsAdvertisementRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
120
CoreCms.Net.Services/Agent/CoreCmsAgentGoodsServices.cs
Normal file
120
CoreCms.Net.Services/Agent/CoreCmsAgentGoodsServices.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 代理商品池 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAgentGoodsServices : BaseServices<CoreCmsAgentGoods>, ICoreCmsAgentGoodsServices
|
||||
{
|
||||
private readonly ICoreCmsAgentGoodsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsAgentGoodsServices(IUnitOfWork unitOfWork, ICoreCmsAgentGoodsRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsAgentGoods>> QueryPageAsync(
|
||||
Expression<Func<CoreCmsAgentGoods, bool>> predicate,
|
||||
Expression<Func<CoreCmsAgentGoods, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize,
|
||||
blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <param name="products"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> InsertAsync(CoreCmsAgentGoods entity, List<CoreCmsAgentProducts> products)
|
||||
{
|
||||
return await _dal.InsertAsync(entity, products);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <param name="products"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateAsync(CoreCmsAgentGoods entity, List<CoreCmsAgentProducts> products)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity, products);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsAgentGoods> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
128
CoreCms.Net.Services/Agent/CoreCmsAgentGradeServices.cs
Normal file
128
CoreCms.Net.Services/Agent/CoreCmsAgentGradeServices.cs
Normal file
@@ -0,0 +1,128 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 代理商等级设置表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAgentGradeServices : BaseServices<CoreCmsAgentGrade>, ICoreCmsAgentGradeServices
|
||||
{
|
||||
private readonly ICoreCmsAgentGradeRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsAgentGradeServices(IUnitOfWork unitOfWork, ICoreCmsAgentGradeRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsAgentGrade>> QueryPageAsync(
|
||||
Expression<Func<CoreCmsAgentGrade, bool>> predicate,
|
||||
Expression<Func<CoreCmsAgentGrade, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize,
|
||||
blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsAgentGrade entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsAgentGrade entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsAgentGrade> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsAgentGrade>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsAgentGrade>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
393
CoreCms.Net.Services/Agent/CoreCmsAgentOrderServices.cs
Normal file
393
CoreCms.Net.Services/Agent/CoreCmsAgentOrderServices.cs
Normal file
@@ -0,0 +1,393 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 代理商订单记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAgentOrderServices : BaseServices<CoreCmsAgentOrder>, ICoreCmsAgentOrderServices
|
||||
{
|
||||
private readonly ICoreCmsAgentGoodsServices _agentGoodsServices;
|
||||
private readonly ICoreCmsAgentProductsServices _agentProductsServices;
|
||||
private readonly ICoreCmsUserBalanceServices _balanceServices;
|
||||
private readonly ICoreCmsAgentOrderRepository _dal;
|
||||
private readonly ICoreCmsGoodsServices _goodsServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
private readonly ICoreCmsOrderServices _orderServices;
|
||||
private readonly ICoreCmsProductsServices _productsServices;
|
||||
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
|
||||
|
||||
public CoreCmsAgentOrderServices(IUnitOfWork unitOfWork, ICoreCmsAgentOrderRepository dal,
|
||||
ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices,
|
||||
ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices,
|
||||
ICoreCmsAgentProductsServices agentProductsServices, ICoreCmsSettingServices settingServices,
|
||||
ICoreCmsAgentGoodsServices agentGoodsServices, IServiceProvider serviceProvider,
|
||||
ICoreCmsOrderServices orderServices, ICoreCmsUserBalanceServices balanceServices)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_userServices = userServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
_productsServices = productsServices;
|
||||
_goodsServices = goodsServices;
|
||||
_agentProductsServices = agentProductsServices;
|
||||
_settingServices = settingServices;
|
||||
_agentGoodsServices = agentGoodsServices;
|
||||
_serviceProvider = serviceProvider;
|
||||
_orderServices = orderServices;
|
||||
_balanceServices = balanceServices;
|
||||
}
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsAgentOrder>> QueryPageAsync(
|
||||
Expression<Func<CoreCmsAgentOrder, bool>> predicate,
|
||||
Expression<Func<CoreCmsAgentOrder, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize,
|
||||
blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 添加代理订单关联记录
|
||||
|
||||
/// <summary>
|
||||
/// 添加代理订单关联记录
|
||||
/// </summary>
|
||||
/// <param name="order"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(CoreCmsOrder order)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var agentServices = container.ServiceProvider.GetService<ICoreCmsAgentServices>();
|
||||
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var isAllowProcurementService = CommonHelper
|
||||
.GetConfigDictionary(allConfigs, SystemSettingConstVars.IsAllowProcurementService).ObjectToInt(0);
|
||||
CoreCmsUser user = null;
|
||||
CoreCmsAgent agentModel = null;
|
||||
//判断是否支持代理代购,支持的话就直接判断当前订单用户是否是代理商,是的话传代理商数据
|
||||
if (isAllowProcurementService == 1)
|
||||
{
|
||||
agentModel = await agentServices.QueryByClauseAsync(p =>
|
||||
p.userId == order.userId && p.verifyStatus == (int) GlobalEnumVars.AgentVerifyStatus.VerifyYes);
|
||||
if (agentModel != null) user = await _userServices.QueryByClauseAsync(p => p.id == order.userId);
|
||||
}
|
||||
|
||||
//如果当前用户不是代理,则找上级
|
||||
if (user == null)
|
||||
{
|
||||
var userChild = await _userServices.QueryByClauseAsync(p => p.id == order.userId);
|
||||
if (userChild.parentId > 0)
|
||||
{
|
||||
agentModel = await agentServices.QueryByClauseAsync(p =>
|
||||
p.userId == userChild.parentId &&
|
||||
p.verifyStatus == (int) GlobalEnumVars.AgentVerifyStatus.VerifyYes);
|
||||
if (agentModel != null)
|
||||
user = await _userServices.QueryByClauseAsync(p => p.id == userChild.parentId);
|
||||
}
|
||||
}
|
||||
|
||||
//查询获取几级返利
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
//获取购物明细
|
||||
var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId);
|
||||
var goodIds = orderItems.Select(p => p.goodsId).ToList();
|
||||
var productIds = orderItems.Select(p => p.productId).ToList();
|
||||
//获取商品数据
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(p => goodIds.Contains(p.id));
|
||||
//获取货品数据
|
||||
var products = await _productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id));
|
||||
//获取当前订单包含的商品在代理商货品池启用商品数据
|
||||
var agentGoods =
|
||||
await _agentGoodsServices.QueryListByClauseAsync(p => goodIds.Contains(p.goodId) && p.isEnable);
|
||||
//获取货品关联的分销数据
|
||||
var agentProducts = await _agentProductsServices.QueryListByClauseAsync(p =>
|
||||
productIds.Contains(p.productId) && p.agentGradeId == agentModel.gradeId);
|
||||
|
||||
if (agentGoods.Any() && agentProducts.Any())
|
||||
await AddOther(order, orderItems, goods, products, agentGoods, agentProducts, agentModel, user);
|
||||
else
|
||||
jm.msg = "代理商商品池或货品池为空";
|
||||
jm.status = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 订单结算处理事件
|
||||
|
||||
/// <summary>
|
||||
/// 订单结算处理事件
|
||||
/// </summary>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> FinishOrder(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var order = await _orderServices.QueryByClauseAsync(p =>
|
||||
p.orderId == orderId && p.status == (int) GlobalEnumVars.OrderStatus.Complete);
|
||||
if (order == null)
|
||||
{
|
||||
jm.msg = "订单查询失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//更新
|
||||
var list = await _dal.QueryListByClauseAsync(p =>
|
||||
p.orderId == orderId && p.isSettlement == (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo);
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
//钱挪到会员余额里面
|
||||
var result = await _balanceServices.Change(item.userId,
|
||||
(int) GlobalEnumVars.UserBalanceSourceTypes.Agent,
|
||||
item.amount, item.orderId);
|
||||
if (!result.status)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
await _dal.UpdateAsync(
|
||||
p => new CoreCmsAgentOrder
|
||||
{
|
||||
isSettlement = (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementYes,
|
||||
updateTime = DateTime.Now
|
||||
},
|
||||
p => p.orderId == orderId &&
|
||||
p.isSettlement == (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo);
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 作废订单
|
||||
|
||||
/// <summary>
|
||||
/// 作废订单
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> CancleOrderByOrderId(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var res = await _dal.UpdateAsync(
|
||||
p => new CoreCmsAgentOrder
|
||||
{isSettlement = (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementCancel},
|
||||
p => p.orderId == orderId &&
|
||||
p.isSettlement == (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo);
|
||||
if (res == false)
|
||||
{
|
||||
jm.msg = "该未结算的订单不存在";
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm.msg = "操作成功";
|
||||
jm.status = true;
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 循环插入上级
|
||||
|
||||
/// <summary>
|
||||
/// 循环插入上级
|
||||
/// </summary>
|
||||
/// <param name="order">订单信息</param>
|
||||
/// <param name="orderItems"></param>
|
||||
/// <param name="goods"></param>
|
||||
/// <param name="products">订单货品</param>
|
||||
/// <param name="agentProducts">商品池货品价格体系数据</param>
|
||||
/// <param name="agentGoods">商品池数据</param>
|
||||
/// <param name="agent">代理商数据</param>
|
||||
/// <param name="user">用户数据</param>
|
||||
/// <returns></returns>
|
||||
private async Task AddOther(CoreCmsOrder order, List<CoreCmsOrderItem> orderItems, List<CoreCmsGoods> goods,
|
||||
List<CoreCmsProducts> products, List<CoreCmsAgentGoods> agentGoods,
|
||||
List<CoreCmsAgentProducts> agentProducts, CoreCmsAgent agent, CoreCmsUser user)
|
||||
{
|
||||
//直返本级
|
||||
decimal amount = 0;
|
||||
foreach (var item in orderItems)
|
||||
{
|
||||
//判断是否存在商品内
|
||||
var good = goods.Find(p => p.id == item.goodsId);
|
||||
if (good == null) continue;
|
||||
//判断是否存在货品类
|
||||
var product = products.Find(p => p.id == item.productId);
|
||||
if (product == null) continue;
|
||||
//判断代理商代理池是否包含此商品数据
|
||||
var agentGood = agentGoods.Find(p => p.goodId == item.goodsId);
|
||||
if (agentGood == null) continue;
|
||||
|
||||
//判断代理商代理池是否包含此货品数据
|
||||
var agentProduct = agentProducts.Find(p => p.productId == item.productId);
|
||||
if (agentProduct == null) continue;
|
||||
|
||||
//获取实际当前单个商品应获得利润
|
||||
var price = item.price - agentProduct.agentGradePrice;
|
||||
//如果销售价减去代理商价格负了,就不计算了。
|
||||
if (price < 0) continue;
|
||||
|
||||
//如果利润减去优惠负了,就不计算了。
|
||||
var mathMoney = Math.Round(price * item.nums - item.promotionAmount, 2);
|
||||
if (mathMoney < 0) mathMoney = 0;
|
||||
|
||||
//单个商品利润*数量,再减去优惠金额
|
||||
amount += mathMoney;
|
||||
}
|
||||
|
||||
if (amount > 0)
|
||||
{
|
||||
var iData = new CoreCmsAgentOrder();
|
||||
iData.userId = user.id;
|
||||
iData.buyUserId = order.userId;
|
||||
iData.orderId = order.orderId;
|
||||
iData.amount = amount;
|
||||
iData.isSettlement = (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo; //默认未结算
|
||||
iData.isDelete = false;
|
||||
//判断是否返利过,有历史记录直接更新
|
||||
var agentOrder = await _dal.QueryByClauseAsync(p => p.userId == user.id && p.orderId == order.orderId);
|
||||
if (agentOrder != null)
|
||||
{
|
||||
agentOrder.updateTime = DateTime.Now;
|
||||
agentOrder.userId = iData.userId;
|
||||
agentOrder.buyUserId = iData.buyUserId;
|
||||
agentOrder.orderId = iData.orderId;
|
||||
agentOrder.amount = iData.amount;
|
||||
agentOrder.isSettlement = iData.isSettlement;
|
||||
agentOrder.isDelete = iData.isDelete;
|
||||
await _dal.UpdateAsync(agentOrder);
|
||||
}
|
||||
else
|
||||
{
|
||||
iData.createTime = DateTime.Now;
|
||||
iData.updateTime = DateTime.Now;
|
||||
await _dal.InsertAsync(iData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsAgentOrder entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsAgentOrder entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsAgentOrder> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
62
CoreCms.Net.Services/Agent/CoreCmsAgentProductsServices.cs
Normal file
62
CoreCms.Net.Services/Agent/CoreCmsAgentProductsServices.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 代理货品池 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAgentProductsServices : BaseServices<CoreCmsAgentProducts>, ICoreCmsAgentProductsServices
|
||||
{
|
||||
private readonly ICoreCmsAgentProductsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsAgentProductsServices(IUnitOfWork unitOfWork, ICoreCmsAgentProductsRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsAgentProducts>> QueryPageAsync(
|
||||
Expression<Func<CoreCmsAgentProducts, bool>> predicate,
|
||||
Expression<Func<CoreCmsAgentProducts, object>> orderByExpression, OrderByType orderByType,
|
||||
int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize,
|
||||
blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
303
CoreCms.Net.Services/Agent/CoreCmsAgentServices.cs
Normal file
303
CoreCms.Net.Services/Agent/CoreCmsAgentServices.cs
Normal file
@@ -0,0 +1,303 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO.Agent;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 代理商表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsAgentServices : BaseServices<CoreCmsAgent>, ICoreCmsAgentServices
|
||||
{
|
||||
private readonly ICoreCmsAgentGoodsServices _agentGoodsServices;
|
||||
private readonly ICoreCmsAgentGradeServices _agentGradeServices;
|
||||
private readonly ICoreCmsAgentOrderServices _agentOrderServices;
|
||||
private readonly ICoreCmsAgentRepository _dal;
|
||||
private readonly ICoreCmsGoodsServices _goodsServices;
|
||||
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
|
||||
|
||||
public CoreCmsAgentServices(IUnitOfWork unitOfWork, ICoreCmsAgentRepository dal,
|
||||
ICoreCmsSettingServices settingServices, ICoreCmsAgentOrderServices agentOrderServices,
|
||||
ICoreCmsUserServices userServices, ICoreCmsAgentGradeServices agentGradeServices,
|
||||
ICoreCmsGoodsServices goodsServices, ICoreCmsAgentGoodsServices agentGoodsServices)
|
||||
{
|
||||
_dal = dal;
|
||||
_settingServices = settingServices;
|
||||
_agentOrderServices = agentOrderServices;
|
||||
_userServices = userServices;
|
||||
_agentGradeServices = agentGradeServices;
|
||||
_goodsServices = goodsServices;
|
||||
_agentGoodsServices = agentGoodsServices;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
#region 获取分销商信息
|
||||
|
||||
/// <summary>
|
||||
/// 获取分销商信息
|
||||
/// </summary>
|
||||
/// <param name="userId">用户id</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetInfo(int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
|
||||
if (info is {verifyStatus: (int) GlobalEnumVars.AgentVerifyStatus.VerifyYes})
|
||||
{
|
||||
//总金额
|
||||
info.TotalSettlementAmount = await _agentOrderServices.GetSumAsync(
|
||||
p => p.isSettlement != (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementCancel &&
|
||||
p.userId == userId, p => p.amount);
|
||||
//已结算金额
|
||||
info.SettlementAmount = await _agentOrderServices.GetSumAsync(
|
||||
p => p.isSettlement == (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementYes &&
|
||||
p.userId == userId, p => p.amount);
|
||||
//冻结金额
|
||||
info.FreezeAmount = await _agentOrderServices.GetSumAsync(
|
||||
p => p.isSettlement == (int) GlobalEnumVars.AgentOrderSettlementStatus.SettlementNo &&
|
||||
p.userId == userId, p => p.amount);
|
||||
|
||||
var dt = DateTime.Now;
|
||||
//本月第一天时间
|
||||
var dtFirst = dt.AddDays(1 - dt.Day);
|
||||
//获得某年某月的天数
|
||||
var year = dt.Year;
|
||||
var month = dt.Month;
|
||||
var dayCount = DateTime.DaysInMonth(year, month);
|
||||
var dtLast = dtFirst.AddDays(dayCount - 1);
|
||||
|
||||
//本月订单数
|
||||
info.CurrentMonthOrder = await _agentOrderServices.GetCountAsync(p =>
|
||||
p.createTime >= dtFirst && p.createTime < dtLast && p.userId == userId);
|
||||
|
||||
info.Store = UserHelper.GetShareCodeByUserId(userId).ToString();
|
||||
|
||||
//本日开始结束时间
|
||||
var day = dt.Day;
|
||||
var dayStart = new DateTime(year, month, day, 0, 0, 0);
|
||||
var datEnd = new DateTime(year, month, day, 23, 59, 59);
|
||||
|
||||
//今日收益
|
||||
info.TodayFreezeAmount = await _agentOrderServices.GetSumAsync(
|
||||
p => p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId, p => p.amount);
|
||||
//今日订单
|
||||
info.TodayOrder = await _agentOrderServices.GetCountAsync(p =>
|
||||
p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId);
|
||||
//今日会员
|
||||
info.TodayUser = await _userServices.GetCountAsync(p =>
|
||||
p.parentId == userId && p.createTime > dayStart && p.createTime <= datEnd);
|
||||
}
|
||||
|
||||
info ??= new CoreCmsAgent();
|
||||
|
||||
info.TotalGoods = await _agentGoodsServices.GetCountAsync(p => p.isEnable);
|
||||
if (info.gradeId > 0)
|
||||
{
|
||||
var userGrade = await _agentGradeServices.QueryByIdAsync(info.gradeId);
|
||||
if (userGrade != null) info.GradeName = userGrade.name;
|
||||
}
|
||||
|
||||
jm.msg = "获取成功";
|
||||
jm.status = true;
|
||||
jm.data = info;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 添加用户信息
|
||||
|
||||
/// <summary>
|
||||
/// 添加用户信息
|
||||
/// </summary>
|
||||
/// <param name="iData"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(CoreCmsAgent iData, int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
if (string.IsNullOrEmpty(iData.mobile))
|
||||
{
|
||||
jm.msg = "请填写手机号";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (CommonHelper.IsMobile(iData.mobile) == false)
|
||||
{
|
||||
jm.msg = "请填写正确的手机号";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(iData.name))
|
||||
{
|
||||
jm.msg = "请填写您的姓名";
|
||||
return jm;
|
||||
}
|
||||
|
||||
iData.userId = userId;
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "您已申请,请勿重复提交";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//默认等级处理
|
||||
if (iData.gradeId == 0)
|
||||
{
|
||||
var disGradeModel = await _agentGradeServices.QueryByClauseAsync(p => p.isDefault);
|
||||
if (disGradeModel != null) iData.gradeId = disGradeModel.id;
|
||||
}
|
||||
|
||||
if (iData.verifyStatus == 0) iData.verifyStatus = (int) GlobalEnumVars.DistributionVerifyStatus.VerifyWait;
|
||||
iData.isDelete = false;
|
||||
iData.createTime = DateTime.Now;
|
||||
|
||||
//判断是否存在
|
||||
var bl = await _dal.InsertAsync(iData) > 0;
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "申请成功" : "申请失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取我的推广订单
|
||||
|
||||
/// <summary>
|
||||
/// 获取我的推广订单
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="limit"></param>
|
||||
/// <param name="typeId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetMyOrderList(int userId, int page, int limit = 10, int typeId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "获取成功";
|
||||
var pageList = await _dal.QueryOrderPageAsync(userId, page, limit, typeId);
|
||||
jm.data = pageList;
|
||||
jm.code = pageList.TotalCount;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取店铺信息
|
||||
|
||||
/// <summary>
|
||||
/// 获取店铺信息
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetStore(int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
jm.status = true;
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null)
|
||||
//info.TotalGoods = await _agentGoodsServices.GetCountAsync(p => p.isEnable == true);
|
||||
jm.data = new
|
||||
{
|
||||
info.createTime,
|
||||
info.name,
|
||||
info.storeBanner,
|
||||
info.storeDesc,
|
||||
info.storeLogo,
|
||||
info.storeName
|
||||
//info.TotalGoods
|
||||
};
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsAgentOrder>> QueryOrderPageAsync(int userId, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryOrderPageAsync(userId, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsAgent>> QueryPageAsync(Expression<Func<CoreCmsAgent, bool>> predicate,
|
||||
Expression<Func<CoreCmsAgent, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize,
|
||||
blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取代理商排行
|
||||
/// </summary>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<AgentRankingDTO>> QueryRankingPageAsync(int pageIndex = 1, int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryRankingPageAsync(pageIndex, pageSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/Api/CoreCmsApiAccessTokenServices.cs
Normal file
33
CoreCms.Net.Services/Api/CoreCmsApiAccessTokenServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 第三方授权记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsApiAccessTokenServices : BaseServices<CoreCmsApiAccessToken>, ICoreCmsApiAccessTokenServices
|
||||
{
|
||||
private readonly ICoreCmsApiAccessTokenRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsApiAccessTokenServices(IUnitOfWork unitOfWork, ICoreCmsApiAccessTokenRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
65
CoreCms.Net.Services/Article/CoreCmsArticleServices.cs
Normal file
65
CoreCms.Net.Services/Article/CoreCmsArticleServices.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 文章表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsArticleServices : BaseServices<CoreCmsArticle>, ICoreCmsArticleServices
|
||||
{
|
||||
private readonly ICoreCmsArticleRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsArticleServices(IUnitOfWork unitOfWork, ICoreCmsArticleRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定id 的文章详情
|
||||
/// </summary>
|
||||
/// <param name="id">序列</param>
|
||||
public async Task<CoreCmsArticle> ArticleDetail(int id)
|
||||
{
|
||||
return await _dal.ArticleDetail(id);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsArticle>> QueryPageAsync(Expression<Func<CoreCmsArticle, bool>> predicate,
|
||||
Expression<Func<CoreCmsArticle, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/Article/CoreCmsArticleTypeServices.cs
Normal file
33
CoreCms.Net.Services/Article/CoreCmsArticleTypeServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 文章分类表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsArticleTypeServices : BaseServices<CoreCmsArticleType>, ICoreCmsArticleTypeServices
|
||||
{
|
||||
private readonly ICoreCmsArticleTypeRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsArticleTypeServices(IUnitOfWork unitOfWork, ICoreCmsArticleTypeRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
1097
CoreCms.Net.Services/BaseServices.cs
Normal file
1097
CoreCms.Net.Services/BaseServices.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,35 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品图片关联表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillAftersalesImagesServices : BaseServices<CoreCmsBillAftersalesImages>,
|
||||
ICoreCmsBillAftersalesImagesServices
|
||||
{
|
||||
private readonly ICoreCmsBillAftersalesImagesRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsBillAftersalesImagesServices(IUnitOfWork unitOfWork, ICoreCmsBillAftersalesImagesRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 售后单明细表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillAftersalesItemServices : BaseServices<CoreCmsBillAftersalesItem>,
|
||||
ICoreCmsBillAftersalesItemServices
|
||||
{
|
||||
private readonly ICoreCmsBillAftersalesItemRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsBillAftersalesItemServices(IUnitOfWork unitOfWork, ICoreCmsBillAftersalesItemRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
787
CoreCms.Net.Services/Bill/CoreCmsBillAftersalesServices.cs
Normal file
787
CoreCms.Net.Services/Bill/CoreCmsBillAftersalesServices.cs
Normal file
@@ -0,0 +1,787 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* 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.QueryMuch;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 退货单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillAftersalesServices : BaseServices<CoreCmsBillAftersales>, ICoreCmsBillAftersalesServices
|
||||
{
|
||||
private readonly ICoreCmsBillAftersalesRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ICoreCmsMessageCenterServices _messageCenterServices;
|
||||
private readonly ICoreCmsUserPointLogServices _userPointLogServices;
|
||||
private readonly IRedisOperationRepository _redisOperationRepository;
|
||||
|
||||
public CoreCmsBillAftersalesServices(IUnitOfWork unitOfWork, ICoreCmsBillAftersalesRepository dal, IServiceProvider serviceProvider, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsUserPointLogServices userPointLogServices, IRedisOperationRepository redisOperationRepository)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
_messageCenterServices = messageCenterServices;
|
||||
_userPointLogServices = userPointLogServices;
|
||||
_redisOperationRepository = redisOperationRepository;
|
||||
}
|
||||
|
||||
#region 根据订单号查询已经售后的内容======================
|
||||
|
||||
/// <summary>
|
||||
/// 根据订单号查询已经售后的内容
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <param name="aftersaleLevel">取售后单的时候,售后单的等级,0:待审核的和审核通过的售后单,1未审核的,2审核通过的</param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack OrderToAftersales(string orderId, int aftersaleLevel = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
List<int> statusInts = new List<int>();
|
||||
switch (aftersaleLevel)
|
||||
{
|
||||
case 0:
|
||||
statusInts.Add((int)GlobalEnumVars.BillAftersalesStatus.Success);
|
||||
statusInts.Add((int)GlobalEnumVars.BillAftersalesStatus.WaitAudit);
|
||||
break;
|
||||
case 1:
|
||||
statusInts.Add((int)GlobalEnumVars.BillAftersalesStatus.WaitAudit);
|
||||
break;
|
||||
case 2:
|
||||
statusInts.Add((int)GlobalEnumVars.BillAftersalesStatus.Success);
|
||||
break;
|
||||
default:
|
||||
jm.msg = "aftersale_level值类型不对";
|
||||
return jm;
|
||||
}
|
||||
//算已经退过款的金额,取已经完成的售后单的金额汇总
|
||||
var where = PredicateBuilder.True<CoreCmsBillAftersales>();
|
||||
where = where.And(p => p.orderId == orderId && statusInts.Contains(p.status)); //加上待审核状态,这样申请过售后的商品和金额不会再重复申请了
|
||||
//已经退过款的金额
|
||||
var refundMoney = base.GetSum(where, p => p.refundAmount);
|
||||
|
||||
//算退货商品明细
|
||||
var list = base.QueryMuch<CoreCmsBillAftersalesItem, CoreCmsBillAftersales, QMAftersalesItems>(
|
||||
(child, parent) => new object[]
|
||||
{
|
||||
JoinType.Inner, child.aftersalesId == parent.aftersalesId
|
||||
},
|
||||
(child, parent) => new QMAftersalesItems
|
||||
{
|
||||
orderItemsId = child.orderItemsId,
|
||||
nums = child.nums,
|
||||
status = parent.status,
|
||||
type = parent.type
|
||||
}, (child, parent) => parent.orderId == orderId && statusInts.Contains(parent.status));
|
||||
|
||||
var reshipGoods = new Dictionary<int, reshipGoods>();
|
||||
if (list != null && list.Count > 0)
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
var reshipGoodsItem = new reshipGoods()
|
||||
{
|
||||
reshipNums = 0,
|
||||
reshipedNums = 0
|
||||
};
|
||||
reshipGoodsItem.reshipNums += item.nums;
|
||||
if (item.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship)
|
||||
{
|
||||
reshipGoodsItem.reshipedNums += item.nums;
|
||||
}
|
||||
reshipGoods.Add(item.orderItemsId, reshipGoodsItem);
|
||||
}
|
||||
}
|
||||
|
||||
var billAftersales = base.QueryListByClause(where);
|
||||
jm.data = new OrderToAftersalesDto
|
||||
{
|
||||
refundMoney = refundMoney,
|
||||
reshipGoods = reshipGoods,
|
||||
billAftersales = billAftersales
|
||||
};
|
||||
jm.status = true;
|
||||
jm.msg = jm.status ? GlobalConstVars.GetDataSuccess : GlobalConstVars.GetDataFailure;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 统计用户的售后数量============================================
|
||||
/// <summary>
|
||||
/// 统计用户的售后数量
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="status"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> GetUserAfterSalesNum(int userId, int status)
|
||||
{
|
||||
var count = await base.GetCountAsync(p => p.userId == userId && p.status == status);
|
||||
return count;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 创建售后单
|
||||
/// <summary>
|
||||
/// 创建售后单
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="orderId">发起售后的订单</param>
|
||||
/// <param name="type">是否收到退货,1未收到退货,不会创建退货单,2收到退货,会创建退货单,只有未发货的商品才能选择未收到货,只有已发货的才能选择已收到货</param>
|
||||
/// <param name="items">如果是退款退货,退货的明细 以 [[order_item_id=>nums]]的二维数组形式传值</param>
|
||||
/// <param name="images"></param>
|
||||
/// <param name="reason">售后理由</param>
|
||||
/// <param name="refund">退款金额,只在退款退货的时候用,如果是退款,直接就是订单金额</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, string orderId, int type, JArray items, string[] images, string reason, decimal refund)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//做个简单校验,防止乱传值
|
||||
if (type != (int)GlobalEnumVars.BillAftersalesIsReceive.Refund && type != (int)GlobalEnumVars.BillAftersalesIsReceive.Reship)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
jm.code = 10000;
|
||||
return jm;
|
||||
}
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
|
||||
var imagesServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesImagesServices>();
|
||||
var itemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
|
||||
var result = await orderServices.GetOrderInfoByOrderId(orderId, userId);
|
||||
if (result.status == false)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13101;
|
||||
jm.code = 13101;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var orderInfo = new CoreCmsOrder();
|
||||
orderInfo = result.data as CoreCmsOrder;
|
||||
|
||||
if (orderInfo.addAftersalesStatus == false)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13200;
|
||||
jm.code = 13200;
|
||||
return jm;
|
||||
}
|
||||
//生成售后单号
|
||||
var aftersalesId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.售后单编号);
|
||||
|
||||
//校验订单是否可以进行此售后,并且校验订单价格是否合理
|
||||
var verifyResult = Verify(type, orderInfo, refund, items);
|
||||
if (verifyResult.status == false)
|
||||
{
|
||||
return verifyResult;
|
||||
}
|
||||
|
||||
jm.otherData = new
|
||||
{
|
||||
orderInfo,
|
||||
items,
|
||||
verifyResult
|
||||
};
|
||||
|
||||
|
||||
//判断图片是否大于系统限定
|
||||
|
||||
//var allConfigs = await settingServices.GetConfigDictionaries();
|
||||
if (images.Length > 5)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10006;
|
||||
jm.code = 10006;
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
var billAftersales = new CoreCmsBillAftersales();
|
||||
billAftersales.aftersalesId = aftersalesId;
|
||||
billAftersales.orderId = orderId;
|
||||
billAftersales.userId = userId;
|
||||
billAftersales.type = type;
|
||||
billAftersales.refundAmount = refund;
|
||||
billAftersales.reason = reason;
|
||||
billAftersales.status = (int)GlobalEnumVars.BillAftersalesStatus.WaitAudit;
|
||||
billAftersales.createTime = DateTime.Now;
|
||||
//保存主表数据
|
||||
await _dal.InsertAsync(billAftersales);
|
||||
|
||||
if (items != null && items.Any())
|
||||
{
|
||||
//如果是退货,判断退货明细,数量是否超出可退的数量
|
||||
var aftersalesItems = formatAftersalesItems(orderInfo, items, aftersalesId);
|
||||
if (!aftersalesItems.status)
|
||||
{
|
||||
return aftersalesItems;
|
||||
}
|
||||
//保存售后明细
|
||||
if (aftersalesItems.data != null)
|
||||
{
|
||||
var list = aftersalesItems.data as List<CoreCmsBillAftersalesItem>;
|
||||
await itemServices.InsertAsync(list);
|
||||
}
|
||||
}
|
||||
|
||||
//保存图片
|
||||
if (images.Length > 0)
|
||||
{
|
||||
var imagesList = new List<CoreCmsBillAftersalesImages>();
|
||||
for (int i = 0; i < images.Length; i++)
|
||||
{
|
||||
imagesList.Add(new CoreCmsBillAftersalesImages()
|
||||
{
|
||||
aftersalesId = aftersalesId,
|
||||
imageUrl = images[i],
|
||||
sortId = i
|
||||
});
|
||||
}
|
||||
await imagesServices.InsertAsync(imagesList);
|
||||
}
|
||||
|
||||
//消息模板推送给客户
|
||||
SmsHelper.SendMessage();
|
||||
|
||||
jm.status = true;
|
||||
jm.data = billAftersales;
|
||||
|
||||
return jm;
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 校验是否可以进行售后
|
||||
/// <summary>
|
||||
/// 校验是否可以进行售后
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="orderInfo"></param>
|
||||
/// <param name="refund"></param>
|
||||
/// <param name="items"></param>
|
||||
/// <returns></returns>
|
||||
private WebApiCallBack Verify(int type, CoreCmsOrder orderInfo, decimal refund, JArray items)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
//判断订单是否是可以售后
|
||||
//只有活动订单才能售后
|
||||
if (orderInfo.status != (int)GlobalEnumVars.OrderStatus.Normal)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13200;
|
||||
jm.code = 13200;
|
||||
return jm;
|
||||
}
|
||||
//未付款订单和已退款订单不能售后
|
||||
if (orderInfo.payStatus == (int)GlobalEnumVars.OrderPayStatus.No || orderInfo.payStatus == (int)GlobalEnumVars.OrderPayStatus.Refunded)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13203;
|
||||
jm.code = 13203;
|
||||
return jm;
|
||||
}
|
||||
//如果订单未发货,那么用户不能选择已收到货
|
||||
if (type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship && orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13227;
|
||||
jm.code = 13227;
|
||||
return jm;
|
||||
}
|
||||
//判断退款金额不能超
|
||||
if (refund + orderInfo.refunded > orderInfo.payedAmount)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13206;
|
||||
jm.code = 13206;
|
||||
return jm;
|
||||
}
|
||||
//根据是否已收到货和未收到货来判断实际可以退的数量,不能超过最大数量,已收到货的和未收到货的不能一起退,在这里做判断
|
||||
return verifyNums(type, orderInfo, items);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 判断退货数量是否超标
|
||||
/// <summary>
|
||||
/// 判断退货数量是否超标
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="orderInfo"></param>
|
||||
/// <param name="items"></param>
|
||||
/// <returns></returns>
|
||||
private WebApiCallBack verifyNums(int type, CoreCmsOrder orderInfo, JArray items)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
foreach (var item in items)
|
||||
{
|
||||
var id = ((JObject)item)["id"].ObjectToInt();
|
||||
var nums = ((JObject)item)["nums"].ObjectToInt();
|
||||
foreach (var orderItem in orderInfo.items)
|
||||
{
|
||||
if (orderItem.id == id)
|
||||
{
|
||||
if (type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund)
|
||||
{
|
||||
var n = orderItem.nums - orderItem.sendNums - (orderItem.reshipNums - orderItem.reshipedNums);
|
||||
if (n < nums)
|
||||
{
|
||||
jm.msg = orderItem.name + orderItem.addon + ",未发货商品,最多能退" + n + "个";
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var n = orderItem.sendNums - orderItem.reshipedNums;
|
||||
if (n < nums)
|
||||
{
|
||||
jm.msg = orderItem.name + orderItem.addon + "已发货商品,最多能退" + n + "个";
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
jm.status = true;
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 根据退货的明细,生成售后单明细表的数据
|
||||
/// <summary>
|
||||
/// 根据退货的明细,生成售后单明细表的数据
|
||||
/// </summary>
|
||||
/// <param name="orderInfo">订单的详细数据</param>
|
||||
/// <param name="items">前台选择的退货商品信息</param>
|
||||
/// <param name="aftersalesId">将要保存的售后单的单号</param>
|
||||
/// <returns></returns>
|
||||
private WebApiCallBack formatAftersalesItems(CoreCmsOrder orderInfo, JArray items, string aftersalesId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
var data = new List<CoreCmsBillAftersalesItem>();
|
||||
foreach (var item in items)
|
||||
{
|
||||
var id = ((JObject)item)["id"].ObjectToInt();
|
||||
var nums = ((JObject)item)["nums"].ObjectToInt();
|
||||
|
||||
if (nums <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var orderItem in orderInfo.items)
|
||||
{
|
||||
if (orderItem.id == id)
|
||||
{
|
||||
//判断已经退过的加上本次退的,是否超过了购买的数量,具体取nums(购买数量)还是取sendnums(已发货数量),以后再说吧。要取购买数量,因为未发货的,也可以退的
|
||||
if (nums + orderItem.reshipNums > orderItem.nums)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13201;
|
||||
jm.code = 13201;
|
||||
return jm;
|
||||
}
|
||||
var billAftersalesItem = new CoreCmsBillAftersalesItem
|
||||
{
|
||||
aftersalesId = aftersalesId,
|
||||
orderItemsId = orderItem.id,
|
||||
goodsId = orderItem.goodsId,
|
||||
productId = orderItem.productId,
|
||||
sn = orderItem.sn,
|
||||
bn = orderItem.bn,
|
||||
name = orderItem.name,
|
||||
imageUrl = orderItem.imageUrl,
|
||||
nums = nums,
|
||||
addon = orderItem.addon,
|
||||
createTime = DateTime.Now
|
||||
};
|
||||
data.Add(billAftersalesItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
//判断生成的总记录条数,是否和前端传过来的记录条数对应上,如果没有对应上,就说明退货明细不正确
|
||||
if (data.Count != items.Count)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13202;
|
||||
jm.data = jm.code = 13202;
|
||||
|
||||
return jm;
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = data;
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 带子集数据分页
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsBillAftersales>> QueryPageAsync(Expression<Func<CoreCmsBillAftersales, bool>> predicate,
|
||||
Expression<Func<CoreCmsBillAftersales, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取单个数据
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个数据
|
||||
/// </summary>
|
||||
/// <param name="aftersalesId"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsBillAftersales> GetInfo(string aftersalesId, int userId)
|
||||
{
|
||||
return await _dal.GetInfo(aftersalesId, userId);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Audit平台审核通过或者审核不通过
|
||||
|
||||
/// <summary>
|
||||
/// 平台审核通过或者审核不通过
|
||||
/// 如果审核通过了,是退款单的话,自动生成退款单,并做订单完成状态,如果是退货的话,自动生成退款单和退货单,如果
|
||||
/// </summary>
|
||||
/// <param name="aftersalesId"></param>
|
||||
/// <param name="status"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="refund"></param>
|
||||
/// <param name="mark"></param>
|
||||
/// <param name="items"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Audit(string aftersalesId, int status, int type, decimal refund, string mark,
|
||||
JArray items)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var res = await PreAudit(aftersalesId);
|
||||
if (!res.status)
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
|
||||
var info = res.data as CoreCmsBillAftersales;
|
||||
var orderInfo = info.order;
|
||||
|
||||
//校验订单是否可以进行此售后,并且校验订单价格是否合理
|
||||
var verifyData = Verify(info.type, orderInfo, refund, items);
|
||||
if (!verifyData.status && status == (int)GlobalEnumVars.BillAftersalesStatus.Success)
|
||||
{
|
||||
return verifyData;
|
||||
}
|
||||
|
||||
|
||||
//如果订单未发货,那么用户不能选择已收到货
|
||||
if (type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship &&
|
||||
orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13227;
|
||||
jm.code = 13227;
|
||||
return jm;
|
||||
}
|
||||
|
||||
//如果是退货单,必须选择退货明细
|
||||
if (info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship && items.Count <= 0)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13205;
|
||||
jm.code = 13205;
|
||||
return jm;
|
||||
}
|
||||
|
||||
//如果是退货,判断退货明细,数量是否超出可退的数量
|
||||
var billAftersalesItems = new List<CoreCmsBillAftersalesItem>();
|
||||
if (items.Count > 0)
|
||||
{
|
||||
var aftersalesItems = formatAftersalesItems(orderInfo, items, aftersalesId);
|
||||
if (!aftersalesItems.status)
|
||||
{
|
||||
return aftersalesItems;
|
||||
}
|
||||
|
||||
billAftersalesItems = aftersalesItems.data as List<CoreCmsBillAftersalesItem>;
|
||||
}
|
||||
|
||||
//判断退款金额不能超了
|
||||
if (refund + orderInfo.refunded > orderInfo.payedAmount)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13206;
|
||||
jm.code = 13206;
|
||||
return jm;
|
||||
}
|
||||
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var itemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var refundServices = container.ServiceProvider.GetService<ICoreCmsBillRefundServices>();
|
||||
var reshipServices = container.ServiceProvider.GetService<ICoreCmsBillReshipServices>();
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
var couponServices = container.ServiceProvider.GetService<ICoreCmsCouponServices>();
|
||||
//更新售后单
|
||||
await _dal.UpdateAsync(p => new CoreCmsBillAftersales() { status = status, mark = mark, refundAmount = refund, type = type },
|
||||
p => p.aftersalesId == aftersalesId && p.status == (int)GlobalEnumVars.BillAftersalesStatus.WaitAudit);
|
||||
|
||||
//更新售后单明细表,先删除,然后全新插入
|
||||
await itemServices.DeleteAsync(p => p.aftersalesId == aftersalesId);
|
||||
if (billAftersalesItems != null && billAftersalesItems.Any())
|
||||
{
|
||||
await itemServices.InsertAsync(billAftersalesItems);
|
||||
}
|
||||
|
||||
//审核通过的话,有退款的,生成退款单,根据最新的items生成退货单,并做订单的状态更改
|
||||
if (status == (int)GlobalEnumVars.BillAftersalesStatus.Success)
|
||||
{
|
||||
//如果有退款,生成退款单
|
||||
if (refund > 0)
|
||||
{
|
||||
var refundRes = await refundServices.ToAdd(info.userId, info.orderId,
|
||||
(int)GlobalEnumVars.BillRefundType.Order, refund, info.aftersalesId);
|
||||
if (!refundRes.status)
|
||||
{
|
||||
return refundRes;
|
||||
}
|
||||
}
|
||||
|
||||
//如果已经发货了,要退货,生成退货单,让用户吧商品邮回来。
|
||||
if (info.type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship && billAftersalesItems != null && billAftersalesItems.Any())
|
||||
{
|
||||
var reshipRes = await reshipServices.ToAdd(info.userId, info.orderId, info.aftersalesId,
|
||||
billAftersalesItems);
|
||||
if (!reshipRes.status)
|
||||
{
|
||||
return reshipRes;
|
||||
}
|
||||
}
|
||||
//更新订单状态
|
||||
|
||||
//如果是退款,退完了就变成已退款并且订单类型变成已完成,如果未退完,就是部分退款
|
||||
if (refund > 0)
|
||||
{
|
||||
if (refund + orderInfo.refunded == orderInfo.payedAmount)
|
||||
{
|
||||
orderInfo.payStatus = (int)GlobalEnumVars.OrderPayStatus.Refunded;
|
||||
orderInfo.status = (int)GlobalEnumVars.OrderStatus.Complete;
|
||||
|
||||
//返还积分
|
||||
if (orderInfo.point > 0)
|
||||
{
|
||||
await _userPointLogServices.SetPoint(orderInfo.userId, orderInfo.point, (int)GlobalEnumVars.UserPointSourceTypes.PointRefundReturn, "售后退款:" + orderInfo.orderId + "返还积分");
|
||||
}
|
||||
//返还优惠券
|
||||
if (!string.IsNullOrEmpty(orderInfo.coupon))
|
||||
{
|
||||
await couponServices.CancelReturnCoupon(orderInfo.coupon);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
orderInfo.payStatus = (int)GlobalEnumVars.OrderPayStatus.PartialNo;
|
||||
}
|
||||
}
|
||||
|
||||
//判断货物发完没,如果货已发完了,订单发货就变成已发货,为了判断在有退款的情况下,当
|
||||
var allDeliveryed = true; //商品该发货状态,默认发货了,为了判断部分发货的情况下,的订单发货状态
|
||||
var noDeliveryed = true; //是否都没发货,默认都没发货
|
||||
var allSened = true; //商品退货状态(所有退货,包含已发的退货和未发的退货),默认都退货了,为了判断都退了的话,订单状态变成已完成
|
||||
|
||||
foreach (var item in orderInfo.items)
|
||||
{
|
||||
if (item.id > 0)
|
||||
{
|
||||
foreach (var jToken in items)
|
||||
{
|
||||
var tt = (JObject)jToken;
|
||||
if (tt["id"].ToString() == item.id.ToString())
|
||||
{
|
||||
item.reshipNums += tt["nums"].ObjectToInt(0);
|
||||
}
|
||||
|
||||
if (type == (int)GlobalEnumVars.BillAftersalesIsReceive.Reship)
|
||||
{
|
||||
item.reshipedNums += tt["nums"].ObjectToInt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
//有任何商品发货,都不是未发货状态
|
||||
if (noDeliveryed && item.sendNums > 0)
|
||||
{
|
||||
noDeliveryed = false;
|
||||
}
|
||||
|
||||
if (allDeliveryed && (item.nums - item.sendNums - (item.reshipNums - item.reshipedNums) > 0))
|
||||
{
|
||||
//说明该发货的商品没发完
|
||||
allDeliveryed = false;
|
||||
}
|
||||
|
||||
if (allSened && (item.reshipNums < item.nums))
|
||||
{
|
||||
//说明未退完商品
|
||||
allSened = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (allDeliveryed && !noDeliveryed)
|
||||
{
|
||||
orderInfo.shipStatus = (int)GlobalEnumVars.OrderShipStatus.Yes;
|
||||
}
|
||||
|
||||
if (allSened)
|
||||
{
|
||||
orderInfo.status = (int)GlobalEnumVars.OrderStatus.Complete;
|
||||
}
|
||||
|
||||
//未发货的商品库存调整,如果订单未发货或者部分发货,并且用户未收到商品的情况下,需要解冻冻结库存
|
||||
if ((orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.No ||
|
||||
orderInfo.shipStatus == (int)GlobalEnumVars.OrderShipStatus.PartialYes) &&
|
||||
type == (int)GlobalEnumVars.BillAftersalesIsReceive.Refund &&
|
||||
(billAftersalesItems != null && billAftersalesItems.Count > 0))
|
||||
{
|
||||
//未发货商品解冻库存
|
||||
foreach (var item in billAftersalesItems)
|
||||
{
|
||||
goodsServices.ChangeStock(item.productId, GlobalEnumVars.OrderChangeStockType.refund.ToString(), item.nums);
|
||||
}
|
||||
}
|
||||
|
||||
//如果订单是已完成,但是订单的未发货商品还有的话,需要解冻库存
|
||||
if (orderInfo.status == (int)GlobalEnumVars.OrderStatus.Complete)
|
||||
{
|
||||
foreach (var item in orderInfo.items)
|
||||
{
|
||||
var nums = item.nums - item.sendNums - (item.reshipNums - item.reshipedNums);//还未发货的数量
|
||||
if (nums > 0)
|
||||
{
|
||||
goodsServices.ChangeStock(item.productId, GlobalEnumVars.OrderChangeStockType.refund.ToString(), nums);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//更新状态
|
||||
await orderServices.UpdateAsync(
|
||||
p => new CoreCmsOrder() { status = orderInfo.status, payStatus = orderInfo.payStatus },
|
||||
p => p.orderId == orderInfo.orderId && p.status == (int)GlobalEnumVars.OrderStatus.Normal);
|
||||
}
|
||||
|
||||
//售后单审核过后的事件处理
|
||||
if (status == (int)GlobalEnumVars.BillAftersalesStatus.Success)
|
||||
{
|
||||
//售后审核通过后处理
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.AfterSalesReview, aftersalesId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
orderInfo.addAftersalesStatus = true;
|
||||
orderInfo.billAftersalesId = aftersalesId;
|
||||
orderInfo.mark = mark;
|
||||
|
||||
//发送售后审核消息
|
||||
await _messageCenterServices.SendMessage(info.userId, GlobalEnumVars.PlatformMessageTypes.AfterSalesPass.ToString(), JObject.FromObject(orderInfo));
|
||||
|
||||
jm.status = true;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 后端进行审核的时候,前置操作,1取出页面的数据,2在提交过来的表单的时候,进行
|
||||
|
||||
/// <summary>
|
||||
/// 后端进行审核的时候,前置操作,1取出页面的数据,2在提交过来的表单的时候,进行校验
|
||||
/// </summary>
|
||||
/// <param name="aftersalesId"></param>
|
||||
/// <returns></return>
|
||||
public async Task<WebApiCallBack> PreAudit(string aftersalesId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
|
||||
var imagesServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesImagesServices>();
|
||||
var itemServices = container.ServiceProvider.GetService<ICoreCmsBillAftersalesItemServices>();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var model = await _dal.QueryByIdAsync(aftersalesId);
|
||||
|
||||
var userModel = await userServices.QueryByClauseAsync(p => p.id == model.userId);
|
||||
model.userNickName = userModel != null ? userModel.nickName : "";
|
||||
model.statusName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BillAftersalesStatus>(model.status);
|
||||
model.images = await imagesServices.QueryListByClauseAsync(p => p.aftersalesId == model.aftersalesId);
|
||||
model.items = await itemServices.QueryListByClauseAsync(p => p.aftersalesId == model.aftersalesId);
|
||||
|
||||
//获取订单信息
|
||||
var orderResult = await orderServices.GetOrderInfoByOrderId(model.orderId, model.userId, 2);
|
||||
|
||||
if (orderResult.status)
|
||||
{
|
||||
model.order = orderResult.data as CoreCmsOrder;
|
||||
|
||||
//订单上的退款金额和数量只包含已经售后的,这里要把当次售后单的商品信息保存到订单
|
||||
foreach (var orderItem in model.order.items)
|
||||
{
|
||||
orderItem.promotionList = string.Empty;
|
||||
orderItem.atPresentReshipNums = 0;
|
||||
foreach (var it in model.items)
|
||||
{
|
||||
if (orderItem.id == it.orderItemsId)
|
||||
{
|
||||
orderItem.atPresentReshipNums = it.nums;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = model;
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
34
CoreCms.Net.Services/Bill/CoreCmsBillDeliveryItemServices.cs
Normal file
34
CoreCms.Net.Services/Bill/CoreCmsBillDeliveryItemServices.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 发货单详情表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillDeliveryItemServices : BaseServices<CoreCmsBillDeliveryItem>,
|
||||
ICoreCmsBillDeliveryItemServices
|
||||
{
|
||||
private readonly ICoreCmsBillDeliveryItemRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsBillDeliveryItemServices(IUnitOfWork unitOfWork, ICoreCmsBillDeliveryItemRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
540
CoreCms.Net.Services/Bill/CoreCmsBillDeliveryServices.cs
Normal file
540
CoreCms.Net.Services/Bill/CoreCmsBillDeliveryServices.cs
Normal file
@@ -0,0 +1,540 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
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.ViewModels.Api;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Flurl.Http;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 发货单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillDeliveryServices : BaseServices<CoreCmsBillDelivery>, ICoreCmsBillDeliveryServices
|
||||
{
|
||||
private readonly ICoreCmsBillDeliveryRepository _dal;
|
||||
private readonly ICoreCmsStoreServices _storeServices;
|
||||
private readonly ICoreCmsBillDeliveryItemServices _billDeliveryItemServices;
|
||||
private readonly ICoreCmsOrderLogServices _orderLogServices;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IRedisOperationRepository _redisOperationRepository;
|
||||
|
||||
|
||||
|
||||
public CoreCmsBillDeliveryServices(
|
||||
IUnitOfWork unitOfWork,
|
||||
IServiceProvider serviceProvider
|
||||
, ICoreCmsBillDeliveryRepository dal
|
||||
, ICoreCmsStoreServices storeServices
|
||||
, ICoreCmsBillDeliveryItemServices billDeliveryItemServices
|
||||
, ICoreCmsOrderLogServices orderLogServices
|
||||
, ICoreCmsSettingServices settingServices, IRedisOperationRepository redisOperationRepository)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
_storeServices = storeServices;
|
||||
_billDeliveryItemServices = billDeliveryItemServices;
|
||||
_orderLogServices = orderLogServices;
|
||||
_settingServices = settingServices;
|
||||
_redisOperationRepository = redisOperationRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量发货,可以支持多个订单合并发货,单个订单拆分发货等。
|
||||
/// </summary>
|
||||
/// <param name="orderId">英文逗号分隔的订单号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> BatchShip(string[] orderId, string logiCode, string logiNo, Dictionary<int, int> items, int storeId = 0, string shipName = "", string shipMobile = "", int shipAreaId = 0, string shipAddress = "", string memo = "")
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var orderService = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var stockServices = container.ServiceProvider.GetService<ICoreCmsStockServices>();
|
||||
//获取订单详情
|
||||
var dInfoResult = await orderService.GetOrderShipInfo(orderId);
|
||||
if (!dInfoResult.status)
|
||||
{
|
||||
return dInfoResult;
|
||||
}
|
||||
var dInfo = dInfoResult.data as AdminOrderShipResult;
|
||||
var orders = dInfo.orders;
|
||||
|
||||
//校验门店自提和普通订单收货地址是否填写
|
||||
if (storeId != 0)
|
||||
{
|
||||
var storeModel = await _storeServices.QueryByIdAsync(storeId);
|
||||
if (storeModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
jm.data = 1000;
|
||||
jm.code = 1000;
|
||||
return jm;
|
||||
}
|
||||
shipName = storeModel.storeName;
|
||||
shipMobile = storeModel.mobile;
|
||||
shipAreaId = storeModel.areaId;
|
||||
shipAddress = storeModel.address;
|
||||
}
|
||||
if (string.IsNullOrEmpty(shipName) || string.IsNullOrEmpty(shipMobile) || string.IsNullOrEmpty(shipAddress) || shipAreaId == 0)
|
||||
{
|
||||
jm.msg = "收货地址信息不全";
|
||||
jm.otherData = new
|
||||
{
|
||||
shipName,
|
||||
shipMobile,
|
||||
shipAddress,
|
||||
shipAreaId
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
var billDelivery = new CoreCmsBillDelivery();
|
||||
billDelivery.orderId = string.Join(",", orderId);
|
||||
billDelivery.deliveryId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.发货单编号);
|
||||
billDelivery.logiCode = logiCode;
|
||||
billDelivery.logiNo = logiNo;
|
||||
billDelivery.shipAreaId = shipAreaId;
|
||||
billDelivery.shipAddress = shipAddress;
|
||||
billDelivery.shipName = shipName;
|
||||
billDelivery.shipMobile = shipMobile;
|
||||
billDelivery.status = (int)GlobalEnumVars.BillDeliveryStatus.Already;
|
||||
billDelivery.memo = memo;
|
||||
billDelivery.createTime = DateTime.Now;
|
||||
|
||||
|
||||
//设置发货明细
|
||||
var bdRel = new List<CoreCmsBillDeliveryItem>();
|
||||
|
||||
//校验发货内容
|
||||
var tNum = 0;
|
||||
foreach (var item in items)
|
||||
{
|
||||
var orderItem = dInfo.items.Find(p => p.productId == item.Key);
|
||||
if (orderItem == null)
|
||||
{
|
||||
//发货的商品不在发货明细里,肯定有问题
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
//判断总发货数量
|
||||
tNum = tNum + item.Value;
|
||||
|
||||
if ((orderItem.nums - orderItem.sendNums - (orderItem.reshipNums - orderItem.reshipedNums)) < item.Value)
|
||||
{
|
||||
jm.msg = orderItem.name + "发超了";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//构建发货单明细
|
||||
var bdItem = new CoreCmsBillDeliveryItem();
|
||||
bdItem.deliveryId = billDelivery.deliveryId;
|
||||
bdItem.productId = orderItem.productId;
|
||||
bdItem.goodsId = orderItem.goodsId;
|
||||
bdItem.bn = orderItem.bn;
|
||||
bdItem.sn = orderItem.sn;
|
||||
bdItem.weight = orderItem.weight;
|
||||
bdItem.name = orderItem.name;
|
||||
bdItem.addon = !string.IsNullOrEmpty(orderItem.addon) ? orderItem.addon : "";
|
||||
bdItem.nums = item.Value;
|
||||
bdRel.Add(bdItem);
|
||||
}
|
||||
if (tNum < 1)
|
||||
{
|
||||
jm.msg = "请至少发生一件商品!";
|
||||
return jm;
|
||||
}
|
||||
//事务处理开始
|
||||
|
||||
|
||||
//插入发货单主体表
|
||||
await _dal.InsertAsync(billDelivery);
|
||||
|
||||
//插入发货单明细表
|
||||
await _billDeliveryItemServices.InsertAsync(bdRel);
|
||||
|
||||
//订单更新发货状态,发送各种消息
|
||||
foreach (var order in orders)
|
||||
{
|
||||
await OrderShip(order, items, billDelivery, storeId);
|
||||
}
|
||||
|
||||
var stock = new CoreCmsStock
|
||||
{
|
||||
manager = 0,
|
||||
id = billDelivery.deliveryId,
|
||||
createTime = DateTime.Now,
|
||||
type = (int)GlobalEnumVars.StockType.DeliverGoods,
|
||||
memo = "订单发货操作,发货单号:" + billDelivery.deliveryId
|
||||
};
|
||||
|
||||
await stockServices.InsertAsync(stock);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "发货成功";
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发货,单个订单发货
|
||||
/// </summary>
|
||||
/// <param name="orderId">英文逗号分隔的订单号</param>
|
||||
/// <param name="logiCode">物流公司编码</param>
|
||||
/// <param name="logiNo">物流单号</param>
|
||||
/// <param name="items">发货明细</param>
|
||||
/// <param name="storeId">店铺收货地址</param>
|
||||
/// <param name="shipName">收货人姓名</param>
|
||||
/// <param name="shipMobile">收货人电话</param>
|
||||
/// <param name="shipAreaId">省市区id</param>
|
||||
/// <param name="shipAddress">收货地址</param>
|
||||
/// <param name="memo">发货描述</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Ship(string orderId, string logiCode, string logiNo, Dictionary<int, int> items, int storeId = 0, string shipName = "", string shipMobile = "", int shipAreaId = 0, string shipAddress = "", string memo = "")
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var orderService = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var stockServices = container.ServiceProvider.GetService<ICoreCmsStockServices>();
|
||||
|
||||
//获取订单详情
|
||||
var dInfoResult = await orderService.GetOrderShipInfo(orderId);
|
||||
if (!dInfoResult.status)
|
||||
{
|
||||
return dInfoResult;
|
||||
}
|
||||
var dInfo = dInfoResult.data as AdminOrderShipOneResult;
|
||||
var orderInfo = dInfo.orderInfo;
|
||||
|
||||
//校验门店自提和普通订单收货地址是否填写
|
||||
if (storeId != 0)
|
||||
{
|
||||
var storeModel = await _storeServices.QueryByIdAsync(storeId);
|
||||
if (storeModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
jm.data = 1000;
|
||||
jm.code = 1000;
|
||||
return jm;
|
||||
}
|
||||
shipName = storeModel.storeName;
|
||||
shipMobile = storeModel.mobile;
|
||||
shipAreaId = storeModel.areaId;
|
||||
shipAddress = storeModel.address;
|
||||
}
|
||||
if (string.IsNullOrEmpty(shipName) || string.IsNullOrEmpty(shipMobile) || string.IsNullOrEmpty(shipAddress) || shipAreaId == 0)
|
||||
{
|
||||
jm.msg = "收货地址信息不全";
|
||||
jm.otherData = new
|
||||
{
|
||||
shipName,
|
||||
shipMobile,
|
||||
shipAddress,
|
||||
shipAreaId
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
var billDelivery = new CoreCmsBillDelivery();
|
||||
billDelivery.orderId = string.Join(",", orderId);
|
||||
billDelivery.deliveryId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.发货单编号);
|
||||
billDelivery.logiCode = logiCode;
|
||||
billDelivery.logiNo = logiNo;
|
||||
billDelivery.shipAreaId = shipAreaId;
|
||||
billDelivery.shipAddress = shipAddress;
|
||||
billDelivery.shipName = shipName;
|
||||
billDelivery.shipMobile = shipMobile;
|
||||
billDelivery.status = (int)GlobalEnumVars.BillDeliveryStatus.Already;
|
||||
billDelivery.memo = memo;
|
||||
billDelivery.createTime = DateTime.Now;
|
||||
|
||||
|
||||
//设置发货明细
|
||||
var bdRel = new List<CoreCmsBillDeliveryItem>();
|
||||
|
||||
//校验发货内容
|
||||
var tNum = 0;
|
||||
foreach (var item in items)
|
||||
{
|
||||
var orderItem = dInfo.items.Find(p => p.productId == item.Key);
|
||||
if (orderItem == null)
|
||||
{
|
||||
//发货的商品不在发货明细里,肯定有问题
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
//判断总发货数量
|
||||
tNum = tNum + item.Value;
|
||||
|
||||
if ((orderItem.nums - orderItem.sendNums - (orderItem.reshipNums - orderItem.reshipedNums)) < item.Value)
|
||||
{
|
||||
jm.msg = orderItem.name + "发超了";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//构建发货单明细
|
||||
var bdItem = new CoreCmsBillDeliveryItem();
|
||||
bdItem.deliveryId = billDelivery.deliveryId;
|
||||
bdItem.productId = orderItem.productId;
|
||||
bdItem.goodsId = orderItem.goodsId;
|
||||
bdItem.bn = orderItem.bn;
|
||||
bdItem.sn = orderItem.sn;
|
||||
bdItem.weight = orderItem.weight;
|
||||
bdItem.name = orderItem.name;
|
||||
bdItem.addon = !string.IsNullOrEmpty(orderItem.addon) ? orderItem.addon : "";
|
||||
bdItem.nums = item.Value;
|
||||
bdRel.Add(bdItem);
|
||||
}
|
||||
if (tNum < 1)
|
||||
{
|
||||
jm.msg = "请至少发生一件商品!";
|
||||
return jm;
|
||||
}
|
||||
//事务处理开始
|
||||
|
||||
|
||||
//插入发货单主体表
|
||||
await _dal.InsertAsync(billDelivery);
|
||||
|
||||
//插入发货单明细表
|
||||
await _billDeliveryItemServices.InsertAsync(bdRel);
|
||||
|
||||
//订单更新发货状态,发送各种消息
|
||||
await OrderShip(orderInfo, items, billDelivery, storeId);
|
||||
|
||||
var stock = new CoreCmsStock
|
||||
{
|
||||
manager = 0,
|
||||
id = billDelivery.deliveryId,
|
||||
createTime = DateTime.Now,
|
||||
type = (int)GlobalEnumVars.StockType.DeliverGoods,
|
||||
memo = "订单发货操作,发货单号:" + billDelivery.deliveryId
|
||||
};
|
||||
|
||||
await stockServices.InsertAsync(stock);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "发货成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 给订单发货
|
||||
/// </summary>
|
||||
/// <param name="orderInfo">订单信息</param>
|
||||
/// <param name="items">总的发货包裹内容</param>
|
||||
/// <param name="deliveryInfo">发货单信息</param>
|
||||
/// <param name="storeId">门店自提还是普通订单,0是普通订单,其他是门店自提</param>
|
||||
private async Task<bool> OrderShip(CoreCmsOrder orderInfo, Dictionary<int, int> items, CoreCmsBillDelivery deliveryInfo, int storeId = 0)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderService = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var billLadingService = container.ServiceProvider.GetService<ICoreCmsBillLadingServices>();
|
||||
var messageCenterServices = container.ServiceProvider.GetService<ICoreCmsMessageCenterServices>();
|
||||
var logisticsServices = container.ServiceProvider.GetService<ICoreCmsLogisticsServices>();
|
||||
var stockLogServices = container.ServiceProvider.GetService<ICoreCmsStockLogServices>();
|
||||
var stockServices = container.ServiceProvider.GetService<ICoreCmsStockServices>();
|
||||
|
||||
var stockLogs = new List<CoreCmsStockLog>();
|
||||
|
||||
var itemList = new Dictionary<int, int>();
|
||||
foreach (var item in orderInfo.items)
|
||||
{
|
||||
if (items.ContainsKey(item.productId))
|
||||
{
|
||||
var maxNum = item.nums - item.reshipNums - item.sendNums;
|
||||
if (maxNum > 0) //如果此条订单明细需要发货的话
|
||||
{
|
||||
var sendNum = maxNum;
|
||||
if (items[item.productId] > maxNum)
|
||||
{
|
||||
//足够发此条记录的话
|
||||
itemList.Add(item.productId, maxNum);
|
||||
items[item.productId] = items[item.productId] - maxNum;
|
||||
}
|
||||
else
|
||||
{
|
||||
//此条订单都发不满的情况下
|
||||
itemList.Add(item.productId, items[item.productId]);
|
||||
sendNum = items[item.productId];
|
||||
}
|
||||
|
||||
var sLog = new CoreCmsStockLog
|
||||
{
|
||||
stockId = deliveryInfo.deliveryId,
|
||||
productId = item.id,
|
||||
goodsId = item.goodsId,
|
||||
nums = -sendNum,
|
||||
sn = item.sn,
|
||||
bn = item.bn,
|
||||
goodsName = item.name,
|
||||
spesDesc = item.addon
|
||||
};
|
||||
stockLogs.Add(sLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
//如果有发货信息,就去给订单更新发货状态
|
||||
if (itemList.Keys.Count <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var res = await orderService.EditShipStatus(orderInfo.orderId, itemList);
|
||||
|
||||
//如果是门店自提,生成提货单
|
||||
if (storeId != 0)
|
||||
{
|
||||
await billLadingService.AddData(orderInfo.orderId, storeId, orderInfo.shipName, orderInfo.shipMobile);
|
||||
}
|
||||
|
||||
if (res.status == true)
|
||||
{
|
||||
//添加操作日志
|
||||
var log = new CoreCmsOrderLog();
|
||||
log.orderId = orderInfo.orderId;
|
||||
log.userId = orderInfo.userId;
|
||||
log.type = (int)GlobalEnumVars.OrderLogTypes.LOG_TYPE_SHIP;
|
||||
log.msg = "订单发货操作,发货单号:" + deliveryInfo.deliveryId;
|
||||
log.data = JsonConvert.SerializeObject(deliveryInfo);
|
||||
log.createTime = DateTime.Now;
|
||||
await _orderLogServices.InsertAsync(log);
|
||||
|
||||
var logistics = await logisticsServices.QueryByClauseAsync(p => p.logiCode == deliveryInfo.logiCode);
|
||||
deliveryInfo.logiName = logistics != null ? logistics.logiName : deliveryInfo.logiCode;
|
||||
//添加库存出库日志
|
||||
|
||||
if (stockLogs.Any())
|
||||
{
|
||||
//var stock = new CoreCmsStock
|
||||
//{
|
||||
// manager = 0,
|
||||
// id = deliveryInfo.deliveryId,
|
||||
// createTime = DateTime.Now,
|
||||
// type = (int)GlobalEnumVars.StockType.DeliverGoods,
|
||||
// memo = log.msg
|
||||
//};
|
||||
//await stockServices.InsertAsync(stock);
|
||||
await stockLogServices.InsertAsync(stockLogs);
|
||||
}
|
||||
|
||||
//发送消息
|
||||
await messageCenterServices.SendMessage(orderInfo.userId, GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString(), JObject.FromObject(deliveryInfo));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 物流信息查询根据快递编码和单号查询(快递100)未使用
|
||||
/// </summary>
|
||||
/// <param name="code">查询的快递公司的编码, 一律用小写字母(如:yuantong)</param>
|
||||
/// <param name="no">查询的快递单号, 单号的最大长度是32个字符</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetLogistic(string code, string no)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//快递100分配给贵司的的公司编号, 请在企业管理后台查看
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var customer = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.Kuaidi100Customer);
|
||||
//签名, 用于验证身份, 按param + key + customer 的顺序进行MD5加密(注意加密后字符串一定要转大写), 不需要加上“+”号, 如{“com”: “yuantong”, “num”: “500306190180”, “from”: “广东省深圳市”, “to”: “北京市朝阳区”}xxxxxxxxxxxxyyyyyyyyyyy yyyyyyyyyyyyyyyyyyyyy
|
||||
var key = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.Kuaidi100Key);
|
||||
|
||||
if (string.IsNullOrEmpty(customer) || string.IsNullOrEmpty(key))
|
||||
{
|
||||
jm.msg = "快递查询接口公司编码及授权key获取失败";
|
||||
}
|
||||
|
||||
var param = new KuaiDi100ApiPostParam();
|
||||
param.com = code.ToLowerInvariant();
|
||||
param.num = no;
|
||||
param.phone = "";
|
||||
param.from = "";
|
||||
param.to = "";
|
||||
param.resultv2 = 1;
|
||||
var jsonParamData = JsonConvert.SerializeObject(param);
|
||||
|
||||
//签名加密
|
||||
var str = jsonParamData + key + customer;
|
||||
var signStr = CommonHelper.Md5For32(str).ToUpper();
|
||||
//实时查询请求地址
|
||||
var postUrl = "http://poll.kuaidi100.com/poll/query.do";
|
||||
|
||||
var postData = new
|
||||
{
|
||||
customer,
|
||||
param = jsonParamData,
|
||||
sign = signStr
|
||||
};
|
||||
|
||||
var result = await postUrl.PostUrlEncodedAsync(postData).ReceiveJson<KuaiDi100ApiPostResult>();
|
||||
if (result.status == "200")
|
||||
{
|
||||
jm.status = true;
|
||||
jm.data = result;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = !string.IsNullOrEmpty(result.message) ? result.message : "暂无消息";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发货单统计7天统计
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<StatisticsOut>> Statistics()
|
||||
{
|
||||
return await _dal.Statistics();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
242
CoreCms.Net.Services/Bill/CoreCmsBillLadingServices.cs
Normal file
242
CoreCms.Net.Services/Bill/CoreCmsBillLadingServices.cs
Normal file
@@ -0,0 +1,242 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 提货单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillLadingServices : BaseServices<CoreCmsBillLading>, ICoreCmsBillLadingServices
|
||||
{
|
||||
private readonly ICoreCmsBillLadingRepository _dal;
|
||||
private readonly ICoreCmsClerkRepository _clerkRepository;
|
||||
private readonly ICoreCmsStoreRepository _storeRepository;
|
||||
private readonly ICoreCmsOrderItemRepository _orderItemRepository;
|
||||
private readonly ICoreCmsUserRepository _userRepository;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsBillLadingServices(IUnitOfWork unitOfWork, ICoreCmsBillLadingRepository dal, ICoreCmsClerkRepository clerkRepository, ICoreCmsStoreRepository storeRepository, ICoreCmsOrderItemRepository orderItemRepository, ICoreCmsUserRepository userRepository)
|
||||
{
|
||||
this._dal = dal;
|
||||
_clerkRepository = clerkRepository;
|
||||
_storeRepository = storeRepository;
|
||||
_orderItemRepository = orderItemRepository;
|
||||
_userRepository = userRepository;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 添加提货单
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(string orderId, int storeId, string name, string mobile)
|
||||
{
|
||||
return await _dal.AddData(orderId, storeId, name, mobile);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 核销提货单
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> LadingOperating(string[] ids, int userId = 0)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var list = await _dal.QueryListByClauseAsync(p => ids.Contains(p.id));
|
||||
if (list.Any())
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
item.clerkId = userId;
|
||||
item.pickUpTime = DateTime.Now;
|
||||
item.status = true;
|
||||
}
|
||||
|
||||
var outChanges = await _dal.UpdateAsync(list);
|
||||
jm.code = outChanges ? 0 : 1;
|
||||
jm.msg = outChanges ? "操作成功" : "操作失败";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "没有可提货的订单";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取店铺提货单列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetStoreLadingList(int userId, int page, int limit)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var clerks = await _clerkRepository.QueryListByClauseAsync(p => p.userId == userId);
|
||||
var storeIds = clerks.Select(p => p.storeId).ToList();
|
||||
var ladingList = await _dal.QueryPageAsync(p => storeIds.Contains(p.storeId) && p.isDel == false, p => p.status, OrderByType.Asc, page, limit);
|
||||
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "获取成功";
|
||||
jm.data = ladingList;
|
||||
jm.otherData = new
|
||||
{
|
||||
ladingList.TotalCount,
|
||||
ladingList.TotalPages
|
||||
};
|
||||
|
||||
if (ladingList.Any())
|
||||
{
|
||||
var storeModel = await _storeRepository.QueryAsync();
|
||||
|
||||
foreach (var item in ladingList)
|
||||
{
|
||||
item.orderItems = await _orderItemRepository.QueryListByClauseAsync(p => p.orderId == item.orderId);
|
||||
item.storeName = storeModel.FirstOrDefault(p => p.id == item.storeId)?.storeName;
|
||||
var statusInt = item.status
|
||||
? (int)GlobalEnumVars.BillLadingStatus.Recharge
|
||||
: (int)GlobalEnumVars.BillLadingStatus.Order;
|
||||
item.statusName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BillLadingStatus>(statusInt);
|
||||
}
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除提货单(软删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> LadingDelete(string id, int userId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var model = await _dal.QueryByClauseAsync(p => p.id == id);
|
||||
if (model != null)
|
||||
{
|
||||
if (model.status == false)
|
||||
{
|
||||
jm.msg = "未提货的提货单不能删除";
|
||||
return jm;
|
||||
}
|
||||
if (userId > 0)
|
||||
{
|
||||
var clerks = await _clerkRepository.ExistsAsync(p => p.userId == userId && p.storeId == model.storeId);
|
||||
if (!clerks)
|
||||
{
|
||||
jm.msg = "你无权删除该提货单";
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
model.isDel = true;
|
||||
model.updateTime = DateTime.Now;
|
||||
var bl = await _dal.UpdateAsync(model);
|
||||
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "删除成功" : "删除失败";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "未找到提货单";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取提货单详情
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetInfo(string id, int userId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var list = await _dal.QueryListByClauseAsync(p => p.id == id || p.orderId == id || p.mobile == id);
|
||||
var data = new List<CoreCmsBillLading>();
|
||||
if (list != null)
|
||||
{
|
||||
if (userId > 0)
|
||||
{
|
||||
var clerks = await _clerkRepository.QueryListByClauseAsync(p => p.userId == userId);
|
||||
if (clerks != null && clerks.Any())
|
||||
{
|
||||
var storeIds = clerks.Select(p => p.storeId).ToList();
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (storeIds.Contains(item.storeId))
|
||||
{
|
||||
data.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (var item in data)
|
||||
{
|
||||
var statusInt = item.status
|
||||
? (int)GlobalEnumVars.BillLadingStatus.Recharge
|
||||
: (int)GlobalEnumVars.BillLadingStatus.Order;
|
||||
item.statusName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BillLadingStatus>(statusInt);
|
||||
if (item.clerkId > 0)
|
||||
{
|
||||
var userInfo = await _userRepository.QueryByClauseAsync(p => p.id == userId);
|
||||
if (userInfo != null)
|
||||
{
|
||||
item.clerkIdName = !string.IsNullOrEmpty(userInfo.nickName)
|
||||
? userInfo.nickName + "(" + userInfo.mobile + ")"
|
||||
: UserHelper.FormatMobile(userInfo.mobile) + "(" + userInfo.mobile + ")";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item.clerkIdName = item.status ? "(后台管理员)" : "";
|
||||
}
|
||||
item.orderItems = await _orderItemRepository.QueryListByClauseAsync(p => p.orderId == item.orderId);
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "获取成功";
|
||||
jm.data = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "提货单不存在";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
839
CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs
Normal file
839
CoreCms.Net.Services/Bill/CoreCmsBillPaymentsServices.cs
Normal file
@@ -0,0 +1,839 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using CoreCms.Net.WeChat.Service.Options;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 支付单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillPaymentsServices : BaseServices<CoreCmsBillPayments>, ICoreCmsBillPaymentsServices
|
||||
{
|
||||
private readonly ICoreCmsBillPaymentsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly ICoreCmsUserBalanceServices _userBalanceServices;
|
||||
private readonly ICoreCmsFormSubmitServices _formSubmitServices;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
//private IWeChatPayServices _weChatPayServices;
|
||||
private readonly ICoreCmsPaymentsServices _paymentsServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
private readonly ICoreCmsServicesServices _servicesServices;
|
||||
private readonly ICoreCmsUserServicesOrderServices _userServicesOrderServices;
|
||||
private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices;
|
||||
private readonly WeChatOptions _weChatOptions;
|
||||
|
||||
|
||||
|
||||
|
||||
public CoreCmsBillPaymentsServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsBillPaymentsRepository dal
|
||||
, ICoreCmsSettingServices settingServices
|
||||
, IHttpContextAccessor httpContextAccessor
|
||||
, ICoreCmsUserBalanceServices userBalanceServices
|
||||
, ICoreCmsFormSubmitServices formSubmitServices
|
||||
//, IWeChatPayServices weChatPayServices
|
||||
, ICoreCmsPaymentsServices paymentsServices
|
||||
, ICoreCmsOrderItemServices orderItemServices
|
||||
, IServiceProvider serviceProvider, ICoreCmsServicesServices servicesServices
|
||||
, ICoreCmsUserServicesOrderServices userServicesOrderServices
|
||||
, ICoreCmsUserWeChatInfoServices userWeChatInfoServices
|
||||
, IOptions<WeChatOptions> weChatOptions
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_settingServices = settingServices;
|
||||
_userBalanceServices = userBalanceServices;
|
||||
_formSubmitServices = formSubmitServices;
|
||||
//_weChatPayServices = weChatPayServices;
|
||||
_formSubmitServices = formSubmitServices;
|
||||
_paymentsServices = paymentsServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
_serviceProvider = serviceProvider;
|
||||
_servicesServices = servicesServices;
|
||||
_userServicesOrderServices = userServicesOrderServices;
|
||||
_userWeChatInfoServices = userWeChatInfoServices;
|
||||
_weChatOptions = weChatOptions.Value;
|
||||
}
|
||||
|
||||
#region 生成支付单的时候,格式化支付单明细
|
||||
|
||||
/// <summary>
|
||||
/// 生成支付单的时候,格式化支付单明细
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="params"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> FormatPaymentRel(string orderId, int type, JObject @params)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var dto = new CheckPayDTO();
|
||||
|
||||
//订单
|
||||
if (type == (int)GlobalEnumVars.BillPaymentsType.Order)
|
||||
{
|
||||
//如果是订单生成支付单的话,取第一条订单的店铺id,后面的所有订单都要保证是此店铺的id
|
||||
var orderModel = await orderServices.QueryByClauseAsync(p =>
|
||||
p.orderId == orderId && p.payStatus == (int)GlobalEnumVars.OrderPayStatus.No &&
|
||||
p.status == (int)GlobalEnumVars.OrderStatus.Normal);
|
||||
if (orderModel != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = orderId,
|
||||
money = orderModel.orderAmount
|
||||
});
|
||||
dto.money += orderModel.orderAmount;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + orderId + "没有找到,或不是未支付状态";
|
||||
return jm;
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
|
||||
}
|
||||
//充值
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.Recharge)
|
||||
{
|
||||
if (@params != null && @params.ContainsKey("money"))
|
||||
{
|
||||
dto.money = @params["money"].ObjectToDecimal(0); //充值金额
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "请输入正确的充值金额";
|
||||
return jm;
|
||||
}
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = orderId,
|
||||
money = dto.money
|
||||
});
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
//表单
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.FormPay || type == (int)GlobalEnumVars.BillPaymentsType.FormOrder)
|
||||
{
|
||||
dto.money = 0;
|
||||
var intId = orderId.ObjectToInt(0);
|
||||
if (intId <= 0)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "表单:" + intId + "没有找到,或不是未支付状态";
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
var formInfo = await _formSubmitServices.QueryByClauseAsync(p => p.id == intId && p.payStatus == false);
|
||||
if (formInfo != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = intId.ToString(),
|
||||
money = formInfo.money
|
||||
});
|
||||
dto.money += formInfo.money;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "表单:" + intId + "没有找到,或不是未支付状态";
|
||||
return jm;
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.ServiceOrder)
|
||||
{
|
||||
dto.money = 0;
|
||||
|
||||
var order = await _userServicesOrderServices.QueryByClauseAsync(p => p.serviceOrderId == orderId);
|
||||
|
||||
var dt = DateTime.Now;
|
||||
var where = PredicateBuilder.True<CoreCmsServices>();
|
||||
@where = @where.And(p => p.status == (int)GlobalEnumVars.ServicesStatus.Shelve);
|
||||
@where = @where.And(p => p.amount > 0);
|
||||
@where = @where.And(p => p.startTime < dt && p.endTime > dt);
|
||||
@where = @where.And(p => p.id == order.servicesId);
|
||||
|
||||
var serviceInfo = await _servicesServices.QueryByClauseAsync(@where);
|
||||
if (serviceInfo != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = orderId,
|
||||
money = serviceInfo.money
|
||||
});
|
||||
dto.money += serviceInfo.money;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "服务订单:" + orderId + "没有找到,或不是有效状态";
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
|
||||
else if (false)
|
||||
{
|
||||
//todo 其他业务逻辑
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = GlobalErrorCodeVars.Code10054;
|
||||
jm.data = 10054;
|
||||
return jm;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 生成支付单的时候,格式化支付单明细
|
||||
|
||||
/// <summary>
|
||||
/// 生成支付单的时候,格式化支付单明细
|
||||
/// </summary>
|
||||
/// <param name="sourceStr"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="params"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> BatchFormatPaymentRel(string[] sourceStr, int type, JObject @params)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
var dto = new CheckPayDTO();
|
||||
|
||||
//订单
|
||||
if (type == (int)GlobalEnumVars.BillPaymentsType.Order)
|
||||
{
|
||||
//如果是订单生成支付单的话,取第一条订单的店铺id,后面的所有订单都要保证是此店铺的id
|
||||
foreach (var item in sourceStr)
|
||||
{
|
||||
var orderModel = await orderServices.QueryByClauseAsync(p =>
|
||||
p.orderId == item && p.payStatus == (int)GlobalEnumVars.OrderPayStatus.No &&
|
||||
p.status == (int)GlobalEnumVars.OrderStatus.Normal);
|
||||
if (orderModel != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = item,
|
||||
money = orderModel.orderAmount
|
||||
});
|
||||
dto.money += orderModel.orderAmount;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "订单号:" + item + "没有找到,或不是未支付状态";
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
//充值
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.Recharge)
|
||||
{
|
||||
if (@params != null && @params.ContainsKey("money"))
|
||||
{
|
||||
dto.money = @params["money"].ObjectToDecimal(0); //充值金额
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "请输入正确的充值金额";
|
||||
return jm;
|
||||
}
|
||||
foreach (var item in sourceStr)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = item,
|
||||
money = dto.money
|
||||
});
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
//表单
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.FormPay || type == (int)GlobalEnumVars.BillPaymentsType.FormOrder)
|
||||
{
|
||||
dto.money = 0;
|
||||
var intIds = CommonHelper.StringArrAyToIntArray(sourceStr);
|
||||
|
||||
foreach (var item in intIds)
|
||||
{
|
||||
var formInfo = await _formSubmitServices.QueryByClauseAsync(p => p.id == item && p.payStatus == false);
|
||||
if (formInfo != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = item.ToString(),
|
||||
money = formInfo.money
|
||||
});
|
||||
dto.money += formInfo.money;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "表单:" + item + "没有找到,或不是未支付状态";
|
||||
return jm;
|
||||
}
|
||||
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
else if (type == (int)GlobalEnumVars.BillPaymentsType.ServiceOrder)
|
||||
{
|
||||
dto.money = 0;
|
||||
|
||||
foreach (var item in sourceStr)
|
||||
{
|
||||
|
||||
var order = await _userServicesOrderServices.QueryByClauseAsync(p => p.serviceOrderId == item);
|
||||
|
||||
var dt = DateTime.Now;
|
||||
var where = PredicateBuilder.True<CoreCmsServices>();
|
||||
@where = @where.And(p => p.status == (int)GlobalEnumVars.ServicesStatus.Shelve);
|
||||
@where = @where.And(p => p.amount > 0);
|
||||
@where = @where.And(p => p.startTime < dt && p.endTime > dt);
|
||||
@where = @where.And(p => p.id == order.servicesId);
|
||||
|
||||
var serviceInfo = await _servicesServices.QueryByClauseAsync(@where);
|
||||
if (serviceInfo != null)
|
||||
{
|
||||
dto.rel.Add(new rel()
|
||||
{
|
||||
sourceId = item,
|
||||
money = serviceInfo.money
|
||||
});
|
||||
dto.money += serviceInfo.money;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "服务订单:" + item + "没有找到,或不是有效状态";
|
||||
return jm;
|
||||
}
|
||||
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
}
|
||||
|
||||
else if (false)
|
||||
{
|
||||
//todo 其他业务逻辑
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = GlobalErrorCodeVars.Code10054;
|
||||
jm.data = 10054;
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 支付,先生成支付单,然后去支付
|
||||
/// <summary>
|
||||
/// 支付,先生成支付单,然后去支付
|
||||
/// </summary>
|
||||
/// <param name="sourceStr">来源,一般是订单号或者用户id,比如充值</param>
|
||||
/// <param name="paymentCode">支付方式</param>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <param name="type">订单/充值/服务订单</param>
|
||||
/// <param name="params">支付的时候用到的参数,如果是微信支付的话,这里可以传trade_type=>'JSAPI'(小程序支付),或者'MWEB'(h5支付),当是JSPI的时候,可以不传其他参数了,默认就可以,默认的这个值就是JSAPI,如果是MWEB的话,需要传wap_url(网站url地址)参数和wap_name(网站名称)参数,其他支付方式需要传什么参数这个以后再说</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Pay(string sourceStr, string paymentCode, int userId, int type, JObject @params)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var weChatPayServices = container.ServiceProvider.GetService<IWeChatPayServices>();
|
||||
var aliPayServices = container.ServiceProvider.GetService<IAliPayServices>();
|
||||
var balancePayServices = container.ServiceProvider.GetService<IBalancePayServices>();
|
||||
var offlinePayServices = container.ServiceProvider.GetService<IOfflinePayServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//如果支付类型为余额充值,那么资源ID就是用户ID
|
||||
if (type == (int)GlobalEnumVars.BillPaymentsType.Recharge)
|
||||
{
|
||||
sourceStr = userId.ToString();
|
||||
}
|
||||
//判断支付方式是否开启
|
||||
var paymentInfo = await _paymentsServices.QueryByClauseAsync(p => p.code == paymentCode && p.isEnable == true);
|
||||
if (paymentInfo == null)
|
||||
{
|
||||
jm.data = jm.code = 10050;
|
||||
jm.msg = GlobalErrorCodeVars.Code10050;
|
||||
return jm;
|
||||
}
|
||||
//如果是公众号支付,并且没有登陆或者没有open_id的话,报错
|
||||
var res = await CheckOpenId(paymentCode, @params);
|
||||
if (res.status == false)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
//生成支付单,只是单纯的生成了支付单
|
||||
var result = await ToAdd(sourceStr, paymentCode, userId, type, @params);
|
||||
if (result.status == false)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var billPayments = result.data as CoreCmsBillPayments;
|
||||
//根据支付方式返回支付配置
|
||||
//微信支付
|
||||
if (paymentCode == GlobalEnumVars.PaymentsTypes.wechatpay.ToString())
|
||||
{
|
||||
jm = await weChatPayServices.PubPay(billPayments);
|
||||
}
|
||||
//支付宝支付
|
||||
else if (paymentCode == GlobalEnumVars.PaymentsTypes.alipay.ToString())
|
||||
{
|
||||
jm = aliPayServices.PubPay(billPayments);
|
||||
|
||||
}
|
||||
//余额支付
|
||||
else if (paymentCode == GlobalEnumVars.PaymentsTypes.balancepay.ToString())
|
||||
{
|
||||
jm = await balancePayServices.PubPay(billPayments);
|
||||
|
||||
}
|
||||
//线下支付
|
||||
else if (paymentCode == GlobalEnumVars.PaymentsTypes.offline.ToString())
|
||||
{
|
||||
jm = offlinePayServices.PubPay(billPayments);
|
||||
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 如果是公众号支付,并且没有登陆或者没有open_id的话,报错
|
||||
/// <summary>
|
||||
/// 如果是公众号支付,并且没有登陆或者没有open_id的话,报错
|
||||
/// </summary>
|
||||
/// <param name="paymentCode"></param>
|
||||
/// <param name="params"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<WebApiCallBack> CheckOpenId(string paymentCode, JObject jobj)
|
||||
{
|
||||
var jm = new WebApiCallBack { status = true };
|
||||
|
||||
//当只有微信支付的时候,才判断
|
||||
if (paymentCode != "wechatpay") return jm;
|
||||
|
||||
if (jobj != null)
|
||||
{
|
||||
//当只有公众号支付的时候,才判断
|
||||
if (jobj.ContainsKey("trade_type") && jobj["trade_type"].ObjectToString() == "JSAPI_OFFICIAL") return jm;
|
||||
if (jobj.ContainsKey("openid") && jobj["openid"].ObjectToString() != "") return jm;
|
||||
|
||||
//到这里基本上就说明
|
||||
if (!jobj.ContainsKey("url"))
|
||||
{
|
||||
jm.data = 10067;
|
||||
jm.code = 10067;
|
||||
jm.msg = GlobalErrorCodeVars.Code10067;
|
||||
return jm;
|
||||
}
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var wxOfficialAppid = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.WxOfficialAppid);
|
||||
var redirectUrl = CommonHelper.UrlEncode(jobj["url"].ObjectToString());
|
||||
|
||||
jm.status = false;
|
||||
jm.data = 10006;
|
||||
|
||||
jm.msg = $"https://open.weixin.qq.com/connect/oauth2/authorize?appid={_weChatOptions.WeiXinAppId}&redirect_uri={redirectUrl}&response_type={"code"}&scope={3}&state={"corecms"}{"&connect_redirect=1"}#wechat_redirect";
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 生成支付单,只是单纯的生成了支付单
|
||||
|
||||
/// <summary>
|
||||
/// 生成支付单,只是单纯的生成了支付单
|
||||
/// </summary>
|
||||
/// <param name="sourceStr">资源id字段</param>
|
||||
/// <param name="paymentCode">支付方式</param>
|
||||
/// <param name="userId">支付用户id</param>
|
||||
/// <param name="type">支付类型</param>
|
||||
/// <param name="params">参数</param>
|
||||
/// <returns></returns>
|
||||
private async Task<WebApiCallBack> ToAdd(string sourceStr, string paymentCode, int userId = 0, int type = (int)GlobalEnumVars.BillPaymentsType.Order, JObject @params = null)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//判断支付方式
|
||||
var paymentInfo = await _paymentsServices.QueryByClauseAsync(p => p.code == paymentCode && p.isEnable == true);
|
||||
if (paymentInfo == null)
|
||||
{
|
||||
jm.data = jm.code = 10050;
|
||||
jm.msg = GlobalErrorCodeVars.Code10050;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var paymentRelData = new CheckPayDTO();
|
||||
|
||||
var sourceStrArr = sourceStr.Split(",");
|
||||
if (sourceStrArr.Length > 0)
|
||||
{
|
||||
var paymentRel = await BatchFormatPaymentRel(sourceStrArr, type, @params);
|
||||
if (paymentRel.status == false)
|
||||
{
|
||||
return paymentRel;
|
||||
}
|
||||
paymentRelData = paymentRel.data as CheckPayDTO;
|
||||
}
|
||||
else
|
||||
{
|
||||
var paymentRel = await FormatPaymentRel(sourceStr, type, @params);
|
||||
if (paymentRel.status == false)
|
||||
{
|
||||
return paymentRel;
|
||||
}
|
||||
paymentRelData = paymentRel.data as CheckPayDTO;
|
||||
}
|
||||
|
||||
var billPayments = new CoreCmsBillPayments();
|
||||
billPayments.paymentId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.支付单编号);
|
||||
billPayments.sourceId = sourceStr;
|
||||
billPayments.money = paymentRelData.money;
|
||||
billPayments.userId = userId;
|
||||
billPayments.type = type;
|
||||
billPayments.status = (int)GlobalEnumVars.BillPaymentsStatus.NoPay;
|
||||
billPayments.paymentCode = paymentCode;
|
||||
billPayments.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1";
|
||||
billPayments.parameters = @params != null ? JsonConvert.SerializeObject(@params) : "";
|
||||
billPayments.createTime = DateTime.Now;
|
||||
|
||||
await _dal.InsertAsync(billPayments);
|
||||
|
||||
//判断支付单金额是否为0,如果为0,直接支付成功,
|
||||
if (billPayments.money == 0)
|
||||
{
|
||||
//更新订单信息
|
||||
await ToUpdate(billPayments.paymentId, (int)GlobalEnumVars.BillPaymentsStatus.Payed, billPayments.paymentCode, billPayments.money, "金额为0,自动支付成功", "");
|
||||
|
||||
jm.data = jm.code = 10059;
|
||||
jm.msg = GlobalErrorCodeVars.Code10059;
|
||||
return jm;
|
||||
}
|
||||
//取支付标题,就不往数据库里存了吧
|
||||
billPayments.payTitle = await PayTitle(billPayments);
|
||||
|
||||
jm.status = true;
|
||||
jm.data = billPayments;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 支付成功后,更新支付单状态
|
||||
|
||||
/// <summary>
|
||||
/// 支付成功后,更新支付单状态
|
||||
/// </summary>
|
||||
/// <param name="paymentId"></param>
|
||||
/// <param name="paymentCode"></param>
|
||||
/// <param name="money"></param>
|
||||
/// <param name="status"></param>
|
||||
/// <param name="payedMsg"></param>
|
||||
/// <param name="tradeNo"></param>
|
||||
public async Task<WebApiCallBack> ToUpdate(string paymentId, int status, string paymentCode, decimal money, string payedMsg = "", string tradeNo = "")
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var billPaymentInfo = await _dal.QueryByClauseAsync(p =>
|
||||
p.paymentId == paymentId && p.money == money &&
|
||||
p.status != (int)GlobalEnumVars.BillPaymentsStatus.Payed);
|
||||
if (billPaymentInfo == null)
|
||||
{
|
||||
NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "支付成功后,更新支付单状态", "没有找到此未支付的支付单号");
|
||||
jm.msg = "没有找到此未支付的支付单号";
|
||||
return jm;
|
||||
}
|
||||
|
||||
billPaymentInfo.status = status;
|
||||
billPaymentInfo.paymentCode = paymentCode;
|
||||
billPaymentInfo.payedMsg = payedMsg;
|
||||
billPaymentInfo.tradeNo = tradeNo;
|
||||
billPaymentInfo.updateTime = DateTime.Now;
|
||||
|
||||
await _dal.UpdateAsync(billPaymentInfo);
|
||||
if (status == (int)GlobalEnumVars.BillPaymentsStatus.Payed)
|
||||
{
|
||||
if (billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.Order)
|
||||
{
|
||||
//如果是订单类型,做支付后处理
|
||||
await orderServices.Pay(billPaymentInfo.sourceId, paymentCode, billPaymentInfo);
|
||||
}
|
||||
else if (billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.Recharge)
|
||||
{
|
||||
//给用户做充值
|
||||
var userId = billPaymentInfo.sourceId.ObjectToInt(0);
|
||||
await _userBalanceServices.Change(userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Recharge, billPaymentInfo.money, billPaymentInfo.paymentId);
|
||||
}
|
||||
else if (billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.ServiceOrder)
|
||||
{
|
||||
//给用户做增加购买关系和生成券操作
|
||||
await _userServicesOrderServices.CreateUserServicesTickets(billPaymentInfo.sourceId, billPaymentInfo.paymentId);
|
||||
}
|
||||
else if (billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.FormOrder || billPaymentInfo.type == (int)GlobalEnumVars.BillPaymentsType.FormPay)
|
||||
{
|
||||
//form表单支付
|
||||
var id = billPaymentInfo.sourceId.ObjectToInt(0);
|
||||
await _formSubmitServices.Pay(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
//::todo 其他业务逻辑
|
||||
}
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = paymentId;
|
||||
jm.msg = "支付成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取支付单详情
|
||||
/// <summary>
|
||||
/// 获取支付单详情
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetInfo(string paymentId, int userId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (string.IsNullOrEmpty(paymentId))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13100;
|
||||
return jm;
|
||||
}
|
||||
var where = PredicateBuilder.True<CoreCmsBillPayments>();
|
||||
where = where.And(p => p.paymentId == paymentId);
|
||||
if (userId > 0)
|
||||
{
|
||||
where = where.And(p => p.userId == userId);
|
||||
}
|
||||
var billPayments = await _dal.QueryByClauseAsync(where);
|
||||
if (billPayments == null)
|
||||
{
|
||||
jm.msg = "没有找到此支付记录";
|
||||
jm.data = jm.code = 10002;
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.data = billPayments;
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
//扩展方法==========================================================================================
|
||||
|
||||
#region 扩展方法
|
||||
private async Task<string> PayTitle(CoreCmsBillPayments entity)
|
||||
{
|
||||
|
||||
var res = string.Empty;
|
||||
switch (entity.type)
|
||||
{
|
||||
case (int)GlobalEnumVars.BillPaymentsType.Order:
|
||||
var orderItem = await _orderItemServices.QueryByClauseAsync(p => p.orderId == entity.sourceId);
|
||||
if (orderItem != null)
|
||||
{
|
||||
res = orderItem.name;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.BillPaymentsType.Recharge:
|
||||
res = "账户充值";
|
||||
break;
|
||||
case (int)GlobalEnumVars.BillPaymentsType.FormPay:
|
||||
break;
|
||||
case (int)GlobalEnumVars.BillPaymentsType.FormOrder:
|
||||
break;
|
||||
case (int)GlobalEnumVars.BillPaymentsType.ServiceOrder:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (string.IsNullOrEmpty(res))
|
||||
{
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
res = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopName); //店铺名称
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 卖家直接支付操作
|
||||
/// <summary>
|
||||
/// 卖家直接支付操作
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <param name="type">支付类型</param>
|
||||
/// <param name="paymentCode">支付类型编码</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToPay(string orderId, int type, string paymentCode)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//查支付人id
|
||||
var userId = 0;
|
||||
switch (type)
|
||||
{
|
||||
case (int)GlobalEnumVars.BillPaymentsType.Order:
|
||||
var orderInfo = await orderServices.QueryByIdAsync(orderId);
|
||||
if (orderInfo == null)
|
||||
{
|
||||
jm.code = 10000;
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
userId = orderInfo.userId;
|
||||
break;
|
||||
}
|
||||
//::todo 校验支付方式是否存在
|
||||
//生成支付单
|
||||
var result = await ToAdd(orderId, paymentCode, userId, type);
|
||||
if (!result.status)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
var data = result.data as CoreCmsBillPayments;
|
||||
//支付单支付
|
||||
jm = await ToUpdate(data.paymentId, (int)GlobalEnumVars.BillPaymentsStatus.Payed,
|
||||
data.paymentCode, data.money, "后台手动支付");
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 支付单7天统计
|
||||
/// <summary>
|
||||
/// 支付单7天统计
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<StatisticsOut>> Statistics()
|
||||
{
|
||||
return await _dal.Statistics();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsBillPayments>> QueryPageAsync(Expression<Func<CoreCmsBillPayments, bool>> predicate,
|
||||
Expression<Func<CoreCmsBillPayments, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
270
CoreCms.Net.Services/Bill/CoreCmsBillRefundServices.cs
Normal file
270
CoreCms.Net.Services/Bill/CoreCmsBillRefundServices.cs
Normal file
@@ -0,0 +1,270 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 退款单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillRefundServices : BaseServices<CoreCmsBillRefund>, ICoreCmsBillRefundServices
|
||||
{
|
||||
private readonly ICoreCmsBillRefundRepository _dal;
|
||||
private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
|
||||
private readonly ICoreCmsMessageCenterServices _messageCenterServices;
|
||||
private readonly ICoreCmsPaymentsServices _paymentsServices;
|
||||
private readonly IBalancePayServices _balancePayServices;
|
||||
private readonly IAliPayServices _aliPayServices;
|
||||
private readonly IWeChatPayServices _weChatPayServices;
|
||||
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsBillRefundServices(IUnitOfWork unitOfWork, ICoreCmsBillRefundRepository dal, ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsMessageCenterServices messageCenterServices, ICoreCmsPaymentsServices paymentsServices, IBalancePayServices balancePayServices, IAliPayServices aliPayServices, IWeChatPayServices weChatPayServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_billPaymentsServices = billPaymentsServices;
|
||||
_messageCenterServices = messageCenterServices;
|
||||
_paymentsServices = paymentsServices;
|
||||
_balancePayServices = balancePayServices;
|
||||
_aliPayServices = aliPayServices;
|
||||
_weChatPayServices = weChatPayServices;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 创建退款单
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="sourceId"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="money"></param>
|
||||
/// <param name="aftersalesId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, string sourceId, int type, decimal money, string aftersalesId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (money == 0)
|
||||
{
|
||||
jm.data = jm.code = 13208;
|
||||
jm.msg = GlobalErrorCodeVars.Code13208;
|
||||
return jm;
|
||||
}
|
||||
//创建退款单
|
||||
var billRefund = new CoreCmsBillRefund();
|
||||
billRefund.refundId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.退款单编号);
|
||||
billRefund.aftersalesId = aftersalesId;
|
||||
billRefund.money = money;
|
||||
billRefund.userId = userId;
|
||||
billRefund.sourceId = sourceId;
|
||||
billRefund.type = type;
|
||||
//取支付成功的支付单号
|
||||
var paymentsInfo = await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == sourceId && p.type == type && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed);
|
||||
if (paymentsInfo != null)
|
||||
{
|
||||
billRefund.paymentCode = paymentsInfo.paymentCode;
|
||||
billRefund.tradeNo = paymentsInfo.tradeNo;
|
||||
}
|
||||
billRefund.status = (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND;
|
||||
billRefund.createTime = DateTime.Now;
|
||||
|
||||
await _dal.InsertAsync(billRefund);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "创建成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 退款单去退款或者拒绝
|
||||
/// </summary>
|
||||
/// <param name="refundId">退款单id</param>
|
||||
/// <param name="status">2或者4,通过或者拒绝</param>
|
||||
/// <param name="paymentCodeStr">退款方式,如果和退款单上的一样,说明没有修改,原路返回,否则只记录状态,不做实际退款,如果为空是原路返回</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToRefund(string refundId, int status, string paymentCodeStr = "")
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
|
||||
|
||||
if (info == null)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = GlobalErrorCodeVars.Code13210;
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (paymentCodeStr == "")
|
||||
{
|
||||
paymentCodeStr = info.paymentCode;
|
||||
}
|
||||
|
||||
if (status == (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND)
|
||||
{
|
||||
//退款完成后的钩子
|
||||
jm.msg = "退款单退款成功";
|
||||
|
||||
//如果前端传过来的退款方式和退款单上的退款方式一样的话,就说明是原路返回,试着调用支付方式的退款方法,如果不一样的话,就直接做退款单的退款状态为已退款就可以了
|
||||
if (paymentCodeStr == info.paymentCode && paymentCodeStr != "offline")
|
||||
{
|
||||
jm = await PaymentRefund(refundId);
|
||||
}
|
||||
else
|
||||
{
|
||||
//只修改状态,不做实际退款,实际退款线下去退。
|
||||
await _dal.UpdateAsync(p => new CoreCmsBillRefund()
|
||||
{
|
||||
status = (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND,
|
||||
paymentCode = paymentCodeStr
|
||||
},
|
||||
p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
|
||||
jm.status = true;
|
||||
}
|
||||
|
||||
//退款同意,先发退款消息和钩子,下面原路返回可能失败,但是在业务上相当于退款已经退过了,只是实际的款项可能还没到账
|
||||
//发送退款消息
|
||||
await _messageCenterServices.SendMessage(info.userId, GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString(), JObject.FromObject(info));
|
||||
|
||||
return jm;
|
||||
}
|
||||
else if (status == (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUSE)
|
||||
{
|
||||
//退款拒绝
|
||||
await _dal.UpdateAsync(
|
||||
p => new CoreCmsBillRefund()
|
||||
{
|
||||
status = status,
|
||||
paymentCode = paymentCodeStr
|
||||
},
|
||||
p => p.refundId == refundId && p.status == (int)GlobalEnumVars.BillRefundStatus.STATUS_NOREFUND);
|
||||
jm.status = true;
|
||||
jm.msg = "退款单拒绝成功";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 如果是在线支付的原路退还,去做退款操作
|
||||
/// </summary>
|
||||
public async Task<WebApiCallBack> PaymentRefund(string refundId)
|
||||
{
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p =>
|
||||
p.refundId == refundId && p.status != (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND);
|
||||
if (info == null)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = GlobalErrorCodeVars.Code13210;
|
||||
return jm;
|
||||
}
|
||||
|
||||
//取支付成功的支付单号
|
||||
var panyMentsInfo = await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == info.sourceId && p.type == info.type && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed);
|
||||
if (panyMentsInfo == null)
|
||||
{
|
||||
jm.msg = "没有找到支付成功的支付单号";
|
||||
return jm;
|
||||
}
|
||||
if (panyMentsInfo.paymentCode != info.paymentCode)
|
||||
{
|
||||
jm.msg = "退款单退款方式和支付方式不一样,原路退还失败";
|
||||
return jm;
|
||||
}
|
||||
//取此支付方式的信息
|
||||
var paymentsModel = await _paymentsServices.QueryByClauseAsync(p => p.code == info.paymentCode && p.isEnable == true);
|
||||
if (paymentsModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10050;
|
||||
return jm;
|
||||
}
|
||||
|
||||
//去退款
|
||||
//微信退款
|
||||
if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.wechatpay.ToString())
|
||||
{
|
||||
jm = await _weChatPayServices.Refund(info, panyMentsInfo);
|
||||
}
|
||||
//支付宝退款
|
||||
else if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.alipay.ToString())
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "支付宝退款未开通";
|
||||
}
|
||||
//余额退款
|
||||
else if (panyMentsInfo.paymentCode == GlobalEnumVars.PaymentsTypes.balancepay.ToString())
|
||||
{
|
||||
jm = await _balancePayServices.Refund(info, panyMentsInfo);
|
||||
}
|
||||
|
||||
if (jm.status)
|
||||
{
|
||||
var res = JsonConvert.SerializeObject(jm.data);
|
||||
await _dal.UpdateAsync(p => new CoreCmsBillRefund() { status = (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND, memo = res }, p => p.refundId == refundId);
|
||||
}
|
||||
else
|
||||
{
|
||||
var res = JsonConvert.SerializeObject(jm.data);
|
||||
await _dal.UpdateAsync(p => new CoreCmsBillRefund() { status = (int)GlobalEnumVars.BillRefundStatus.STATUS_FAIL, memo = res }, p => p.refundId == refundId);
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsBillRefund>> QueryPageAsync(Expression<Func<CoreCmsBillRefund, bool>> predicate,
|
||||
Expression<Func<CoreCmsBillRefund, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/Bill/CoreCmsBillReshipItemServices.cs
Normal file
33
CoreCms.Net.Services/Bill/CoreCmsBillReshipItemServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 退货单明细表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillReshipItemServices : BaseServices<CoreCmsBillReshipItem>, ICoreCmsBillReshipItemServices
|
||||
{
|
||||
private readonly ICoreCmsBillReshipItemRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsBillReshipItemServices(IUnitOfWork unitOfWork, ICoreCmsBillReshipItemRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
143
CoreCms.Net.Services/Bill/CoreCmsBillReshipServices.cs
Normal file
143
CoreCms.Net.Services/Bill/CoreCmsBillReshipServices.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 退货单表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBillReshipServices : BaseServices<CoreCmsBillReship>, ICoreCmsBillReshipServices
|
||||
{
|
||||
private readonly ICoreCmsBillReshipRepository _dal;
|
||||
private readonly ICoreCmsBillReshipItemRepository _billReshipItemRepository;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsBillReshipServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsBillReshipRepository dal
|
||||
, ICoreCmsBillReshipItemRepository billReshipItemRepository
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_billReshipItemRepository = billReshipItemRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建退货单
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <param name="aftersalesId"></param>
|
||||
/// <param name="aftersalesItems"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, string orderId, string aftersalesId, List<CoreCmsBillAftersalesItem> aftersalesItems)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (aftersalesItems == null || aftersalesItems.Count <= 0)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code13209;
|
||||
jm.data = jm.code = 13209;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var model = new CoreCmsBillReship();
|
||||
model.reshipId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.退货单编号);
|
||||
model.orderId = orderId;
|
||||
model.aftersalesId = aftersalesId;
|
||||
model.userId = userId;
|
||||
model.status = (int)GlobalEnumVars.BillReshipStatus.待退货;
|
||||
model.createTime = DateTime.Now;
|
||||
|
||||
await _dal.InsertAsync(model);
|
||||
|
||||
var list = new List<CoreCmsBillReshipItem>();
|
||||
foreach (var item in aftersalesItems)
|
||||
{
|
||||
var reshipItem = new CoreCmsBillReshipItem();
|
||||
reshipItem.reshipId = model.reshipId;
|
||||
reshipItem.orderItemsId = item.orderItemsId;
|
||||
reshipItem.goodsId = item.goodsId;
|
||||
reshipItem.productId = item.productId;
|
||||
reshipItem.sn = item.sn;
|
||||
reshipItem.bn = item.bn;
|
||||
reshipItem.name = item.name;
|
||||
reshipItem.imageUrl = item.imageUrl;
|
||||
reshipItem.nums = item.nums;
|
||||
reshipItem.addon = item.addon;
|
||||
reshipItem.createTime = DateTime.Now;
|
||||
list.Add(reshipItem);
|
||||
//保存退货单明细
|
||||
}
|
||||
|
||||
await _billReshipItemRepository.InsertAsync(list);
|
||||
|
||||
jm.status = true;
|
||||
jm.data = model;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsBillReship>> QueryPageAsync(Expression<Func<CoreCmsBillReship, bool>> predicate,
|
||||
Expression<Func<CoreCmsBillReship, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 获取单个数据带导航
|
||||
/// <summary>
|
||||
/// 获取单个数据带导航
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="orderByType"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsBillReship> GetDetails(Expression<Func<CoreCmsBillReship, bool>> predicate,
|
||||
Expression<Func<CoreCmsBillReship, object>> orderByExpression, OrderByType orderByType)
|
||||
{
|
||||
return await _dal.GetDetails(predicate, orderByExpression, orderByType);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
1017
CoreCms.Net.Services/Cart/CoreCmsCartServices.cs
Normal file
1017
CoreCms.Net.Services/Cart/CoreCmsCartServices.cs
Normal file
File diff suppressed because it is too large
Load Diff
75
CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs
Normal file
75
CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using System.Collections.Generic;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IServices;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services.CodeGenerator
|
||||
{
|
||||
public class CodeGeneratorServices : ICodeGeneratorServices
|
||||
{
|
||||
ICodeGeneratorRepository _dal;
|
||||
|
||||
public CodeGeneratorServices(ICodeGeneratorRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有的表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<DbTableInfo> GetDbTables()
|
||||
{
|
||||
return _dal.GetDbTables();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取表下面所有的字段
|
||||
/// </summary>
|
||||
/// <param name="tableName"></param>
|
||||
/// <returns></returns>
|
||||
public List<DbColumnInfo> GetDbTablesColumns(string tableName)
|
||||
{
|
||||
return _dal.GetDbTablesColumns(tableName);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 自动生成代码
|
||||
/// </summary>
|
||||
/// <param name="tableName"></param>
|
||||
/// <param name="fileType"></param>
|
||||
/// <returns></returns>
|
||||
public byte[] CodeGen(string tableName, string fileType)
|
||||
{
|
||||
return _dal.CodeGen(tableName, fileType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 自动生成类型的所有数据库代码
|
||||
/// </summary>
|
||||
/// <param name="tableName"></param>
|
||||
/// <param name="fileType"></param>
|
||||
/// <returns></returns>
|
||||
public byte[] CodeGenByAll(string fileType)
|
||||
{
|
||||
|
||||
return _dal.CodeGenByAll(fileType);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
34
CoreCms.Net.Services/Com/CoreCmsLabelServices.cs
Normal file
34
CoreCms.Net.Services/Com/CoreCmsLabelServices.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 标签表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsLabelServices : BaseServices<CoreCmsLabel>, ICoreCmsLabelServices
|
||||
{
|
||||
private readonly ICoreCmsLabelRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsLabelServices(IUnitOfWork unitOfWork, ICoreCmsLabelRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
448
CoreCms.Net.Services/Com/ToolsServices.cs
Normal file
448
CoreCms.Net.Services/Com/ToolsServices.cs
Normal file
@@ -0,0 +1,448 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Aliyun.OSS;
|
||||
using Aliyun.OSS.Util;
|
||||
using CoreCms.Net.Caching.Manual;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Options;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using COSXML;
|
||||
using COSXML.Auth;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.FileProviders;
|
||||
using Qiniu.Storage;
|
||||
using Qiniu.Util;
|
||||
using ToolGood.Words;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 标签表 接口实现
|
||||
/// </summary>
|
||||
public class ToolsServices : IToolsServices
|
||||
{
|
||||
private readonly IWebHostEnvironment _hostEnvironment;
|
||||
private readonly IWebHostEnvironment _webHostEnvironment;
|
||||
|
||||
|
||||
|
||||
public ToolsServices(IWebHostEnvironment hostEnvironment, IWebHostEnvironment webHostEnvironment)
|
||||
{
|
||||
_hostEnvironment = hostEnvironment;
|
||||
_webHostEnvironment = webHostEnvironment;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查询是否存在违规内容并进行替换
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<String> IllegalWordsReplace(string oldString, char symbol = '*')
|
||||
{
|
||||
var cache = ManualDataCache.Instance.Get<string>(ToolsVars.IllegalWordsCahceName);
|
||||
if (string.IsNullOrEmpty(cache))
|
||||
{
|
||||
IFileProvider fileProvider = this._hostEnvironment.ContentRootFileProvider;
|
||||
IFileInfo fileInfo = fileProvider.GetFileInfo("illegalWord/IllegalKeywords.txt");
|
||||
|
||||
string fileContent = null;
|
||||
|
||||
using (StreamReader readSteam = new StreamReader(fileInfo.CreateReadStream()))
|
||||
{
|
||||
fileContent = await readSteam.ReadToEndAsync();
|
||||
}
|
||||
cache = fileContent;
|
||||
ManualDataCache.Instance.Set(ToolsVars.IllegalWordsCahceName, cache);
|
||||
}
|
||||
|
||||
WordsMatch wordsSearch = new WordsMatch();
|
||||
wordsSearch.SetKeywords(cache.Split('|', StringSplitOptions.RemoveEmptyEntries));
|
||||
|
||||
var t = wordsSearch.Replace(oldString, symbol);
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 查询是否存在违规内容
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> IllegalWordsContainsAny(string oldString)
|
||||
{
|
||||
var cache = ManualDataCache.Instance.Get<string>(ToolsVars.IllegalWordsCahceName);
|
||||
if (string.IsNullOrEmpty(cache))
|
||||
{
|
||||
IFileProvider fileProvider = this._hostEnvironment.ContentRootFileProvider;
|
||||
IFileInfo fileInfo = fileProvider.GetFileInfo("illegalWord/IllegalKeywords.txt");
|
||||
|
||||
string fileContent = null;
|
||||
|
||||
using (StreamReader readSteam = new StreamReader(fileInfo.CreateReadStream()))
|
||||
{
|
||||
fileContent = await readSteam.ReadToEndAsync();
|
||||
}
|
||||
cache = fileContent;
|
||||
ManualDataCache.Instance.Set(ToolsVars.IllegalWordsCahceName, cache);
|
||||
}
|
||||
|
||||
WordsMatch wordsSearch = new WordsMatch();
|
||||
wordsSearch.SetKeywords(cache.Split('|', StringSplitOptions.RemoveEmptyEntries));
|
||||
|
||||
var bl = wordsSearch.ContainsAny(oldString);
|
||||
|
||||
return bl;
|
||||
}
|
||||
|
||||
|
||||
#region 本地上传方法(File)
|
||||
|
||||
/// <summary>
|
||||
/// 本地上传方法(File)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="fileExt"></param>
|
||||
/// <param name="file"></param>
|
||||
/// <param name="filesStorageLocation"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> UpLoadFileForLocalStorage(FilesStorageOptions options, string fileExt, IFormFile file, int filesStorageLocation = (int)GlobalEnumVars.FilesStorageLocation.Admin)
|
||||
{
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
var saveUrl = options.Path + today + "/";
|
||||
var dirPath = _webHostEnvironment.WebRootPath + saveUrl;
|
||||
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath);
|
||||
var filePath = dirPath + newFileName;
|
||||
var fileUrl = saveUrl + newFileName;
|
||||
|
||||
string bucketBindDomain = string.Empty;
|
||||
if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.Admin)
|
||||
{
|
||||
bucketBindDomain = AppSettingsConstVars.AppConfigAppUrl;
|
||||
}
|
||||
else if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.API)
|
||||
{
|
||||
bucketBindDomain = AppSettingsConstVars.AppConfigAppInterFaceUrl;
|
||||
}
|
||||
|
||||
await using (var fs = System.IO.File.Create(filePath))
|
||||
{
|
||||
await file.CopyToAsync(fs);
|
||||
fs.Flush();
|
||||
}
|
||||
|
||||
return bucketBindDomain + fileUrl;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 阿里云上传方法(File)
|
||||
/// <summary>
|
||||
/// 阿里云上传方法(File)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="fileExt"></param>
|
||||
/// <param name="file"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> UpLoadFileForAliYunOSS(FilesStorageOptions options, string fileExt, IFormFile file)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
//上传到阿里云
|
||||
await using var fileStream = file.OpenReadStream();
|
||||
var md5 = OssUtils.ComputeContentMd5(fileStream, file.Length);
|
||||
|
||||
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
|
||||
//初始化阿里云配置--外网Endpoint、访问ID、访问password
|
||||
var aliYun = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessKeySecret);
|
||||
//将文件md5值赋值给meat头信息,服务器验证文件MD5
|
||||
var objectMeta = new ObjectMetadata
|
||||
{
|
||||
ContentMd5 = md5
|
||||
};
|
||||
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
|
||||
aliYun.PutObject(options.BucketName, filePath, fileStream, objectMeta);
|
||||
//返回给UEditor的插入编辑器的图片的src
|
||||
|
||||
return options.BucketBindUrl + filePath;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 腾讯云存储上传方法(File)
|
||||
/// <summary>
|
||||
/// 腾讯云存储上传方法(File)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="fileExt"></param>
|
||||
/// <param name="file"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> UpLoadFileForQCloudOSS(FilesStorageOptions options, string fileExt, IFormFile file)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
|
||||
|
||||
//上传到腾讯云OSS
|
||||
//初始化 CosXmlConfig
|
||||
string appid = options.AccountId;//设置腾讯云账户的账户标识 APPID
|
||||
string region = options.CosRegion; //设置一个默认的存储桶地域
|
||||
CosXmlConfig config = new CosXmlConfig.Builder()
|
||||
//.SetAppid(appid)
|
||||
.IsHttps(true) //设置默认 HTTPS 请求
|
||||
.SetRegion(region) //设置一个默认的存储桶地域
|
||||
.SetDebugLog(true) //显示日志
|
||||
.Build(); //创建 CosXmlConfig 对象
|
||||
|
||||
long durationSecond = 600; //每次请求签名有效时长,单位为秒
|
||||
QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(options.AccessKeyId, options.AccessKeySecret, durationSecond);
|
||||
|
||||
|
||||
byte[] bytes;
|
||||
await using (var ms = new MemoryStream())
|
||||
{
|
||||
await file.CopyToAsync(ms);
|
||||
bytes = ms.ToArray();
|
||||
}
|
||||
|
||||
var cosXml = new CosXmlServer(config, qCloudCredentialProvider);
|
||||
COSXML.Model.Object.PutObjectRequest putObjectRequest = new COSXML.Model.Object.PutObjectRequest(options.TencentBucketName, filePath, bytes);
|
||||
cosXml.PutObject(putObjectRequest);
|
||||
|
||||
return options.BucketBindUrl + filePath;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 七牛云存储上传(File)
|
||||
/// <summary>
|
||||
/// 七牛云存储上传(File)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="fileExt"></param>
|
||||
/// <param name="file"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> UpLoadFileForQiNiuKoDo(FilesStorageOptions options, string fileExt, IFormFile file)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_fffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
|
||||
|
||||
Mac mac = new Mac(options.AccessKeyId, options.AccessKeySecret);
|
||||
|
||||
byte[] bytes;
|
||||
await using (var ms = new MemoryStream())
|
||||
{
|
||||
await file.CopyToAsync(ms);
|
||||
bytes = ms.ToArray();
|
||||
}
|
||||
|
||||
// 设置上传策略
|
||||
PutPolicy putPolicy = new PutPolicy();
|
||||
// 设置要上传的目标空间
|
||||
putPolicy.Scope = options.QiNiuBucketName;
|
||||
// 上传策略的过期时间(单位:秒)
|
||||
putPolicy.SetExpires(3600);
|
||||
// 文件上传完毕后,在多少天后自动被删除
|
||||
putPolicy.DeleteAfterDays = 1;
|
||||
// 生成上传token
|
||||
string token = Qiniu.Util.Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
|
||||
|
||||
Config config = new Config();
|
||||
// 设置 http 或者 https 上传
|
||||
config.UseHttps = true;
|
||||
config.UseCdnDomains = true;
|
||||
config.ChunkSize = ChunkUnit.U512K;
|
||||
|
||||
UploadManager um = new UploadManager(config);
|
||||
var outData = um.UploadData(bytes, newFileName, token, null);
|
||||
|
||||
return options.BucketBindUrl + newFileName;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 本地上传方法(Base64)
|
||||
|
||||
/// <summary>
|
||||
/// 本地上传方法(Base64)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="memStream"></param>
|
||||
/// <param name="filesStorageLocation"></param>
|
||||
/// <returns></returns>
|
||||
public string UpLoadBase64ForLocalStorage(FilesStorageOptions options, MemoryStream memStream, int filesStorageLocation = (int)GlobalEnumVars.FilesStorageLocation.Admin)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
Image mImage = Image.FromStream(memStream);
|
||||
Bitmap bp = new Bitmap(mImage);
|
||||
|
||||
var saveUrl = options.Path + today + "/";
|
||||
var dirPath = _webHostEnvironment.WebRootPath + saveUrl;
|
||||
|
||||
string bucketBindDomain = string.Empty;
|
||||
if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.Admin)
|
||||
{
|
||||
bucketBindDomain = AppSettingsConstVars.AppConfigAppUrl;
|
||||
}
|
||||
else if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.API)
|
||||
{
|
||||
bucketBindDomain = AppSettingsConstVars.AppConfigAppInterFaceUrl;
|
||||
}
|
||||
|
||||
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath);
|
||||
var filePath = dirPath + newFileName;
|
||||
var fileUrl = saveUrl + newFileName;
|
||||
|
||||
bp.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);//注意保存路径
|
||||
|
||||
return bucketBindDomain + fileUrl;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 阿里云上传方法(Base64)
|
||||
/// <summary>
|
||||
/// 阿里云上传方法(Base64)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="memStream"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> UpLoadBase64ForAliYunOSS(FilesStorageOptions options, MemoryStream memStream)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
// 设置当前流的位置为流的开始
|
||||
memStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
await using var fileStream = memStream;
|
||||
var md5 = OssUtils.ComputeContentMd5(fileStream, memStream.Length);
|
||||
|
||||
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
|
||||
//初始化阿里云配置--外网Endpoint、访问ID、访问password
|
||||
var aliyun = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessKeySecret);
|
||||
//将文件md5值赋值给meat头信息,服务器验证文件MD5
|
||||
var objectMeta = new ObjectMetadata
|
||||
{
|
||||
ContentMd5 = md5
|
||||
};
|
||||
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
|
||||
aliyun.PutObject(options.BucketName, filePath, fileStream, objectMeta);
|
||||
//返回给UEditor的插入编辑器的图片的src
|
||||
|
||||
return options.BucketBindUrl + filePath;
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 腾讯云存储上传方法(Base64)
|
||||
|
||||
/// <summary>
|
||||
/// 腾讯云存储上传方法(Base64)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns></returns>
|
||||
public string UpLoadBase64ForQCloudOSS(FilesStorageOptions options, byte[] bytes)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
|
||||
var today = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
//初始化 CosXmlConfig
|
||||
string appid = options.AccountId;//设置腾讯云账户的账户标识 APPID
|
||||
string region = options.CosRegion; //设置一个默认的存储桶地域
|
||||
CosXmlConfig config = new CosXmlConfig.Builder()
|
||||
//.SetAppid(appid)
|
||||
.IsHttps(true) //设置默认 HTTPS 请求
|
||||
.SetRegion(region) //设置一个默认的存储桶地域
|
||||
.SetDebugLog(true) //显示日志
|
||||
.Build(); //创建 CosXmlConfig 对象
|
||||
|
||||
long durationSecond = 600; //每次请求签名有效时长,单位为秒
|
||||
QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(options.AccessKeyId, options.AccessKeySecret, durationSecond);
|
||||
|
||||
var cosXml = new CosXmlServer(config, qCloudCredentialProvider);
|
||||
|
||||
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
|
||||
COSXML.Model.Object.PutObjectRequest putObjectRequest = new COSXML.Model.Object.PutObjectRequest(options.TencentBucketName, filePath, bytes);
|
||||
|
||||
cosXml.PutObject(putObjectRequest);
|
||||
|
||||
return options.BucketBindUrl + filePath;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 牛云上传方法(Base64)
|
||||
|
||||
/// <summary>
|
||||
/// 七牛云上传方法(Base64)
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns></returns>
|
||||
public string UpLoadBase64ForQiNiuKoDo(FilesStorageOptions options, byte[] bytes)
|
||||
{
|
||||
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_fffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
|
||||
|
||||
Mac mac = new Mac(options.AccessKeyId, options.AccessKeySecret);
|
||||
|
||||
// 设置上传策略
|
||||
PutPolicy putPolicy = new PutPolicy();
|
||||
// 设置要上传的目标空间
|
||||
putPolicy.Scope = options.QiNiuBucketName;
|
||||
// 上传策略的过期时间(单位:秒)
|
||||
putPolicy.SetExpires(3600);
|
||||
// 文件上传完毕后,在多少天后自动被删除
|
||||
putPolicy.DeleteAfterDays = 1;
|
||||
// 生成上传token
|
||||
string token = Qiniu.Util.Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
|
||||
|
||||
Config config = new Config();
|
||||
// 设置 http 或者 https 上传
|
||||
config.UseHttps = true;
|
||||
config.UseCdnDomains = true;
|
||||
config.ChunkSize = ChunkUnit.U512K;
|
||||
|
||||
UploadManager um = new UploadManager(config);
|
||||
var outData = um.UploadData(bytes, newFileName, token, null);
|
||||
|
||||
return options.BucketBindUrl + newFileName;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
30
CoreCms.Net.Services/CoreCms.Net.Services.csproj
Normal file
30
CoreCms.Net.Services/CoreCms.Net.Services.csproj
Normal file
@@ -0,0 +1,30 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
|
||||
<PackageReference Include="Essensoft.Paylink.WeChatPay" Version="4.0.6" />
|
||||
<PackageReference Include="Flurl.Http" Version="3.2.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
||||
<PackageReference Include="Qc.YilianyunSdk" Version="1.0.7" />
|
||||
<PackageReference Include="Qiniu" Version="8.0.0" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
|
||||
<PackageReference Include="Tencent.QCloud.Cos.Sdk" Version="5.4.24" />
|
||||
<PackageReference Include="ToolGood.Words" Version="3.0.2.8" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\CoreCms.Net.Auth\CoreCms.Net.Auth.csproj" />
|
||||
<ProjectReference Include="..\CoreCms.Net.Caching\CoreCms.Net.Caching.csproj" />
|
||||
<ProjectReference Include="..\CoreCms.Net.Configuration\CoreCms.Net.Configuration.csproj" />
|
||||
<ProjectReference Include="..\CoreCms.Net.Core\CoreCms.Net.Core.csproj" />
|
||||
<ProjectReference Include="..\CoreCms.Net.IRepository\CoreCms.Net.IRepository.csproj" />
|
||||
<ProjectReference Include="..\CoreCms.Net.IServices\CoreCms.Net.IServices.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,137 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 分销商等级升级条件 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsDistributionConditionServices : BaseServices<CoreCmsDistributionCondition>, ICoreCmsDistributionConditionServices
|
||||
{
|
||||
private readonly ICoreCmsDistributionConditionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsDistributionConditionServices(IUnitOfWork unitOfWork, ICoreCmsDistributionConditionRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionCondition entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionCondition entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsDistributionCondition> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsDistributionCondition>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsDistributionCondition>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsDistributionCondition>> QueryPageAsync(Expression<Func<CoreCmsDistributionCondition, bool>> predicate,
|
||||
Expression<Func<CoreCmsDistributionCondition, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 分销商等级设置表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsDistributionGradeServices : BaseServices<CoreCmsDistributionGrade>, ICoreCmsDistributionGradeServices
|
||||
{
|
||||
private readonly ICoreCmsDistributionGradeRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsDistributionGradeServices(IUnitOfWork unitOfWork, ICoreCmsDistributionGradeRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionGrade entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionGrade entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsDistributionGrade>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsDistributionGrade>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsDistributionGrade>> QueryPageAsync(Expression<Func<CoreCmsDistributionGrade, bool>> predicate,
|
||||
Expression<Func<CoreCmsDistributionGrade, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,406 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 分销商订单记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsDistributionOrderServices : BaseServices<CoreCmsDistributionOrder>, ICoreCmsDistributionOrderServices
|
||||
{
|
||||
private readonly ICoreCmsDistributionOrderRepository _dal;
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
private readonly ICoreCmsDistributionServices _distributionServices;
|
||||
private readonly ICoreCmsOrderServices _orderServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
private readonly ICoreCmsProductsDistributionServices _productsDistributionServices;
|
||||
private readonly ICoreCmsProductsServices _productsServices;
|
||||
private readonly ICoreCmsUserBalanceServices _balanceServices;
|
||||
private readonly ICoreCmsGoodsServices _goodsServices;
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsDistributionOrderServices(IUnitOfWork unitOfWork, ICoreCmsDistributionOrderRepository dal, ICoreCmsDistributionServices distributionServices, ICoreCmsUserBalanceServices balanceServices, ICoreCmsOrderServices orderServices, ICoreCmsUserServices userServices, ICoreCmsOrderItemServices orderItemServices, ICoreCmsProductsDistributionServices productsDistributionServices, ICoreCmsProductsServices productsServices, ICoreCmsGoodsServices goodsServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_distributionServices = distributionServices;
|
||||
_balanceServices = balanceServices;
|
||||
_orderServices = orderServices;
|
||||
_userServices = userServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
_productsDistributionServices = productsDistributionServices;
|
||||
_productsServices = productsServices;
|
||||
_goodsServices = goodsServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionOrder entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionOrder entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsDistributionOrder> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsDistributionOrder>> QueryPageAsync(Expression<Func<CoreCmsDistributionOrder, bool>> predicate,
|
||||
Expression<Func<CoreCmsDistributionOrder, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 添加分销订单关联记录
|
||||
/// <summary>
|
||||
/// 添加分销订单关联记录
|
||||
/// </summary>
|
||||
/// <param name="order"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(CoreCmsOrder order)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
//查询获取几级返利
|
||||
var user = await _userServices.QueryByClauseAsync(p => p.id == order.userId);
|
||||
if (user is { parentId: > 0 })
|
||||
{
|
||||
//获取购物明细
|
||||
var orderItems = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId);
|
||||
var goodIds = orderItems.Select(p => p.goodsId).ToList();
|
||||
var productIds = orderItems.Select(p => p.productId).ToList();
|
||||
//获取货品数据
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(p => goodIds.Contains(p.id));
|
||||
//获取货品数据
|
||||
var products = await _productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id));
|
||||
//获取货品关联的分销数据
|
||||
var productsDistributions = await _productsDistributionServices.QueryListByClauseAsync(p => productIds.Contains(p.productsId));
|
||||
|
||||
await AddOther(order, orderItems, goods, products, productsDistributions, 1, user.parentId); //本级是否返利
|
||||
}
|
||||
jm.status = true;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 循环插入上级
|
||||
|
||||
/// <summary>
|
||||
/// 循环插入上级
|
||||
/// </summary>
|
||||
/// <param name="order">订单信息</param>
|
||||
/// <param name="orderItems"></param>
|
||||
/// <param name="goods"></param>
|
||||
/// <param name="products">订单货品</param>
|
||||
/// <param name="productsDistributions">货品分销数据</param>
|
||||
/// <param name="level">第几级</param>
|
||||
/// <param name="userId">用户id</param>
|
||||
/// <returns></returns>
|
||||
private async Task AddOther(CoreCmsOrder order, List<CoreCmsOrderItem> orderItems, List<CoreCmsGoods> goods, List<CoreCmsProducts> products, List<CoreCmsProductsDistribution> productsDistributions, int level = 0, int userId = 0)
|
||||
{
|
||||
var user = await _userServices.QueryByClauseAsync(p => p.id == userId);
|
||||
if (user != null)
|
||||
{
|
||||
var commission = await _distributionServices.GetGradeAndCommission(user.id);
|
||||
if (commission.status && commission.data != null) //不是分销商的,不返利。
|
||||
{
|
||||
var ommissionDto = commission.data as DistributionDto;
|
||||
//直返本级
|
||||
decimal amount = 0;
|
||||
foreach (var item in orderItems)
|
||||
{
|
||||
var good = goods.Find(p => p.id == item.goodsId);
|
||||
if (good == null) continue;
|
||||
var product = products.Find(p => p.id == item.productId);
|
||||
if (product == null) continue;
|
||||
if (good.productsDistributionType == (int)GlobalEnumVars.ProductsDistributionType.Global)
|
||||
{
|
||||
if (ommissionDto == null) continue;
|
||||
//获取实际当前支付金额,减去优惠的金额
|
||||
var itemAmount = item.amount - item.promotionAmount;
|
||||
//如果去掉优惠需要负了,就为0
|
||||
if (itemAmount < 0) itemAmount = 0;
|
||||
//一级分销
|
||||
if (level == 1 && ommissionDto.commission_1 != null)
|
||||
{
|
||||
if (ommissionDto.commission_1.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
|
||||
{
|
||||
amount += ommissionDto.commission_1.discount;
|
||||
}
|
||||
else
|
||||
{
|
||||
amount += Math.Round(ommissionDto.commission_1.discount * itemAmount / 100, 2);
|
||||
}
|
||||
}
|
||||
//二级分销
|
||||
else if (level == 2 && ommissionDto.commission_2 != null)
|
||||
{
|
||||
if (ommissionDto.commission_2.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
|
||||
{
|
||||
amount += ommissionDto.commission_2.discount;
|
||||
}
|
||||
else
|
||||
{
|
||||
amount += Math.Round(ommissionDto.commission_2.discount * itemAmount / 100, 2);
|
||||
}
|
||||
}
|
||||
//三级分销
|
||||
else if (level == 3 && ommissionDto.commission_3 != null)
|
||||
{
|
||||
if (ommissionDto.commission_3.type == (int)GlobalEnumVars.DistributionCommissiontype.COMMISSION_TYPE_FIXED)
|
||||
{
|
||||
amount += ommissionDto.commission_3.discount;
|
||||
}
|
||||
else
|
||||
{
|
||||
amount += Math.Round(ommissionDto.commission_3.discount * itemAmount / 100, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (good.productsDistributionType == (int)GlobalEnumVars.ProductsDistributionType.Detail)
|
||||
{
|
||||
var productsDistribution = productsDistributions.Find(p => p.productsId == item.productId);
|
||||
if (productsDistribution == null) continue;
|
||||
|
||||
if (level == 1 && productsDistribution.levelOne > 0)
|
||||
{
|
||||
amount += Math.Round(productsDistribution.levelOne * item.nums, 2);
|
||||
}
|
||||
else if (level == 2 && productsDistribution.levelTwo > 0)
|
||||
{
|
||||
amount += Math.Round(productsDistribution.levelTwo * item.nums, 2);
|
||||
}
|
||||
else if (level == 3 && productsDistribution.levelThree > 0)
|
||||
{
|
||||
amount += Math.Round(productsDistribution.levelThree * item.nums, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > 0)
|
||||
{
|
||||
var iData = new CoreCmsDistributionOrder();
|
||||
iData.userId = userId;
|
||||
iData.buyUserId = order.userId;
|
||||
iData.orderId = order.orderId;
|
||||
iData.amount = amount;
|
||||
iData.level = level;
|
||||
iData.isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo; //默认未结算
|
||||
iData.isDelete = false;
|
||||
//判断是否返利过,有历史记录直接更新
|
||||
var commissOrder = await _dal.QueryByClauseAsync(p => p.userId == userId && p.orderId == order.orderId);
|
||||
if (commissOrder != null)
|
||||
{
|
||||
commissOrder.updateTime = DateTime.Now;
|
||||
commissOrder.userId = iData.userId;
|
||||
commissOrder.buyUserId = iData.buyUserId;
|
||||
commissOrder.orderId = iData.orderId;
|
||||
commissOrder.amount = iData.amount;
|
||||
commissOrder.level = iData.level;
|
||||
commissOrder.isSettlement = iData.isSettlement;
|
||||
commissOrder.isDelete = iData.isDelete;
|
||||
await _dal.UpdateAsync(commissOrder);
|
||||
}
|
||||
else
|
||||
{
|
||||
iData.createTime = DateTime.Now;
|
||||
iData.updateTime = DateTime.Now;
|
||||
await _dal.InsertAsync(iData);
|
||||
}
|
||||
}
|
||||
|
||||
if (user.parentId > 0 && ommissionDto != null && level < ommissionDto.DistributionLevel)
|
||||
{
|
||||
//返第二级
|
||||
level++;
|
||||
await AddOther(order, orderItems, goods, products, productsDistributions, level, user.parentId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 订单结算处理事件
|
||||
/// <summary>
|
||||
/// 订单结算处理事件
|
||||
/// </summary>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> FinishOrder(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var order = await _orderServices.QueryByClauseAsync(p => p.orderId == orderId && p.status == (int)GlobalEnumVars.OrderStatus.Complete);
|
||||
if (order == null)
|
||||
{
|
||||
jm.msg = "订单查询失败";
|
||||
return jm;
|
||||
}
|
||||
//更新
|
||||
var list = await _dal.QueryListByClauseAsync(p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
//钱挪到会员余额里面
|
||||
var result = await _balanceServices.Change(item.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution,
|
||||
item.amount, item.orderId);
|
||||
if (!result.status)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
await _dal.UpdateAsync(p => new CoreCmsDistributionOrder()
|
||||
{
|
||||
isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes,
|
||||
updateTime = DateTime.Now
|
||||
}, p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 作废订单
|
||||
/// <summary>
|
||||
/// 作废订单
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单编号</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> CancleOrderByOrderId(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var res = await _dal.UpdateAsync(p => new CoreCmsDistributionOrder() { isSettlement = (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementCancel },
|
||||
p => p.orderId == orderId && p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo);
|
||||
if (res == false)
|
||||
{
|
||||
jm.msg = "该未结算的订单不存在";
|
||||
return jm;
|
||||
}
|
||||
jm.msg = "操作成功";
|
||||
jm.status = true;
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取下级推广订单数量
|
||||
/// <summary>
|
||||
/// 获取下级推广订单数量
|
||||
/// </summary>
|
||||
/// <param name="parentId">父类序列</param>
|
||||
/// <param name="type">1获取1级,其他为2级,0为全部</param>
|
||||
/// <param name="thisMonth">显示当月</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> QueryChildOrderCountAsync(int parentId, int type = 1, bool thisMonth = false)
|
||||
{
|
||||
return await _dal.QueryChildOrderCountAsync(parentId, type, thisMonth);
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取下级推广订单金额
|
||||
/// <summary>
|
||||
/// 获取下级推广订单金额
|
||||
/// </summary>
|
||||
/// <param name="parentId">父类序列</param>
|
||||
/// <param name="type">1获取1级,其他为2级,0为全部</param>
|
||||
/// <param name="thisMonth">显示当月</param>
|
||||
/// <returns></returns>
|
||||
public async Task<decimal> QueryChildOrderMoneySumAsync(int parentId, int type = 1, bool thisMonth = false)
|
||||
{
|
||||
|
||||
return await _dal.QueryChildOrderMoneySumAsync(parentId, type, thisMonth);
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 等级佣金表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsDistributionResultServices : BaseServices<CoreCmsDistributionResult>, ICoreCmsDistributionResultServices
|
||||
{
|
||||
private readonly ICoreCmsDistributionResultRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsDistributionResultServices(IUnitOfWork unitOfWork, ICoreCmsDistributionResultRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsDistributionResult entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsDistributionResult entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsDistributionResult> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsDistributionResult>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsDistributionResult>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsDistributionResult>> QueryPageAsync(Expression<Func<CoreCmsDistributionResult, bool>> predicate,
|
||||
Expression<Func<CoreCmsDistributionResult, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
558
CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
Normal file
558
CoreCms.Net.Services/Distribution/CoreCmsDistributionServices.cs
Normal file
@@ -0,0 +1,558 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.DTO.Distribution;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 分销商表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsDistributionServices : BaseServices<CoreCmsDistribution>, ICoreCmsDistributionServices
|
||||
{
|
||||
private readonly ICoreCmsDistributionRepository _dal;
|
||||
private readonly ICoreCmsDistributionOrderRepository _distributionOrderRepository;
|
||||
private readonly ICoreCmsDistributionGradeRepository _distributionGradeRepository;
|
||||
private readonly ICoreCmsDistributionResultRepository _distributionResultRepository;
|
||||
private readonly ICoreCmsDistributionConditionServices _coreCmsDistributionConditionServices;
|
||||
private readonly ICoreCmsUserRepository _userRepository;
|
||||
private readonly ICoreCmsGoodsRepository _goodsRepository;
|
||||
private readonly ICoreCmsUserGradeRepository _userGradeRepository;
|
||||
private readonly ICoreCmsOrderRepository _orderRepository;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsDistributionServices(IUnitOfWork unitOfWork, ICoreCmsDistributionRepository dal, ICoreCmsDistributionOrderRepository distributionOrderRepository, ICoreCmsUserRepository userRepository, ICoreCmsGoodsRepository goodsRepository, ICoreCmsUserGradeRepository userGradeRepository, ICoreCmsSettingServices settingServices, ICoreCmsOrderRepository orderRepository, ICoreCmsDistributionGradeRepository distributionGradeRepository, ICoreCmsDistributionResultRepository distributionResultRepository, ICoreCmsDistributionConditionServices coreCmsDistributionConditionServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_distributionOrderRepository = distributionOrderRepository;
|
||||
_userRepository = userRepository;
|
||||
_goodsRepository = goodsRepository;
|
||||
_userGradeRepository = userGradeRepository;
|
||||
_settingServices = settingServices;
|
||||
_orderRepository = orderRepository;
|
||||
_distributionGradeRepository = distributionGradeRepository;
|
||||
_distributionResultRepository = distributionResultRepository;
|
||||
_coreCmsDistributionConditionServices = coreCmsDistributionConditionServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 获取分销商信息
|
||||
/// <summary>
|
||||
/// 获取分销商信息
|
||||
/// </summary>
|
||||
/// <param name="userId">用户id</param>
|
||||
/// <param name="checkStatus">是否检查满足条件</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetInfo(int userId, bool checkStatus = false)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null && info.verifyStatus == (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes)
|
||||
{
|
||||
//总金额
|
||||
info.TotalSettlementAmount = await _distributionOrderRepository.GetSumAsync(
|
||||
p => p.isSettlement != (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementCancel && p.userId == userId,
|
||||
p => p.amount);
|
||||
//已结算金额
|
||||
info.SettlementAmount = await _distributionOrderRepository.GetSumAsync(
|
||||
p => p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementYes && p.userId == userId,
|
||||
p => p.amount);
|
||||
//冻结金额
|
||||
info.FreezeAmount = await _distributionOrderRepository.GetSumAsync(
|
||||
p => p.isSettlement == (int)GlobalEnumVars.DistributionOrderSettlementStatus.SettlementNo && p.userId == userId,
|
||||
p => p.amount);
|
||||
var dt = DateTime.Now;
|
||||
//本月第一天时间
|
||||
DateTime dtFirst = dt.AddDays(1 - (dt.Day));
|
||||
dtFirst = new DateTime(dtFirst.Year, dtFirst.Month, dtFirst.Day, 0, 0, 0);
|
||||
//获得某年某月的天数
|
||||
int year = dt.Year;
|
||||
int month = dt.Month;
|
||||
int dayCount = DateTime.DaysInMonth(year, month);
|
||||
DateTime dtLast = dtFirst.AddDays(dayCount - 1);
|
||||
//本月订单数
|
||||
info.CurrentMonthOrder = await _distributionOrderRepository.GetCountAsync(p =>
|
||||
p.createTime >= dtFirst && p.createTime < dtLast && p.userId == userId);
|
||||
|
||||
info.Store = UserHelper.GetShareCodeByUserId(userId).ToString();
|
||||
|
||||
//本日开始结束时间
|
||||
var day = dt.Day;
|
||||
var dayStart = new DateTime(year, month, day, 0, 0, 0);
|
||||
var datEnd = new DateTime(year, month, day, 23, 59, 59);
|
||||
//今日收益
|
||||
info.TodayFreezeAmount = await _distributionOrderRepository.GetSumAsync(
|
||||
p => p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId,
|
||||
p => p.amount);
|
||||
//今日订单
|
||||
info.TodayOrder = await _distributionOrderRepository.GetCountAsync(
|
||||
p => p.createTime > dayStart && p.createTime <= datEnd && p.userId == userId);
|
||||
//今日会员
|
||||
info.TodayUser = await _userRepository.GetCountAsync(p =>
|
||||
p.parentId == userId && p.createTime > dayStart && p.createTime <= datEnd);
|
||||
}
|
||||
else if (info == null)
|
||||
{
|
||||
info = new CoreCmsDistribution();
|
||||
}
|
||||
info.TotalGoods = await _goodsRepository.GetCountAsync(p => p.isMarketable == true);
|
||||
if (info.gradeId > 0)
|
||||
{
|
||||
var userGrade = await _userGradeRepository.QueryByIdAsync(info.gradeId);
|
||||
if (userGrade != null)
|
||||
{
|
||||
info.GradeName = userGrade.title;
|
||||
}
|
||||
}
|
||||
//检查是否满足条件
|
||||
if ((checkStatus == true && info.id == 0) || info.verifyStatus != (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes)
|
||||
{
|
||||
info.NeedApply = true; //是否需要申请
|
||||
info.ConditionMsg = "您的条件已满足。(点击申请)";
|
||||
|
||||
//无需审核,但是需要满足条件
|
||||
var distributionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionType).ObjectToInt(0);
|
||||
if (distributionType > 0 && distributionType == 3)
|
||||
{
|
||||
info.NeedApply = false;
|
||||
info.ConditionStatus = false;//条件状态
|
||||
info.ConditionProgress = 0;
|
||||
|
||||
//满足条件,直接成为会员
|
||||
await CheckCondition(allConfigs, info, userId);
|
||||
if (info.ConditionStatus == true && info.ConditionProgress == 100)
|
||||
{
|
||||
//添加用户
|
||||
var userModel = await _userRepository.QueryByIdAsync(userId);
|
||||
if (userModel != null)
|
||||
{
|
||||
var iData = new CoreCmsDistribution();
|
||||
iData.name = !string.IsNullOrEmpty(userModel.nickName)
|
||||
? userModel.nickName
|
||||
: userModel.mobile;
|
||||
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes;
|
||||
iData.verifyTime = DateTime.Now;
|
||||
|
||||
await AddData(iData, userId);
|
||||
info.ConditionProgress = 100;
|
||||
info.ConditionStatus = true;//条件状态
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//无条件,但是需要审核
|
||||
if (distributionType > 0 && distributionType == 1)
|
||||
{
|
||||
info.NeedApply = true;
|
||||
info.ConditionProgress = 100;
|
||||
info.ConditionStatus = true;//条件状态
|
||||
info.ConditionMsg = "您的条件已满足。(前往申请)";
|
||||
}
|
||||
else if (distributionType > 0 && distributionType == 2)
|
||||
{
|
||||
await CheckCondition(allConfigs, info, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jm.msg = "获取成功";
|
||||
jm.status = true;
|
||||
jm.data = info;
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 添加用户信息
|
||||
/// <summary>
|
||||
/// 添加用户信息
|
||||
/// </summary>
|
||||
/// <param name="iData"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(CoreCmsDistribution iData, int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
if (string.IsNullOrEmpty(iData.mobile))
|
||||
{
|
||||
jm.msg = "请填写手机号";
|
||||
return jm;
|
||||
}
|
||||
if (CommonHelper.IsMobile(iData.mobile) == false)
|
||||
{
|
||||
jm.msg = "请填写正确的手机号";
|
||||
return jm;
|
||||
}
|
||||
if (string.IsNullOrEmpty(iData.name))
|
||||
{
|
||||
jm.msg = "请填写您的姓名";
|
||||
return jm;
|
||||
}
|
||||
iData.userId = userId;
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "您已申请,请勿重复提交";
|
||||
return jm;
|
||||
}
|
||||
//默认等级处理
|
||||
if (iData.gradeId == 0)
|
||||
{
|
||||
var disGradeModel = await _distributionGradeRepository.QueryByClauseAsync(p => p.isDefault == true);
|
||||
if (disGradeModel != null)
|
||||
{
|
||||
iData.gradeId = disGradeModel.id;
|
||||
}
|
||||
}
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var distributionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionType).ObjectToInt(0);
|
||||
if (distributionType == (int)GlobalEnumVars.DistributionConditionType.NoReview)
|
||||
{
|
||||
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes;
|
||||
}
|
||||
else
|
||||
{
|
||||
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyWait;
|
||||
}
|
||||
|
||||
iData.isDelete = false;
|
||||
iData.createTime = DateTime.Now;
|
||||
|
||||
//判断是否存在
|
||||
var bl = await _dal.InsertAsync(iData) > 0;
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "申请成功" : "申请失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 检查是否可以成为分销商
|
||||
//检查是否可以成为分销商
|
||||
public async Task CheckCondition(Dictionary<string, DictionaryKeyValues> allConfigs, CoreCmsDistribution info, int userId = 0)
|
||||
{
|
||||
//判断消费
|
||||
info.ConditionStatus = false;//条件状态
|
||||
info.ConditionProgress = 0;
|
||||
//获取成为分销商条件
|
||||
//var DistributionType = CommonHelper.GetConfigDictionary(allConfigs, GlobalSettingConstVars.DistributionType).ObjectToInt(0);
|
||||
var distributionMoney = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionMoney).ObjectToInt(0);
|
||||
//支付金额
|
||||
var payed = await _orderRepository.GetSumAsync(
|
||||
p => p.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes && p.userId == userId, p => p.payedAmount);
|
||||
if (payed < distributionMoney && distributionMoney > 0)
|
||||
{
|
||||
info.ConditionMsg = "您的消费额度未满足" + distributionMoney + "元无法申请,快去下单吧~";
|
||||
}
|
||||
else
|
||||
{
|
||||
info.ConditionProgress = 50;
|
||||
//判断是否需要购买商品
|
||||
var distributionGoods = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionGoods).ObjectToInt(0);
|
||||
if (distributionGoods > 0 && distributionGoods == 1)
|
||||
{
|
||||
info.ConditionProgress = info.ConditionProgress + 50;
|
||||
info.ConditionStatus = true;//条件状态
|
||||
info.ConditionMsg = "您的条件已满足,马上申请。";
|
||||
}
|
||||
else
|
||||
{
|
||||
//任意商品
|
||||
if (distributionGoods > 0 && distributionGoods == 2)
|
||||
{
|
||||
var orderCount = await _orderRepository.GetCountAsync(p =>
|
||||
p.userId == userId && p.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes);
|
||||
if (orderCount > 1)
|
||||
{
|
||||
info.ConditionProgress = info.ConditionProgress + 50;
|
||||
info.ConditionStatus = true;//条件状态
|
||||
info.ConditionMsg = "您的条件已满足,马上申请。";
|
||||
}
|
||||
else
|
||||
{
|
||||
info.ConditionMsg = "您的条件未满足,请任意购买一件商品即可成为分销商。";
|
||||
}
|
||||
}
|
||||
else if (distributionGoods > 0 && distributionGoods == 3) //购买指定商品
|
||||
{
|
||||
//判断是否购买指定商品
|
||||
var distributionGoodsId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionGoodsId).ObjectToInt(0);
|
||||
var orderNum = _orderRepository.GetOrderNum(userId, distributionGoodsId);
|
||||
if (orderNum >= 1)
|
||||
{
|
||||
info.ConditionProgress = info.ConditionProgress + 50;
|
||||
info.ConditionStatus = true;//条件状态
|
||||
info.ConditionMsg = "您的条件已满足,马上申请。";
|
||||
}
|
||||
else
|
||||
{
|
||||
var goodsInfo = await _goodsRepository.QueryByIdAsync(distributionGoodsId);
|
||||
if (goodsInfo != null)
|
||||
{
|
||||
info.ConditionMsg = "您的条件未满足,请购买指定的【" + goodsInfo.name + "】商品即可成为分销商。";
|
||||
}
|
||||
else
|
||||
{
|
||||
info.ConditionMsg = "您的条件未满足,请购买指定的商品即可成为分销商。";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取我的推广订单
|
||||
|
||||
/// <summary>
|
||||
/// 获取我的推广订单
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="limit"></param>
|
||||
/// <param name="typeId">类型</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetMyOrderList(int userId, int page, int limit = 10, int typeId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "获取成功";
|
||||
var pageList = await _dal.QueryOrderPageAsync(userId, page, limit, typeId);
|
||||
jm.data = pageList;
|
||||
jm.code = pageList.TotalCount;
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取店铺信息
|
||||
/// <summary>
|
||||
/// 获取店铺信息
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetStore(int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
jm.status = true;
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null)
|
||||
{
|
||||
info.TotalGoods = await _goodsRepository.GetCountAsync(p => p.isMarketable == true && p.isDel == false);
|
||||
jm.data = new
|
||||
{
|
||||
info.createTime,
|
||||
info.name,
|
||||
info.storeBanner,
|
||||
info.storeDesc,
|
||||
info.storeLogo,
|
||||
info.storeName,
|
||||
info.TotalGoods
|
||||
};
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取当前用户返佣设置
|
||||
/// <summary>
|
||||
/// 获取当前用户返佣设置
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetGradeAndCommission(int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info == null)
|
||||
{
|
||||
jm.msg = "不是分销商的,不返利";
|
||||
return jm; //不是分销商的,不返利。
|
||||
}
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var commissionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionType).ObjectToInt(0);
|
||||
var dto = new DistributionDto();
|
||||
if (info.gradeId > 0)
|
||||
{
|
||||
var res = await _distributionResultRepository.QueryListByClauseAsync(p => p.gradeId == info.gradeId);
|
||||
if (res != null && res.Any())
|
||||
{
|
||||
dto.grade_id = info.gradeId;
|
||||
res.ForEach(p =>
|
||||
{
|
||||
var obj = JObject.Parse(p.parameters);
|
||||
if (p.code == "COMMISSION_1")
|
||||
{
|
||||
dto.commission_1 = new commission()
|
||||
{
|
||||
type = obj["commissionType"].ObjectToInt(0),
|
||||
discount = obj["discount"].ObjectToDecimal(0)
|
||||
};
|
||||
}
|
||||
else if (p.code == "COMMISSION_2")
|
||||
{
|
||||
dto.commission_2 = new commission()
|
||||
{
|
||||
type = obj["commissionType"].ObjectToInt(0),
|
||||
discount = obj["discount"].ObjectToDecimal(0)
|
||||
};
|
||||
|
||||
}
|
||||
else if (p.code == "COMMISSION_3")
|
||||
{
|
||||
dto.commission_3 = new commission()
|
||||
{
|
||||
type = obj["commissionType"].ObjectToInt(0),
|
||||
discount = obj["discount"].ObjectToDecimal(0)
|
||||
};
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
dto.grade_id = 0;
|
||||
dto.commission_1 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionFirst).ObjectToDecimal(0)
|
||||
};
|
||||
dto.commission_2 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionSecond).ObjectToDecimal(0)
|
||||
};
|
||||
dto.commission_3 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionThird).ObjectToDecimal(0)
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
dto.grade_id = 0;
|
||||
dto.commission_1 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionFirst).ObjectToDecimal(0)
|
||||
};
|
||||
dto.commission_2 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionSecond).ObjectToDecimal(0)
|
||||
};
|
||||
dto.commission_3 = new commission()
|
||||
{
|
||||
type = commissionType,
|
||||
discount = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionThird).ObjectToDecimal(0)
|
||||
};
|
||||
}
|
||||
|
||||
dto.DistributionLevel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionLevel).ObjectToInt(0);
|
||||
jm.status = true;
|
||||
jm.data = dto;
|
||||
jm.msg = "获取成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 检查当前用户是否可以升级(暂存,有问题)
|
||||
|
||||
/// <summary>
|
||||
/// 检查当前用户是否可以升级(暂存,有问题)
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> CheckUpdate(int userId)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (info != null && info.gradeId > 0)
|
||||
{
|
||||
//找下有没有可以升级的分销商等级
|
||||
var grade = await _distributionGradeRepository.QueryByClauseAsync(p => p.id > info.gradeId && p.isAutoUpGrade == true);
|
||||
if (grade != null)
|
||||
{
|
||||
var conditionList = await _coreCmsDistributionConditionServices.QueryListByClauseAsync(p => p.gradeId == grade.id);
|
||||
//循环所有条件,判断是否可以升级
|
||||
var condition = true;//默认满足升级
|
||||
foreach (var item in conditionList)
|
||||
{
|
||||
var method = "condition_" + item.code;
|
||||
//暂存,有问题
|
||||
}
|
||||
|
||||
if (condition)
|
||||
{
|
||||
await _dal.UpdateAsync(p => new CoreCmsDistribution() { gradeId = grade.id },
|
||||
p => p.userId == userId);
|
||||
jm.msg = "升级成功";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "条件暂不满足,无法升级";
|
||||
}
|
||||
}
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取代理商排行
|
||||
/// </summary>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<DistributionRankingDTO>> QueryRankingPageAsync(int pageIndex = 1, int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryRankingPageAsync(pageIndex, pageSize);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 发票信息记录 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsInvoiceRecordServices : BaseServices<CoreCmsInvoiceRecord>, ICoreCmsInvoiceRecordServices
|
||||
{
|
||||
private readonly ICoreCmsInvoiceRecordRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsInvoiceRecordServices(IUnitOfWork unitOfWork, ICoreCmsInvoiceRecordRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
81
CoreCms.Net.Services/Financial/CoreCmsInvoiceServices.cs
Normal file
81
CoreCms.Net.Services/Financial/CoreCmsInvoiceServices.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 发票表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsInvoiceServices : BaseServices<CoreCmsInvoice>, ICoreCmsInvoiceServices
|
||||
{
|
||||
private readonly ICoreCmsInvoiceRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsInvoiceServices(IUnitOfWork unitOfWork, ICoreCmsInvoiceRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取订单的发票信息
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单字符串编号</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetOrderInvoiceInfo(string orderId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var model = await base.QueryByClauseAsync(p => p.sourceId == orderId && p.category == (int)GlobalEnumVars.OrderTaxCategory.Order);
|
||||
jm.status = model != null;
|
||||
jm.data = model;
|
||||
jm.msg = jm.status ? GlobalConstVars.GetDataSuccess : GlobalConstVars.GetDataFailure;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsInvoice>> QueryPageAsync(Expression<Func<CoreCmsInvoice, bool>> predicate,
|
||||
Expression<Func<CoreCmsInvoice, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/Financial/CoreCmsPaymentsServices.cs
Normal file
39
CoreCms.Net.Services/Financial/CoreCmsPaymentsServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 支付方式表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPaymentsServices : BaseServices<CoreCmsPayments>, ICoreCmsPaymentsServices
|
||||
{
|
||||
private readonly ICoreCmsPaymentsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsPaymentsServices(IUnitOfWork unitOfWork, ICoreCmsPaymentsRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
307
CoreCms.Net.Services/Financial/CoreCmsReportsServices.cs
Normal file
307
CoreCms.Net.Services/Financial/CoreCmsReportsServices.cs
Normal file
@@ -0,0 +1,307 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.Echarts;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 报表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsReportsServices : BaseServices<GetOrdersReportsDbSelectOut>, ICoreCmsReportsServices
|
||||
{
|
||||
private readonly ICoreCmsReportsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsReportsServices(IUnitOfWork unitOfWork, ICoreCmsReportsRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 订单报表
|
||||
/// </summary>
|
||||
/// <param name="num">数量</param>
|
||||
/// <param name="where">查询条件</param>
|
||||
/// <param name="section">查询值</param>
|
||||
/// <param name="sTime">开始时间</param>
|
||||
/// <param name="joinVal">筛选字段createTime/paymentTime </param>
|
||||
/// <returns></returns>
|
||||
public List<GetOrdersReportsDbSelectOut> GetOrderMark(int num, string where, int section, DateTime sTime, string joinVal)
|
||||
{
|
||||
|
||||
var sqlStr = string.Empty;
|
||||
string dbTypeString = AppSettingsConstVars.DbDbType;
|
||||
if (dbTypeString == DbType.SqlServer.ToString())
|
||||
{
|
||||
sqlStr = @"SELECT tmp_x.number ,
|
||||
ISNULL(SUM(o.orderAmount), 0) AS val ,
|
||||
COUNT(o.orderId) AS num
|
||||
FROM ( ( SELECT number
|
||||
FROM MASTER..spt_values
|
||||
WHERE TYPE = 'P'
|
||||
AND number >= 0
|
||||
AND number <= " + num + @"
|
||||
) tmp_x
|
||||
LEFT OUTER JOIN ( SELECT *
|
||||
FROM CoreCmsOrder
|
||||
WHERE isdel=0 " + where + @"
|
||||
) o ON tmp_x.number = DATEDIFF(" + (section == 3600 ? "HOUR" : "DAY") + ", '" + sTime.ToString("yyyy-MM-dd HH:mm:ss") + @"', o." + joinVal + @")
|
||||
)
|
||||
GROUP BY tmp_x.number";
|
||||
}
|
||||
else if (dbTypeString == DbType.MySql.ToString())
|
||||
{
|
||||
sqlStr = @"select tmp_x.x,ifnull(sum(o.orderAmount),0) as val,count(o.orderId) as num
|
||||
from
|
||||
(SELECT @xi:=@xi+1 as x from
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x1,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x2,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x3,
|
||||
(SELECT @xi:=-1) x0 limit 0," + num + @") tmp_x
|
||||
left join (
|
||||
select * from CoreCmsOrder
|
||||
where 1 = 1
|
||||
" + where + @"
|
||||
) o on tmp_x.x = ((cast(date(o." + joinVal + @") as signed) - " + sTime.ToString("yyyy-MM-dd") + @") div(" + section + @"))
|
||||
group by tmp_x.x
|
||||
";
|
||||
}
|
||||
|
||||
|
||||
var sp = new List<SugarParameter>();
|
||||
|
||||
var list = _dal.SqlQuery(sqlStr, sp);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 支付单报表
|
||||
/// </summary>
|
||||
/// <param name="num">数量</param>
|
||||
/// <param name="where">查询条件</param>
|
||||
/// <param name="section">查询值</param>
|
||||
/// <param name="sTime">开始时间</param>
|
||||
/// <param name="joinVal">筛选字段createTime/paymentTime </param>
|
||||
/// <returns></returns>
|
||||
public List<GetOrdersReportsDbSelectOut> GetPaymentsMark(int num, string where, int section, DateTime sTime, string joinVal)
|
||||
{
|
||||
var sqlStr = string.Empty;
|
||||
string dbTypeString = AppSettingsConstVars.DbDbType;
|
||||
if (dbTypeString == DbType.SqlServer.ToString())
|
||||
{
|
||||
sqlStr = @"SELECT tmp_x.number ,
|
||||
ISNULL(SUM(o.money), 0) AS val ,
|
||||
COUNT(o.paymentId) AS num
|
||||
FROM ( ( SELECT number
|
||||
FROM MASTER..spt_values
|
||||
WHERE TYPE = 'P'
|
||||
AND number >= 0
|
||||
AND number <= " + num + @"
|
||||
) tmp_x
|
||||
LEFT OUTER JOIN ( SELECT *
|
||||
FROM CoreCmsBillPayments
|
||||
WHERE 1=1 " + where + @"
|
||||
) o ON tmp_x.number = DATEDIFF(" + (section == 3600 ? "HOUR" : "DAY") + ", '" + sTime.ToString("yyyy-MM-dd HH:mm:ss") + @"', o." + joinVal + @")
|
||||
)
|
||||
GROUP BY tmp_x.number";
|
||||
}
|
||||
else if (dbTypeString == DbType.MySql.ToString())
|
||||
{
|
||||
sqlStr = @"select tmp_x.x,ifnull(sum(o.money),0) as val,count(o.paymentId) as num
|
||||
from
|
||||
(SELECT @xi:=@xi+1 as x from
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x1,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x2,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x3,
|
||||
(SELECT @xi:=-1) x0 limit 0," + num + @") tmp_x
|
||||
left join (
|
||||
select * from CoreCmsBillPayments
|
||||
where 1 = 1
|
||||
" + where + @"
|
||||
) o on tmp_x.x = ((cast(date(o." + joinVal + @") as signed) - " + sTime.ToString("yyyy-MM-dd") + @") div(" + section + @"))
|
||||
group by tmp_x.x
|
||||
";
|
||||
}
|
||||
|
||||
var sp = new List<SugarParameter>();
|
||||
|
||||
|
||||
var list = _dal.SqlQuery(sqlStr, sp);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 退款单报表
|
||||
/// </summary>
|
||||
/// <param name="num">数量</param>
|
||||
/// <param name="where">查询条件</param>
|
||||
/// <param name="section">查询值</param>
|
||||
/// <param name="sTime">开始时间</param>
|
||||
/// <param name="joinVal">筛选字段createTime/paymentTime </param>
|
||||
/// <returns></returns>
|
||||
public List<GetOrdersReportsDbSelectOut> GetRefundMark(int num, string where, int section, DateTime sTime, string joinVal)
|
||||
{
|
||||
|
||||
var sqlStr = string.Empty;
|
||||
string dbTypeString = AppSettingsConstVars.DbDbType;
|
||||
if (dbTypeString == DbType.SqlServer.ToString())
|
||||
{
|
||||
sqlStr = @"SELECT tmp_x.number ,
|
||||
ISNULL(SUM(o.money), 0) AS val ,
|
||||
COUNT(o.refundId) AS num
|
||||
FROM ( ( SELECT number
|
||||
FROM MASTER..spt_values
|
||||
WHERE TYPE = 'P'
|
||||
AND number >= 0
|
||||
AND number <= " + num + @"
|
||||
) tmp_x
|
||||
LEFT OUTER JOIN ( SELECT *
|
||||
FROM CoreCmsBillRefund
|
||||
WHERE 1=1 " + where + @"
|
||||
) o ON tmp_x.number = DATEDIFF(" + (section == 3600 ? "HOUR" : "DAY") + ", '" + sTime.ToString("yyyy-MM-dd HH:mm:ss") + @"', o." + joinVal + @")
|
||||
)
|
||||
GROUP BY tmp_x.number";
|
||||
}
|
||||
else if (dbTypeString == DbType.MySql.ToString())
|
||||
{
|
||||
sqlStr = @"select tmp_x.x,ifnull(sum(o.money),0) as val,count(o.refundId) as num
|
||||
from
|
||||
(SELECT @xi:=@xi+1 as x from
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x1,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x2,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x3,
|
||||
(SELECT @xi:=-1) x0 limit 0," + num + @") tmp_x
|
||||
left join(
|
||||
select* from CoreCmsBillRefund
|
||||
where 1 = 1
|
||||
" + where + @"
|
||||
) o on tmp_x.x = ((cast(date(o." + joinVal + @") as signed) - " + sTime.ToString("yyyy-MM-dd") + @") div(" + section + @"))
|
||||
group by tmp_x.x
|
||||
";
|
||||
}
|
||||
|
||||
var sp = new List<SugarParameter>();
|
||||
|
||||
var list = _dal.SqlQuery(sqlStr, sp);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户提现报表
|
||||
/// </summary>
|
||||
/// <param name="num">数量</param>
|
||||
/// <param name="where">查询条件</param>
|
||||
/// <param name="section">查询值</param>
|
||||
/// <param name="sTime">开始时间</param>
|
||||
/// <param name="joinVal">筛选字段createTime/paymentTime </param>
|
||||
/// <returns></returns>
|
||||
public List<GetOrdersReportsDbSelectOut> GetTocashMark(int num, string where, int section, DateTime sTime, string joinVal)
|
||||
{
|
||||
|
||||
var sqlStr = string.Empty;
|
||||
string dbTypeString = AppSettingsConstVars.DbDbType;
|
||||
if (dbTypeString == DbType.SqlServer.ToString())
|
||||
{
|
||||
sqlStr = @"SELECT tmp_x.number ,
|
||||
ISNULL(SUM(o.money), 0) AS val ,
|
||||
COUNT(o.id) AS num
|
||||
FROM ( ( SELECT number
|
||||
FROM MASTER..spt_values
|
||||
WHERE TYPE = 'P'
|
||||
AND number >= 0
|
||||
AND number <= " + num + @"
|
||||
) tmp_x
|
||||
LEFT OUTER JOIN ( SELECT *
|
||||
FROM CoreCmsUserTocash
|
||||
WHERE 1=1 " + where + @"
|
||||
) o ON tmp_x.number = DATEDIFF(" + (section == 3600 ? "HOUR" : "DAY") + ", '" + sTime.ToString("yyyy-MM-dd HH:mm:ss") + @"', o." + joinVal + @")
|
||||
)
|
||||
GROUP BY tmp_x.number";
|
||||
}
|
||||
else if (dbTypeString == DbType.MySql.ToString())
|
||||
{
|
||||
sqlStr = @"select tmp_x.x,ifnull(sum(o.money),0) as val,count(o.id) as num
|
||||
from
|
||||
(SELECT @xi:=@xi+1 as x from
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x1,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x2,
|
||||
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) x3,
|
||||
(SELECT @xi:=-1) x0 limit 0," + num + @") tmp_x
|
||||
left join (
|
||||
select * from CoreCmsUserTocash
|
||||
where 1 = 1
|
||||
" + where + @"
|
||||
) o on tmp_x.x = ((cast(date(o." + joinVal + @") as signed) - " + sTime.ToString("yyyy-MM-dd") + @") div(" + section + @"))
|
||||
group by tmp_x.x
|
||||
";
|
||||
}
|
||||
|
||||
var sp = new List<SugarParameter>();
|
||||
|
||||
var list = _dal.SqlQuery(sqlStr, sp);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取订单销量查询返回结果
|
||||
/// </summary>
|
||||
/// <param name="start"></param>
|
||||
/// <param name="end"></param>
|
||||
/// <param name="filter"></param>
|
||||
/// <param name="filterSed"></param>
|
||||
/// <param name="thesort"></param>
|
||||
/// <param name="pageIndex"></param>
|
||||
/// <param name="pageSize"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<GoodsSalesVolume>> GetGoodsSalesVolumes(string start, string end, string filter, string filterSed, string thesort, int pageIndex = 1, int pageSize = 5000)
|
||||
{
|
||||
return await _dal.GetGoodsSalesVolumes(start, end, filter, filterSed, thesort, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取商品收藏查询返回结果
|
||||
/// </summary>
|
||||
/// <param name="start"></param>
|
||||
/// <param name="end"></param>
|
||||
/// <param name="thesort"></param>
|
||||
/// <param name="pageIndex"></param>
|
||||
/// <param name="pageSize"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<GoodsCollection>> GetGoodsCollections(string start, string end, string thesort, int pageIndex = 1, int pageSize = 5000)
|
||||
{
|
||||
return await _dal.GetGoodsCollections(start, end, thesort, pageIndex, pageSize);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
38
CoreCms.Net.Services/Good/CoreCmsBrandServices.cs
Normal file
38
CoreCms.Net.Services/Good/CoreCmsBrandServices.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 品牌表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsBrandServices : BaseServices<CoreCmsBrand>, ICoreCmsBrandServices
|
||||
{
|
||||
private readonly ICoreCmsBrandRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsBrandServices(IUnitOfWork unitOfWork, ICoreCmsBrandRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
57
CoreCms.Net.Services/Good/CoreCmsGoodsBrowsingServices.cs
Normal file
57
CoreCms.Net.Services/Good/CoreCmsGoodsBrowsingServices.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品浏览记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsBrowsingServices : BaseServices<CoreCmsGoodsBrowsing>, ICoreCmsGoodsBrowsingServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsBrowsingRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsBrowsingServices(IUnitOfWork unitOfWork, ICoreCmsGoodsBrowsingRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsGoodsBrowsing>> QueryPageAsync(Expression<Func<CoreCmsGoodsBrowsing, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoodsBrowsing, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品分类扩展表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsCategoryExtendServices : BaseServices<CoreCmsGoodsCategoryExtend>, ICoreCmsGoodsCategoryExtendServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsCategoryExtendRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsCategoryExtendServices(IUnitOfWork unitOfWork, ICoreCmsGoodsCategoryExtendRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
153
CoreCms.Net.Services/Good/CoreCmsGoodsCategoryServices.cs
Normal file
153
CoreCms.Net.Services/Good/CoreCmsGoodsCategoryServices.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品分类 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsCategoryServices : BaseServices<CoreCmsGoodsCategory>, ICoreCmsGoodsCategoryServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsCategoryRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsCategoryServices(IUnitOfWork unitOfWork, ICoreCmsGoodsCategoryRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsGoodsCategory entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsCategory entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsGoodsCategory> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsGoodsCategory>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 判断商品分类下面是否有某一个商品分类
|
||||
/// <summary>
|
||||
/// 判断商品分类下面是否有某一个商品分类
|
||||
/// </summary>
|
||||
/// <param name="catParentId"></param>
|
||||
/// <param name="catId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> IsChild(int catParentId, int catId)
|
||||
{
|
||||
var list = await _dal.GetCaChe();
|
||||
var bl = IsHave(list, catParentId, catId);
|
||||
return bl;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 判断是否含有子类
|
||||
/// <summary>
|
||||
/// 判断是否含有子类
|
||||
/// </summary>
|
||||
/// <param name="list"></param>
|
||||
/// <param name="catParentId"></param>
|
||||
/// <param name="catId"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsHave(List<CoreCmsGoodsCategory> list, int catParentId, int catId)
|
||||
{
|
||||
if (catParentId == catId)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (!list.Exists(p => p.id == catParentId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var children = list.Where(p => p.parentId == catParentId).ToList();
|
||||
foreach (var item in children)
|
||||
{
|
||||
if (IsHave(list, item.id, catId))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
119
CoreCms.Net.Services/Good/CoreCmsGoodsCollectionServices.cs
Normal file
119
CoreCms.Net.Services/Good/CoreCmsGoodsCollectionServices.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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 SqlSugar;
|
||||
using StackExchange.Redis;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品收藏表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsCollectionServices : BaseServices<CoreCmsGoodsCollection>, ICoreCmsGoodsCollectionServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsCollectionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsCollectionServices(IUnitOfWork unitOfWork, ICoreCmsGoodsCollectionRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查是否收藏了此商品
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="goodsId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> Check(int userId, int goodsId)
|
||||
{
|
||||
var bl =await _dal.ExistsAsync(p => p.userId == userId && p.goodsId == goodsId);
|
||||
return bl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsGoodsCollection>> QueryPageAsync(Expression<Func<CoreCmsGoodsCollection, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoodsCollection, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 如果收藏了,就取消收藏,如果没有收藏,就收藏
|
||||
/// </summary>
|
||||
public async Task<WebApiCallBack> ToDo(int userId, int goodsId)
|
||||
{
|
||||
var collectionInfo = await _dal.ExistsAsync(p => p.userId == userId && p.goodsId == goodsId);
|
||||
if (collectionInfo)
|
||||
{
|
||||
return await ToDel(userId, goodsId);
|
||||
}
|
||||
else
|
||||
{
|
||||
return await ToAdd(userId, goodsId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 取消收藏
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="goodsId"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<WebApiCallBack> ToDel(int userId, int goodsId)
|
||||
{
|
||||
var jm = new WebApiCallBack() { status = true, msg = "取消收藏成功" };
|
||||
await _dal.DeleteAsync(p => p.userId == userId && p.goodsId == goodsId);
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 收藏
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="goodsId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToAdd(int userId, int goodsId)
|
||||
{
|
||||
return await _dal.ToAdd(userId, goodsId);
|
||||
}
|
||||
}
|
||||
}
|
||||
238
CoreCms.Net.Services/Good/CoreCmsGoodsCommentServices.cs
Normal file
238
CoreCms.Net.Services/Good/CoreCmsGoodsCommentServices.cs
Normal file
@@ -0,0 +1,238 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
using ToolGood.Words;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品评价表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsCommentServices : BaseServices<CoreCmsGoodsComment>, ICoreCmsGoodsCommentServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsCommentRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IToolsServices _toolsServices;
|
||||
public CoreCmsGoodsCommentServices(IUnitOfWork unitOfWork, ICoreCmsGoodsCommentRepository dal,
|
||||
IServiceProvider serviceProvider, IToolsServices toolsServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
_toolsServices = toolsServices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加一条评论
|
||||
/// </summary>
|
||||
/// <param name="orderId">订单号</param>
|
||||
/// <param name="items">评价数据</param>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddComment(string orderId, List<OrderEvaluatePostItems> items, int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var orderItemServices = container.ServiceProvider.GetService<ICoreCmsOrderItemServices>();
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
|
||||
//判断这个订单是否可以评价
|
||||
var res = await orderServices.IsOrderComment(orderId, userId);
|
||||
if (!res.status)
|
||||
{
|
||||
//已经评价或者存在问题
|
||||
return res;
|
||||
}
|
||||
var goodComments = new List<CoreCmsGoodsComment>();
|
||||
var gid = new List<int>();
|
||||
|
||||
|
||||
|
||||
|
||||
foreach (var item in items)
|
||||
{
|
||||
//判断此条记录是否是此订单下面的
|
||||
var itemInfo = await orderItemServices.QueryByClauseAsync(p => p.id == item.orderItemId && p.orderId == orderId);
|
||||
if (itemInfo == null)
|
||||
{
|
||||
//说明没有此条记录,就不需要评论了
|
||||
continue;
|
||||
}
|
||||
var score = 5;
|
||||
if (item.score >= 1 && item.score <= 5)
|
||||
{
|
||||
score = item.score;
|
||||
}
|
||||
var images = string.Empty;
|
||||
if (item.images.Any())
|
||||
{
|
||||
images = string.Join(",", item.images);
|
||||
}
|
||||
|
||||
//过滤违规字符串
|
||||
item.textarea = await _toolsServices.IllegalWordsReplace(item.textarea);
|
||||
|
||||
var commentModel = new CoreCmsGoodsComment
|
||||
{
|
||||
commentId = 0,
|
||||
score = score,
|
||||
userId = userId,
|
||||
goodsId = itemInfo.goodsId,
|
||||
orderId = orderId,
|
||||
images = images,
|
||||
contentBody = item.textarea,
|
||||
addon = itemInfo.addon,
|
||||
isDisplay = false,
|
||||
createTime = DateTime.Now
|
||||
};
|
||||
goodComments.Add(commentModel);
|
||||
gid.Add(itemInfo.goodsId);
|
||||
}
|
||||
|
||||
await _dal.InsertAsync(goodComments);
|
||||
//商品表更新评论数量
|
||||
await goodsServices.UpdateAsync(p => new CoreCmsGoods() { commentsCount = p.commentsCount + 1 },
|
||||
p => gid.Contains(p.id));
|
||||
//修改评价状态
|
||||
await orderServices.UpdateAsync(p => new CoreCmsOrder() { isComment = true }, p => p.orderId == orderId);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "评价成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsGoodsComment entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsGoodsComment entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsGoodsComment> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 商家回复评价
|
||||
/// </summary>
|
||||
/// <param name="id">序列</param>
|
||||
/// <param name="sellerContent">回复内容</param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> Reply(int id, string sellerContent)
|
||||
{
|
||||
return await _dal.Reply(id, sellerContent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个详情数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsGoodsComment> DetailsByIdAsync(Expression<Func<CoreCmsGoodsComment, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoodsComment, object>> orderByExpression, OrderByType orderByType)
|
||||
{
|
||||
return await _dal.DetailsByIdAsync(predicate, orderByExpression, orderByType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoodsComment>> QueryPageAsync(Expression<Func<CoreCmsGoodsComment, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoodsComment, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/Good/CoreCmsGoodsGradeServices.cs
Normal file
39
CoreCms.Net.Services/Good/CoreCmsGoodsGradeServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品会员价表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsGradeServices : BaseServices<CoreCmsGoodsGrade>, ICoreCmsGoodsGradeServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsGradeRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsGradeServices(IUnitOfWork unitOfWork, ICoreCmsGoodsGradeRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/Good/CoreCmsGoodsParamsServices.cs
Normal file
39
CoreCms.Net.Services/Good/CoreCmsGoodsParamsServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品参数表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsParamsServices : BaseServices<CoreCmsGoodsParams>, ICoreCmsGoodsParamsServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsParamsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsParamsServices(IUnitOfWork unitOfWork, ICoreCmsGoodsParamsRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
684
CoreCms.Net.Services/Good/CoreCmsGoodsServices.cs
Normal file
684
CoreCms.Net.Services/Good/CoreCmsGoodsServices.cs
Normal file
@@ -0,0 +1,684 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsServices : BaseServices<CoreCmsGoods>, ICoreCmsGoodsServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly ICoreCmsProductsServices _productsServices;
|
||||
private readonly ICoreCmsGoodsGradeServices _goodsGradeServices;
|
||||
private readonly ICoreCmsLabelServices _labelServices;
|
||||
private readonly ICoreCmsPromotionServices _promotionServices;
|
||||
private readonly ICoreCmsGoodsCollectionServices _goodsCollectionServices;
|
||||
private readonly ICoreCmsBrandServices _brandServices;
|
||||
private readonly ICoreCmsOrderItemServices _orderItemServices;
|
||||
|
||||
public CoreCmsGoodsServices(IUnitOfWork unitOfWork, ICoreCmsGoodsRepository dal
|
||||
, ICoreCmsProductsServices productsServices
|
||||
, ICoreCmsGoodsGradeServices goodsGradeServices
|
||||
, ICoreCmsLabelServices labelServices
|
||||
, ICoreCmsPromotionServices promotionServices
|
||||
, ICoreCmsGoodsCollectionServices goodsCollectionServices
|
||||
, ICoreCmsBrandServices brandServices
|
||||
, ICoreCmsOrderItemServices orderItemServices
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_productsServices = productsServices;
|
||||
_goodsGradeServices = goodsGradeServices;
|
||||
_labelServices = labelServices;
|
||||
_promotionServices = promotionServices;
|
||||
_goodsCollectionServices = goodsCollectionServices;
|
||||
_brandServices = brandServices;
|
||||
_orderItemServices = orderItemServices;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> InsertAsync(FMGoodsInsertModel entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateAsync(FMGoodsInsertModel entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
|
||||
#region 批量修改价格==========================================
|
||||
/// <summary>
|
||||
/// 批量修改价格
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoBatchModifyPrice(FmBatchModifyPrice entity)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var bl = false;
|
||||
//获取商品信息
|
||||
var goods = await base.BaseDal.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
|
||||
if (!goods.Any())
|
||||
{
|
||||
jm.msg = GlobalConstVars.DataisNo;
|
||||
return jm;
|
||||
}
|
||||
var goodIds = goods.Select(p => p.id).ToList();
|
||||
//获取货品信息
|
||||
var products = await _productsServices.QueryListByClauseAsync(p => goodIds.Contains((int)p.goodsId));
|
||||
var productIds = products.Select(p => p.id).ToList();
|
||||
//获取自定义价格信息
|
||||
var goodsGrade = await _goodsGradeServices.QueryListByClauseAsync(p => goodIds.Contains(p.goodsId));
|
||||
var goodsGradeIds = goodsGrade.Select(p => p.id).ToList();
|
||||
|
||||
var priceValue = entity.priceValue;
|
||||
|
||||
switch (entity.modifyType)
|
||||
{
|
||||
case "=":
|
||||
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType.Contains("grade_price_"))
|
||||
{
|
||||
var gradeArr = entity.priceType.Split("_");
|
||||
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
|
||||
if (goodsGradeId > 0)
|
||||
{
|
||||
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "-":
|
||||
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType.Contains("grade_price_"))
|
||||
{
|
||||
var gradeArr = entity.priceType.Split("_");
|
||||
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
|
||||
if (goodsGradeId > 0)
|
||||
{
|
||||
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice - priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "+":
|
||||
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType.Contains("grade_price_"))
|
||||
{
|
||||
var gradeArr = entity.priceType.Split("_");
|
||||
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
|
||||
if (goodsGradeId > 0)
|
||||
{
|
||||
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice + priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "*":
|
||||
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
|
||||
{
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
}
|
||||
else if (entity.priceType.Contains("grade_price_"))
|
||||
{
|
||||
var gradeArr = entity.priceType.Split("_");
|
||||
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
|
||||
if (goodsGradeId > 0)
|
||||
{
|
||||
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice * priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "价格修改成功" : "价格修改失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 批量修改库存==========================================
|
||||
/// <summary>
|
||||
/// 批量修改价格
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoBatchModifyStock(FmBatchModifyStock entity)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var bl = false;
|
||||
//获取商品信息
|
||||
var goods = await base.BaseDal.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
|
||||
if (!goods.Any())
|
||||
{
|
||||
jm.msg = GlobalConstVars.DataisNo;
|
||||
return jm;
|
||||
}
|
||||
var goodIds = goods.Select(p => p.id).ToList();
|
||||
|
||||
var modifyValue = entity.modifyValue;
|
||||
|
||||
switch (entity.modifyType)
|
||||
{
|
||||
case "=":
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
break;
|
||||
case "-":
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock - modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
break;
|
||||
case "+":
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock + modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
break;
|
||||
case "*":
|
||||
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock * modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
|
||||
break;
|
||||
}
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "库存修改成功" : "库存修改失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 批量上架==========================================
|
||||
|
||||
/// <summary>
|
||||
/// 批量上架
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoBatchMarketableUp(int[] ids)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var bl = await _dal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = true }, p => ids.Contains(p.id));
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "上架成功" : "上架失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 批量下架==========================================
|
||||
|
||||
/// <summary>
|
||||
/// 批量下架
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoBatchMarketableDown(int[] ids)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var bl = await base.BaseDal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = false }, p => ids.Contains(p.id));
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "下架成功" : "下架失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 设置标签==========================================
|
||||
|
||||
/// <summary>
|
||||
/// 设置标签
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoSetLabel(FmSetLabel entity)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
|
||||
var names = entity.labels.Select(p => p.text).ToList();
|
||||
//获取已经存在数据库数据
|
||||
var olds = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
|
||||
if (olds.Any())
|
||||
{
|
||||
var oldNames = olds.Select(p => p.name).ToList();
|
||||
//获取未插入数据库数据
|
||||
var newNames = entity.labels.Where(p => !oldNames.Contains(p.text)).ToList();
|
||||
if (newNames.Any())
|
||||
{
|
||||
var labels = new List<CoreCmsLabel>();
|
||||
newNames.ForEach(p =>
|
||||
{
|
||||
labels.Add(new CoreCmsLabel()
|
||||
{
|
||||
name = p.text,
|
||||
style = p.style
|
||||
});
|
||||
});
|
||||
await _labelServices.InsertAsync(labels);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var labels = new List<CoreCmsLabel>();
|
||||
entity.labels.ForEach(p =>
|
||||
{
|
||||
labels.Add(new CoreCmsLabel()
|
||||
{
|
||||
name = p.text,
|
||||
style = p.style
|
||||
});
|
||||
});
|
||||
await _labelServices.InsertAsync(labels);
|
||||
}
|
||||
|
||||
var items = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
|
||||
var idsInts = items.Select(p => p.id).ToArray();
|
||||
var ids = String.Join(",", idsInts);
|
||||
|
||||
var bl = await base.BaseDal.UpdateAsync(p => new CoreCmsGoods() { labelIds = ids }, p => entity.ids.Contains(p.id));
|
||||
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "设置成功" : "设置失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 取消标签==========================================
|
||||
|
||||
/// <summary>
|
||||
/// 取消标签
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DoDeleteLabel(FmSetLabel entity)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var names = entity.labels.Select(p => p.text).ToList();
|
||||
//获取已经存在数据库数据
|
||||
var labels = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
|
||||
var labelIds = labels.Select(p => p.id).ToList();
|
||||
|
||||
var goods = await base.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
|
||||
goods.ForEach(p =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(p.labelIds))
|
||||
{
|
||||
var ids = CommonHelper.StringToIntArray(p.labelIds);
|
||||
var newIds = ids.Except(labelIds).ToList();
|
||||
if (newIds.Any())
|
||||
{
|
||||
p.labelIds = String.Join(",", newIds);
|
||||
}
|
||||
else
|
||||
{
|
||||
p.labelIds = "";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var bl = await base.UpdateAsync(goods);
|
||||
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "设置成功" : "设置失败";
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 判断商品是否参加团购或者秒杀
|
||||
|
||||
public bool IsInGroup(int goodId, out CoreCmsPromotion promotionsModel, int promotionId = 0)
|
||||
{
|
||||
promotionsModel = new CoreCmsPromotion();
|
||||
if (goodId == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var dt = DateTime.Now;
|
||||
var where = PredicateBuilder.True<CoreCmsPromotion>();
|
||||
where = where.And(p => p.isEnable == true);
|
||||
if (promotionId > 0)
|
||||
{
|
||||
where = where.And(p => p.id == promotionId);
|
||||
}
|
||||
where = where.And(p =>
|
||||
(p.type == (int)GlobalEnumVars.PromotionType.Group ||
|
||||
p.type == (int)GlobalEnumVars.PromotionType.Seckill));
|
||||
where = where.And(p => p.startTime < dt || p.endTime > dt);
|
||||
where = where.And(p => p.isDel == false);
|
||||
|
||||
var promotions = _promotionServices.QueryByClause(where);
|
||||
if (promotions == null) return false;
|
||||
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(promotions.parameters)) return false;
|
||||
var obj = JsonConvert.DeserializeAnonymousType(promotions.parameters, new
|
||||
{
|
||||
goodsId = "",
|
||||
num = 0,
|
||||
});
|
||||
if (obj.goodsId.ObjectToInt(0) != goodId) return false;
|
||||
promotionsModel = promotions;
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取商品重量
|
||||
|
||||
/// <summary>
|
||||
/// 获取商品重量
|
||||
/// </summary>
|
||||
/// <param name="productsId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<decimal> GetWeight(int productsId)
|
||||
{
|
||||
return await _dal.GetWeight(productsId);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 库存改变机制
|
||||
/// <summary>
|
||||
/// 库存改变机制。
|
||||
/// 库存机制:商品下单 总库存不变,冻结库存加1,
|
||||
/// 商品发货:冻结库存减1,总库存减1,
|
||||
/// 订单完成但未发货:总库存不变,冻结库存减1
|
||||
/// 商品退款&取消订单:总库存不变,冻结库存减1,
|
||||
/// 商品退货:总库存加1,冻结库存不变,
|
||||
/// 可销售库存:总库存-冻结库存
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack ChangeStock(int productsId, string type = "order", int num = 0)
|
||||
{
|
||||
|
||||
return _dal.ChangeStock(productsId, type, num);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取商品详情
|
||||
|
||||
/// <summary>
|
||||
/// 获取商品详情
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="isPromotion">是否涉及优惠</param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="groupId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsGoods> GetGoodsDetial(int id, int userId = 0, bool isPromotion = false, string type = "goods", int groupId = 0)
|
||||
{
|
||||
var model = await _dal.QueryByIdAsync(id);
|
||||
if (model == null) return null;
|
||||
//取图片集
|
||||
var album = model.images.Split(",");
|
||||
model.image = !string.IsNullOrEmpty(model.image) ? model.image : "/static/images/common/empty-banner.png";
|
||||
model.album = album;
|
||||
//label_ids
|
||||
//获取用户信息
|
||||
if (userId > 0)
|
||||
{
|
||||
model.isFav = await _goodsCollectionServices.ExistsAsync(p => p.goodsId == model.id && p.userId == userId);
|
||||
}
|
||||
//取默认货品
|
||||
var products = await _productsServices.QueryByClauseAsync(p => p.goodsId == model.id && p.isDefalut == true && p.isDel == false);
|
||||
if (products == null) return null;
|
||||
var getProductInfo = await _productsServices.GetProductInfo(products.id, isPromotion, userId, type, groupId);
|
||||
if (getProductInfo == null) return null;
|
||||
|
||||
model.product = getProductInfo;
|
||||
|
||||
model.sn = getProductInfo.sn;
|
||||
model.price = getProductInfo.price;
|
||||
model.costprice = getProductInfo.costprice;
|
||||
model.mktprice = getProductInfo.mktprice;
|
||||
model.stock = getProductInfo.stock;
|
||||
model.freezeStock = getProductInfo.freezeStock;
|
||||
model.weight = getProductInfo.weight;
|
||||
|
||||
//获取品牌
|
||||
var brand = await _brandServices.QueryByIdAsync(model.brandId);
|
||||
model.brand = brand;
|
||||
|
||||
//取出销量
|
||||
model.buyCount = await _orderItemServices.GetCountAsync(p => p.goodsId == model.id);
|
||||
return model;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取随机推荐数据
|
||||
|
||||
/// <summary>
|
||||
/// 获取随机推荐数据
|
||||
/// </summary>
|
||||
/// <param name="number"></param>
|
||||
/// <param name="isRecommend"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsGoods>> GetGoodsRecommendList(int number, bool isRecommend = false)
|
||||
{
|
||||
return await _dal.GetGoodsRecommendList(number, isRecommend);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取数据总数
|
||||
/// <summary>
|
||||
/// 获取数据总数
|
||||
/// </summary>
|
||||
/// <param name="predicate">条件表达式树</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<int> GetCountAsync(Expression<Func<CoreCmsGoods, bool>> predicate, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.GetCountAsync(predicate, blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate,
|
||||
Expression<Func<CoreCmsGoods, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 重写根据条件查询一定数量数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询一定数量数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">条件表达式树</param>
|
||||
/// <param name="take">获取数量</param>
|
||||
/// <param name="orderByPredicate">排序字段</param>
|
||||
/// <param name="orderByType">排序顺序</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, int take,
|
||||
Expression<Func<CoreCmsGoods, object>> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryListByClauseAsync(predicate, take, orderByPredicate, orderByType, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 重写根据条件查询数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">条件表达式树</param>
|
||||
/// <param name="orderBy">排序字段,如name asc,age desc</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns>泛型实体集合</returns>
|
||||
public new async Task<List<CoreCmsGoods>> QueryListByClauseAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryListByClauseAsync(predicate, orderBy, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderBy"></param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsGoods>> QueryPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询代理池商品分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate"></param>
|
||||
/// <param name="orderBy"></param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsGoods>> QueryAgentGoodsPageAsync(Expression<Func<CoreCmsGoods, bool>> predicate, string orderBy = "",
|
||||
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryAgentGoodsPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
|
||||
|
||||
#region 获取下拉商品数据
|
||||
/// <summary>
|
||||
/// 获取下拉商品数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<EnumEntity>> QueryEnumEntityAsync()
|
||||
{
|
||||
|
||||
return await _dal.QueryEnumEntityAsync();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
74
CoreCms.Net.Services/Good/CoreCmsGoodsTypeSpecServices.cs
Normal file
74
CoreCms.Net.Services/Good/CoreCmsGoodsTypeSpecServices.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品类型属性表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsTypeSpecServices : BaseServices<CoreCmsGoodsTypeSpec>, ICoreCmsGoodsTypeSpecServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsTypeSpecRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsTypeSpecServices(IUnitOfWork unitOfWork, ICoreCmsGoodsTypeSpecRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 使用事务重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> InsertAsync(FmGoodsTypeSpecInsert entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateAsync(FmGoodsTypeSpecUpdate entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品类型属性值表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsGoodsTypeSpecValueServices : BaseServices<CoreCmsGoodsTypeSpecValue>, ICoreCmsGoodsTypeSpecValueServices
|
||||
{
|
||||
private readonly ICoreCmsGoodsTypeSpecValueRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsGoodsTypeSpecValueServices(IUnitOfWork unitOfWork, ICoreCmsGoodsTypeSpecValueRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 货品三级佣金表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsProductsDistributionServices : BaseServices<CoreCmsProductsDistribution>, ICoreCmsProductsDistributionServices
|
||||
{
|
||||
private readonly ICoreCmsProductsDistributionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsProductsDistributionServices(IUnitOfWork unitOfWork, ICoreCmsProductsDistributionRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
363
CoreCms.Net.Services/Good/CoreCmsProductsServices.cs
Normal file
363
CoreCms.Net.Services/Good/CoreCmsProductsServices.cs
Normal file
@@ -0,0 +1,363 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 货品表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsProductsServices : BaseServices<CoreCmsProducts>, ICoreCmsProductsServices
|
||||
{
|
||||
private readonly ICoreCmsProductsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsProductsServices(IUnitOfWork unitOfWork, ICoreCmsProductsRepository dal,
|
||||
IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据货品ID获取货品信息
|
||||
/// </summary>
|
||||
/// <param name="id">货品序列</param>
|
||||
/// <param name="isPromotion">是否计算促销</param>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <param name="type">类型</param>
|
||||
/// <param name="groupId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsProducts> GetProductInfo(int id, bool isPromotion, int userId, string type = "goods", int groupId = 0)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var userGradeServices = container.ServiceProvider.GetService<ICoreCmsUserGradeServices>();
|
||||
var promotionServices = container.ServiceProvider.GetService<ICoreCmsPromotionServices>();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
|
||||
var goodsGradeServices = container.ServiceProvider.GetService<ICoreCmsGoodsGradeServices>();
|
||||
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
|
||||
|
||||
//获取货品
|
||||
var productModel = await _dal.QueryByClauseAsync(p => p.id == id);
|
||||
if (productModel == null) return null;
|
||||
//获取商品信息
|
||||
var goods = await goodsServices.QueryByIdAsync(productModel.goodsId);
|
||||
if (goods == null) return null;
|
||||
//DTO映射
|
||||
productModel.bn = goods.bn;
|
||||
productModel.images = !string.IsNullOrEmpty(productModel.images) ? GoodsHelper.GetOneImage(productModel.images) : GoodsHelper.GetOneImage(goods.images);
|
||||
productModel.totalStock = Convert.ToInt32(productModel.stock);
|
||||
productModel.stock = GoodsHelper.GetStock(productModel.stock, productModel.freezeStock);
|
||||
productModel.name = goods.name;
|
||||
|
||||
var price = productModel.price;
|
||||
var gradePrice = new List<CoreCmsGoodsGrade>();
|
||||
//获取价格体系
|
||||
if (userId > 0)
|
||||
{
|
||||
//获取用户信息
|
||||
var userInfo = await userServices.QueryByIdAsync(userId);
|
||||
if (userInfo != null)
|
||||
{
|
||||
var gradeInfo = await userGradeServices.QueryByIdAsync(userInfo.grade);
|
||||
if (gradeInfo != null)
|
||||
{
|
||||
productModel.gradeInfo = gradeInfo;
|
||||
}
|
||||
var goodsGrades = await goodsGradeServices.QueryListByClauseAsync(p => p.goodsId == goods.id);
|
||||
if (goodsGrades != null && goodsGrades.Count > 0)
|
||||
{
|
||||
var userGradeList = await userGradeServices.QueryAsync();
|
||||
goodsGrades.ForEach(p =>
|
||||
{
|
||||
var userGrades = userGradeList.Find(o => o.id == p.gradeId);
|
||||
p.gradeName = userGrades != null ? userGrades.title : "";
|
||||
|
||||
if (gradeInfo != null && gradeInfo.id == p.gradeId)
|
||||
{
|
||||
price = (productModel.price - p.gradePrice) > 0 ? productModel.price - p.gradePrice : 0;
|
||||
}
|
||||
p.gradePrice = (productModel.price - p.gradePrice) > 0 ? productModel.price - p.gradePrice : 0;
|
||||
});
|
||||
}
|
||||
gradePrice = goodsGrades;
|
||||
}
|
||||
}
|
||||
productModel.gradePrice = gradePrice;
|
||||
productModel.price = price;
|
||||
|
||||
//如果是多规格商品,算多规格
|
||||
if (goods.openSpec == 1 && !string.IsNullOrEmpty(goods.spesDesc))
|
||||
{
|
||||
var defaultSpec = new Dictionary<string, Dictionary<string, DefaultSpesDesc>>();
|
||||
//一级拆分
|
||||
var spesDescArr = goods.spesDesc.Split("|");
|
||||
var productSpecDescArr = productModel.spesDesc.Split(",");
|
||||
foreach (var item in spesDescArr)
|
||||
{
|
||||
//小类拆分
|
||||
var itemArr = item.Split(".");
|
||||
//键值对处理
|
||||
var keyValue = itemArr[1].Split(":");
|
||||
var defaultSpesDesc = new DefaultSpesDesc();
|
||||
defaultSpesDesc.name = keyValue[1];
|
||||
foreach (var childItem in productSpecDescArr)
|
||||
{
|
||||
if (childItem == itemArr[1])
|
||||
{
|
||||
defaultSpesDesc.isDefault = true;
|
||||
}
|
||||
}
|
||||
if (defaultSpec.ContainsKey(keyValue[0]))
|
||||
{
|
||||
defaultSpec[keyValue[0]].Add(keyValue[1], defaultSpesDesc);
|
||||
}
|
||||
else
|
||||
{
|
||||
var a = new Dictionary<string, DefaultSpesDesc> { { keyValue[1], defaultSpesDesc } };
|
||||
|
||||
defaultSpec.Add(keyValue[0], a);
|
||||
}
|
||||
}
|
||||
//取其他货品信息
|
||||
var otherProduts = await _dal.QueryListByClauseAsync(t => t.goodsId == goods.id && t.isDel == false && t.id != productModel.id);
|
||||
if (otherProduts.Any())
|
||||
{
|
||||
foreach (var item in defaultSpec)
|
||||
{
|
||||
foreach (var childItem in item.Value)
|
||||
{
|
||||
//如果是默认选中的,跳出本次
|
||||
if (childItem.Value.isDefault) continue;
|
||||
//当前主货品sku
|
||||
var tempProductSpesDesc = productSpecDescArr;
|
||||
//替换当前sku的当前值为当前遍历的值
|
||||
for (var i = 0; i < tempProductSpesDesc.Length; i++)
|
||||
{
|
||||
if (tempProductSpesDesc[i].Contains(item.Key)) tempProductSpesDesc[i] = item.Key + ":" + childItem.Key;
|
||||
}
|
||||
//循环所有货品,找到对应的多规格
|
||||
foreach (var o in otherProduts)
|
||||
{
|
||||
var otherProductSpesDesc = o.spesDesc.Split(",");
|
||||
if (!tempProductSpesDesc.Except(otherProductSpesDesc).Any())
|
||||
{
|
||||
childItem.Value.productId = o.id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
productModel.defaultSpecificationDescription = defaultSpec;
|
||||
}
|
||||
|
||||
productModel.amount = productModel.price;
|
||||
productModel.promotionList = new Dictionary<int, WxNameTypeDto>();
|
||||
productModel.promotionAmount = 0;
|
||||
|
||||
//开启计算促销
|
||||
if (isPromotion)
|
||||
{
|
||||
//模拟购物车数据库结构,去取促销信息
|
||||
var miniCart = new CartDto();
|
||||
miniCart.userId = userId;
|
||||
miniCart.goodsAmount = productModel.amount;
|
||||
miniCart.amount = productModel.amount;
|
||||
var listOne = new CartProducts()
|
||||
{
|
||||
id = 0,
|
||||
isSelect = true,
|
||||
userId = userId,
|
||||
productId = productModel.id,
|
||||
nums = 1,
|
||||
products = productModel
|
||||
};
|
||||
miniCart.list.Add(listOne);
|
||||
|
||||
var cartModel = new CartDto();
|
||||
|
||||
if (type == "group" || type == "skill")
|
||||
{
|
||||
//团购秒杀默认时间过期后,不可以下单
|
||||
var dt = DateTime.Now;
|
||||
var promotionInfo = await promotionServices.QueryByClauseAsync(p => p.startTime < dt && p.endTime > dt && p.id == groupId);
|
||||
if (promotionInfo != null)
|
||||
{
|
||||
await promotionServices.SetPromotion(promotionInfo, miniCart);
|
||||
}
|
||||
cartModel = miniCart;
|
||||
}
|
||||
else
|
||||
{
|
||||
cartModel = await promotionServices.ToPromotion(miniCart);
|
||||
}
|
||||
|
||||
//把促销信息和新的价格等,覆盖到这里
|
||||
var promotionList = cartModel.promotionList;
|
||||
|
||||
if (cartModel.list[0].products.promotionList.Count > 0)
|
||||
{
|
||||
//把订单促销和商品促销合并,都让他显示
|
||||
foreach (KeyValuePair<int, WxNameTypeDto> kvp in cartModel.list[0].products.promotionList)
|
||||
{
|
||||
if (promotionList.ContainsKey(kvp.Key))
|
||||
{
|
||||
promotionList[kvp.Key] = kvp.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
promotionList.Add(kvp.Key, kvp.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
productModel.price = cartModel.list[0].products.price; //新的商品单价
|
||||
productModel.amount = cartModel.list[0].products.amount; //商品总价格
|
||||
productModel.promotionList = promotionList; //促销列表
|
||||
productModel.promotionAmount = cartModel.list[0].products.promotionAmount; //如果商品促销应用了,那么促销的金额
|
||||
}
|
||||
|
||||
//获取活动数量
|
||||
if (type == "pinTuan")
|
||||
{
|
||||
//把拼团的一些属性等加上
|
||||
var pinTuanRule = pinTuanRuleServices.QueryMuchFirst<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
|
||||
(role, pinTuanGoods) => new object[] { JoinType.Inner, role.id == pinTuanGoods.ruleId }
|
||||
, (role, pinTuanGoods) => role
|
||||
, (role, pinTuanGoods) => pinTuanGoods.goodsId == productModel.goodsId);
|
||||
|
||||
//var pinTuanRule = dbClient.Queryable<CoreCmsPinTuanRule, CoreCmsPinTuanGoods>(
|
||||
|
||||
// ).Where((role, pinTuanGoods) => pinTuanGoods.goodsId == productModel.goodsId)
|
||||
// .Select((role, pinTuanGoods) => role).First();
|
||||
//调整前台显示数量
|
||||
var checkOrder = orderServices.FindLimitOrder(productModel.id, userId, pinTuanRule.startTime, pinTuanRule.endTime);
|
||||
if (pinTuanRule.maxGoodsNums != 0)
|
||||
{
|
||||
//活动销售件数
|
||||
productModel.stock = pinTuanRule.maxGoodsNums - checkOrder.TotalOrders;
|
||||
productModel.buyPinTuanCount = checkOrder.TotalOrders;
|
||||
}
|
||||
else
|
||||
{
|
||||
productModel.buyPinTuanCount = checkOrder.TotalOrders;
|
||||
}
|
||||
}
|
||||
else if (type == "group" || type == "skill")
|
||||
{
|
||||
if (!goodsServices.IsInGroup(productModel.goodsId, out var groupModel, groupId))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
//调整前台显示数量
|
||||
var checkOrder = orderServices.FindLimitOrder(productModel.id, userId, groupModel.startTime,
|
||||
groupModel.endTime);
|
||||
if (groupModel.maxGoodsNums != 0)
|
||||
{
|
||||
//活动销售件数
|
||||
productModel.stock = groupModel.maxGoodsNums - checkOrder.TotalOrders;
|
||||
productModel.buyPromotionCount = checkOrder.TotalOrders;
|
||||
}
|
||||
else
|
||||
{
|
||||
productModel.buyPromotionCount = checkOrder.TotalOrders;
|
||||
}
|
||||
}
|
||||
return productModel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断货品上下架状态
|
||||
/// </summary>
|
||||
/// <param name="productsId">货品序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> GetShelfStatus(int productsId)
|
||||
{
|
||||
return await _dal.GetShelfStatus(productsId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取库存报警数量
|
||||
/// </summary>
|
||||
/// <param name="goodsStocksWarn"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> GoodsStaticsTotalWarn(int goodsStocksWarn)
|
||||
{
|
||||
return await _dal.GoodsStaticsTotalWarn(goodsStocksWarn);
|
||||
}
|
||||
|
||||
|
||||
#region 获取关联商品的货品列表数据
|
||||
/// <summary>
|
||||
/// 获取关联商品的货品列表数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsProducts>> QueryDetailPageAsync(Expression<Func<CoreCmsProducts, bool>> predicate,
|
||||
Expression<Func<CoreCmsProducts, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryDetailPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 修改单个货品库存并记入库存管理日志内
|
||||
/// </summary>
|
||||
/// <param name="productId"></param>
|
||||
/// <param name="stock"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> EditStock(int productId, int stock)
|
||||
{
|
||||
return await _dal.EditStock(productId, stock);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有货品数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsProducts>> GetProducts(int goodId = 0)
|
||||
{
|
||||
return await _dal.GetProducts(goodId);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 表单项表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsFormItemServices : BaseServices<CoreCmsFormItem>, ICoreCmsFormItemServices
|
||||
{
|
||||
private readonly ICoreCmsFormItemRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsFormItemServices(IUnitOfWork unitOfWork, ICoreCmsFormItemRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
531
CoreCms.Net.Services/IntelligentForms/CoreCmsFormServices.cs
Normal file
531
CoreCms.Net.Services/IntelligentForms/CoreCmsFormServices.cs
Normal file
@@ -0,0 +1,531 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Auth;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.FromBody;
|
||||
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.Http;
|
||||
using Microsoft.AspNetCore.Http.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 表单 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsFormServices : BaseServices<CoreCmsForm>, ICoreCmsFormServices
|
||||
{
|
||||
private readonly ICoreCmsFormRepository _dal;
|
||||
private readonly ICoreCmsFormItemRepository _itemRepository;
|
||||
private readonly ICoreCmsFormSubmitServices _formSubmitServices;
|
||||
private readonly ICoreCmsFormSubmitDetailServices _formSubmitDetailServices;
|
||||
private readonly ICoreCmsProductsServices _productsServices;
|
||||
private readonly ICoreCmsAreaServices _areaServices;
|
||||
|
||||
private IHttpContextAccessor _httpContextAccessor;
|
||||
|
||||
private readonly ICoreCmsGoodsServices _goodsServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsFormServices(IUnitOfWork unitOfWork, ICoreCmsFormRepository dal, ICoreCmsFormItemRepository itemRepository, ICoreCmsGoodsServices goodsServices, ICoreCmsFormSubmitServices formSubmitServices, IHttpContextAccessor httpContextAccessor, ICoreCmsAreaServices areaServices, ICoreCmsFormSubmitDetailServices formSubmitDetailServices, ICoreCmsProductsServices productsServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_itemRepository = itemRepository;
|
||||
_goodsServices = goodsServices;
|
||||
_formSubmitServices = formSubmitServices;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_areaServices = areaServices;
|
||||
_formSubmitDetailServices = formSubmitDetailServices;
|
||||
_productsServices = productsServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> InsertAsync(FMForm entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateAsync(FMForm entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsForm entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsForm> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsForm>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsForm>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsForm>> QueryPageAsync(Expression<Func<CoreCmsForm, bool>> predicate,
|
||||
Expression<Func<CoreCmsForm, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取form表单详情
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <param name="noToken"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetFormInfo(int id, string token, bool noToken = false)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10051;
|
||||
jm.status = false;
|
||||
return jm;
|
||||
}
|
||||
var formModel = await _dal.QueryByIdAsync(id);
|
||||
if (formModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18008;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var dt = DateTime.Now;
|
||||
//检查过期时间
|
||||
if (formModel.endDateTime < dt && noToken == false)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18002;
|
||||
jm.data = new
|
||||
{
|
||||
isExpires = true,
|
||||
needLogin = false
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
|
||||
//如果是后台,则不验证token
|
||||
if (noToken)
|
||||
{
|
||||
formModel.isLogin = false;
|
||||
}
|
||||
if (formModel.isLogin && string.IsNullOrEmpty(token))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code14006;
|
||||
jm.data = new
|
||||
{
|
||||
needLogin = true,
|
||||
isExpires = false,
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
else if (formModel.isLogin && !string.IsNullOrEmpty(token))
|
||||
{
|
||||
var userId = TokenHelper.GetUserIdBySecurityToken(token);
|
||||
jm.otherData = userId;
|
||||
if (userId <= 0)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code14006;
|
||||
jm.data = new
|
||||
{
|
||||
needLogin = true,
|
||||
isExpires = false,
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var items = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id, p => p.sort, OrderByType.Asc);
|
||||
foreach (var item in items)
|
||||
{
|
||||
if (item.type == GlobalEnumVars.FormFieldTypes.goods.ToString())
|
||||
{
|
||||
if (noToken == false)
|
||||
{
|
||||
var goodId = Convert.ToInt32(item.value);
|
||||
if (goodId > 0)
|
||||
{
|
||||
item.good = await _goodsServices.GetGoodsDetial(goodId);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (item.type == GlobalEnumVars.FormFieldTypes.radio.ToString())
|
||||
{
|
||||
item.radioValue = item.value.Split(",").ToList();
|
||||
}
|
||||
else if (item.type == GlobalEnumVars.FormFieldTypes.checbox.ToString())
|
||||
{
|
||||
var valueArray = item.value.Split(",");
|
||||
var defaultArray = item.defaultValue.Split(",");
|
||||
|
||||
var tempCheckbox = new List<TempCheckbox>();
|
||||
foreach (var v in valueArray)
|
||||
{
|
||||
var t = new TempCheckbox { @checked = defaultArray.Contains(v), value = v };
|
||||
tempCheckbox.Add(t);
|
||||
}
|
||||
item.checkboxValue = tempCheckbox;
|
||||
}
|
||||
else if (item.type == GlobalEnumVars.FormFieldTypes.date.ToString())
|
||||
{
|
||||
//没有值的时候设置下默认值
|
||||
if (string.IsNullOrEmpty(item.defaultValue))
|
||||
{
|
||||
item.defaultValue = dt.ToString("yyyy-MM-hh");
|
||||
}
|
||||
}
|
||||
else if (item.type == GlobalEnumVars.FormFieldTypes.time.ToString())
|
||||
{
|
||||
//没有值的时候设置下默认值
|
||||
if (string.IsNullOrEmpty(item.defaultValue))
|
||||
{
|
||||
item.defaultValue = dt.ToString("HH:mm");
|
||||
}
|
||||
}
|
||||
}
|
||||
formModel.Items = items;
|
||||
|
||||
|
||||
jm.status = true;
|
||||
jm.code = 0;
|
||||
jm.data = formModel;
|
||||
jm.msg = "获取成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddSubmit(FmAddSubmit entity)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
jm.msg = GlobalErrorCodeVars.Code18001;
|
||||
|
||||
var formModel = await _dal.QueryByIdAsync(entity.id);
|
||||
if (formModel == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18008;
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (formModel.isLogin && string.IsNullOrEmpty(entity.token))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code14006;
|
||||
jm.data = new
|
||||
{
|
||||
needLogin = true
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
|
||||
var dt = DateTime.Now;
|
||||
//检查过期时间
|
||||
if (formModel.endDateTime < dt)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18002;
|
||||
return jm;
|
||||
}
|
||||
|
||||
decimal money = 0;
|
||||
|
||||
//todo 金额促销
|
||||
//付款码
|
||||
if (formModel.type == (int)GlobalEnumVars.FormTypes.付款码)
|
||||
{
|
||||
var items = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id && p.type == GlobalEnumVars.FormFieldTypes.money.ToString());
|
||||
if (items.Any())
|
||||
{
|
||||
items.ForEach(p =>
|
||||
{
|
||||
var post = entity.data.Find(o => o.key == p.id);
|
||||
money += (decimal)(post?.value.ObjectToFloat(0) ?? 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var userId = 0;
|
||||
if (!string.IsNullOrEmpty(entity.token))
|
||||
{
|
||||
userId = TokenHelper.GetUserIdBySecurityToken(entity.token);
|
||||
}
|
||||
//判断提交次数
|
||||
if (formModel.times > 0 && !string.IsNullOrEmpty(entity.token))
|
||||
{
|
||||
if (userId <= 0)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18012;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var count = await _formSubmitServices.GetCountAsync(p => p.userId == userId && p.formId == formModel.id);
|
||||
if (count >= formModel.times)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code18003;
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_unitOfWork.BeginTran();
|
||||
var formSubmitModel = new CoreCmsFormSubmit();
|
||||
formSubmitModel.formId = formModel.id;
|
||||
formSubmitModel.formName = formModel.name;
|
||||
formSubmitModel.userId = userId;
|
||||
formSubmitModel.money = money;
|
||||
formSubmitModel.payStatus = false;
|
||||
formSubmitModel.status = false;
|
||||
formSubmitModel.createTime = DateTime.Now;
|
||||
formSubmitModel.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1";
|
||||
|
||||
var formSubmitId = await _formSubmitServices.InsertReturnIdentityAsync(formSubmitModel);
|
||||
|
||||
if (formSubmitId <= 0)
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.msg = GlobalErrorCodeVars.Code18005;
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (entity.data.Count > 0)
|
||||
{
|
||||
//根据提交的数据取字段列表(已废弃)
|
||||
//var formitemIds = entity.data.Select(p => p.key).ToList();
|
||||
//var formItems = await _itemRepository.QueryListByClauseAsync(p => formitemIds.Contains(p.id));
|
||||
|
||||
//查询表单展示字段
|
||||
var formItems = await _itemRepository.QueryListByClauseAsync(p => p.formId == formModel.id, p => p.sort, OrderByType.Asc);
|
||||
|
||||
var sDetails = new List<CoreCmsFormSubmitDetail>();
|
||||
|
||||
//遍历表单字段项
|
||||
foreach (var item in formItems)
|
||||
{
|
||||
//获取提交的哪些
|
||||
var postItem = entity.data.Find(p => p.key == item.id);
|
||||
if (postItem == null)
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.msg = item.name + GlobalErrorCodeVars.Code18020;
|
||||
return jm;
|
||||
}
|
||||
string value = postItem.value;
|
||||
|
||||
//验证数据格式
|
||||
if (FormHelper.ValidateField(item.validationType, postItem.value))
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
}
|
||||
//如果必填但数据为空。
|
||||
if (item.required && string.IsNullOrEmpty(postItem.value))
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.msg = GlobalErrorCodeVars.Code18006 + item.name;
|
||||
return jm;
|
||||
}
|
||||
//验证地区
|
||||
if (item.type == GlobalEnumVars.FormFieldTypes.area.ToString() && !string.IsNullOrEmpty(postItem.value))
|
||||
{
|
||||
//var arr = postItem.value.Split(" ");
|
||||
|
||||
//var countyName = arr[2];
|
||||
//var cityName = arr[1];
|
||||
//var provinceName = arr[0];
|
||||
|
||||
//var areaId = await _areaServices.GetThreeAreaId(provinceName, cityName, countyName, "");
|
||||
//value = areaId.ToString();
|
||||
|
||||
value = postItem.value;
|
||||
}
|
||||
|
||||
if (item.type == GlobalEnumVars.FormFieldTypes.goods.ToString() && !string.IsNullOrEmpty(postItem.value))
|
||||
{
|
||||
var goods = JsonConvert.DeserializeObject<List<FmAddSubmitItemGoods>>(postItem.value);
|
||||
if (goods.Any())
|
||||
{
|
||||
foreach (var good in goods)
|
||||
{
|
||||
var product = await _productsServices.GetProductInfo(good.productId, false, 0);
|
||||
if (product == null)
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.msg = GlobalErrorCodeVars.Code12501;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var formItemName = !string.IsNullOrEmpty(product.spesDesc)
|
||||
? product.spesDesc + "/" + product.sn
|
||||
: product.sn;
|
||||
|
||||
money += product.price * good.nums;
|
||||
var sDetail = new CoreCmsFormSubmitDetail();
|
||||
sDetail.submitId = formSubmitId;
|
||||
sDetail.formId = formModel.id;
|
||||
sDetail.formItemId = item.id;
|
||||
sDetail.formItemName = formItemName;
|
||||
sDetail.formItemValue = good.nums.ToString();
|
||||
sDetails.Add(sDetail);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var sDetail = new CoreCmsFormSubmitDetail();
|
||||
sDetail.submitId = formSubmitId;
|
||||
sDetail.formId = formModel.id;
|
||||
sDetail.formItemId = item.id;
|
||||
sDetail.formItemName = item.name;
|
||||
sDetail.formItemValue = value;
|
||||
sDetails.Add(sDetail);
|
||||
}
|
||||
}
|
||||
var sDetailResult = await _formSubmitDetailServices.InsertAsync(sDetails);
|
||||
if (sDetailResult <= 0)
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.msg = GlobalErrorCodeVars.Code18007;
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
if (formModel.type == (int)GlobalEnumVars.FormTypes.订单)
|
||||
{
|
||||
//订单类型时,更新提交表单金额
|
||||
await _formSubmitServices.UpdateAsync(p => new CoreCmsFormSubmit() { money = money }, p => p.id == formSubmitId);
|
||||
}
|
||||
|
||||
jm.data = new
|
||||
{
|
||||
formSubmitId,
|
||||
money
|
||||
};
|
||||
|
||||
_unitOfWork.CommitTran();
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "提交成功";
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
jm.status = false;
|
||||
jm.msg = "操作异常";
|
||||
jm.data = e;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 提交表单保存大文本值表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsFormSubmitDetailServices : BaseServices<CoreCmsFormSubmitDetail>, ICoreCmsFormSubmitDetailServices
|
||||
{
|
||||
private readonly ICoreCmsFormSubmitDetailRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsFormSubmitDetailServices(IUnitOfWork unitOfWork, ICoreCmsFormSubmitDetailRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户对表的提交记录 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsFormSubmitServices : BaseServices<CoreCmsFormSubmit>, ICoreCmsFormSubmitServices
|
||||
{
|
||||
private readonly ICoreCmsFormSubmitRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsFormSubmitServices(IUnitOfWork unitOfWork, ICoreCmsFormSubmitRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法并返回自增值
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> InsertReturnIdentityAsync(CoreCmsFormSubmit entity)
|
||||
{
|
||||
return await _dal.InsertReturnIdentityAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsFormSubmit entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsFormSubmit entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsFormSubmit> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsFormSubmit>> QueryPageAsync(Expression<Func<CoreCmsFormSubmit, bool>> predicate,
|
||||
Expression<Func<CoreCmsFormSubmit, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 表单支付
|
||||
/// </summary>
|
||||
/// <param name="id">序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Pay(int id)
|
||||
{
|
||||
return await _dal.Pay(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取表单的统计数据
|
||||
/// </summary>
|
||||
/// <param name="formId">表单序列</param>
|
||||
/// <param name="day">多少天内的数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<FormStatisticsViewDto> GetStatisticsByFormid(int formId, int day)
|
||||
{
|
||||
return await _dal.GetStatisticsByFormid(formId, day);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
138
CoreCms.Net.Services/Message/CoreCmsMessageCenterServices.cs
Normal file
138
CoreCms.Net.Services/Message/CoreCmsMessageCenterServices.cs
Normal file
@@ -0,0 +1,138 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
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.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 消息配置表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsMessageCenterServices : BaseServices<CoreCmsMessageCenter>, ICoreCmsMessageCenterServices
|
||||
{
|
||||
private readonly ICoreCmsMessageCenterRepository _dal;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IRedisOperationRepository _redisOperationRepository;
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsMessageCenterServices(IUnitOfWork unitOfWork, ICoreCmsMessageCenterRepository dal, IServiceProvider serviceProvider, ISysTaskLogServices taskLogServices, IRedisOperationRepository redisOperationRepository)
|
||||
{
|
||||
this._dal = dal;
|
||||
_serviceProvider = serviceProvider;
|
||||
_redisOperationRepository = redisOperationRepository;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 商家发送信息助手
|
||||
/// </summary>
|
||||
/// <param name="userId">接受者id</param>
|
||||
/// <param name="code">模板编码</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> SendMessage(int userId, string code, JObject parameters)
|
||||
{
|
||||
try
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
|
||||
var settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
|
||||
var smsServices = container.ServiceProvider.GetService<ICoreCmsSmsServices>();
|
||||
var messageServices = container.ServiceProvider.GetService<ICoreCmsMessageServices>();
|
||||
var allConfigs = await settingServices.GetConfigDictionaries();
|
||||
|
||||
var config = await _dal.QueryByClauseAsync(p => p.code == code);
|
||||
if (config == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10100;
|
||||
return jm;
|
||||
}
|
||||
if (config.isSms)
|
||||
{
|
||||
//判断短信是否够,如果够,就去发
|
||||
var user = await userServices.QueryByClauseAsync(p => p.id == userId);
|
||||
if (user != null && !string.IsNullOrEmpty(user.mobile))
|
||||
{
|
||||
var mobile = user.mobile;
|
||||
//判断是否平台通知
|
||||
if (code == GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString())
|
||||
{
|
||||
mobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopMobile);
|
||||
}
|
||||
//发货时,短信通知用发货人的
|
||||
if (code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString())
|
||||
{
|
||||
if (parameters.ContainsKey("shipMobile"))
|
||||
{
|
||||
mobile = parameters["shipMobile"].ObjectToString();
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(mobile))
|
||||
{
|
||||
await smsServices.Send(mobile, code, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
//站内消息
|
||||
if (config.isMessage && code != GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString())
|
||||
{
|
||||
await messageServices.Send(userId, code, parameters);
|
||||
}
|
||||
//微信模板消息【小程序,公众号都走这里】
|
||||
if (config.isWxTempletMessage &&
|
||||
(code == GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString() || code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString() || code == GlobalEnumVars.PlatformMessageTypes.RemindOrderPay.ToString()))
|
||||
{
|
||||
var @params = new JObject();
|
||||
@params.Add("parameters", parameters);
|
||||
|
||||
var data = new
|
||||
{
|
||||
userId,
|
||||
code,
|
||||
parameters = @params
|
||||
};
|
||||
|
||||
//队列推送消息
|
||||
await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.SendWxTemplateMessage, JsonConvert.SerializeObject(data));
|
||||
}
|
||||
jm.status = true;
|
||||
return jm;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
NLogUtil.WriteAll(LogLevel.Trace, LogType.RefundResultNotification, "商家发送信息助手", JsonConvert.SerializeObject(ex));
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
109
CoreCms.Net.Services/Message/CoreCmsMessageServices.cs
Normal file
109
CoreCms.Net.Services/Message/CoreCmsMessageServices.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 消息发送表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsMessageServices : BaseServices<CoreCmsMessage>, ICoreCmsMessageServices
|
||||
{
|
||||
private readonly ICoreCmsMessageRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsMessageServices(IUnitOfWork unitOfWork, ICoreCmsMessageRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 站内消息
|
||||
/// </summary>
|
||||
/// <param name="userId">接受者id</param>
|
||||
/// <param name="code">模板编码</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Send(int userId, string code, JObject parameters)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var content = MessageHelper.GetTemp(code, parameters);
|
||||
if (string.IsNullOrEmpty(content))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10009;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var msg = new CoreCmsMessage
|
||||
{
|
||||
userId = userId,
|
||||
code = code,
|
||||
parameters = JsonConvert.SerializeObject(parameters),
|
||||
contentBody = content,
|
||||
status = false,
|
||||
createTime = DateTime.Now
|
||||
};
|
||||
|
||||
var bl = await _dal.InsertAsync(msg) > 0;
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "站内消息发布成功" : "站内消息发布失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 消息查看,更新已读状态
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> info(int userId, int id)
|
||||
{
|
||||
var jm = new WebApiCallBack { status = true };
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(p => p.userId == userId && p.id == id);
|
||||
if (info != null)
|
||||
{
|
||||
await _dal.UpdateAsync(p => new CoreCmsMessage() { status = true }, p => p.id == info.id);
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是否有新消息
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> HasNew(int userId)
|
||||
{
|
||||
var bl = await _dal.ExistsAsync(p => p.userId == userId && p.status == false);
|
||||
return bl;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
364
CoreCms.Net.Services/Message/CoreCmsSmsServices.cs
Normal file
364
CoreCms.Net.Services/Message/CoreCmsSmsServices.cs
Normal file
@@ -0,0 +1,364 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Sms;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 短信发送日志 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsSmsServices : BaseServices<CoreCmsSms>, ICoreCmsSmsServices
|
||||
{
|
||||
private readonly ICoreCmsSmsRepository _dal;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
|
||||
public CoreCmsSmsServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsSmsRepository dal
|
||||
, IHttpContextAccessor httpContextAccessor, ICoreCmsSettingServices settingServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_settingServices = settingServices;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#region 发送短信(验证码)
|
||||
|
||||
/// <summary>
|
||||
/// 发送短信(验证码)
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="mobile"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> DoSendSms(string type, string mobile)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
var smsOptions = await _settingServices.GetSmsOptions();
|
||||
if (smsOptions.Enabled == false)
|
||||
{
|
||||
jm.msg = "短信功能未开启";
|
||||
return jm;
|
||||
}
|
||||
|
||||
Random rd = new Random();
|
||||
int codeNumber = rd.Next(100000, 999999);
|
||||
|
||||
//获取是否存在
|
||||
var dt = DateTime.Now;
|
||||
var endDt = dt.AddMinutes(10);
|
||||
|
||||
var oldLog = await _dal.QueryByClauseAsync(p => p.code == type && p.mobile == mobile && p.createTime > dt && p.createTime < endDt, p => p.id, OrderByType.Desc);
|
||||
if (oldLog == null)
|
||||
{
|
||||
oldLog = new CoreCmsSms();
|
||||
oldLog.code = type;
|
||||
oldLog.createTime = DateTime.Now;
|
||||
oldLog.mobile = mobile;
|
||||
oldLog.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1";
|
||||
oldLog.isUsed = false;
|
||||
var obj = new
|
||||
{
|
||||
code = codeNumber
|
||||
};
|
||||
switch (type)
|
||||
{
|
||||
case "login":
|
||||
oldLog.contentBody = "您本次登陆的验证码是:" + codeNumber + ",请不要将验证码泄露给他人!";
|
||||
oldLog.parameters = JsonConvert.SerializeObject(obj);
|
||||
break;
|
||||
default:
|
||||
oldLog.contentBody = "您验证码是:" + codeNumber + ",请不要将验证码泄露给他人!";
|
||||
oldLog.parameters = JsonConvert.SerializeObject(obj);
|
||||
break;
|
||||
}
|
||||
await _dal.InsertAsync(oldLog);
|
||||
}
|
||||
|
||||
var str = SendSms(oldLog.mobile, oldLog.contentBody, smsOptions);
|
||||
jm.status = true;
|
||||
jm.data = str;
|
||||
jm.msg = "短信发送成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 校验短信验证码
|
||||
/// <summary>
|
||||
/// 校验短信验证码
|
||||
/// </summary>
|
||||
/// <param name="phone"></param>
|
||||
/// <param name="verCode"></param>
|
||||
/// <param name="code"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<bool> Check(string phone, string verCode, string code)
|
||||
{
|
||||
var smsInfo = await _dal.QueryByClauseAsync(p =>
|
||||
p.mobile == phone && p.code == code && p.createTime < DateTime.Now && p.isUsed == false, p => p.createTime, OrderByType.Desc);
|
||||
if (smsInfo != null)
|
||||
{
|
||||
var parameters = JObject.Parse(smsInfo.parameters);
|
||||
if (parameters.ContainsKey("code"))
|
||||
{
|
||||
var dataCode = parameters["code"]?.ToString();
|
||||
if (dataCode != verCode) return false;
|
||||
smsInfo.isUsed = true;
|
||||
await _dal.UpdateAsync(smsInfo);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 接口通道发送短信
|
||||
|
||||
/// <summary>
|
||||
/// 接口通道发送短信
|
||||
/// </summary>
|
||||
/// <param name="mobile"></param>
|
||||
/// <param name="contentBody"></param>
|
||||
/// <param name="smsOptions">配置文件</param>
|
||||
public string SendSms(string mobile, string contentBody, SMSOptions smsOptions)
|
||||
{
|
||||
if (smsOptions.Enabled)
|
||||
{
|
||||
string param = $@"action=send&userid={smsOptions.UserId}&account={smsOptions.Account}&password={smsOptions.Password}&content={"【" + smsOptions.Signature + "】" + contentBody}&mobile={mobile}";
|
||||
var str = HttpHelper.PostSend(smsOptions.ApiUrl, param);
|
||||
return str;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "短信接口未开启";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 发送短信统一方法
|
||||
/// <summary>
|
||||
/// 发送短信统一方法
|
||||
/// </summary>
|
||||
/// <param name="mobile">接受者手机号码</param>
|
||||
/// <param name="code">模板编码</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Send(string mobile, string code, JObject parameters)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
var smsOptions = await _settingServices.GetSmsOptions();
|
||||
if (smsOptions.Enabled == false)
|
||||
{
|
||||
jm.msg = "短信功能未开启";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(mobile))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code11051;
|
||||
return jm;
|
||||
}
|
||||
var isUsed = false;
|
||||
if (code == GlobalEnumVars.SmsMessageTypes.Reg.ToString() || code == GlobalEnumVars.SmsMessageTypes.Login.ToString() || code == GlobalEnumVars.SmsMessageTypes.Veri.ToString())
|
||||
{
|
||||
var dt = DateTime.Now;
|
||||
var newCreateTime = DateTime.Now.AddSeconds(-60);
|
||||
var smsInfo = await _dal.QueryByClauseAsync(p =>
|
||||
p.mobile == mobile && p.code == code && p.createTime < newCreateTime && p.isUsed == false);
|
||||
if (smsInfo != null)
|
||||
{
|
||||
var ts = dt - smsInfo.createTime;
|
||||
if (ts.Seconds < 60)
|
||||
{
|
||||
jm.msg = "两次发送时间间隔小于60秒";
|
||||
return jm;
|
||||
}
|
||||
parameters = JObject.Parse(smsInfo.parameters); ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Random rd = new Random();
|
||||
int codeNumber = rd.Next(100000, 999999);
|
||||
if (parameters.ContainsKey("code"))
|
||||
{
|
||||
parameters.Remove("code");
|
||||
}
|
||||
parameters.Add("code", codeNumber);
|
||||
}
|
||||
isUsed = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
isUsed = true;
|
||||
}
|
||||
|
||||
|
||||
var str = string.Empty;
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
|
||||
if (code == GlobalEnumVars.SmsMessageTypes.Reg.ToString())
|
||||
{
|
||||
// 账户注册
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForReg);
|
||||
if (!string.IsNullOrEmpty(msg))
|
||||
{
|
||||
var sendCode = string.Empty;
|
||||
if (parameters.ContainsKey("code"))
|
||||
{
|
||||
sendCode = parameters["code"]?.ToString();
|
||||
}
|
||||
str = msg.Replace("{code}", sendCode);
|
||||
}
|
||||
}
|
||||
else if (code == GlobalEnumVars.SmsMessageTypes.Login.ToString())
|
||||
{
|
||||
// 账户登录
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForLogin);
|
||||
if (!string.IsNullOrEmpty(msg))
|
||||
{
|
||||
var sendCode = string.Empty;
|
||||
if (parameters.ContainsKey("code"))
|
||||
{
|
||||
sendCode = parameters["code"]?.ToString();
|
||||
}
|
||||
str = msg.Replace("{code}", sendCode);
|
||||
}
|
||||
}
|
||||
else if (code == GlobalEnumVars.SmsMessageTypes.Veri.ToString())
|
||||
{
|
||||
// 验证验证码
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForVeri);
|
||||
if (!string.IsNullOrEmpty(msg))
|
||||
{
|
||||
var sendCode = string.Empty;
|
||||
if (parameters.ContainsKey("code"))
|
||||
{
|
||||
sendCode = parameters["code"]?.ToString();
|
||||
}
|
||||
str = msg.Replace("{code}", sendCode);
|
||||
}
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.CreateOrder.ToString())
|
||||
{
|
||||
// 订单创建
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForCreateOrder);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.OrderPayed.ToString())
|
||||
{
|
||||
// 订单支付通知买家
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForOrderPayed);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.RemindOrderPay.ToString())
|
||||
{
|
||||
// 未支付催单
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForRemindOrderPay);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.DeliveryNotice.ToString())
|
||||
{
|
||||
// 订单发货
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForDeliveryNotice);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.AfterSalesPass.ToString())
|
||||
{
|
||||
// 售后审核通过
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForAfterSalesPass);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.RefundSuccess.ToString())
|
||||
{
|
||||
// 退款已处理
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForRefundSuccess);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.SellerOrderNotice.ToString())
|
||||
{
|
||||
// 订单支付通知卖家
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForSellerOrderNotice);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
else if (code == GlobalEnumVars.PlatformMessageTypes.Common.ToString())
|
||||
{
|
||||
//通用类型
|
||||
var tpl = string.Empty;
|
||||
if (parameters.ContainsKey("tpl"))
|
||||
{
|
||||
tpl = parameters["tpl"]?.ToString();
|
||||
}
|
||||
str = tpl;
|
||||
if (!string.IsNullOrEmpty(str))
|
||||
{
|
||||
var msg = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SmsTplForCommon);
|
||||
str = !string.IsNullOrEmpty(msg) ? msg : string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(str))
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10009;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var oldLog = new CoreCmsSms();
|
||||
oldLog.mobile = mobile;
|
||||
oldLog.code = code;
|
||||
oldLog.parameters = JsonConvert.SerializeObject(parameters);
|
||||
oldLog.contentBody = str;
|
||||
oldLog.createTime = DateTime.Now;
|
||||
oldLog.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ?
|
||||
_httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1";
|
||||
oldLog.isUsed = isUsed;
|
||||
|
||||
await _dal.InsertAsync(oldLog);
|
||||
|
||||
var result = SendSms(oldLog.mobile, oldLog.contentBody, smsOptions);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "发送成功";
|
||||
jm.data = result;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
101
CoreCms.Net.Services/Order/CoreCmsOrderItemServices.cs
Normal file
101
CoreCms.Net.Services/Order/CoreCmsOrderItemServices.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单明细表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsOrderItemServices : BaseServices<CoreCmsOrderItem>, ICoreCmsOrderItemServices
|
||||
{
|
||||
private readonly ICoreCmsOrderItemRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsOrderItemServices(IUnitOfWork unitOfWork,
|
||||
IServiceProvider serviceProvider,
|
||||
ICoreCmsOrderItemRepository dal)
|
||||
{
|
||||
_serviceProvider = serviceProvider;
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发货数量
|
||||
/// </summary>
|
||||
/// <param name="orderId"></param>
|
||||
/// <param name="item">发货明细</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> ship(string orderId, Dictionary<int, int> item)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var goodsRepository = container.ServiceProvider.GetService<ICoreCmsGoodsRepository>();
|
||||
|
||||
var isOver = true; //是否发完了,true发完了,false未发完
|
||||
var list = await base.QueryListByClauseAsync(p => p.orderId == orderId);
|
||||
foreach (var child in list)
|
||||
{
|
||||
if (item.ContainsKey(child.productId))
|
||||
{
|
||||
var maxNum = child.nums - child.sendNums; //还需要减掉已发数量
|
||||
|
||||
//还需要减掉已退的数量
|
||||
var reshipNums = _dal.GetaftersalesNums(orderId, child.sn);
|
||||
maxNum = maxNum - reshipNums;
|
||||
|
||||
if (item[child.productId] > maxNum) //如果发超了怎么办
|
||||
{
|
||||
throw new System.Exception(orderId + "的" + child.sn + "发超了");
|
||||
}
|
||||
|
||||
if (isOver && item[child.productId] < maxNum) //判断是否订单发完了,有一个没发完,就是未发完
|
||||
{
|
||||
isOver = false;
|
||||
}
|
||||
|
||||
var updateSendNums = item[child.productId] + child.sendNums;
|
||||
await _dal.UpdateAsync(p => new CoreCmsOrderItem() { sendNums = updateSendNums },
|
||||
p => p.id == child.id);
|
||||
|
||||
//发货后,减库存
|
||||
goodsRepository.ChangeStock(child.productId, GlobalEnumVars.OrderChangeStockType.send.ToString(), item[child.productId]);
|
||||
|
||||
item.Remove(child.productId);
|
||||
}
|
||||
}
|
||||
//如果没发完,也报错
|
||||
if (item.Count > 0)
|
||||
{
|
||||
throw new System.Exception("发货明细里包含订单之外的商品");
|
||||
}
|
||||
return isOver;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/Order/CoreCmsOrderLogServices.cs
Normal file
33
CoreCms.Net.Services/Order/CoreCmsOrderLogServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsOrderLogServices : BaseServices<CoreCmsOrderLog>, ICoreCmsOrderLogServices
|
||||
{
|
||||
private readonly ICoreCmsOrderLogRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsOrderLogServices(IUnitOfWork unitOfWork, ICoreCmsOrderLogRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
2406
CoreCms.Net.Services/Order/CoreCmsOrderServices.cs
Normal file
2406
CoreCms.Net.Services/Order/CoreCmsOrderServices.cs
Normal file
File diff suppressed because it is too large
Load Diff
39
CoreCms.Net.Services/Pay/AliPayServices.cs
Normal file
39
CoreCms.Net.Services/Pay/AliPayServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 支付宝支付 接口实现
|
||||
/// </summary>
|
||||
public class AliPayServices : BaseServices<CoreCmsSetting>, IAliPayServices
|
||||
{
|
||||
public AliPayServices(IWeChatPayRepository dal)
|
||||
{
|
||||
BaseDal = dal;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发起支付
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack PubPay(CoreCmsBillPayments entity)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
119
CoreCms.Net.Services/Pay/BalancePayServices.cs
Normal file
119
CoreCms.Net.Services/Pay/BalancePayServices.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 线下支付 接口实现
|
||||
/// </summary>
|
||||
public class BalancePayServices : BaseServices<CoreCmsSetting>, IBalancePayServices
|
||||
{
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ICoreCmsUserBalanceServices _userBalanceServices;
|
||||
|
||||
public BalancePayServices(IWeChatPayRepository dal
|
||||
, IServiceProvider serviceProvider, ICoreCmsUserBalanceServices userBalanceServices)
|
||||
{
|
||||
BaseDal = dal;
|
||||
_serviceProvider = serviceProvider;
|
||||
_userBalanceServices = userBalanceServices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发起支付
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> PubPay(CoreCmsBillPayments entity)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var userBalanceServices = container.ServiceProvider.GetService<ICoreCmsUserBalanceServices>();
|
||||
var billPaymentsServices = container.ServiceProvider.GetService<ICoreCmsBillPaymentsServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var result = await userBalanceServices.Change(entity.userId,
|
||||
(int)GlobalEnumVars.UserBalanceSourceTypes.Pay, entity.money, entity.paymentId);
|
||||
if (!result.status)
|
||||
{
|
||||
jm.msg = result.msg;
|
||||
return jm;
|
||||
}
|
||||
|
||||
//改变支付单状态
|
||||
var billPaymentInfo = await billPaymentsServices.QueryByIdAsync(entity.paymentId);
|
||||
if (billPaymentInfo == null)
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code10056;
|
||||
jm.data = 10056;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var userBalance = result.data as CoreCmsUserBalance;
|
||||
var resultBillPayment = await billPaymentsServices.ToUpdate(entity.paymentId,
|
||||
(int)GlobalEnumVars.BillPaymentsStatus.Payed, "balancepay", entity.money, userBalance.memo,
|
||||
userBalance.id.ToString());
|
||||
if (resultBillPayment.status)
|
||||
{
|
||||
jm.msg = resultBillPayment.msg;
|
||||
jm.status = true;
|
||||
jm.data = entity;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = resultBillPayment.msg;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户余额退款
|
||||
/// </summary>
|
||||
/// <param name="refundInfo">退款单数据</param>
|
||||
/// <param name="paymentInfo">支付单数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Refund(CoreCmsBillRefund refundInfo, CoreCmsBillPayments paymentInfo)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (refundInfo.money == 0)
|
||||
{
|
||||
jm.status = true;
|
||||
jm.msg = "退款成功";
|
||||
jm.data = new
|
||||
{
|
||||
ReturnCode = "SUCCESS"
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
|
||||
var res = await _userBalanceServices.Change(paymentInfo.userId,
|
||||
(int)GlobalEnumVars.UserBalanceSourceTypes.Refund, refundInfo.money, paymentInfo.paymentId);
|
||||
if (res.status == false) return jm;
|
||||
jm.status = true;
|
||||
jm.data = res;
|
||||
jm.msg = "退款成功";
|
||||
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
40
CoreCms.Net.Services/Pay/OfflinePayServices.cs
Normal file
40
CoreCms.Net.Services/Pay/OfflinePayServices.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 线下支付 接口实现
|
||||
/// </summary>
|
||||
public class OfflinePayServices : BaseServices<CoreCmsSetting>, IOfflinePayServices
|
||||
{
|
||||
public OfflinePayServices(IWeChatPayRepository dal)
|
||||
{
|
||||
BaseDal = dal;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发起支付
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack PubPay(CoreCmsBillPayments entity)
|
||||
{
|
||||
var jm = new WebApiCallBack {status = true};
|
||||
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
202
CoreCms.Net.Services/Pay/WeChatPayServices.cs
Normal file
202
CoreCms.Net.Services/Pay/WeChatPayServices.cs
Normal file
@@ -0,0 +1,202 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Auth.HttpContextUser;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using Essensoft.Paylink.WeChatPay;
|
||||
using Essensoft.Paylink.WeChatPay.V2;
|
||||
using Essensoft.Paylink.WeChatPay.V2.Request;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信支付 接口实现
|
||||
/// </summary>
|
||||
public class WeChatPayServices : BaseServices<CoreCmsSetting>, IWeChatPayServices
|
||||
{
|
||||
private readonly IWeChatPayClient _client;
|
||||
private readonly IOptions<WeChatPayOptions> _optionsAccessor;
|
||||
private readonly IHttpContextUser _user;
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices;
|
||||
|
||||
public WeChatPayServices(IHttpContextUser user
|
||||
, IWeChatPayClient client
|
||||
, IOptions<WeChatPayOptions> optionsAccessor
|
||||
, ICoreCmsUserServices userServices
|
||||
, ICoreCmsUserWeChatInfoServices userWeChatInfoServices
|
||||
)
|
||||
{
|
||||
|
||||
_client = client;
|
||||
_optionsAccessor = optionsAccessor;
|
||||
_user = user;
|
||||
_userServices = userServices;
|
||||
_userWeChatInfoServices = userWeChatInfoServices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发起支付
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> PubPay(CoreCmsBillPayments entity)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var weChatPayUrl = AppSettingsConstVars.PayCallBackWeChatPayUrl;
|
||||
if (string.IsNullOrEmpty(weChatPayUrl))
|
||||
{
|
||||
jm.msg = "未获取到配置的通知地址";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var tradeType = GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString();
|
||||
if (!string.IsNullOrEmpty(entity.parameters))
|
||||
{
|
||||
var jobj = (JObject)JsonConvert.DeserializeObject(entity.parameters);
|
||||
if (jobj != null && jobj.ContainsKey("trade_type"))
|
||||
tradeType = GetTradeType(jobj["trade_type"].ObjectToString());
|
||||
}
|
||||
|
||||
var openId = string.Empty;
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString())
|
||||
{
|
||||
var userAccount = await _userServices.QueryByIdAsync(_user.ID);
|
||||
if (userAccount == null)
|
||||
{
|
||||
jm.msg = "用户账户获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (userAccount.userWx <= 0)
|
||||
{
|
||||
jm.msg = "账户关联微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.id == userAccount.userWx);
|
||||
if (user == null)
|
||||
{
|
||||
jm.msg = "微信用户信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
openId = user.openid;
|
||||
}
|
||||
|
||||
var request = new WeChatPayUnifiedOrderRequest
|
||||
{
|
||||
Body = entity.payTitle,
|
||||
OutTradeNo = entity.paymentId,
|
||||
TotalFee = Convert.ToInt32(entity.money * 100),
|
||||
SpBillCreateIp = entity.ip,
|
||||
NotifyUrl = weChatPayUrl,
|
||||
TradeType = tradeType,
|
||||
OpenId = openId
|
||||
};
|
||||
|
||||
var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
|
||||
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
|
||||
{
|
||||
var req = new WeChatPayJsApiSdkRequest
|
||||
{
|
||||
Package = "prepay_id=" + response.PrepayId
|
||||
};
|
||||
|
||||
var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
|
||||
// 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
|
||||
parameter.Add("paymentId", entity.paymentId);
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "支付成功";
|
||||
jm.data = parameter;
|
||||
jm.otherData = response;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "微信建立支付请求失败";
|
||||
jm.otherData = response;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户退款
|
||||
/// </summary>
|
||||
/// <param name="refundInfo">退款单数据</param>
|
||||
/// <param name="paymentInfo">支付单数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Refund(CoreCmsBillRefund refundInfo, CoreCmsBillPayments paymentInfo)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var weChatRefundUrl = AppSettingsConstVars.PayCallBackWeChatRefundUrl;
|
||||
if (string.IsNullOrEmpty(weChatRefundUrl))
|
||||
{
|
||||
jm.msg = "未获取到配置的通知地址";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var request = new WeChatPayRefundRequest
|
||||
{
|
||||
OutRefundNo = refundInfo.refundId,
|
||||
TransactionId = paymentInfo.tradeNo,
|
||||
OutTradeNo = paymentInfo.paymentId,
|
||||
TotalFee = Convert.ToInt32(paymentInfo.money * 100),
|
||||
RefundFee = Convert.ToInt32(refundInfo.money * 100),
|
||||
NotifyUrl = weChatRefundUrl
|
||||
};
|
||||
var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
|
||||
|
||||
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
|
||||
{
|
||||
jm.status = true;
|
||||
jm.msg = "退款成功";
|
||||
jm.data = response;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "退款失败";
|
||||
jm.data = response;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
private static string GetTradeType(string tradeType)
|
||||
{
|
||||
if (tradeType != GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString() &&
|
||||
tradeType != GlobalEnumVars.WeiChatPayTradeType.JSAPI_OFFICIAL.ToString() &&
|
||||
tradeType != GlobalEnumVars.WeiChatPayTradeType.NATIVE.ToString() &&
|
||||
tradeType != GlobalEnumVars.WeiChatPayTradeType.APP.ToString() &&
|
||||
tradeType != GlobalEnumVars.WeiChatPayTradeType.MWEB.ToString()
|
||||
)
|
||||
return "JSAPI";
|
||||
if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI_OFFICIAL.ToString())
|
||||
return "JSAPI";
|
||||
return tradeType;
|
||||
}
|
||||
}
|
||||
}
|
||||
130
CoreCms.Net.Services/Pintuan/CoreCmsPintuanGoodsServices.cs
Normal file
130
CoreCms.Net.Services/Pintuan/CoreCmsPintuanGoodsServices.cs
Normal file
@@ -0,0 +1,130 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
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.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 拼团商品表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPinTuanGoodsServices : BaseServices<CoreCmsPinTuanGoods>, ICoreCmsPinTuanGoodsServices
|
||||
{
|
||||
private readonly ICoreCmsPinTuanGoodsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsPinTuanGoodsServices(IUnitOfWork unitOfWork, ICoreCmsPinTuanGoodsRepository dal,
|
||||
IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取拼团的商品信息,增加拼团的一些属性,会显示优惠价
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsGoods> GetGoodsInfo(int id, int userId, int pinTuanStatus = 0)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
|
||||
var pinTuanRecordServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRecordServices>();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var goodsInfo = await goodsServices.GetGoodsDetial(id, userId, false);
|
||||
if (goodsInfo == null) return null;
|
||||
//把拼团的一些属性等加上
|
||||
var info =
|
||||
await pinTuanRuleServices
|
||||
.QueryMuchFirstAsync<CoreCmsPinTuanRule, CoreCmsPinTuanGoods, CoreCmsPinTuanRule>(
|
||||
(join1, join2) => new object[] { JoinType.Left, join1.id == join2.ruleId },
|
||||
(join1, join2) => join1, (join1, join2) => join2.goodsId == id && join1.isStatusOpen == true);
|
||||
|
||||
if (info == null) return null;
|
||||
|
||||
goodsInfo.pinTuanRule = info;
|
||||
goodsInfo.pinTuanPrice = goodsInfo.price - info.discountAmount;
|
||||
if (goodsInfo.pinTuanPrice < 0) goodsInfo.pinTuanPrice = 0;
|
||||
//取拼团记录
|
||||
goodsInfo.pinTuanRecordNums = await pinTuanRecordServices.GetCountAsync(p => p.ruleId == info.id && p.goodsId == id && p.status == pinTuanStatus);
|
||||
|
||||
//判断拼团状态
|
||||
var dt = DateTime.Now;
|
||||
if (goodsInfo.pinTuanRule.startTime > dt)
|
||||
{
|
||||
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
|
||||
|
||||
TimeSpan ts = goodsInfo.pinTuanRule.startTime.Subtract(dt);
|
||||
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
|
||||
}
|
||||
else if (goodsInfo.pinTuanRule.startTime <= dt && goodsInfo.pinTuanRule.endTime > dt)
|
||||
{
|
||||
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
|
||||
|
||||
TimeSpan ts = goodsInfo.pinTuanRule.endTime.Subtract(dt);
|
||||
goodsInfo.pinTuanRule.lastTime = (int)ts.TotalSeconds;
|
||||
}
|
||||
else
|
||||
{
|
||||
goodsInfo.pinTuanRule.pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
|
||||
}
|
||||
//拼团记录
|
||||
//var re = await pinTuanRecordServices.GetRecord(info.id, goodsInfo.product.goodsId);
|
||||
var re = await pinTuanRecordServices.GetRecord(info.id, goodsInfo.id, pinTuanStatus);
|
||||
if (re.status)
|
||||
{
|
||||
goodsInfo.pinTuanRecord = re.data as List<CoreCmsPinTuanRecord>;
|
||||
}
|
||||
|
||||
var checkOrder = orderServices.FindLimitOrder(goodsInfo.product.id, userId, info.startTime, info.endTime, 0);
|
||||
if (info.maxGoodsNums > 0)
|
||||
{
|
||||
goodsInfo.stock = info.maxGoodsNums;
|
||||
//活动销售件数
|
||||
goodsInfo.product.stock = info.maxGoodsNums - checkOrder.TotalOrders;
|
||||
//goodsInfo.buyCount = info.maxGoodsNums - checkOrder.TotalOrders;
|
||||
goodsInfo.buyPinTuanCount = checkOrder.TotalOrders;
|
||||
}
|
||||
else
|
||||
{
|
||||
//goodsInfo.buyCount = info.maxGoodsNums - checkOrder.TotalOrders;
|
||||
goodsInfo.buyPinTuanCount = checkOrder.TotalOrders;
|
||||
|
||||
}
|
||||
return goodsInfo;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
455
CoreCms.Net.Services/Pintuan/CoreCmsPintuanRecordServices.cs
Normal file
455
CoreCms.Net.Services/Pintuan/CoreCmsPintuanRecordServices.cs
Normal file
@@ -0,0 +1,455 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// 拼团记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPinTuanRecordServices : BaseServices<CoreCmsPinTuanRecord>, 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;
|
||||
|
||||
|
||||
public CoreCmsPinTuanRecordServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsPinTuanRecordRepository dal
|
||||
, ICoreCmsPinTuanRuleRepository pinTuanRuleRepository
|
||||
, ICoreCmsUserRepository userRepository, IServiceProvider serviceProvider, ISysTaskLogServices taskLogServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_pinTuanRuleRepository = pinTuanRuleRepository;
|
||||
_userRepository = userRepository;
|
||||
_serviceProvider = serviceProvider;
|
||||
_taskLogServices = taskLogServices;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 生成订单的时候,增加信息
|
||||
/// </summary>
|
||||
/// <param name="order">订单数据</param>
|
||||
/// <param name="items">商品列表</param>
|
||||
/// <param name="teamId">团队序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> OrderAdd(CoreCmsOrder order, List<CoreCmsOrderItem> items, int teamId = 0)
|
||||
{
|
||||
return await _dal.OrderAdd(order, items, teamId);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 取得商品的所有拼团记录
|
||||
/// </summary>
|
||||
/// <param name="ruleId"></param>
|
||||
/// <param name="goodsId"></param>
|
||||
/// <param name="status"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="limit"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> 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<CoreCmsPinTuanRecord>();
|
||||
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<CoreCmsPinTuanRecord>();
|
||||
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<PinTuanRecordTeam>();
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取拼团团队人数
|
||||
/// </summary>
|
||||
/// <param name="teamId"></param>
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> 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<PinTuanRecordTeam>();
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 自动取消到时间的团
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AutoCanclePinTuanOrder()
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var billRefundServices = container.ServiceProvider.GetService<ICoreCmsBillRefundServices>();
|
||||
|
||||
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)
|
||||
{
|
||||
//如果已经发货了,就不管了,手动退款吧
|
||||
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, 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;
|
||||
}
|
||||
//去退款
|
||||
var toRefundResult = await billRefundServices.ToRefund(refundInfo.refundId, (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND);
|
||||
|
||||
//插入退款日志
|
||||
var log = new SysTaskLog
|
||||
{
|
||||
createTime = DateTime.Now,
|
||||
isSuccess = toRefundResult.status,
|
||||
name = "定时任务取消拼团订单退款日志",
|
||||
parameters = JsonConvert.SerializeObject(toRefundResult)
|
||||
};
|
||||
await _taskLogServices.InsertAsync(log);
|
||||
|
||||
|
||||
//更新订单状态为已退款已完成
|
||||
await orderServices.UpdateAsync(p => new CoreCmsOrder()
|
||||
{
|
||||
payStatus = (int)GlobalEnumVars.OrderPayStatus.Refunded,
|
||||
status = (int)GlobalEnumVars.OrderStatus.Complete
|
||||
}, p => p.orderId == orderInfo.orderId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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<bool> CancelOrder(string[] orderId)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var billRefundServices = container.ServiceProvider.GetService<ICoreCmsBillRefundServices>();
|
||||
|
||||
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 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsPinTuanRecord>> QueryPageAsync(Expression<Func<CoreCmsPinTuanRecord, bool>> predicate,
|
||||
Expression<Func<CoreCmsPinTuanRecord, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
144
CoreCms.Net.Services/Pintuan/CoreCmsPintuanRuleServices.cs
Normal file
144
CoreCms.Net.Services/Pintuan/CoreCmsPintuanRuleServices.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.Model.ViewModels.DTO;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 拼团规则表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPinTuanRuleServices : BaseServices<CoreCmsPinTuanRule>, ICoreCmsPinTuanRuleServices
|
||||
{
|
||||
private readonly ICoreCmsPinTuanRuleRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsPinTuanRuleServices(IUnitOfWork unitOfWork, ICoreCmsPinTuanRuleRepository dal,
|
||||
IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 取购物车数据的时候,更新价格
|
||||
/// </summary>
|
||||
/// <param name="list"></param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack PinTuanInfo(List<CartProducts> list)
|
||||
{
|
||||
return _dal.PinTuanInfo(list);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 接口上获取拼团所有商品
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetPinTuanList(int id = 0, int userId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var pinTuanGoodsServices = container.ServiceProvider.GetService<ICoreCmsPinTuanGoodsServices>();
|
||||
var pinTuanRuleServices = container.ServiceProvider.GetService<ICoreCmsPinTuanRuleServices>();
|
||||
|
||||
var dt = DateTime.Now;
|
||||
var where = PredicateBuilder.True<CoreCmsPinTuanRule>();
|
||||
@where = @where.And(p => p.startTime < dt);
|
||||
@where = @where.And(p => p.endTime > dt);
|
||||
if (id != 0)
|
||||
{
|
||||
@where = @where.And(p => p.id == id);
|
||||
}
|
||||
|
||||
var list = await pinTuanRuleServices.QueryListByClauseAsync(@where, p => p.sort, OrderByType.Asc);
|
||||
var goodIds = new List<int>();
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
var ruleIds = list.Select(p => p.id).ToList();
|
||||
var goods = await pinTuanGoodsServices.QueryListByClauseAsync(p => ruleIds.Contains(p.ruleId));
|
||||
if (goods != null && goods.Any())
|
||||
{
|
||||
goodIds = goods.Select(p => p.goodsId).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
if (goodIds.Any())
|
||||
{
|
||||
var goods = new List<CoreCmsGoods>();
|
||||
foreach (var goodId in goodIds)
|
||||
{
|
||||
var g = await pinTuanGoodsServices.GetGoodsInfo(goodId, userId);
|
||||
if (g != null)
|
||||
{
|
||||
goods.Add(g);
|
||||
}
|
||||
}
|
||||
jm.data = goods;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<TagPinTuanResult>> QueryTagPinTuanPageAsync(Expression<Func<TagPinTuanResult, bool>> predicate,
|
||||
Expression<Func<TagPinTuanResult, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1, int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryTagPinTuanPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据商品id获取拼团规则信息
|
||||
/// </summary>
|
||||
/// <param name="goodId"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<TagPinTuanResult> GetPinTuanInfo(int goodId)
|
||||
{
|
||||
return await _dal.GetPinTuanInfo(goodId);
|
||||
}
|
||||
}
|
||||
}
|
||||
351
CoreCms.Net.Services/Promotion/CoreCmsCouponServices.cs
Normal file
351
CoreCms.Net.Services/Promotion/CoreCmsCouponServices.cs
Normal file
@@ -0,0 +1,351 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 优惠券表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsCouponServices : BaseServices<CoreCmsCoupon>, ICoreCmsCouponServices
|
||||
{
|
||||
private readonly ICoreCmsCouponRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsCouponServices(IUnitOfWork unitOfWork, ICoreCmsCouponRepository dal, IServiceProvider serviceProvider)
|
||||
{
|
||||
this._dal = dal;
|
||||
_serviceProvider = serviceProvider;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据优惠券编码取优惠券的信息,并判断是否可用
|
||||
/// </summary>
|
||||
/// <param name="code"></param>
|
||||
/// <param name="check"></param>
|
||||
public async Task<WebApiCallBack> CodeToInfo(string[] code, bool check = false)
|
||||
{
|
||||
return await _dal.ToInfo(code, check);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除核销多个优惠券
|
||||
/// </summary>
|
||||
/// <param name="couponCode">优惠券码</param>
|
||||
/// <param name="orderId">使用序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> UsedMultipleCoupon(string[] couponCode, string orderId)
|
||||
{
|
||||
var res = new WebApiCallBack() { methodDescription = "删除核销多个优惠券" };
|
||||
//判断优惠券码能否有效
|
||||
var resCodeToInfo = await CodeToInfo(couponCode, true);
|
||||
if (resCodeToInfo.status == false)
|
||||
{
|
||||
return resCodeToInfo;
|
||||
}
|
||||
var dt = DateTime.Now;
|
||||
var doHasChange = await _dal.UpdateAsync(p => new CoreCmsCoupon() { isUsed = true, usedId = orderId, updateTime = dt },
|
||||
p => p.isUsed == false && couponCode.Contains(p.couponCode));
|
||||
if (doHasChange)
|
||||
{
|
||||
res.status = true;
|
||||
res.msg = "核销使用优惠券成功";
|
||||
res.data = couponCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
res.status = false;
|
||||
res.msg = "核销使用优惠券失败";
|
||||
res.data = couponCode;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取 我的优惠券
|
||||
/// </summary>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <param name="promotionId">促销序列</param>
|
||||
/// <param name="display">优惠券状态编码</param>
|
||||
/// <param name="page">页码</param>
|
||||
/// <param name="limit">数量</param>
|
||||
public async Task<WebApiCallBack> GetMyCoupon(int userId, int promotionId = 0, string display = "all", int page = 1, int limit = 10)
|
||||
{
|
||||
|
||||
return await _dal.GetMyCoupon(userId, promotionId, display, page, limit);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户领取优惠券 插入数据
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="promotionId"></param>
|
||||
/// <param name="promotion"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> AddData(int userId, int promotionId, CoreCmsPromotion promotion)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var dtTime = DateTime.Now;
|
||||
var eTime = DateTime.Now;
|
||||
|
||||
if (promotion.effectiveDays > 0)
|
||||
{
|
||||
eTime = eTime.AddDays(promotion.effectiveDays);
|
||||
}
|
||||
if (promotion.effectiveHours > 0)
|
||||
{
|
||||
eTime = eTime.AddHours(promotion.effectiveHours);
|
||||
}
|
||||
var coupon = new CoreCmsCoupon
|
||||
{
|
||||
couponCode = GeneratePromotionCode()[0],
|
||||
promotionId = promotion.id,
|
||||
isUsed = false,
|
||||
userId = userId,
|
||||
createTime = dtTime,
|
||||
startTime = dtTime,
|
||||
endTime = eTime,
|
||||
remark = "接口领取"
|
||||
};
|
||||
|
||||
var bl = await _dal.InsertAsync(coupon) > 0;
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "领取成功" : "领取失败";
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 通过优惠券号领取优惠券
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="couponCode"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ReceiveCoupon(int userId, string couponCode)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var promotionServices = container.ServiceProvider.GetService<ICoreCmsPromotionServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var coupon = await _dal.QueryByClauseAsync(p => p.couponCode == couponCode);
|
||||
if (coupon == null)
|
||||
{
|
||||
jm.msg = "该优惠券不存在";
|
||||
return jm;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(coupon.usedId))
|
||||
{
|
||||
jm.msg = "该优惠券已被使用";
|
||||
return jm;
|
||||
}
|
||||
if (coupon.userId > 0)
|
||||
{
|
||||
jm.msg = "该优惠券已被其他人领取";
|
||||
return jm;
|
||||
}
|
||||
|
||||
coupon.userId = userId;
|
||||
var bl = await _dal.UpdateAsync(p => new CoreCmsCoupon() { userId = userId }, p => p.id == coupon.id);
|
||||
if (bl)
|
||||
{
|
||||
var promotion = await promotionServices.QueryByIdAsync(coupon.promotionId);
|
||||
if (promotion != null)
|
||||
{
|
||||
coupon.couponName = promotion.name;
|
||||
}
|
||||
}
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "领取成功" : "领取失败";
|
||||
jm.data = coupon;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 生成优惠券code 方法
|
||||
/// </summary>
|
||||
/// <param name="noOfCodes">定义一个int类型的参数 用来确定生成多少个优惠码</param>
|
||||
/// <param name="excludeCodesArray">定义一个exclude_codes_array类型的数组</param>
|
||||
/// <param name="codeLength">定义一个code_length的参数来确定优惠码的长度</param>
|
||||
/// <returns></returns>
|
||||
public List<string> GeneratePromotionCode(int noOfCodes = 1, List<string> excludeCodesArray = null, int codeLength = 10)
|
||||
{
|
||||
char[] constant =
|
||||
{
|
||||
'0','1','2','3','4','5','6','7','8','9',
|
||||
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
|
||||
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
|
||||
};
|
||||
var promotionCodes = new List<string>(); //这个数组用来接收生成的优惠码
|
||||
Random rd = new Random();
|
||||
for (int i = 0; i < noOfCodes; i++)
|
||||
{
|
||||
var code = "";
|
||||
for (int j = 0; j < codeLength; j++)
|
||||
{
|
||||
code += constant[rd.Next(62)];
|
||||
}
|
||||
//如果生成的6位随机数不再我们定义的$promotion_codes函数里面
|
||||
if (!promotionCodes.Contains(code))
|
||||
{
|
||||
if (excludeCodesArray != null && excludeCodesArray.Any())
|
||||
{
|
||||
if (!excludeCodesArray.Contains(code))
|
||||
{
|
||||
promotionCodes.Add(code);//将优惠码赋值给数组
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
promotionCodes.Add(code);//将优惠码赋值给数组
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
}
|
||||
}
|
||||
return promotionCodes;
|
||||
}
|
||||
|
||||
|
||||
#region 根据条件查询分页数据及导航数据
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询分页数据及导航数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="isToPage">是否分页</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsCoupon>> QueryPageMapperAsync(Expression<Func<CoreCmsCoupon, bool>> predicate,
|
||||
Expression<Func<CoreCmsCoupon, object>> orderByExpression, OrderByType orderByType, bool isToPage = false, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
|
||||
return await _dal.QueryPageMapperAsync(predicate, orderByExpression, orderByType, isToPage, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写数据并获取相关
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsCoupon>> QueryWithAboutAsync(Expression<Func<CoreCmsCoupon, bool>> predicate)
|
||||
{
|
||||
return await _dal.QueryWithAboutAsync(predicate);
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsCoupon>> QueryPageAsync(Expression<Func<CoreCmsCoupon, bool>> predicate,
|
||||
Expression<Func<CoreCmsCoupon, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 获取 我的优惠券可用数量
|
||||
/// </summary>
|
||||
/// <param name="userId">用户序列</param>
|
||||
public async Task<int> GetMyCouponCount(int userId)
|
||||
{
|
||||
return await _dal.GetMyCouponCount(userId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region 优惠券返还
|
||||
/// <summary>
|
||||
/// 优惠券返还
|
||||
/// </summary>
|
||||
/// <param name="couponCodes">优惠券数组</param>
|
||||
public async Task<WebApiCallBack> CancelReturnCoupon(string couponCodes)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
jm.code = 0;
|
||||
var bl = false;
|
||||
var ids = couponCodes.Split(",");
|
||||
var list = await _dal.QueryListByClauseAsync(p => ids.Contains(p.couponCode));
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
var newList = new List<CoreCmsCoupon>();
|
||||
list.ForEach(p =>
|
||||
{
|
||||
var eTime = p.endTime.AddMinutes(1);
|
||||
newList.Add(new CoreCmsCoupon()
|
||||
{
|
||||
couponCode = GeneratePromotionCode()[0],
|
||||
promotionId = p.promotionId,
|
||||
isUsed = false,
|
||||
userId = p.userId,
|
||||
createTime = DateTime.Now,
|
||||
remark = "优惠券返还",
|
||||
startTime = p.startTime,
|
||||
endTime = eTime
|
||||
});
|
||||
});
|
||||
bl = await _dal.InsertAsync(newList) > 0;
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "返还成功" : "返还失败";
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,386 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 促销条件表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPromotionConditionServices : BaseServices<CoreCmsPromotionCondition>, ICoreCmsPromotionConditionServices
|
||||
{
|
||||
private readonly ICoreCmsPromotionConditionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
|
||||
public CoreCmsPromotionConditionServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsPromotionConditionRepository dal
|
||||
, ICoreCmsGoodsCategoryServices goodsCategoryServices
|
||||
, IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_goodsCategoryServices = goodsCategoryServices;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查是否满足条件
|
||||
/// </summary>
|
||||
/// <param name="conditionInfo"></param>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> check(CoreCmsPromotionCondition conditionInfo, CartDto cart,
|
||||
CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (string.IsNullOrEmpty(conditionInfo.parameters)) return false;
|
||||
|
||||
var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
|
||||
var codeModel = getPromotionConditionType.Find(p => p.sKey == conditionInfo.code);
|
||||
if (codeModel != null)
|
||||
{
|
||||
//如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(conditionInfo.parameters);
|
||||
|
||||
if (codeModel.sValue == "goods")
|
||||
{
|
||||
var key = false;
|
||||
foreach (var item in cart.list)
|
||||
{
|
||||
var type = 0;
|
||||
//判断是哪个规则,并且确认是否符合
|
||||
switch (conditionInfo.code)
|
||||
{
|
||||
case "GOODS_ALL":
|
||||
type = condition_GOODS_ALL(parameters,
|
||||
(int)item.products.goodsId, item.nums);
|
||||
break;
|
||||
case "GOODS_IDS":
|
||||
type = condition_GoodsIdS(parameters,
|
||||
(int)item.products.goodsId, item.nums);
|
||||
break;
|
||||
case "GOODS_CATS":
|
||||
type = await condition_GOODS_CATS(parameters, (int)item.products.goodsId, item.nums);
|
||||
break;
|
||||
case "GOODS_BRANDS":
|
||||
type = await condition_GOODS_BRANDS(parameters,
|
||||
(int)item.products.goodsId, item.nums);
|
||||
break;
|
||||
default:
|
||||
type = 0;
|
||||
break;
|
||||
}
|
||||
if (type > 0)
|
||||
{
|
||||
if (item.products.promotionList.ContainsKey(promotionInfo.id))
|
||||
{
|
||||
item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
item.products.promotionList[promotionInfo.id].type = type;
|
||||
}
|
||||
else
|
||||
{
|
||||
item.products.promotionList.Add(promotionInfo.id, new WxNameTypeDto()
|
||||
{
|
||||
name = promotionInfo.name,
|
||||
type = type
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
//只有选中的商品才算促销
|
||||
if (item.isSelect)
|
||||
{
|
||||
if (!key)
|
||||
{
|
||||
if (type == 2)
|
||||
{
|
||||
key = true;//针对某一条商品促销条件,循环购物车的所有商品,只要有一条满足要求就,算,就返回true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return key;
|
||||
}
|
||||
else if (codeModel.sValue == "order")
|
||||
{
|
||||
var type = condition_ORDER_FULL(parameters, cart);
|
||||
if (type > 0)
|
||||
{
|
||||
if (cart.promotionList.ContainsKey(promotionInfo.id))
|
||||
{
|
||||
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
cart.promotionList[promotionInfo.id].type = type;
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// cart.promotionList.Add(type, new WxNameTypeDto()
|
||||
// {
|
||||
// name = promotionInfo.name,
|
||||
// type = type
|
||||
// });
|
||||
//}
|
||||
}
|
||||
if (type == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (codeModel.sValue == "user")
|
||||
{
|
||||
var type = await condition_USER_GRADE(parameters, cart.userId);
|
||||
if (type == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在促销结果中,如果是商品促销结果,调用此方法,判断商品是否符合需求
|
||||
/// </summary>
|
||||
/// <param name="promotionId"></param>
|
||||
/// <param name="goodsId"></param>
|
||||
/// <param name="nums"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> goods_check(int promotionId, int goodsId, int nums = 1)
|
||||
{
|
||||
var conditionInfos = await _dal.QueryListByClauseAsync(p => p.promotionId == promotionId);
|
||||
var getPromotionConditionType = SystemSettingDictionary.GetPromotionConditionType();
|
||||
|
||||
foreach (var item in conditionInfos)
|
||||
{
|
||||
var codeModel = getPromotionConditionType.Find(p => p.sKey == item.code);
|
||||
if (codeModel != null && codeModel.sValue == "goods")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
var type = 0;
|
||||
//判断是哪个规则,并且确认是否符合
|
||||
switch (item.code)
|
||||
{
|
||||
case "GOODS_ALL":
|
||||
type = condition_GOODS_ALL(parameters, goodsId, nums);
|
||||
break;
|
||||
case "GOODS_IDS":
|
||||
type = condition_GoodsIdS(parameters, goodsId, nums);
|
||||
break;
|
||||
case "GOODS_CATS":
|
||||
type = await condition_GOODS_CATS(parameters, goodsId, nums);
|
||||
break;
|
||||
case "GOODS_BRANDS":
|
||||
type = await condition_GOODS_BRANDS(parameters, goodsId, nums);
|
||||
break;
|
||||
default:
|
||||
type = 0;
|
||||
break;
|
||||
}
|
||||
if (type != 2)
|
||||
{
|
||||
return type;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 因为计算过促销条件后啊,前面有些是满足条件的,所以,他们的type是2,后面有不满足条件的时候呢,要把前面满足条件的回滚成不满足条件的
|
||||
/// </summary>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public CartDto PromotionFalse(CartDto cart, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
switch (promotionInfo.type)
|
||||
{
|
||||
case (int)GlobalEnumVars.PromotionType.Promotion:
|
||||
//订单促销回滚
|
||||
if (cart.promotionList.ContainsKey(promotionInfo.id))
|
||||
{
|
||||
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
cart.promotionList[promotionInfo.id].type = 1;
|
||||
}
|
||||
//商品回滚
|
||||
foreach (var item in cart.list.Where(item => item.products.promotionList.ContainsKey(promotionInfo.id)))
|
||||
{
|
||||
item.products.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
item.products.promotionList[promotionInfo.id].type = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return cart;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 订单满XX金额时满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="cart"></param>
|
||||
/// <returns></returns>
|
||||
public int condition_ORDER_FULL(JObject parameters, CartDto cart)
|
||||
{
|
||||
if (!parameters.ContainsKey("money")) return 1;
|
||||
var objMoney = Convert.ToDecimal(parameters["money"]);
|
||||
return cart.amount >= objMoney ? 2 : 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 所有商品满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="goodsId">商品序列</param>
|
||||
/// <param name="nums">数量</param>
|
||||
/// <returns></returns>
|
||||
public int condition_GOODS_ALL(JObject parameters, int goodsId, int nums)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定某些商品满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="goodsId">商品序列</param>
|
||||
/// <param name="nums">数量</param>
|
||||
/// <returns></returns>
|
||||
public int condition_GoodsIdS(JObject parameters, int goodsId, int nums)
|
||||
{
|
||||
if (!parameters.ContainsKey("goodsId") || !parameters.ContainsKey("nums")) return 0;
|
||||
|
||||
var objNums = Convert.ToInt32(parameters["nums"]);
|
||||
|
||||
var goodsIds = CommonHelper.StringToIntArray(parameters["goodsId"].ObjectToString());
|
||||
|
||||
return goodsIds.Any() && goodsIds.Contains(goodsId) ? nums >= objNums ? 2 : 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 指定商品分类满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="goodsId">商品序列</param>
|
||||
/// <param name="nums">数量</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> condition_GOODS_CATS(JObject parameters, int goodsId, int nums)
|
||||
{
|
||||
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
|
||||
if (!parameters.ContainsKey("catId") || !parameters.ContainsKey("nums")) return 0;
|
||||
var objCatId = parameters["catId"].ObjectToInt();
|
||||
var objNums = parameters["nums"].ObjectToInt();
|
||||
var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
|
||||
|
||||
if (goodsModel == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return await _goodsCategoryServices.IsChild(objCatId, goodsModel.goodsCategoryId)
|
||||
? nums >= objNums ? 2 : 1
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定商品品牌满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="goodsId">商品序列</param>
|
||||
/// <param name="nums">数量</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> condition_GOODS_BRANDS(JObject parameters, int goodsId, int nums)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
|
||||
if (!parameters.ContainsKey("brandId") || !parameters.ContainsKey("nums")) return 0;
|
||||
var objBrandId = parameters["brandId"].ObjectToInt(0);
|
||||
var objNums = parameters["nums"].ObjectToInt(0);
|
||||
|
||||
var goodsModel = await goodsServices.QueryByIdAsync(goodsId);
|
||||
if (goodsModel == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return goodsModel.brandId == objBrandId ? nums >= objNums ? 2 : 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 指定用户等级满足条件
|
||||
/// </summary>
|
||||
/// <param name="parameters">参数对象</param>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> condition_USER_GRADE(JObject parameters, int userId)
|
||||
{
|
||||
using (var container = _serviceProvider.CreateScope())
|
||||
{
|
||||
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
|
||||
|
||||
if (!parameters.ContainsKey("grades")) return 0;
|
||||
var userInfo = await userServices.QueryByIdAsync(userId);
|
||||
if (userInfo == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
var arr = CommonHelper.StringToIntArray(parameters["grades"].ObjectToString());
|
||||
if (arr.Contains(userInfo.grade))
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
126
CoreCms.Net.Services/Promotion/CoreCmsPromotionRecordServices.cs
Normal file
126
CoreCms.Net.Services/Promotion/CoreCmsPromotionRecordServices.cs
Normal file
@@ -0,0 +1,126 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 促销活动记录表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPromotionRecordServices : BaseServices<CoreCmsPromotionRecord>, ICoreCmsPromotionRecordServices
|
||||
{
|
||||
private readonly ICoreCmsPromotionRecordRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
|
||||
|
||||
public CoreCmsPromotionRecordServices(IUnitOfWork unitOfWork, ICoreCmsPromotionRecordRepository dal, IServiceProvider serviceProvider)
|
||||
{
|
||||
this._dal = dal;
|
||||
_serviceProvider = serviceProvider;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
#region 生成订单的时候,增加信息
|
||||
|
||||
/// <summary>
|
||||
/// 生成订单的时候,增加信息
|
||||
/// </summary>
|
||||
/// <param name="order">订单数据</param>
|
||||
/// <param name="items">货品列表</param>
|
||||
/// <param name="groupId">秒杀团购序列</param>
|
||||
/// <param name="orderType">购物车类型</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> OrderAdd(CoreCmsOrder order, List<CoreCmsOrderItem> items, int groupId,
|
||||
int orderType)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
|
||||
|
||||
var orderItem = items.FirstOrDefault();
|
||||
|
||||
//判断商品是否做团购秒杀
|
||||
if (goodsServices.IsInGroup((int)orderItem.goodsId, out var promotionsModel, groupId) == true)
|
||||
{
|
||||
jm.msg = "团购秒杀机制验证失败";
|
||||
|
||||
var checkOrder = orderServices.FindLimitOrder(orderItem.productId, order.userId, promotionsModel.startTime, promotionsModel.endTime, orderType);
|
||||
if (promotionsModel.maxGoodsNums > 0)
|
||||
{
|
||||
if (checkOrder.TotalOrders + 1 > promotionsModel.maxGoodsNums)
|
||||
{
|
||||
jm.data = 15610;
|
||||
jm.msg = GlobalErrorCodeVars.Code15610;
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
if (promotionsModel.maxNums > 0)
|
||||
{
|
||||
if (checkOrder.TotalUserOrders > promotionsModel.maxNums)
|
||||
{
|
||||
jm.data = 15611;
|
||||
jm.msg = GlobalErrorCodeVars.Code15611;
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var model = new CoreCmsPromotionRecord();
|
||||
model.promotionId = groupId;
|
||||
model.userId = order.userId;
|
||||
model.goodsId = orderItem.goodsId;
|
||||
model.productId = orderItem.productId;
|
||||
model.orderId = order.orderId;
|
||||
model.type = orderType;
|
||||
|
||||
var res = await _dal.InsertAsync(model) > 0;
|
||||
|
||||
if (res == false)
|
||||
{
|
||||
jm.data = 10004;
|
||||
jm.msg = GlobalErrorCodeVars.Code10004;
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "团购秒杀机制验证通过";
|
||||
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
306
CoreCms.Net.Services/Promotion/CoreCmsPromotionResultServices.cs
Normal file
306
CoreCms.Net.Services/Promotion/CoreCmsPromotionResultServices.cs
Normal file
@@ -0,0 +1,306 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 促销结果表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPromotionResultServices : BaseServices<CoreCmsPromotionResult>, ICoreCmsPromotionResultServices
|
||||
{
|
||||
private readonly ICoreCmsPromotionResultRepository _dal;
|
||||
|
||||
private readonly ICoreCmsPromotionConditionServices _promotionConditionServices;
|
||||
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsPromotionResultServices(IUnitOfWork unitOfWork, ICoreCmsPromotionResultRepository dal, ICoreCmsPromotionConditionServices promotionConditionServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_promotionConditionServices = promotionConditionServices;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//去计算结果
|
||||
public async Task<bool> toResult(CoreCmsPromotionResult resultInfo, CartDto cart,
|
||||
CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (string.IsNullOrEmpty(resultInfo.parameters)) return false;
|
||||
|
||||
var resultType = SystemSettingDictionary.GetPromotionResultType();
|
||||
var resultModel = resultType.Find(p => p.sKey == resultInfo.code);
|
||||
if (resultModel != null)
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(resultInfo.parameters);
|
||||
//如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
|
||||
if (resultModel.sValue == "goods")
|
||||
{
|
||||
foreach (var item in cart.list)
|
||||
{
|
||||
var type = await _promotionConditionServices.goods_check(promotionInfo.id, (int)item.products.goodsId, item.nums);
|
||||
if (type == 2)
|
||||
{
|
||||
//到这里就说明此商品信息满足促销商品促销信息的条件,去计算结果
|
||||
//注意,在明细上面,就不细分促销的种类了,都放到一个上面,在订单上面才细分
|
||||
decimal promotionModel = 0;
|
||||
switch (resultInfo.code)
|
||||
{
|
||||
case "GOODS_REDUCE":
|
||||
promotionModel = result_GOODS_REDUCE(parameters, item, promotionInfo);
|
||||
break;
|
||||
case "GOODS_DISCOUNT":
|
||||
promotionModel = result_GOODS_DISCOUNT(parameters, item, promotionInfo);
|
||||
break;
|
||||
case "GOODS_ONE_PRICE":
|
||||
promotionModel = result_GOODS_ONE_PRICE(parameters, item, promotionInfo);
|
||||
break;
|
||||
default:
|
||||
promotionModel = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (item.isSelect)
|
||||
{
|
||||
switch (promotionInfo.type)
|
||||
{
|
||||
case (int)GlobalEnumVars.PromotionType.Promotion:
|
||||
//设置总的商品促销金额
|
||||
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
|
||||
//设置总的价格
|
||||
cart.amount = Math.Round(cart.amount - promotionModel, 2);
|
||||
break;
|
||||
case (int)GlobalEnumVars.PromotionType.Coupon:
|
||||
//优惠券促销金额
|
||||
cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + promotionModel, 2);
|
||||
//设置总的价格
|
||||
cart.amount = Math.Round(cart.amount - promotionModel, 2);
|
||||
break;
|
||||
case (int)GlobalEnumVars.PromotionType.Group:
|
||||
//团购
|
||||
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
|
||||
//设置总的价格
|
||||
cart.amount = Math.Round(cart.amount - promotionModel, 2);
|
||||
break;
|
||||
case (int)GlobalEnumVars.PromotionType.Seckill:
|
||||
//秒杀
|
||||
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
|
||||
//设置总的价格
|
||||
cart.amount = Math.Round(cart.amount - promotionModel, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
//商品促销可能做的比较狠,导致订单价格为负数了,这里判断一下,如果订单价格小于0了,就是0了
|
||||
cart.amount = cart.amount > 0 ? cart.amount : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resultInfo.code == "ORDER_DISCOUNT")
|
||||
{
|
||||
result_ORDER_DISCOUNT(parameters, cart, promotionInfo);
|
||||
}
|
||||
else if (resultInfo.code == "ORDER_REDUCE")
|
||||
{
|
||||
result_ORDER_REDUCE(parameters, cart, promotionInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 订单减固定金额
|
||||
/// </summary>
|
||||
/// <param name="parameters"></param>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public bool result_ORDER_REDUCE(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (!parameters.ContainsKey("money")) return true;
|
||||
|
||||
//判断极端情况,减的太多,超过购物车的总金额了,那么就最多减到0
|
||||
if (cart.amount < (decimal)parameters["money"])
|
||||
{
|
||||
parameters["money"] = cart.amount;
|
||||
}
|
||||
//总价格修改
|
||||
cart.amount -= (decimal)parameters["money"];
|
||||
switch (promotionInfo.type)
|
||||
{
|
||||
case (int)GlobalEnumVars.PromotionType.Promotion:
|
||||
//总促销修改
|
||||
cart.orderPromotionMoney += (decimal)parameters["money"];
|
||||
//设置促销列表
|
||||
if (cart.promotionList.ContainsKey(promotionInfo.id))
|
||||
{
|
||||
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
cart.promotionList[promotionInfo.id].type = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)GlobalEnumVars.PromotionType.Coupon:
|
||||
//优惠券促销金额
|
||||
cart.couponPromotionMoney += (decimal)parameters["money"];
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 订单打X折
|
||||
/// </summary>
|
||||
/// <param name="parameters"></param>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public bool result_ORDER_DISCOUNT(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
//if (parameters.Property("discount") == null) return true;
|
||||
//var objDiscount = Convert.ToInt32(parameters["discount"]);
|
||||
|
||||
if (!parameters.ContainsKey("discount")) return true;
|
||||
var objDiscount = parameters["discount"].ObjectToDecimal(0);
|
||||
|
||||
//判断参数是否设置的正确
|
||||
if (objDiscount >= 10 || objDiscount <= 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
var orderAmount = cart.amount;
|
||||
//总价格修改
|
||||
cart.amount = Math.Round(Math.Round(Math.Round(cart.amount * objDiscount, 3) * 10, 2) / 100, 2);
|
||||
switch (promotionInfo.type)
|
||||
{
|
||||
case (int)GlobalEnumVars.PromotionType.Promotion:
|
||||
//总促销修改
|
||||
cart.orderPromotionMoney = Math.Round(cart.orderPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
|
||||
//设置促销列表
|
||||
if (cart.promotionList.ContainsKey(promotionInfo.id))
|
||||
{
|
||||
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
|
||||
cart.promotionList[promotionInfo.id].type = 2;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)GlobalEnumVars.PromotionType.Coupon:
|
||||
//优惠券促销金额
|
||||
cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定商品减固定金额
|
||||
/// </summary>
|
||||
/// <param name="parameters"></param>
|
||||
/// <param name="cartProducts"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public decimal result_GOODS_REDUCE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (!parameters.ContainsKey("money")) return 0;
|
||||
var objMoney = parameters["money"].ObjectToDecimal(0);
|
||||
|
||||
decimal promotionMoney = 0;
|
||||
//判断极端情况,减的太多,超过商品单价了,那么就最多减到0
|
||||
if (cartProducts.products.price < objMoney)
|
||||
{
|
||||
objMoney = cartProducts.products.price;
|
||||
}
|
||||
cartProducts.products.price = Math.Round(cartProducts.products.price - objMoney, 2);
|
||||
//此次商品促销一共优惠了多少钱
|
||||
promotionMoney = Math.Round(cartProducts.nums * objMoney, 2);
|
||||
//设置商品优惠总金额
|
||||
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + objMoney, 2);
|
||||
//设置商品的实际销售金额(单品)
|
||||
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
|
||||
return promotionMoney;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定商品打X折
|
||||
/// </summary>
|
||||
/// <param name="parameters"></param>
|
||||
/// <param name="cartProducts"></param>
|
||||
/// <param name="promotionInfo"></param>
|
||||
/// <returns></returns>
|
||||
public decimal result_GOODS_DISCOUNT(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (!parameters.ContainsKey("discount")) return 0;
|
||||
var objDiscount = parameters["discount"].ObjectToDecimal(0);
|
||||
|
||||
decimal promotionMoney = 0;
|
||||
decimal goodsPrice = cartProducts.products.price;
|
||||
cartProducts.products.price = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
|
||||
var pmoney = Math.Round(goodsPrice - cartProducts.products.price, 2); //单品优惠的金额
|
||||
promotionMoney = Math.Round(cartProducts.nums * pmoney, 2);
|
||||
//设置商品优惠总金额
|
||||
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
|
||||
//设置商品的实际销售总金额
|
||||
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
|
||||
|
||||
return promotionMoney;
|
||||
}
|
||||
|
||||
//商品一口价
|
||||
public decimal result_GOODS_ONE_PRICE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
|
||||
{
|
||||
if (!parameters.ContainsKey("money")) return 0;
|
||||
var objMoney = parameters["money"].ObjectToDecimal(0);
|
||||
|
||||
//如果一口价比商品价格高,那么就不执行了
|
||||
decimal promotionMoney = 0;
|
||||
if (cartProducts.products.price <= objMoney)
|
||||
{
|
||||
return promotionMoney;
|
||||
}
|
||||
var goodsPrice = (decimal)cartProducts.products.price;
|
||||
cartProducts.products.price = Math.Round(objMoney, 2);
|
||||
var pmoney = Math.Round(goodsPrice - cartProducts.products.price, 2); //单品优惠的金额
|
||||
promotionMoney = Math.Round(cartProducts.nums * pmoney, 2);
|
||||
//设置商品优惠总金额
|
||||
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
|
||||
//设置商品的实际销售总金额
|
||||
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
|
||||
return promotionMoney;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
501
CoreCms.Net.Services/Promotion/CoreCmsPromotionServices.cs
Normal file
501
CoreCms.Net.Services/Promotion/CoreCmsPromotionServices.cs
Normal file
@@ -0,0 +1,501 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.Model.ViewModels.DTO;
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// 促销表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPromotionServices : BaseServices<CoreCmsPromotion>, ICoreCmsPromotionServices
|
||||
{
|
||||
private readonly ICoreCmsPromotionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
private readonly ICoreCmsPromotionConditionServices _promotionConditionServices;
|
||||
private readonly ICoreCmsPromotionResultServices _promotionResultServices;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
private readonly ICoreCmsCouponServices _couponServices;
|
||||
|
||||
|
||||
public CoreCmsPromotionServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsPromotionRepository dal
|
||||
, ICoreCmsPromotionConditionServices promotionConditionServices
|
||||
, ICoreCmsPromotionResultServices promotionResultServices
|
||||
, IServiceProvider serviceProvider, ICoreCmsCouponServices couponServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
|
||||
_promotionConditionServices = promotionConditionServices;
|
||||
_promotionResultServices = promotionResultServices;
|
||||
_serviceProvider = serviceProvider;
|
||||
_couponServices = couponServices;
|
||||
}
|
||||
|
||||
|
||||
#region 购物车的数据传过来,然后去算促销================
|
||||
|
||||
/// <summary>
|
||||
/// 购物车的数据传过来,然后去算促销
|
||||
/// </summary>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<CartDto> ToPromotion(CartDto cart, int type = (int)GlobalEnumVars.PromotionType.Promotion)
|
||||
{
|
||||
//团购秒杀不会走到这里,团购秒杀直接调用setPromotion方法
|
||||
if (type == (int)GlobalEnumVars.PromotionType.Group || type == (int)GlobalEnumVars.PromotionType.Seckill)
|
||||
{
|
||||
return cart;
|
||||
}
|
||||
|
||||
//按照权重取所有已生效的促销列表
|
||||
var dt = DateTime.Now;
|
||||
var promotions = await _dal.QueryListByClauseAsync(p => p.isEnable == true && p.startTime < dt && p.endTime > dt && p.type == (int)GlobalEnumVars.PromotionType.Promotion && p.isDel == false, p => p.sort, OrderByType.Asc);
|
||||
|
||||
foreach (var item in promotions)
|
||||
{
|
||||
await SetPromotion(item, cart);
|
||||
if (item.isExclusive == true) break;
|
||||
}
|
||||
|
||||
return cart;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 购物车的数据传过来,然后去算优惠券
|
||||
|
||||
/// <summary>
|
||||
/// 购物车的数据传过来,然后去算优惠券
|
||||
/// </summary>
|
||||
/// <param name="cart"></param>
|
||||
/// <param name="promotions"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ToCoupon(CartDto cart, List<CoreCmsPromotion> promotions)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
foreach (var item in promotions)
|
||||
{
|
||||
if (item == null)
|
||||
{
|
||||
jm.data = 15014;
|
||||
jm.msg = GlobalErrorCodeVars.Code15014;
|
||||
return jm;
|
||||
}
|
||||
var bl = await SetPromotion(item, cart);
|
||||
if (bl)
|
||||
{
|
||||
cart.coupon.Add(item.name);
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.data = 15014;
|
||||
jm.msg = GlobalErrorCodeVars.Code15014;
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
jm.status = true;
|
||||
jm.data = cart;
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 根据促销信息,去计算购物车的促销情况
|
||||
|
||||
/// <summary>
|
||||
/// 根据促销信息,去计算购物车的促销情况
|
||||
/// </summary>
|
||||
/// <param name="promotion"></param>
|
||||
/// <param name="cartModel"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> SetPromotion(CoreCmsPromotion promotion, CartDto cartModel)
|
||||
{
|
||||
var promotionConditions = await _promotionConditionServices.QueryListByClauseAsync(p => p.promotionId == promotion.id);
|
||||
//循环取出所有的促销条件,有一条不满足,就不行,就返回false
|
||||
var key = true;
|
||||
foreach (var item in promotionConditions)
|
||||
{
|
||||
var res = await _promotionConditionServices.check(item, cartModel, promotion);
|
||||
if (!key) continue;
|
||||
if (!res)
|
||||
{
|
||||
//多个促销条件中,如果有一个不满足,整体就不满足,但是为了显示完整的促销标签,还是要运算完所有的促销条件
|
||||
key = false;
|
||||
}
|
||||
}
|
||||
if (key)
|
||||
{
|
||||
//走到这一步就说明所有的促销条件都符合,那么就去计算结果
|
||||
var promotionResults = await _promotionResultServices.QueryListByClauseAsync(p => p.promotionId == promotion.id);
|
||||
foreach (var item in promotionResults)
|
||||
{
|
||||
await _promotionResultServices.toResult(item, cartModel, promotion);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//如果不满足需求,就要统一标准,把有些满足条件的(2),变成1
|
||||
_promotionConditionServices.PromotionFalse(cartModel, promotion);
|
||||
}
|
||||
return key;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取团购列表数据
|
||||
/// <summary>
|
||||
/// 获取团购列表数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetGroupList(int type, int userId, int status, int pageIndex, int pageSize)
|
||||
{
|
||||
|
||||
var jm = new WebApiCallBack { status = true };
|
||||
|
||||
var where = PredicateBuilder.True<CoreCmsPromotion>();
|
||||
where = where.And(p => p.isEnable == true && p.isDel == false);
|
||||
if (type == (int)GlobalEnumVars.PromotionType.Group)
|
||||
{
|
||||
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Group);
|
||||
}
|
||||
else if (type == (int)GlobalEnumVars.PromotionType.Seckill)
|
||||
{
|
||||
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Seckill);
|
||||
}
|
||||
|
||||
var dt = DateTime.Now;
|
||||
|
||||
if (status == (int)GlobalEnumVars.GroupSeckillStatus.Upcoming)
|
||||
{
|
||||
where = where.And(p => p.startTime > dt);
|
||||
|
||||
}
|
||||
else if (status == (int)GlobalEnumVars.GroupSeckillStatus.InProgress)
|
||||
{
|
||||
where = where.And(p => p.startTime < dt && dt < p.endTime);
|
||||
}
|
||||
else if (status == (int)GlobalEnumVars.GroupSeckillStatus.Finished)
|
||||
{
|
||||
where = where.And(p => p.endTime < dt);
|
||||
}
|
||||
|
||||
var goods = new List<CoreCmsGoods>();
|
||||
var list = await _dal.QueryPageAsync(where, p => p.endTime, OrderByType.Desc, pageIndex, pageSize);
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
foreach (var item in list)
|
||||
{
|
||||
var promotionId = item.id;
|
||||
var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId);
|
||||
if (condition != null && condition.parameters.Contains("goodsId"))
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(condition.parameters);
|
||||
|
||||
var res = await GetGroupDetail(parameters["goodsId"].ObjectToInt(0), userId, "group", item.id);
|
||||
if (res.status)
|
||||
{
|
||||
var good = res.data as CoreCmsGoods;
|
||||
|
||||
good.groupId = item.id;
|
||||
good.groupType = item.type;
|
||||
good.groupStatus = item.isEnable;
|
||||
good.groupTime = DateTime.Now;
|
||||
good.groupStartTime = item.startTime;
|
||||
good.groupEndTime = item.endTime;
|
||||
|
||||
TimeSpan ts = item.endTime.Subtract(dt);
|
||||
good.groupTimestamp = (int)ts.TotalSeconds;
|
||||
|
||||
goods.Add(good);
|
||||
}
|
||||
else
|
||||
{
|
||||
item.expression1 = res.msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jm.data = new
|
||||
{
|
||||
goods,
|
||||
list.TotalCount,
|
||||
list.TotalPages,
|
||||
list,
|
||||
pageIndex,
|
||||
pageSize
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取团购/秒杀商品详情
|
||||
/// <summary>
|
||||
/// 获取团购/秒杀商品详情
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<WebApiCallBack> GetGroupDetail(int goodId = 0, int userId = 0, string type = "group", int groupId = 0)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var goodsServices = container.ServiceProvider.GetService<ICoreCmsGoodsServices>();
|
||||
var orderServices = container.ServiceProvider.GetService<ICoreCmsOrderServices>();
|
||||
|
||||
var jm = new WebApiCallBack() { msg = "关键参数丢失" };
|
||||
|
||||
if (goodId == 0)
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
//判断商品是否参加团购
|
||||
var isInGroup = _dal.IsInGroup(goodId, out var promotionId);
|
||||
if (!isInGroup)
|
||||
{
|
||||
jm.msg = "商品未参加团购";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var promotion = await _dal.QueryByClauseAsync(p => p.isDel == false && p.isEnable == true && p.id == promotionId);
|
||||
if (promotion == null)
|
||||
{
|
||||
jm.msg = "无此活动";
|
||||
jm.otherData = promotionId;
|
||||
return jm;
|
||||
}
|
||||
|
||||
var goods = new CoreCmsGoods();
|
||||
goods = await goodsServices.GetGoodsDetial(goodId, userId, true, type, groupId);
|
||||
if (goods == null)
|
||||
{
|
||||
jm.msg = "商品不存在";
|
||||
return jm;
|
||||
}
|
||||
|
||||
if (goods.isMarketable == false)
|
||||
{
|
||||
jm.msg = "商品已下架";
|
||||
return jm;
|
||||
}
|
||||
|
||||
//调整前台显示数量
|
||||
if (!string.IsNullOrEmpty(promotion.parameters))
|
||||
{
|
||||
var extendParams = (JObject)JsonConvert.DeserializeObject(promotion.parameters);
|
||||
var checkOrder = orderServices.FindLimitOrder(goods.product.id, userId, promotion.startTime, promotion.endTime);
|
||||
|
||||
if (extendParams != null && extendParams.ContainsKey("max_goods_nums") && extendParams["max_goods_nums"].ObjectToInt(0) != 0)
|
||||
{
|
||||
var maxGoodsNums = extendParams["max_goods_nums"].ObjectToInt(0);
|
||||
goods.stock = maxGoodsNums;
|
||||
//活动销售件数
|
||||
goods.product.stock = maxGoodsNums - checkOrder.TotalOrders;
|
||||
goods.buyPromotionCount = checkOrder.TotalOrders;
|
||||
}
|
||||
else
|
||||
{
|
||||
goods.buyPromotionCount = checkOrder.TotalOrders;
|
||||
}
|
||||
}
|
||||
|
||||
var dt = DateTime.Now;
|
||||
|
||||
goods.groupId = promotion.id;
|
||||
goods.groupType = promotion.type;
|
||||
goods.groupStatus = promotion.isEnable;
|
||||
goods.groupTime = dt;
|
||||
goods.groupStartTime = promotion.startTime;
|
||||
goods.groupEndTime = promotion.endTime;
|
||||
|
||||
TimeSpan ts = promotion.endTime.Subtract(dt);
|
||||
goods.groupTimestamp = (int)ts.TotalSeconds;
|
||||
|
||||
|
||||
//进行促销后要更换原销售价替换原市场价
|
||||
var originPrice = Math.Round(goods.product.price + goods.product.promotionAmount, 2);
|
||||
goods.product.mktprice = originPrice;
|
||||
jm.status = true;
|
||||
jm.msg = "数据获取成功";
|
||||
jm.data = goods;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取可领取的优惠券(不分页)
|
||||
/// <summary>
|
||||
/// 获取可领取的优惠券(不分页)
|
||||
/// </summary>
|
||||
/// <param name="limit">数量</param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsPromotion>> ReceiveCouponList(int limit = 3)
|
||||
{
|
||||
var where = PredicateBuilder.True<CoreCmsPromotion>();
|
||||
where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取
|
||||
where = where.And(p => p.isEnable == true); //启用状态
|
||||
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型
|
||||
where = where.And(p => p.isAutoReceive == true); //自动领取状态
|
||||
where = where.And(p => p.isDel == false); //是否被删除
|
||||
|
||||
var data = await _dal.QueryPageAndChildsAsync(where, p => p.id, OrderByType.Desc, false, 0, limit);
|
||||
|
||||
if (data != null && data.Any())
|
||||
{
|
||||
foreach (var item in data)
|
||||
{
|
||||
|
||||
var expression1 = "";
|
||||
var expression2 = "";
|
||||
|
||||
foreach (var condition in item.promotionCondition)
|
||||
{
|
||||
var str = PromotionHelper.GetConditionMsg(condition.code, condition.parameters);
|
||||
expression1 += str;
|
||||
item.conditions.Add(str);
|
||||
}
|
||||
foreach (var result in item.promotionResult)
|
||||
{
|
||||
var str = PromotionHelper.GetResultMsg(result.code, result.parameters);
|
||||
expression2 += str;
|
||||
item.results.Add(str);
|
||||
}
|
||||
item.expression1 = expression1;
|
||||
item.expression2 = expression2;
|
||||
}
|
||||
}
|
||||
return data.ToList();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取可领取的优惠券(分页)
|
||||
|
||||
/// <summary>
|
||||
/// 获取可领取的优惠券(分页)
|
||||
/// </summary>
|
||||
/// <param name="page">页码</param>
|
||||
/// <param name="limit">数量</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsPromotion>> GetReceiveCouponList(int page = 1, int limit = 10)
|
||||
{
|
||||
var where = PredicateBuilder.True<CoreCmsPromotion>();
|
||||
where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取
|
||||
where = where.And(p => p.isEnable == true); //启用状态
|
||||
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型
|
||||
where = where.And(p => p.isAutoReceive == true); //自动领取状态
|
||||
where = where.And(p => p.isDel == false); //是否被删除
|
||||
|
||||
var data = await _dal.QueryPageAndChildsAsync(where, p => p.id, OrderByType.Desc, true, page, limit);
|
||||
|
||||
if (data != null && data.Any())
|
||||
{
|
||||
foreach (var item in data)
|
||||
{
|
||||
var expression1 = "";
|
||||
var expression2 = "";
|
||||
foreach (var condition in item.promotionCondition)
|
||||
{
|
||||
var str = PromotionHelper.GetConditionMsg(condition.code, condition.parameters);
|
||||
expression1 += str;
|
||||
item.conditions.Add(str);
|
||||
}
|
||||
foreach (var result in item.promotionResult)
|
||||
{
|
||||
var str = PromotionHelper.GetResultMsg(result.code, result.parameters);
|
||||
expression2 += str;
|
||||
item.results.Add(str);
|
||||
}
|
||||
item.expression1 = expression1;
|
||||
item.expression2 = expression2;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取指定id 的优惠券是否可以领取
|
||||
/// <summary>
|
||||
/// 获取指定id 的优惠券是否可以领取
|
||||
/// </summary>
|
||||
/// <param name="promotionId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ReceiveCoupon(int promotionId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var where = PredicateBuilder.True<CoreCmsPromotion>();
|
||||
where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取
|
||||
where = where.And(p => p.isEnable == true); //启用状态
|
||||
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型
|
||||
where = where.And(p => p.isAutoReceive == true); //自动领取状态
|
||||
where = where.And(p => p.id == promotionId);
|
||||
where = where.And(p => p.isDel == false); //是否被删除
|
||||
|
||||
|
||||
var info = await _dal.QueryByClauseAsync(where);
|
||||
if (info != null)
|
||||
{
|
||||
jm.data = info;
|
||||
//判断最大领取数量
|
||||
if (info.maxRecevieNums == 0)
|
||||
{
|
||||
jm.status = true;
|
||||
return jm;
|
||||
}
|
||||
var receiveCount = await _couponServices.GetCountAsync(p => p.promotionId == promotionId);
|
||||
if (receiveCount >= info.maxRecevieNums)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = "该优惠券已被领完,请下次再来!";
|
||||
return jm;
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = true;
|
||||
jm.code = receiveCount;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = GlobalErrorCodeVars.Code15007;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
58
CoreCms.Net.Services/Service/CoreCmsServicesServices.cs
Normal file
58
CoreCms.Net.Services/Service/CoreCmsServicesServices.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务项目表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsServicesServices : BaseServices<CoreCmsServices>, ICoreCmsServicesServices
|
||||
{
|
||||
private readonly ICoreCmsServicesRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsServicesServices(IUnitOfWork unitOfWork, ICoreCmsServicesRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsServices>> TagQueryPageAsync(Expression<Func<CoreCmsServices, bool>> predicate,
|
||||
Expression<Func<CoreCmsServices, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
|
||||
return await _dal.TagQueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
109
CoreCms.Net.Services/Service/CoreCmsUserServicesOrderServices.cs
Normal file
109
CoreCms.Net.Services/Service/CoreCmsUserServicesOrderServices.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务购买表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsUserServicesOrderServices : BaseServices<CoreCmsUserServicesOrder>, ICoreCmsUserServicesOrderServices
|
||||
{
|
||||
private readonly ICoreCmsUserServicesOrderRepository _dal;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsUserServicesOrderServices(IUnitOfWork unitOfWork, ICoreCmsUserServicesOrderRepository dal, IServiceProvider serviceProvider)
|
||||
{
|
||||
this._dal = dal;
|
||||
_serviceProvider = serviceProvider;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 完成服务订单后生成兑换券
|
||||
/// </summary>
|
||||
/// <param name="serviceOrderId"></param>
|
||||
/// <param name="paymentId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> CreateUserServicesTickets(string serviceOrderId, string paymentId)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
|
||||
var servicesServices = container.ServiceProvider.GetService<ICoreCmsServicesServices>();
|
||||
var userServicesTicketServices = container.ServiceProvider.GetService<ICoreCmsUserServicesTicketServices>();
|
||||
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var model = await _dal.QueryByClauseAsync(p => p.serviceOrderId == serviceOrderId);
|
||||
if (model == null)
|
||||
{
|
||||
jm.msg = "订单获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var servicesModel = await servicesServices.QueryByClauseAsync(p => p.id == model.servicesId);
|
||||
if (servicesModel == null)
|
||||
{
|
||||
jm.msg = "服务信息获取失败";
|
||||
return jm;
|
||||
}
|
||||
|
||||
model.isPay = true;
|
||||
model.payTime = DateTime.Now;
|
||||
model.paymentId = paymentId;
|
||||
model.servicesEndTime = servicesModel.validityEndTime;
|
||||
|
||||
var up = await _dal.UpdateAsync(model);
|
||||
var bl = false;
|
||||
if (up)
|
||||
{
|
||||
var tickets = new List<CoreCmsUserServicesTicket>();
|
||||
for (int i = 0; i < servicesModel.ticketNumber; i++)
|
||||
{
|
||||
var tk = new CoreCmsUserServicesTicket();
|
||||
tk.serviceOrderId = serviceOrderId;
|
||||
tk.securityCode = Guid.NewGuid();
|
||||
tk.redeemCode = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.服务券兑换码);
|
||||
tk.serviceId = model.servicesId;
|
||||
tk.userId = model.userId;
|
||||
tk.status = (int)GlobalEnumVars.ServicesTicketStatus.Normal;
|
||||
tk.validityType = servicesModel.validityType;
|
||||
tk.validityStartTime = servicesModel.validityStartTime;
|
||||
tk.validityEndTime = servicesModel.validityEndTime;
|
||||
tk.createTime = DateTime.Now;
|
||||
tk.isVerification = false;
|
||||
tickets.Add(tk);
|
||||
}
|
||||
bl = await userServicesTicketServices.InsertAsync(tickets) > 0;
|
||||
}
|
||||
|
||||
jm.status = bl && up;
|
||||
jm.msg = bl && up ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
|
||||
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务消费券 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsUserServicesTicketServices : BaseServices<CoreCmsUserServicesTicket>, ICoreCmsUserServicesTicketServices
|
||||
{
|
||||
private readonly ICoreCmsUserServicesTicketRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsUserServicesTicketServices(IUnitOfWork unitOfWork, ICoreCmsUserServicesTicketRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务券核验日志 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsUserServicesTicketVerificationLogServices : BaseServices<CoreCmsUserServicesTicketVerificationLog>, ICoreCmsUserServicesTicketVerificationLogServices
|
||||
{
|
||||
private readonly ICoreCmsUserServicesTicketVerificationLogRepository _dal;
|
||||
private readonly ICoreCmsServicesServices _servicesServices;
|
||||
private readonly ICoreCmsUserServicesTicketServices _userServicesTicketServices;
|
||||
private readonly ICoreCmsClerkServices _clerkServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsUserServicesTicketVerificationLogServices(IUnitOfWork unitOfWork, ICoreCmsUserServicesTicketVerificationLogRepository dal, ICoreCmsClerkServices clerkServices, ICoreCmsServicesServices servicesServices, ICoreCmsUserServicesTicketServices userServicesTicketServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_clerkServices = clerkServices;
|
||||
_servicesServices = servicesServices;
|
||||
_userServicesTicketServices = userServicesTicketServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 店铺核销的服务券列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetVerificationLogs(int userId, int page, int limit)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var clerk = await _clerkServices.QueryByClauseAsync(p => p.userId == userId);
|
||||
if (clerk == null)
|
||||
{
|
||||
jm.msg = "未查询到用户门店";
|
||||
return jm;
|
||||
}
|
||||
|
||||
var logs = await _dal.QueryPageAsync(p => p.storeId == clerk.storeId && p.isDel == false, p => p.verificationTime, OrderByType.Desc, page, limit);
|
||||
|
||||
if (logs != null && logs.Any())
|
||||
{
|
||||
var ticketIds = logs.Select(p => p.ticketId).ToList();
|
||||
var serviceIds = logs.Select(p => p.serviceId).ToList();
|
||||
|
||||
var servicesModel = await _servicesServices.QueryListByClauseAsync(p => serviceIds.Contains(p.id));
|
||||
var ticketsMdoel = await _userServicesTicketServices.QueryListByClauseAsync(p => ticketIds.Contains(p.id));
|
||||
|
||||
foreach (var item in logs)
|
||||
{
|
||||
item.ticket = ticketsMdoel.Find(p => p.id == item.ticketId);
|
||||
item.service = servicesModel.Find(p => p.id == item.serviceId);
|
||||
}
|
||||
jm.status = true;
|
||||
jm.msg = "获取成功";
|
||||
}
|
||||
|
||||
jm.data = logs;
|
||||
jm.otherData = new
|
||||
{
|
||||
logs.TotalPages,
|
||||
logs.TotalCount
|
||||
};
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除服务券核销单(软删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> LogDelete(int id, int userId = 0)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var model = await _dal.QueryByClauseAsync(p => p.id == id);
|
||||
if (model != null)
|
||||
{
|
||||
if (userId > 0)
|
||||
{
|
||||
var clerks = await _clerkServices.ExistsAsync(p => p.userId == userId && p.storeId == model.storeId);
|
||||
if (!clerks)
|
||||
{
|
||||
jm.msg = "你无权删除该服务券核销单";
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
model.isDel = true;
|
||||
var bl = await _dal.UpdateAsync(model);
|
||||
|
||||
jm.status = bl;
|
||||
jm.msg = bl ? "删除成功" : "删除失败";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "未找到服务券核销单";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
974
CoreCms.Net.Services/Share/CoreCmsShareServices.cs
Normal file
974
CoreCms.Net.Services/Share/CoreCmsShareServices.cs
Normal file
@@ -0,0 +1,974 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using CoreCms.Net.Caching.AccressToken;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using CoreCms.Net.WeChat.Service.Enums;
|
||||
using CoreCms.Net.WeChat.Service.HttpClients;
|
||||
using CoreCms.Net.WeChat.Service.Options;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SKIT.FlurlHttpClient.Wechat.Api;
|
||||
using SKIT.FlurlHttpClient.Wechat.Api.Models;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 表单 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsShareServices : BaseServices<CoreCmsSetting>, ICoreCmsShareServices
|
||||
{
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IWebHostEnvironment _webHostEnvironment;
|
||||
|
||||
public static readonly string AppInterFaceUrl = AppSettingsConstVars.AppConfigAppInterFaceUrl;
|
||||
|
||||
public readonly ICoreCmsGoodsServices GoodsServices;
|
||||
private readonly WeChatOptions _weChatOptions;
|
||||
private readonly WeChat.Service.HttpClients.IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
|
||||
|
||||
|
||||
|
||||
public CoreCmsShareServices(IUnitOfWork unitOfWork
|
||||
, IWebHostEnvironment webHostEnvironment
|
||||
, ICoreCmsGoodsServices goodsServices
|
||||
, IOptions<WeChatOptions> weChatOptions, IWeChatApiHttpClientFactory weChatApiHttpClientFactory)
|
||||
|
||||
{
|
||||
_unitOfWork = unitOfWork;
|
||||
_webHostEnvironment = webHostEnvironment;
|
||||
GoodsServices = goodsServices;
|
||||
_weChatApiHttpClientFactory = weChatApiHttpClientFactory;
|
||||
_weChatOptions = weChatOptions.Value;
|
||||
|
||||
}
|
||||
|
||||
#region 二维码分享
|
||||
|
||||
/// <summary>
|
||||
/// 二维码分享
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="userShareCode"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> QrShare(int client, int page, int userShareCode, string url, JObject parameter)
|
||||
{
|
||||
var res = GetCode(client, page, userShareCode, url, parameter);
|
||||
if (!res.status)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
return await getQr(url, res.otherData.ToString(), client);
|
||||
}
|
||||
|
||||
private async Task<WebApiCallBack> getQr(string url, string code, int client)
|
||||
{
|
||||
var jm = new WebApiCallBack() { status = true };
|
||||
|
||||
switch (client)
|
||||
{
|
||||
case (int)GlobalEnumVars.UrlShareClentType.Wxmnapp:
|
||||
jm = await GetQrCode(code, url);
|
||||
break;
|
||||
default:
|
||||
var urlStr = GetUrl(url, code);
|
||||
urlStr = HttpUtility.UrlEncode(urlStr);
|
||||
break;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 海报分享
|
||||
/// <summary>
|
||||
/// 海报分享
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="userShareCode"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> PosterShare(int client, int page, int userShareCode, string url, JObject parameter)
|
||||
{
|
||||
var res = GetCode(client, page, userShareCode, url, parameter);
|
||||
if (!res.status)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
//如果不是商品和拼团
|
||||
if (page != (int)GlobalEnumVars.UrlSharePageType.PinTuan && page != (int)GlobalEnumVars.UrlSharePageType.Goods && page != (int)GlobalEnumVars.UrlSharePageType.Seckill && page != (int)GlobalEnumVars.UrlSharePageType.Group)
|
||||
{
|
||||
return await getQr(url, res.otherData.ToString(), client);
|
||||
}
|
||||
//生成海报图片
|
||||
var result = await Poster(url, res.otherData.ToString(), client);
|
||||
return result;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 页面分享UrlShare
|
||||
/// <summary>
|
||||
/// 页面分享
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="userShareCode"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack UrlShare(int client, int page, int userShareCode, string url, JObject parameter)
|
||||
{
|
||||
var res = GetCode(client, page, userShareCode, url, parameter);
|
||||
if (!res.status)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
res.data = GetUrl(url, res.otherData.ToString());
|
||||
return res;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 二维码生成
|
||||
/// <summary>
|
||||
/// 二维码生成
|
||||
/// </summary>
|
||||
/// <param name="invite"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="groupId"></param>
|
||||
/// <param name="teamId"></param>
|
||||
/// <param name="style"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetParameterQrCode(string invite = "", int type = 1, string id = "", string groupId = "", string teamId = "", List<string> style = null, string page = "pages/share/jump")
|
||||
{
|
||||
var jm = new WebApiCallBack() { status = false, msg = "获取失败" };
|
||||
|
||||
var styles = style != null && style.Any() ? string.Join("-", style.ToArray()) : "";
|
||||
var nameStr = CommonHelper.Md5For32(page + invite + type + id + groupId + teamId + _weChatOptions.WxOpenAppId + styles);
|
||||
|
||||
//QrCode 根目录
|
||||
var dir = "/static/qrCode/weChat/";
|
||||
//文件虚拟目录
|
||||
var fileName = dir + nameStr + ".jpg";
|
||||
//文件硬地址
|
||||
var qrCodeDir = _webHostEnvironment.WebRootPath + dir;
|
||||
//QrCode 根目录
|
||||
var pathFileName = qrCodeDir + nameStr + ".jpg";
|
||||
|
||||
//QrCode 根目录
|
||||
if (File.Exists(pathFileName))
|
||||
{
|
||||
//有这个二维码了
|
||||
jm.status = true;
|
||||
jm.msg = "二维码获取成功";
|
||||
jm.data = AppInterFaceUrl + fileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
//没有去官方请求生成
|
||||
var scene = string.Empty;
|
||||
if (type == 1)
|
||||
{
|
||||
//商品详情页
|
||||
if (!string.IsNullOrEmpty(invite))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("2", invite, id, "");
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("2", "", id, "");
|
||||
}
|
||||
}
|
||||
else if (type == 2)
|
||||
{
|
||||
//首页
|
||||
if (!string.IsNullOrEmpty(invite))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("3", invite, "", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("3", "", "", "");
|
||||
}
|
||||
}
|
||||
else if (type == 3)
|
||||
{
|
||||
//拼团
|
||||
if (!string.IsNullOrEmpty(invite))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(teamId))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("5", invite, id, teamId);
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("5", invite, id, "");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!string.IsNullOrEmpty(teamId))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("5", "", id, teamId);
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("5", "", id, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == 4)
|
||||
{
|
||||
//店铺首页
|
||||
if (!string.IsNullOrEmpty(invite))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("9", invite, id, "");
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("9", "", id, "");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//默认首页
|
||||
if (!string.IsNullOrEmpty(invite))
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("3", invite, "", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
scene = ShareHelper.share_parameter_encode("3", "", "", "");
|
||||
}
|
||||
}
|
||||
|
||||
//没有去官方请求生成
|
||||
var ms = new MemoryStream();
|
||||
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
var request = new WxaGetWxaCodeUnlimitRequest();
|
||||
request.AccessToken = accessToken;
|
||||
request.Scene = scene;
|
||||
request.PagePath = page;
|
||||
request.LineColor = new WxaGetWxaCodeUnlimitRequest.Types.Color() { Red = 221, Blue = 51, Green = 238 };
|
||||
|
||||
var response = await client.ExecuteWxaGetWxaCodeUnlimitAsync(request);
|
||||
if (response.IsSuccessful())
|
||||
{
|
||||
ms = new MemoryStream(response.RawBytes);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.page不正确)
|
||||
{
|
||||
jm.msg = "后台小程序配置的APPID和APPSECRET对应的小程序未发布上线,或者page没有发布,无法生成海报";
|
||||
return jm;
|
||||
}
|
||||
else if (response.IsSuccessful() && response.ErrorCode == (int)WeChatReturnCode.ReturnCode.获取access_token时AppSecret错误或者access_token无效)
|
||||
{
|
||||
jm.msg = "微信小程序access_token已过期,无法为你生成海报";
|
||||
return jm;
|
||||
}
|
||||
else
|
||||
{
|
||||
var enumType = EnumHelper.GetEnumberEntity<WeChatReturnCode.ReturnCode>(response.ErrorCode);
|
||||
if (enumType != null)
|
||||
{
|
||||
jm.msg = response.ErrorCode + enumType.title;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
|
||||
//QrCode 根目录
|
||||
if (!Directory.Exists(qrCodeDir))
|
||||
{
|
||||
Directory.CreateDirectory(qrCodeDir);
|
||||
}
|
||||
|
||||
await using FileStream fs = System.IO.File.Create(pathFileName);
|
||||
await ms.CopyToAsync(fs);
|
||||
fs.Flush();
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "二维码生成成功";
|
||||
jm.data = AppSettingsConstVars.AppConfigAppInterFaceUrl + fileName;
|
||||
jm.otherData = response;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 小程序二维码,和业务没关系【GetQrCode】
|
||||
/// <summary>
|
||||
/// 小程序二维码,和业务没关系
|
||||
/// </summary>
|
||||
/// <param name="scene"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetQrCode(string scene, string page = "pages/share/jump")
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
jm.otherData = scene;
|
||||
|
||||
var fileNameStr = CommonHelper.Md5For32(scene) + CommonHelper.Msectime();
|
||||
//QrCode 根目录
|
||||
var dir = "/static/qrCode/weChat/";
|
||||
//文件虚拟目录
|
||||
var fileName = dir + fileNameStr + ".jpg";
|
||||
//文件硬地址
|
||||
var qrCodeDir = _webHostEnvironment.WebRootPath + dir;
|
||||
//QrCode 文件全路径
|
||||
var pathFileName = qrCodeDir + fileNameStr + ".jpg";
|
||||
var fileNameMin = fileNameStr + ".jpg";
|
||||
|
||||
if (File.Exists(pathFileName))
|
||||
{
|
||||
jm.status = true;
|
||||
jm.msg = "二维码获取成功";
|
||||
jm.data = AppInterFaceUrl + fileName;
|
||||
jm.otherData = fileNameMin;
|
||||
}
|
||||
else
|
||||
{
|
||||
//没有去官方请求生成
|
||||
var ms = new MemoryStream();
|
||||
|
||||
var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
|
||||
var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
|
||||
var request = new WxaGetWxaCodeUnlimitRequest();
|
||||
request.AccessToken = accessToken;
|
||||
request.Scene = scene;
|
||||
request.PagePath = page;
|
||||
request.LineColor = new WxaGetWxaCodeUnlimitRequest.Types.Color() { Red = 221, Blue = 51, Green = 238 };
|
||||
|
||||
var response = await client.ExecuteWxaGetWxaCodeUnlimitAsync(request);
|
||||
if (response.IsSuccessful() && response.ErrorCode == (int)WeChatReturnCode.ReturnCode.page不正确)
|
||||
{
|
||||
jm.msg = "后台小程序配置的APPID和APPSECRET对应的小程序未发布上线,或者page没有发布,无法生成海报";
|
||||
return jm;
|
||||
}
|
||||
else if (response.IsSuccessful() && response.ErrorCode == (int)WeChatReturnCode.ReturnCode.获取access_token时AppSecret错误或者access_token无效)
|
||||
{
|
||||
jm.msg = "微信小程序access_token已过期,无法为你生成海报";
|
||||
return jm;
|
||||
}
|
||||
else if (response.IsSuccessful() && response.ErrorCode > 0)
|
||||
{
|
||||
var enumType = EnumHelper.GetEnumberEntity<WeChatReturnCode.ReturnCode>(response.ErrorCode);
|
||||
if (enumType != null)
|
||||
{
|
||||
jm.msg = response.ErrorCode + enumType.title;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
else
|
||||
{
|
||||
ms = new MemoryStream(response.RawBytes);
|
||||
}
|
||||
|
||||
//QrCode 根目录
|
||||
if (!Directory.Exists(qrCodeDir))
|
||||
{
|
||||
Directory.CreateDirectory(qrCodeDir);
|
||||
}
|
||||
|
||||
FileStream fs = new FileStream(pathFileName, FileMode.OpenOrCreate);
|
||||
BinaryWriter w = new BinaryWriter(fs);
|
||||
w.Write(ms.ToArray());
|
||||
fs.Close();
|
||||
ms.Close();
|
||||
|
||||
jm.status = true;
|
||||
jm.msg = "GetQrCode";
|
||||
jm.data = AppSettingsConstVars.AppConfigAppInterFaceUrl + fileName;
|
||||
jm.otherData = fileNameMin;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获得分享的Code【GetCode】
|
||||
/// <summary>
|
||||
/// 获得分享的code
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="userShareCode"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
private static WebApiCallBack GetCode(int client, int page, int userShareCode, string url, JObject parameter)
|
||||
{
|
||||
//检查params参数是否正确
|
||||
WebApiCallBack result = en_params(page, parameter);
|
||||
if (!result.status)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
var code = en_url(page, userShareCode, result.data.ToString());
|
||||
result.otherData = code;
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 根据获得的code,拼接url【GetUrl】
|
||||
/// <summary>
|
||||
/// 根据获得的code,拼接url
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="code"></param>
|
||||
/// <returns></returns>
|
||||
private static string GetUrl(string url, string code)
|
||||
{
|
||||
return url + "?scene=" + code;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region url参数加密【en_url】
|
||||
/// <summary>
|
||||
/// url参数加密
|
||||
/// </summary>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="userShareCode"></param>
|
||||
/// <param name="paramsStr"></param>
|
||||
/// <returns></returns>
|
||||
private static string en_url(int page, int userShareCode, string paramsStr)
|
||||
{
|
||||
return page + "-" + userShareCode + "-" + paramsStr;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region url参数解密【de_url】
|
||||
/// <summary>
|
||||
/// url参数解密
|
||||
/// </summary>
|
||||
/// <param name="code"></param>
|
||||
/// <returns></returns>
|
||||
public WebApiCallBack de_url(string code)
|
||||
{
|
||||
//3-3702-2032_0
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var arr = code.Split("-");
|
||||
if (arr.Length != 3)
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
|
||||
var page = arr[0];
|
||||
var userShareCode = arr[1];
|
||||
|
||||
|
||||
var paramsResult = de_params(Convert.ToInt16(arr[0]), arr[2]);
|
||||
if (paramsResult.status)
|
||||
{
|
||||
jm.status = true;
|
||||
jm.data = new
|
||||
{
|
||||
page,
|
||||
userShareCode,
|
||||
@params = paramsResult.data
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
paramsResult.otherData = code;
|
||||
return paramsResult;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 检查参数,拼接参数【en_params】
|
||||
/// <summary>
|
||||
/// 检查参数,拼接参数
|
||||
/// </summary>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
private static WebApiCallBack en_params(int page, JObject parameter)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
var str = "";
|
||||
|
||||
switch (page)
|
||||
{
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Index:
|
||||
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Goods:
|
||||
if (parameter.ContainsKey("goodsId"))
|
||||
{
|
||||
str = parameter["goodsId"]?.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传goodsId";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.PinTuan:
|
||||
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("teamId"))
|
||||
{
|
||||
str = parameter["goodsId"] + "_" + parameter["teamId"];
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传goodsId,teamId";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Inv:
|
||||
if (parameter.ContainsKey("store"))
|
||||
{
|
||||
str = parameter["store"]?.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传store";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Article:
|
||||
if (parameter.ContainsKey("articleId") || parameter.ContainsKey("articleType"))
|
||||
{
|
||||
str = parameter["articleId"] + "_" + parameter["articleType"];
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传articleId,articleType";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.AddPinTuan:
|
||||
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("groupId") || parameter.ContainsKey("teamId"))
|
||||
{
|
||||
str = parameter["goodsId"] + "_" + parameter["groupId"] + "_" + parameter["teamId"];
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传goodsId,groupId,teamId";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Page:
|
||||
if (parameter.ContainsKey("pageCode"))
|
||||
{
|
||||
str = parameter["pageCode"]?.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传pageCode";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Form:
|
||||
if (parameter.ContainsKey("id"))
|
||||
{
|
||||
str = parameter["id"]?.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传id";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Group:
|
||||
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("groupId"))
|
||||
{
|
||||
str = parameter["goodsId"] + "_" + parameter["groupId"];
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传goodsId,groupId";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Seckill:
|
||||
if (parameter.ContainsKey("goodsId") || parameter.ContainsKey("groupId"))
|
||||
{
|
||||
str = parameter["goodsId"] + "_" + parameter["groupId"];
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传goodsId,groupId";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Agent:
|
||||
if (parameter.ContainsKey("store"))
|
||||
{
|
||||
str = parameter["store"]?.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "参数必须传store";
|
||||
return jm;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm.status = true;
|
||||
jm.data = str;
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 解码参数【de_params】
|
||||
/// <summary>
|
||||
/// 解码参数
|
||||
/// </summary>
|
||||
/// <param name="page"></param>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
private static WebApiCallBack de_params(int page, string parameter)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
var arr = parameter.Split("_");
|
||||
|
||||
switch (page)
|
||||
{
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Index:
|
||||
jm.status = true;
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Goods:
|
||||
if (arr.Length == 1)
|
||||
{
|
||||
jm.data = new { goodsId = arr[0] };
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.PinTuan:
|
||||
//if (arr.Length == 3)
|
||||
//{
|
||||
// jm.data = new
|
||||
// {
|
||||
// goodsId = arr[0],
|
||||
// groupId = arr[1],
|
||||
// teamId = arr[2]
|
||||
// };
|
||||
// jm.status = true;
|
||||
//}
|
||||
|
||||
if (arr.Length == 2)
|
||||
{
|
||||
jm.data = new
|
||||
{
|
||||
goodsId = arr[0],
|
||||
teamId = arr[1]
|
||||
};
|
||||
jm.status = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Inv:
|
||||
if (arr.Length == 1)
|
||||
{
|
||||
jm.data = new { store = arr[0] };
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Article:
|
||||
if (arr.Length == 2)
|
||||
{
|
||||
jm.data = new
|
||||
{
|
||||
articleId = arr[0],
|
||||
articleType = arr[1],
|
||||
};
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.AddPinTuan:
|
||||
if (arr.Length == 3)
|
||||
{
|
||||
jm.data = new
|
||||
{
|
||||
goodsId = arr[0],
|
||||
groupId = arr[1],
|
||||
teamId = arr[2]
|
||||
};
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Page:
|
||||
if (arr.Length == 1)
|
||||
{
|
||||
jm.data = new { pageCode = arr[0] };
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Form:
|
||||
if (arr.Length == 1)
|
||||
{
|
||||
jm.data = new { goodsId = arr[0] };
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Group:
|
||||
if (arr.Length == 2)
|
||||
{
|
||||
jm.data = new
|
||||
{
|
||||
goodsId = arr[0],
|
||||
groupId = arr[1],
|
||||
};
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Seckill:
|
||||
if (arr.Length == 2)
|
||||
{
|
||||
jm.data = new
|
||||
{
|
||||
goodsId = arr[0],
|
||||
groupId = arr[1],
|
||||
};
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
case (int)GlobalEnumVars.UrlSharePageType.Agent:
|
||||
if (arr.Length == 1)
|
||||
{
|
||||
jm.data = new { store = arr[0] };
|
||||
jm.status = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
jm.msg = GlobalErrorCodeVars.Code10000;
|
||||
return jm;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 渲染并生成海报图片
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="code"></param>
|
||||
/// <param name="client"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Poster(string url, string code, int client)
|
||||
{
|
||||
var jm = new WebApiCallBack() { status = false, msg = "海报生成失败0" };
|
||||
|
||||
|
||||
var fileNameStr = CommonHelper.Md5For32(url + code + client) + CommonHelper.Msectime();
|
||||
//QrCode 根目录
|
||||
var dir = "/static/poster/";
|
||||
//文件虚拟目录
|
||||
var fileName = dir + fileNameStr + ".jpg";
|
||||
//文件硬地址
|
||||
var qrCodeDir = _webHostEnvironment.WebRootPath + dir;
|
||||
//QrCode 根目录
|
||||
var pathFileName = qrCodeDir + fileNameStr + ".jpg";
|
||||
|
||||
//QrCode 根目录
|
||||
if (File.Exists(pathFileName))
|
||||
{
|
||||
//有这个二维码了
|
||||
jm.status = true;
|
||||
jm.msg = "海报获取成功";
|
||||
jm.data = AppInterFaceUrl + fileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
//去生成
|
||||
var res = de_url(code);
|
||||
if (!res.status)
|
||||
{
|
||||
jm.msg = "海报生成失败1";
|
||||
return res;
|
||||
}
|
||||
|
||||
var qrResult = await getQr(url, code, client);
|
||||
if (!qrResult.status)
|
||||
{
|
||||
jm.msg = "海报生成失败2";
|
||||
return qrResult;
|
||||
}
|
||||
|
||||
var mkResult = await DoMark(res.data, qrResult.otherData.ToString(), fileName);
|
||||
if (mkResult)
|
||||
{
|
||||
jm.status = true;
|
||||
jm.msg = "海报生成成功";
|
||||
jm.data = AppInterFaceUrl + fileName;
|
||||
}
|
||||
jm.otherData = mkResult;
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 绘制图片
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="otherData">生成的二维码图片地址</param>
|
||||
/// <param name="fileNameStr">海报文件名称</param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> DoMark(object data, string otherData, string fileNameStr)
|
||||
{
|
||||
var fileName = fileNameStr;
|
||||
|
||||
//文件硬地址
|
||||
var qrCodeDir = _webHostEnvironment.WebRootPath + "/static/qrCode/weChat/" + otherData;
|
||||
System.Drawing.Image qrCodeImage = System.Drawing.Image.FromFile(qrCodeDir);
|
||||
|
||||
//获取数据来源
|
||||
var dataObj = JObject.FromObject(data);
|
||||
if (!dataObj.ContainsKey("page") || dataObj["page"].ObjectToInt(0) <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//2商品详情页,3拼团详情页
|
||||
var page = dataObj["page"].ObjectToInt(0);
|
||||
if (page == 2 || page == 3)
|
||||
{
|
||||
if (dataObj.ContainsKey("params"))
|
||||
{
|
||||
var paramsObj = JObject.FromObject(dataObj["params"]);
|
||||
if (!paramsObj.ContainsKey("goodsId"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var goodId = paramsObj["goodsId"].ObjectToInt();
|
||||
var goodModel = await GoodsServices.GetGoodsDetial(goodId);
|
||||
if (goodModel != null)
|
||||
{
|
||||
var images = goodModel.images.Split(",");
|
||||
if (images.Any())
|
||||
{
|
||||
var image = images[0];
|
||||
//创建画布
|
||||
//创建 带二维码的图片 大小的 位图
|
||||
Bitmap tmpImage = new Bitmap(400, 600);
|
||||
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(tmpImage);
|
||||
//下面这个设成High
|
||||
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
||||
g.SmoothingMode = SmoothingMode.HighQuality;
|
||||
g.CompositingQuality = CompositingQuality.HighQuality;
|
||||
//清除整个绘图面并以背景色填充
|
||||
//g.Clear(Color.Transparent);// 透明(看到的可能是黑色)
|
||||
g.Clear(Color.White); //绘制白色
|
||||
|
||||
//绘制商品图片(网络下载图片)
|
||||
System.Net.WebRequest request = System.Net.WebRequest.Create(image);
|
||||
System.Net.WebResponse response = request.GetResponse();
|
||||
Stream reader = response.GetResponseStream();
|
||||
if (reader != null)
|
||||
{
|
||||
System.Drawing.Image imgHeadPhoto = System.Drawing.Image.FromStream(reader);
|
||||
g.DrawImage(imgHeadPhoto, 0, 0, 400, 400);
|
||||
imgHeadPhoto.Dispose();
|
||||
}
|
||||
reader.Close();
|
||||
reader.Dispose();
|
||||
|
||||
//绘制分享二维码
|
||||
g.DrawImage(qrCodeImage, 275, 420, 120, 120);
|
||||
|
||||
//绘制商品名称
|
||||
Font titleFont = new Font("微软雅黑", 14);
|
||||
|
||||
RectangleF descRect = new RectangleF();
|
||||
descRect.Location = new Point(10, 460);
|
||||
descRect.Size = new Size(260, ((int)g.MeasureString(goodModel.name, titleFont, 260, StringFormat.GenericTypographic).Height));
|
||||
g.DrawString(goodModel.name, titleFont, Brushes.Black, descRect);
|
||||
|
||||
//g.DrawString(goodModel.name, titleFont, new SolidBrush(Color.Black), new PointF(10, 430));
|
||||
|
||||
//绘制商品金额
|
||||
Font moneyFont = new Font("微软雅黑", 18);
|
||||
g.DrawString("¥" + goodModel.price, moneyFont, new SolidBrush(Color.Crimson), new PointF(10, 420));
|
||||
|
||||
//绘制提示语
|
||||
Font tipsFont = new Font("微软雅黑", 8);
|
||||
g.DrawString("扫描或长按识别二维码", tipsFont, new SolidBrush(Color.Black), new PointF(278, 555));
|
||||
|
||||
//释放资源 并保存要返回 位图
|
||||
qrCodeImage.Dispose();
|
||||
//图片压缩
|
||||
SaveImage2File(_webHostEnvironment.WebRootPath + fileName, tmpImage, 90);
|
||||
g.Dispose();
|
||||
tmpImage.Dispose();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将Image实例保存到文件,注意此方法不执行 img.Dispose()
|
||||
/// 图片保存时本可以直接使用destImage.Save(path, ImageFormat.Jpeg),但是这种方法无法进行进一步控制图片质量
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="img"></param>
|
||||
/// <param name="quality">1~100整数,无效值,则取默认值95</param>
|
||||
/// <param name="mimeType"></param>
|
||||
private void SaveImage2File(string path, Image destImage, int quality, string mimeType = "image/jpeg")
|
||||
{
|
||||
if (quality <= 0 || quality > 100) quality = 95;
|
||||
//创建保存的文件夹
|
||||
FileInfo fileInfo = new FileInfo(path);
|
||||
if (!Directory.Exists(fileInfo.DirectoryName))
|
||||
{
|
||||
Directory.CreateDirectory(fileInfo.DirectoryName);
|
||||
}
|
||||
//设置保存参数,保存参数里进一步控制质量
|
||||
EncoderParameters encoderParams = new EncoderParameters();
|
||||
long[] qua = new long[] { quality };
|
||||
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
|
||||
encoderParams.Param[0] = encoderParam;
|
||||
//获取指定mimeType的mimeType的ImageCodecInfo
|
||||
var codecInfo = ImageCodecInfo.GetImageEncoders().FirstOrDefault(ici => ici.MimeType == mimeType);
|
||||
destImage.Save(path, codecInfo, encoderParams);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
486
CoreCms.Net.Services/Shop/CoreCmsAreaServices.cs
Normal file
486
CoreCms.Net.Services/Shop/CoreCmsAreaServices.cs
Normal file
@@ -0,0 +1,486 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Caching.Manual;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using SqlSugar;
|
||||
|
||||
namespace CoreCms.Net.Services.Basic
|
||||
{
|
||||
public class CoreCmsAreaServices : BaseServices<CoreCmsArea>, ICoreCmsAreaServices
|
||||
{
|
||||
private readonly ICoreCmsAreaRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsAreaServices(IUnitOfWork unitOfWork, ICoreCmsAreaRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsArea entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsArea entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsArea> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsArea>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsArea>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsArea>> QueryPageAsync(Expression<Func<CoreCmsArea, bool>> predicate,
|
||||
Expression<Func<CoreCmsArea, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 获取所有省市区信息
|
||||
/// <summary>
|
||||
/// 获取所有省市区信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AreaTreeDto>> GetTreeArea(List<PostAreasTreeNode> checkedAreases, int parentId = 0,
|
||||
int currentChecked = 0)
|
||||
{
|
||||
var list = await UpdateCaChe();
|
||||
var areaTrees = GetTrees(list, parentId, checkedAreases, currentChecked);
|
||||
return areaTrees;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 迭代方法
|
||||
/// </summary>
|
||||
/// <param name="oldNavs"></param>
|
||||
/// <param name="parentId"></param>
|
||||
/// <returns></returns>
|
||||
private static List<AreaTreeDto> GetTrees(List<CoreCmsArea> allDatas, int parentId, List<PostAreasTreeNode> checkedAreases, int currentChecked = 0)
|
||||
{
|
||||
List<AreaTreeDto> childTree = new List<AreaTreeDto>();
|
||||
var model = allDatas.Where(p => p.parentId == parentId).ToList();
|
||||
foreach (var item in model)
|
||||
{
|
||||
var areaTree = new AreaTreeDto();
|
||||
areaTree.id = item.id;
|
||||
areaTree.title = item.name;
|
||||
areaTree.isLast = allDatas.Exists(p => p.parentId == item.id) == false;
|
||||
areaTree.level = (int)item.depth;
|
||||
areaTree.parentId = (int)item.parentId;
|
||||
|
||||
var isChecked = "0";
|
||||
var idStr = item.id.ToString();
|
||||
var parentIdStr = item.parentId.ToString();
|
||||
//判断是否选中的数据
|
||||
if (checkedAreases != null)
|
||||
{
|
||||
var areaModel = checkedAreases.Find(p => p.id == idStr);
|
||||
if (areaModel != null)
|
||||
{
|
||||
isChecked = areaModel.ischecked.ToString();
|
||||
}
|
||||
var parentModel = checkedAreases.Find(p => p.id == parentIdStr);
|
||||
if (parentModel != null && parentModel.ischecked == 1)
|
||||
{
|
||||
isChecked = "1";
|
||||
}
|
||||
}
|
||||
//当前父节点是1,下面肯定都是1
|
||||
if (currentChecked == 1)
|
||||
{
|
||||
isChecked = "1";
|
||||
}
|
||||
|
||||
var checkArr = new AreaTreeCheckArr()
|
||||
{
|
||||
@checked = isChecked,
|
||||
type = "0"
|
||||
};
|
||||
areaTree.checkArr = new List<AreaTreeCheckArr>();
|
||||
areaTree.checkArr.Add(checkArr);
|
||||
|
||||
childTree.Add(areaTree);
|
||||
areaTree.children = GetTrees(allDatas, item.id, checkedAreases, currentChecked);
|
||||
}
|
||||
return childTree;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 组装地区数据
|
||||
/// <summary>
|
||||
/// 组装地区数据
|
||||
/// </summary>
|
||||
public List<AreaTreeDto> resolve2(List<CoreCmsArea> allDatas, int parentId, List<PostAreasTreeNode> checkedAreases, int currentChecked = 0)
|
||||
{
|
||||
var areaTreeList = new List<AreaTreeDto>();
|
||||
var nowList = allDatas.Where(p => p.parentId == parentId).ToList();
|
||||
foreach (var item in nowList)
|
||||
{
|
||||
var isChecked = "0";
|
||||
var idStr = item.id.ToString();
|
||||
var parentIdStr = item.parentId.ToString();
|
||||
|
||||
//判断是否选中的数据
|
||||
if (checkedAreases != null)
|
||||
{
|
||||
var model = checkedAreases.Find(p => p.id == idStr);
|
||||
if (model != null)
|
||||
{
|
||||
isChecked = model.ischecked.ToString();
|
||||
}
|
||||
var parentModel = checkedAreases.Find(p => p.id == parentIdStr);
|
||||
if (parentModel != null && parentModel.ischecked == 1)
|
||||
{
|
||||
isChecked = "1";
|
||||
}
|
||||
}
|
||||
//当前父节点是1,下面肯定都是1
|
||||
if (currentChecked == 1)
|
||||
{
|
||||
isChecked = "1";
|
||||
}
|
||||
|
||||
var isLast = false;
|
||||
var isChild = allDatas.Exists(p => p.parentId == item.id);
|
||||
if (!isChild)
|
||||
{
|
||||
isLast = true;
|
||||
}
|
||||
|
||||
var areaTree = new AreaTreeDto();
|
||||
areaTree.id = item.id;
|
||||
areaTree.title = item.name;
|
||||
areaTree.isLast = isLast;
|
||||
areaTree.level = (int)item.depth;
|
||||
areaTree.parentId = (int)item.parentId;
|
||||
var checkArr = new AreaTreeCheckArr()
|
||||
{
|
||||
@checked = isChecked,
|
||||
type = "0"
|
||||
};
|
||||
areaTree.checkArr = new List<AreaTreeCheckArr>();
|
||||
areaTree.checkArr.Add(checkArr);
|
||||
areaTreeList.Add(areaTree);
|
||||
}
|
||||
return areaTreeList;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 根据areaId获取三级区域名称
|
||||
|
||||
/// <summary>
|
||||
/// 根据areaId获取三级区域名称
|
||||
/// </summary>
|
||||
/// <param name="areaId"></param>
|
||||
/// <param name="cacheAreas"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetAreaFullName(int areaId, List<CoreCmsArea> cacheAreas = null)
|
||||
{
|
||||
var jm = new WebApiCallBack { status = true };
|
||||
|
||||
cacheAreas ??= await GetCaChe();
|
||||
var arr = GetArea(cacheAreas, areaId);
|
||||
var str = string.Empty;
|
||||
if (arr.Any())
|
||||
{
|
||||
arr.Reverse();//倒序
|
||||
arr.ForEach(p => { str += p.name + " "; });
|
||||
}
|
||||
jm.data = str;
|
||||
|
||||
return jm;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 根据id来返回省市区信息,如果没有查到,就返回省的列表
|
||||
/// <summary>
|
||||
/// 根据id来返回省市区信息,如果没有查到,就返回省的列表
|
||||
/// </summary>
|
||||
public List<CoreCmsArea> GetArea(List<CoreCmsArea> cacheAreas, int id = 0)
|
||||
{
|
||||
var outAreas = new List<CoreCmsArea>();
|
||||
|
||||
if (id > 0)
|
||||
{
|
||||
GetParentArea(cacheAreas, id, outAreas);
|
||||
}
|
||||
return outAreas;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 递归取得父节点信息
|
||||
|
||||
/// <summary>
|
||||
/// 递归取得父节点信息
|
||||
/// </summary>
|
||||
/// <param name=""></param>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="outAreas"></param>
|
||||
/// <param name="cacheAreas"></param>
|
||||
/// <returns></returns>
|
||||
private void GetParentArea(List<CoreCmsArea> cacheAreas, int id, List<CoreCmsArea> outAreas)
|
||||
{
|
||||
//获取当前级别
|
||||
var model = cacheAreas.FirstOrDefault(p => p.id == id);
|
||||
if (model != null)
|
||||
{
|
||||
if (outAreas.All(p => p.id != model.id)) outAreas.Add(model);
|
||||
//获取父级
|
||||
var parentModel = cacheAreas.Find(p => p.id == model.parentId);
|
||||
if (parentModel != null)
|
||||
{
|
||||
if (outAreas.All(p => p.id != parentModel.id)) outAreas.Add(parentModel);
|
||||
if (parentModel.parentId != 0)
|
||||
{
|
||||
//上面还有节点
|
||||
var parentParentModel = cacheAreas.Find(p => p.id == parentModel.parentId);
|
||||
if (parentParentModel != null && outAreas.All(p => p.id != parentParentModel.id)) outAreas.Add(parentParentModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 获取最终地区ID
|
||||
/// <summary>
|
||||
/// 获取最终地区ID
|
||||
/// </summary>
|
||||
/// <param name="provinceName">省</param>
|
||||
/// <param name="cityName">市</param>
|
||||
/// <param name="countyName">县</param>
|
||||
/// <param name="postalCode">邮编</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetAreaId(string provinceName, string cityName, string countyName, string postalCode)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (string.IsNullOrEmpty(provinceName) || string.IsNullOrEmpty(cityName) || string.IsNullOrEmpty(countyName))
|
||||
{
|
||||
jm.msg = "请提交合法参数信息";
|
||||
return jm;
|
||||
}
|
||||
|
||||
jm = new WebApiCallBack
|
||||
{
|
||||
status = true,
|
||||
data = await GetThreeAreaId(provinceName, cityName, countyName, postalCode)
|
||||
};
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取最终地区ID
|
||||
/// </summary>
|
||||
/// <param name="provinceName">省</param>
|
||||
/// <param name="cityName">市</param>
|
||||
/// <param name="countyName">县</param>
|
||||
/// <param name="postalCode">邮编</param>
|
||||
/// <returns></returns>
|
||||
public async Task<int> GetThreeAreaId(string provinceName, string cityName, string countyName, string postalCode)
|
||||
{
|
||||
var areaData = await GetCaChe();
|
||||
var id = 0;
|
||||
var countyList = areaData.Where(p => p.depth == (int)GlobalEnumVars.AreaDepth.County && p.name == countyName).ToList();
|
||||
if (countyList.Any())
|
||||
{
|
||||
if (countyList.Count > 1)
|
||||
{
|
||||
var cityModel = areaData.Find(p => p.depth == (int)GlobalEnumVars.AreaDepth.City && p.name == cityName);
|
||||
if (cityModel != null)
|
||||
{
|
||||
//foreach (var item in countyList)
|
||||
//{
|
||||
// if (item.parentId == cityModel.id)
|
||||
// {
|
||||
// id = item.id;
|
||||
// }
|
||||
//}
|
||||
var result = countyList.Find(p => p.parentId == cityModel.id);
|
||||
return result?.id ?? 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
id = countyList[0].id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//var cityModel = areaData.Find(p => p.depth == (int)GlobalEnumVars.AreaDepth.City && p.name == cityName);
|
||||
//if (cityModel != null)
|
||||
//{
|
||||
// //创建区域
|
||||
// var area = new CoreCmsArea();
|
||||
// area.depth = (int)GlobalEnumVars.AreaDepth.County;
|
||||
// area.name = countyName;
|
||||
// area.postalCode = postalCode;
|
||||
// area.parentId = cityModel.id;
|
||||
// area.sort = 100;
|
||||
// id = await base.InsertAsync(area);
|
||||
|
||||
// await UpdateCaChe();
|
||||
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// var province = areaData.Find(p => p.depth == (int)GlobalEnumVars.AreaDepth.Province && p.name == provinceName);
|
||||
// if (province != null)
|
||||
// {
|
||||
// //创建城市
|
||||
// var areaCity = new CoreCmsArea();
|
||||
// areaCity.depth = (int)GlobalEnumVars.AreaDepth.City;
|
||||
// areaCity.name = cityName;
|
||||
// //areaCity.postalCode = postalCode;
|
||||
// areaCity.parentId = province.id;
|
||||
// areaCity.sort = 100;
|
||||
// var cityId = await base.InsertAsync(areaCity);
|
||||
|
||||
// //创建区域
|
||||
// var areaCounty = new CoreCmsArea();
|
||||
// areaCounty.depth = (int)GlobalEnumVars.AreaDepth.County;
|
||||
// areaCounty.name = countyName;
|
||||
// areaCounty.postalCode = postalCode;
|
||||
// areaCounty.parentId = cityId;
|
||||
// areaCounty.sort = 100;
|
||||
// id = await base.InsertAsync(areaCounty);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //创建省
|
||||
// var areaProvince = new CoreCmsArea();
|
||||
// areaProvince.depth = (int)GlobalEnumVars.AreaDepth.Province;
|
||||
// areaProvince.name = cityName;
|
||||
// //areaCity.postalCode = postalCode;
|
||||
// areaProvince.parentId = (int)GlobalEnumVars.AreaDepth.ProvinceParentId;
|
||||
// areaProvince.sort = 100;
|
||||
// var provinceId = await base.InsertAsync(areaProvince);
|
||||
|
||||
// //创建城市
|
||||
// var areaCity = new CoreCmsArea();
|
||||
// areaCity.depth = (int)GlobalEnumVars.AreaDepth.City;
|
||||
// areaCity.name = cityName;
|
||||
// //areaCity.postalCode = postalCode;
|
||||
// areaCity.parentId = provinceId;
|
||||
// areaCity.sort = 100;
|
||||
// var cityId = await base.InsertAsync(areaCity);
|
||||
|
||||
// //创建区域
|
||||
// var areaCounty = new CoreCmsArea();
|
||||
// areaCounty.depth = (int)GlobalEnumVars.AreaDepth.County;
|
||||
// areaCounty.name = countyName;
|
||||
// areaCounty.postalCode = postalCode;
|
||||
// areaCounty.parentId = cityId;
|
||||
// areaCounty.sort = 100;
|
||||
// id = await base.InsertAsync(areaCounty);
|
||||
// }
|
||||
// await UpdateCaChe();
|
||||
//}
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
113
CoreCms.Net.Services/Shop/CoreCmsClerkServices.cs
Normal file
113
CoreCms.Net.Services/Shop/CoreCmsClerkServices.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 店铺店员关联表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsClerkServices : BaseServices<CoreCmsClerk>, ICoreCmsClerkServices
|
||||
{
|
||||
private readonly ICoreCmsClerkRepository _dal;
|
||||
private readonly ICoreCmsUserServices _userServices;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsClerkServices(IUnitOfWork unitOfWork, ICoreCmsClerkRepository dal
|
||||
, ICoreCmsUserServices userServices
|
||||
, ICoreCmsSettingServices settingServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_userServices = userServices;
|
||||
_settingServices = settingServices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是不是店员
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> IsClerk(int userId)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
|
||||
var storeSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.StoreSwitch).ObjectToInt(2);
|
||||
if (storeSwitch == 1)
|
||||
{
|
||||
var bl = await base.ExistsAsync(p => p.userId == userId);
|
||||
jm.status = true;
|
||||
jm.data = bl;
|
||||
jm.msg = bl ? "是店员" : "不是店员";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.status = true;
|
||||
jm.data = false;
|
||||
jm.msg = "未开启到店自提";
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取门店关联用户分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<StoreClerkDto>> QueryStoreClerkDtoPageAsync(Expression<Func<StoreClerkDto, bool>> predicate,
|
||||
Expression<Func<StoreClerkDto, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryStoreClerkDtoPageAsync(predicate, orderByExpression, orderByType, pageIndex,
|
||||
pageSize, blUseNoLock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个门店用户数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<StoreClerkDto> QueryStoreClerkDtoByClauseAsync(Expression<Func<StoreClerkDto, bool>> predicate, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryStoreClerkDtoByClauseAsync(predicate, blUseNoLock);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
247
CoreCms.Net.Services/Shop/CoreCmsLogisticsServices.cs
Normal file
247
CoreCms.Net.Services/Shop/CoreCmsLogisticsServices.cs
Normal file
@@ -0,0 +1,247 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Api;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Flurl.Http;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 物流公司表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsLogisticsServices : BaseServices<CoreCmsLogistics>, ICoreCmsLogisticsServices
|
||||
{
|
||||
private readonly ICoreCmsLogisticsRepository _dal;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
|
||||
|
||||
public CoreCmsLogisticsServices(IUnitOfWork unitOfWork, ICoreCmsLogisticsRepository dal, ICoreCmsSettingServices settingServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_settingServices = settingServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据物流编码取物流名称等信息
|
||||
/// </summary>
|
||||
/// <param name="logiCode">物流编码</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetLogiInfo(string logiCode)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var model = await _dal.QueryByClauseAsync(p => p.logiCode == logiCode);
|
||||
jm.status = model != null;
|
||||
jm.data = model;
|
||||
jm.msg = jm.status ? GlobalConstVars.GetDataSuccess : GlobalConstVars.GetDataFailure;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 通过接口更新所有快递公司信息
|
||||
/// </summary>
|
||||
public async Task<AdminUiCallBack> DoUpdateCompany()
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var showApiAppid = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowApiAppid);
|
||||
var showApiSecret = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowApiSecret);
|
||||
var shopMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopMobile);
|
||||
|
||||
var showApiTimesTamp = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
|
||||
var maxSize = 1500;
|
||||
var signStr = "maxSize" + maxSize + "showapi_appid" + showApiAppid + "showapi_timestamp" + showApiTimesTamp + showApiSecret;
|
||||
var md5Sign = CommonHelper.Md5For32(signStr).ToLower();
|
||||
|
||||
var url = "https://route.showapi.com/64-20?expName=&maxSize=1500&page=&showapi_appid=" + showApiAppid +
|
||||
"&showapi_timestamp=" + showApiTimesTamp + "&showapi_sign=" + md5Sign;
|
||||
var person = await url.GetJsonAsync<ShowApiGetExpressCompanyListResult>();
|
||||
|
||||
if (person.showapi_res_code == 0)
|
||||
{
|
||||
if (person.showapi_res_body != null && person.showapi_res_body.ret_code == 0 && person.showapi_res_body.expressList != null && person.showapi_res_body.expressList.Count > 0)
|
||||
{
|
||||
var list = new List<CoreCmsLogistics>();
|
||||
|
||||
|
||||
var systemLogistics = SystemSettingDictionary.GetSystemLogistics();
|
||||
systemLogistics.ForEach(p =>
|
||||
{
|
||||
var logistics = new CoreCmsLogistics();
|
||||
logistics.logiCode = p.sKey;
|
||||
logistics.logiName = p.sDescription;
|
||||
logistics.imgUrl = "";
|
||||
logistics.phone = shopMobile;
|
||||
logistics.url = "";
|
||||
logistics.sort = -1;
|
||||
logistics.isDelete = false;
|
||||
|
||||
list.Add(logistics);
|
||||
});
|
||||
|
||||
|
||||
var count = 0;
|
||||
person.showapi_res_body.expressList.ForEach(p =>
|
||||
{
|
||||
var logistics = new CoreCmsLogistics();
|
||||
logistics.logiCode = p.simpleName;
|
||||
logistics.logiName = p.expName;
|
||||
logistics.imgUrl = p.imgUrl;
|
||||
logistics.phone = p.phone;
|
||||
logistics.url = p.url;
|
||||
logistics.sort = count * 5;
|
||||
logistics.isDelete = false;
|
||||
|
||||
list.Add(logistics);
|
||||
count++;
|
||||
});
|
||||
await _dal.DeleteAsync(p => p.id > 0);
|
||||
var bl = await _dal.InsertAsync(list) > 0;
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = bl ? "数据刷新成功" : "数据刷新失败";
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = "接口获取数据失败";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jm.msg = person.showapi_res_error;
|
||||
}
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 通过接口获取快递信息
|
||||
/// </summary>
|
||||
/// <param name="com">来源</param>
|
||||
/// <param name="number">编号</param>
|
||||
/// <param name="phone">手机号码</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> ExpressPoll(string com, string number, string phone)
|
||||
{
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (string.IsNullOrEmpty(com))
|
||||
{
|
||||
jm.msg = "请提交来源";
|
||||
return jm;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(number))
|
||||
{
|
||||
jm.msg = "请提交编号";
|
||||
return jm;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(phone))
|
||||
{
|
||||
jm.msg = "请提交手机号码";
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
var allConfigs = await _settingServices.GetConfigDictionaries();
|
||||
var showApiAppid = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowApiAppid);
|
||||
var showApiSecret = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShowApiSecret);
|
||||
|
||||
var showApiTimesTamp = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
|
||||
var signStr = "com" + com + "nu" + number + "phone" + phone + "showapi_appid" + showApiAppid + "showapi_timestamp" + showApiTimesTamp + showApiSecret;
|
||||
var md5Sign = CommonHelper.Md5For32(signStr).ToLower();
|
||||
|
||||
var url = "https://route.showapi.com/64-19?com=" + com + "&nu=" + number + "&phone=" + phone + "&showapi_appid=" + showApiAppid +
|
||||
"&showapi_timestamp=" + showApiTimesTamp + "&showapi_sign=" + md5Sign;
|
||||
var result = await url.GetJsonAsync<ShowApiGetExpressPollResult>();
|
||||
|
||||
if (result.showapi_res_code != 0)
|
||||
{
|
||||
jm.status = false;
|
||||
jm.msg = result.showapi_res_error;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (result.showapi_res_body.ret_code)
|
||||
{
|
||||
case 0:
|
||||
jm.status = true;
|
||||
jm.msg = "查询成功";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 1:
|
||||
jm.status = false;
|
||||
jm.msg = "输入参数错误";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 2:
|
||||
jm.status = false;
|
||||
jm.msg = "查不到物流信息";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 3:
|
||||
jm.status = false;
|
||||
jm.msg = "单号不符合规则";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 4:
|
||||
jm.status = false;
|
||||
jm.msg = "快递公司编码不符合规则";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 5:
|
||||
jm.status = false;
|
||||
jm.msg = "快递查询渠道异常";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 6:
|
||||
jm.status = false;
|
||||
jm.msg = " auto时未查到单号对应的快递公司,请指定快递公司编码";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
case 7:
|
||||
jm.status = false;
|
||||
jm.msg = "单号与手机号不匹配";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
default:
|
||||
jm.status = false;
|
||||
jm.msg = "接口调用失败";
|
||||
jm.data = result.showapi_res_body;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return jm;
|
||||
}
|
||||
}
|
||||
}
|
||||
76
CoreCms.Net.Services/Shop/CoreCmsNoticeServices.cs
Normal file
76
CoreCms.Net.Services/Shop/CoreCmsNoticeServices.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 公告表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsNoticeServices : BaseServices<CoreCmsNotice>, ICoreCmsNoticeServices
|
||||
{
|
||||
private readonly ICoreCmsNoticeRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsNoticeServices(IUnitOfWork unitOfWork, ICoreCmsNoticeRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsNotice>> QueryPageAsync(Expression<Func<CoreCmsNotice, bool>> predicate,
|
||||
Expression<Func<CoreCmsNotice, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取列表首页用
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsNotice>> QueryListAsync(Expression<Func<CoreCmsNotice, bool>> predicate,
|
||||
Expression<Func<CoreCmsNotice, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20)
|
||||
{
|
||||
return await _dal.QueryListAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
38
CoreCms.Net.Services/Shop/CoreCmsPagesItemsServices.cs
Normal file
38
CoreCms.Net.Services/Shop/CoreCmsPagesItemsServices.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 单页内容 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPagesItemsServices : BaseServices<CoreCmsPagesItems>, ICoreCmsPagesItemsServices
|
||||
{
|
||||
private readonly ICoreCmsPagesItemsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsPagesItemsServices(IUnitOfWork unitOfWork, ICoreCmsPagesItemsRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
778
CoreCms.Net.Services/Shop/CoreCmsPagesServices.cs
Normal file
778
CoreCms.Net.Services/Shop/CoreCmsPagesServices.cs
Normal file
@@ -0,0 +1,778 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
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.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.DTO;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 单页 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsPagesServices : BaseServices<CoreCmsPages>, ICoreCmsPagesServices
|
||||
{
|
||||
private readonly ICoreCmsPagesRepository _dal;
|
||||
private readonly ICoreCmsPagesItemsRepository _pagesItemsRepository;
|
||||
private readonly ICoreCmsPromotionServices _promotionServices;
|
||||
private readonly ICoreCmsNoticeServices _noticeServices;
|
||||
private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
|
||||
private readonly ICoreCmsSettingServices _settingServices;
|
||||
private readonly ICoreCmsGoodsServices _goodsServices;
|
||||
private readonly ICoreCmsArticleServices _articleServices;
|
||||
private readonly ICoreCmsPromotionConditionServices _promotionConditionServices;
|
||||
private readonly ICoreCmsPinTuanRuleServices _pinTuanRuleServices;
|
||||
private readonly ICoreCmsServicesServices _servicesServices;
|
||||
|
||||
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsPagesServices(IUnitOfWork unitOfWork
|
||||
, ICoreCmsPagesRepository dal
|
||||
, ICoreCmsPagesItemsRepository pagesItemsRepository, ICoreCmsPromotionServices promotionServices, ICoreCmsNoticeServices noticeServices, ICoreCmsGoodsCategoryServices goodsCategoryServices, ICoreCmsSettingServices settingServices, ICoreCmsGoodsServices goodsServices, ICoreCmsArticleServices articleServices, ICoreCmsPromotionConditionServices promotionConditionServices, ICoreCmsPinTuanRuleServices pinTuanRuleServices, ICoreCmsServicesServices servicesServices)
|
||||
{
|
||||
this._dal = dal;
|
||||
_pagesItemsRepository = pagesItemsRepository;
|
||||
_promotionServices = promotionServices;
|
||||
_noticeServices = noticeServices;
|
||||
_goodsCategoryServices = goodsCategoryServices;
|
||||
_settingServices = settingServices;
|
||||
_goodsServices = goodsServices;
|
||||
_articleServices = articleServices;
|
||||
_promotionConditionServices = promotionConditionServices;
|
||||
_pinTuanRuleServices = pinTuanRuleServices;
|
||||
_servicesServices = servicesServices;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsPages entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsPages entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新设计
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateDesignAsync(FmPagesUpdate entity)
|
||||
{
|
||||
return await _dal.UpdateDesignAsync(entity);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 复制一个同样的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> CopyByIdAsync(int id)
|
||||
{
|
||||
return await _dal.CopyByIdAsync(id);
|
||||
}
|
||||
|
||||
|
||||
#region 获取首页数据
|
||||
/// <summary>
|
||||
/// 获取首页数据
|
||||
/// </summary>
|
||||
/// <param name="code"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> GetPageConfig(string code)
|
||||
{
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
var wherePage = PredicateBuilder.True<CoreCmsPages>();
|
||||
|
||||
wherePage = code == "mobile_home" ? wherePage.And(p => p.type == 1) : wherePage.And(p => p.code == code);
|
||||
|
||||
var model = await _dal.QueryByClauseAsync(wherePage);
|
||||
if (model == null)
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
jm.status = true;
|
||||
var items = await _pagesItemsRepository.QueryListByClauseAsync(p => p.pageCode == model.code, p => p.sort, OrderByType.Asc);
|
||||
|
||||
var itemsDto = new List<PagesItemsDto>();
|
||||
foreach (var item in items)
|
||||
{
|
||||
var dto = new PagesItemsDto();
|
||||
dto.id = item.id;
|
||||
dto.widgetCode = item.widgetCode;
|
||||
dto.pageCode = item.pageCode;
|
||||
dto.positionId = item.positionId;
|
||||
dto.sort = item.sort;
|
||||
|
||||
item.parameters = item.parameters.Replace("/images/empty-banner.png", "/static/images/common/empty-banner.png");
|
||||
|
||||
|
||||
if (item.widgetCode == "search") //搜索
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "tabBar")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "notice")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "auto")
|
||||
{
|
||||
var list = await _noticeServices.QueryListAsync(p => p.isDel == false, p => p.createTime, OrderByType.Desc, 1, 20);
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(list);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
}
|
||||
else if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "choose")
|
||||
{
|
||||
|
||||
var where = PredicateBuilder.True<CoreCmsNotice>();
|
||||
|
||||
var orderBy = string.Empty;
|
||||
var noticeIdsStr = string.Empty;
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(parameters["list"].ToString());
|
||||
var noticeIds = new List<int>();
|
||||
foreach (var ss in result) //查找某个字段与值
|
||||
{
|
||||
var noticeId = ((JObject)ss)["id"].ObjectToInt(0);
|
||||
if (noticeId > 0)
|
||||
{
|
||||
noticeIds.Add(noticeId);
|
||||
}
|
||||
}
|
||||
where = where.And(p => noticeIds.Contains(p.id));
|
||||
if (noticeIds.Any())
|
||||
{
|
||||
noticeIdsStr = string.Join(",", noticeIdsStr);
|
||||
//按照固定的序列id进行排序
|
||||
if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString())
|
||||
{
|
||||
orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + noticeIdsStr + "') ";
|
||||
}
|
||||
else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString())
|
||||
{
|
||||
orderBy = " find_in_set(id,'" + noticeIdsStr + "') ";
|
||||
}
|
||||
}
|
||||
}
|
||||
var notices = await _noticeServices.QueryListByClauseAsync(where, orderBy);
|
||||
if (notices != null && notices.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(notices);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", new JArray());
|
||||
}
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "imgSlide")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "coupon")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("limit") && parameters["limit"].ObjectToInt(0) != 0)
|
||||
{
|
||||
var list = await _promotionServices.ReceiveCouponList(parameters["limit"].ObjectToInt(0));
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(list);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "blank")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "textarea")
|
||||
{
|
||||
JObject parameters = new JObject();
|
||||
parameters["value"] = item.parameters;
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "video")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "imgWindow")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "imgSingle")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "goodTabBar")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
var list = JArray.Parse(parameters["list"].ToString());
|
||||
var newList = new JArray();
|
||||
foreach (var jToken in list)
|
||||
{
|
||||
var child = (JObject)jToken;
|
||||
var where = PredicateBuilder.True<CoreCmsGoods>();
|
||||
where = where.And(p => p.isDel == false);
|
||||
where = where.And(p => p.isMarketable == true);
|
||||
|
||||
if (child != null && child.ContainsKey("type") && child["type"].ToString() == "auto")
|
||||
{
|
||||
//商品分类,同时取所有子分类
|
||||
if (child.ContainsKey("classifyId") && child["classifyId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var classifyId = child["classifyId"].ObjectToInt(0);
|
||||
var childCats = await _goodsCategoryServices.QueryListByClauseAsync(p => p.parentId == classifyId);
|
||||
var catIds = childCats != null && childCats.Any()
|
||||
? childCats.Select(p => p.id).ToList()
|
||||
: new List<int>();
|
||||
catIds.Add(classifyId);
|
||||
|
||||
where = where.And(p => catIds.Contains(p.goodsCategoryId));
|
||||
//扩展分类 CoreCmsGoodsCategory
|
||||
}
|
||||
//品牌筛选
|
||||
if (child.ContainsKey("brandId") && child["brandId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var brandId = child["brandId"].ObjectToInt(0);
|
||||
where = where.And(p => p.brandId == brandId);
|
||||
}
|
||||
|
||||
var limit = 0;
|
||||
if (child.ContainsKey("limit") && child["limit"].ObjectToInt(0) > 0)
|
||||
{
|
||||
limit = child["limit"].ObjectToInt(0);
|
||||
}
|
||||
limit = limit > 0 ? limit : 10;
|
||||
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(where, limit, p => p.createTime, OrderByType.Desc, true);
|
||||
if (goods != null && goods.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(goods);
|
||||
child.Remove("list");
|
||||
child.Add("list", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
child.Remove("list");
|
||||
child.Add("list", new JArray());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var orderBy = string.Empty;
|
||||
string goodidsStr;
|
||||
if (child != null && child.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(child["list"].ToString());
|
||||
var goodids = new List<int>();
|
||||
foreach (var ss in result) //查找某个字段与值
|
||||
{
|
||||
var goodid = ((JObject)ss)["id"].ObjectToInt(0);
|
||||
if (goodid > 0)
|
||||
{
|
||||
goodids.Add(goodid);
|
||||
}
|
||||
}
|
||||
where = where.And(p => goodids.Contains(p.id));
|
||||
if (goodids.Any())
|
||||
{
|
||||
goodidsStr = string.Join(",", goodids);
|
||||
//按照id序列打乱后的顺序排序
|
||||
if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString())
|
||||
{
|
||||
orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + goodidsStr + "') ";
|
||||
}
|
||||
else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString())
|
||||
{
|
||||
orderBy = " find_in_set(id,'" + goodidsStr + "') ";
|
||||
}
|
||||
}
|
||||
}
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(where, orderBy);
|
||||
if (goods != null && goods.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(goods);
|
||||
child.Remove("list");
|
||||
child.Add("list", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
child.Remove("list");
|
||||
child.Add("list", new JArray());
|
||||
}
|
||||
}
|
||||
newList.Add(child);
|
||||
}
|
||||
|
||||
if (newList != null && newList.Any())
|
||||
{
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", newList);
|
||||
}
|
||||
}
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
|
||||
else if (item.widgetCode == "goods")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
var where = PredicateBuilder.True<CoreCmsGoods>();
|
||||
where = where.And(p => p.isDel == false);
|
||||
where = where.And(p => p.isMarketable == true);
|
||||
if (parameters != null && parameters.ContainsKey("type") && parameters["type"].ToString() == "auto")
|
||||
{
|
||||
//商品分类,同时取所有子分类
|
||||
if (parameters.ContainsKey("classifyId") && parameters["classifyId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var classifyId = parameters["classifyId"].ObjectToInt(0);
|
||||
var childCats = await _goodsCategoryServices.QueryListByClauseAsync(p => p.parentId == classifyId);
|
||||
var catIds = childCats != null && childCats.Any()
|
||||
? childCats.Select(p => p.id).ToList()
|
||||
: new List<int>();
|
||||
catIds.Add(classifyId);
|
||||
|
||||
where = where.And(p => catIds.Contains(p.goodsCategoryId));
|
||||
//扩展分类 CoreCmsGoodsCategory
|
||||
}
|
||||
//品牌筛选
|
||||
if (parameters.ContainsKey("brandId") && parameters["brandId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var brandId = parameters["brandId"].ObjectToInt(0);
|
||||
where = where.And(p => p.brandId == brandId);
|
||||
}
|
||||
|
||||
var limit = 0;
|
||||
if (parameters.ContainsKey("limit") && parameters["limit"].ObjectToInt(0) > 0)
|
||||
{
|
||||
limit = parameters["limit"].ObjectToInt(0);
|
||||
}
|
||||
limit = limit > 0 ? limit : 10;
|
||||
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(where, limit, p => p.createTime, OrderByType.Desc, false);
|
||||
if (goods != null && goods.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(goods);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", new JArray());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var orderBy = string.Empty;
|
||||
var goodidsStr = string.Empty;
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(parameters["list"].ToString());
|
||||
var goodids = new List<int>();
|
||||
foreach (var ss in result) //查找某个字段与值
|
||||
{
|
||||
var goodid = ((JObject)ss)["id"].ObjectToInt(0);
|
||||
if (goodid > 0)
|
||||
{
|
||||
goodids.Add(goodid);
|
||||
}
|
||||
}
|
||||
where = where.And(p => goodids.Contains(p.id));
|
||||
if (goodids.Any())
|
||||
{
|
||||
goodidsStr = string.Join(",", goodids);
|
||||
//按照id序列打乱后的顺序排序
|
||||
if (AppSettingsConstVars.DbDbType == DbType.SqlServer.ToString())
|
||||
{
|
||||
orderBy = " CHARINDEX(RTRIM(CAST(id as NCHAR)),'" + goodidsStr + "') ";
|
||||
}
|
||||
else if (AppSettingsConstVars.DbDbType == DbType.MySql.ToString())
|
||||
{
|
||||
orderBy = " find_in_set(id,'" + goodidsStr + "') ";
|
||||
}
|
||||
}
|
||||
}
|
||||
var goods = await _goodsServices.QueryListByClauseAsync(where, orderBy);
|
||||
if (goods != null && goods.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(goods);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", new JArray());
|
||||
}
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
|
||||
}
|
||||
else if (item.widgetCode == "article")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "articleClassify")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null)
|
||||
{
|
||||
if (parameters.ContainsKey("articleClassifyId") && parameters["articleClassifyId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var articleClassifyId = parameters["articleClassifyId"].ObjectToInt(0);
|
||||
var limit = parameters["limit"].ObjectToInt(0);
|
||||
limit = limit > 0 ? limit : 20;
|
||||
var list = await _articleServices.QueryPageAsync(p => p.typeId == articleClassifyId,
|
||||
p => p.createTime, OrderByType.Desc, 1, limit);
|
||||
if (list != null && list.Any())
|
||||
{
|
||||
JArray result = JArray.FromObject(list);
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "navBar")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "groupPurchase")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(parameters["list"].ToString());
|
||||
var newReslut = new JArray();
|
||||
foreach (var jToken in result)
|
||||
{
|
||||
var ss = (JObject)jToken;
|
||||
if (ss.ContainsKey("id"))
|
||||
{
|
||||
//判断拼团状态
|
||||
var dt = DateTime.Now;
|
||||
|
||||
var promotionId = ((JObject)ss)["id"].ObjectToInt(0);
|
||||
if (promotionId > 0)
|
||||
{
|
||||
var promotionModel = await _promotionServices.QueryByClauseAsync(p => p.id == promotionId && p.isEnable == true && p.startTime <= dt && p.endTime > dt);
|
||||
if (promotionModel != null)
|
||||
{
|
||||
var condition = await _promotionConditionServices.QueryByClauseAsync(p => p.promotionId == promotionId);
|
||||
if (condition != null)
|
||||
{
|
||||
var obj = (JObject)JsonConvert.DeserializeObject(condition.parameters);
|
||||
if (obj.ContainsKey("goodsId") && obj["goodsId"].ObjectToInt(0) > 0)
|
||||
{
|
||||
var goodsId = obj["goodsId"].ObjectToInt(0);
|
||||
var goods = await _promotionServices.GetGroupDetail(goodsId, 0, "group", promotionId);
|
||||
if (goods.status)
|
||||
{
|
||||
var goodJson = JsonConvert.SerializeObject(goods.data);
|
||||
((JObject)ss).Add("goods", JToken.Parse(goodJson));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var startStatus = 1;
|
||||
int lastTime = 0;
|
||||
bool isOverdue = false;
|
||||
|
||||
if (promotionModel.startTime > dt)
|
||||
{
|
||||
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
|
||||
|
||||
TimeSpan ts = promotionModel.startTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else if (promotionModel.startTime <= dt && promotionModel.endTime > dt)
|
||||
{
|
||||
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
|
||||
|
||||
TimeSpan ts = promotionModel.endTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
startStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
|
||||
}
|
||||
|
||||
((JObject)ss).Add("startStatus", startStatus);
|
||||
((JObject)ss).Add("lastTime", lastTime);
|
||||
((JObject)ss).Add("isOverdue", isOverdue);
|
||||
|
||||
newReslut.Add(ss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", newReslut);
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "record")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "pinTuan")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(parameters["list"].ToString());
|
||||
var newReslut = new JArray();
|
||||
foreach (JObject ss in result)
|
||||
{
|
||||
if (ss.ContainsKey("goodsId"))
|
||||
{
|
||||
var goodsId = ((JObject)ss)["goodsId"].ObjectToInt(0);
|
||||
if (goodsId > 0)
|
||||
{
|
||||
var goodsInfo = await _pinTuanRuleServices.GetPinTuanInfo(goodsId);
|
||||
if (goodsInfo != null)
|
||||
{
|
||||
var pinTuanStartStatus = 1;
|
||||
int lastTime = 0;
|
||||
bool isOverdue = false;
|
||||
//判断拼团状态
|
||||
var dt = DateTime.Now;
|
||||
|
||||
if (goodsInfo.startTime > dt)
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.notBegun;
|
||||
|
||||
TimeSpan ts = goodsInfo.startTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else if (goodsInfo.startTime <= dt && goodsInfo.endTime > dt)
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.begin;
|
||||
|
||||
TimeSpan ts = goodsInfo.endTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.PinTuanRuleStatus.haveExpired;
|
||||
}
|
||||
|
||||
decimal pinTuanPrice = goodsInfo.goodsPrice - goodsInfo.discountAmount;
|
||||
if (pinTuanPrice < 0) pinTuanPrice = 0;
|
||||
|
||||
|
||||
|
||||
var obj = new JObject();
|
||||
((JObject)obj).Add("pinTuanStartStatus", pinTuanStartStatus);
|
||||
((JObject)obj).Add("lastTime", lastTime);
|
||||
((JObject)obj).Add("isOverdue", isOverdue);
|
||||
((JObject)obj).Add("pinTuanPrice", pinTuanPrice);
|
||||
|
||||
((JObject)obj).Add("createTime", goodsInfo.createTime);
|
||||
((JObject)obj).Add("discountAmount", goodsInfo.discountAmount);
|
||||
((JObject)obj).Add("endTime", goodsInfo.endTime);
|
||||
((JObject)obj).Add("goodsId", goodsInfo.goodsId);
|
||||
((JObject)obj).Add("goodsImage", goodsInfo.goodsImage);
|
||||
((JObject)obj).Add("goodsName", goodsInfo.goodsName);
|
||||
((JObject)obj).Add("goodsPrice", goodsInfo.goodsPrice);
|
||||
((JObject)obj).Add("id", goodsInfo.id);
|
||||
((JObject)obj).Add("isStatusOpen", goodsInfo.isStatusOpen);
|
||||
((JObject)obj).Add("maxGoodsNums", goodsInfo.maxGoodsNums);
|
||||
((JObject)obj).Add("maxNums", goodsInfo.maxNums);
|
||||
((JObject)obj).Add("name", goodsInfo.name);
|
||||
((JObject)obj).Add("peopleNumber", goodsInfo.peopleNumber);
|
||||
((JObject)obj).Add("significantInterval", goodsInfo.significantInterval);
|
||||
((JObject)obj).Add("sort", goodsInfo.sort);
|
||||
((JObject)obj).Add("startTime", goodsInfo.startTime);
|
||||
((JObject)obj).Add("updateTime", goodsInfo.updateTime);
|
||||
|
||||
//((JObject)ss).Add("goodsInfo", JToken.FromObject(goodsInfo));
|
||||
newReslut.Add(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", newReslut);
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
|
||||
}
|
||||
else if (item.widgetCode == "service")
|
||||
{
|
||||
JObject parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
|
||||
if (parameters != null && parameters.ContainsKey("list"))
|
||||
{
|
||||
JArray result = JArray.Parse(parameters["list"].ToString());
|
||||
foreach (JObject ss in result)
|
||||
{
|
||||
if (ss.ContainsKey("id"))
|
||||
{
|
||||
var id = ((JObject)ss)["id"].ObjectToInt(0);
|
||||
if (id > 0)
|
||||
{
|
||||
var serviceInfo = await _servicesServices.QueryByIdAsync(id);
|
||||
if (serviceInfo != null)
|
||||
{
|
||||
var pinTuanStartStatus = 1;
|
||||
int lastTime = 0;
|
||||
bool isOverdue = false;
|
||||
//判断拼团状态
|
||||
var dt = DateTime.Now;
|
||||
|
||||
if (serviceInfo.startTime > dt)
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.notBegun;
|
||||
TimeSpan ts = serviceInfo.startTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else if (serviceInfo.startTime <= dt && serviceInfo.endTime > dt)
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.begin;
|
||||
|
||||
TimeSpan ts = serviceInfo.endTime.Subtract(dt);
|
||||
lastTime = (int)ts.TotalSeconds;
|
||||
isOverdue = lastTime > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
pinTuanStartStatus = (int)GlobalEnumVars.ServicesOpenStatus.haveExpired;
|
||||
}
|
||||
((JObject)ss).Add("pinTuanStartStatus", pinTuanStartStatus);
|
||||
((JObject)ss).Add("lastTime", lastTime);
|
||||
((JObject)ss).Add("isOverdue", isOverdue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
parameters.Remove("list");
|
||||
parameters.Add("list", result);
|
||||
}
|
||||
|
||||
dto.parameters = parameters;
|
||||
}
|
||||
else if (item.widgetCode == "adpop")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else if (item.widgetCode == "topImgSlide")
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
else
|
||||
{
|
||||
dto.parameters = (JObject)JsonConvert.DeserializeObject(item.parameters);
|
||||
}
|
||||
itemsDto.Add(dto);
|
||||
}
|
||||
|
||||
jm.data = new
|
||||
{
|
||||
model.code,
|
||||
desc = model.description,
|
||||
model.id,
|
||||
model.layout,
|
||||
model.name,
|
||||
model.type,
|
||||
items = itemsDto
|
||||
};
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
137
CoreCms.Net.Services/Shop/CoreCmsServiceDescriptionServices.cs
Normal file
137
CoreCms.Net.Services/Shop/CoreCmsServiceDescriptionServices.cs
Normal file
@@ -0,0 +1,137 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 商城服务说明 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsServiceDescriptionServices : BaseServices<CoreCmsServiceDescription>, ICoreCmsServiceDescriptionServices
|
||||
{
|
||||
private readonly ICoreCmsServiceDescriptionRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsServiceDescriptionServices(IUnitOfWork unitOfWork, ICoreCmsServiceDescriptionRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsServiceDescription entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsServiceDescription entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsServiceDescription> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<CoreCmsServiceDescription>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<CoreCmsServiceDescription>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsServiceDescription>> QueryPageAsync(Expression<Func<CoreCmsServiceDescription, bool>> predicate,
|
||||
Expression<Func<CoreCmsServiceDescription, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
238
CoreCms.Net.Services/Shop/CoreCmsSettingServices.cs
Normal file
238
CoreCms.Net.Services/Shop/CoreCmsSettingServices.cs
Normal file
@@ -0,0 +1,238 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Caching.Manual;
|
||||
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.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.Options;
|
||||
using CoreCms.Net.Model.ViewModels.Sms;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 店铺设置表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsSettingServices : BaseServices<CoreCmsSetting>, ICoreCmsSettingServices
|
||||
{
|
||||
private readonly ICoreCmsSettingRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsSettingServices(IUnitOfWork unitOfWork, ICoreCmsSettingRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> UpdateAsync(FMCoreCmsSettingDoSaveModel model)
|
||||
{
|
||||
var jm = new AdminUiCallBack();
|
||||
|
||||
var entity = model.entity;
|
||||
if (!entity.Any())
|
||||
{
|
||||
jm.msg = "数据不能为空";
|
||||
return jm;
|
||||
}
|
||||
var oldList = await _dal.QueryAsync();
|
||||
var bl = false;
|
||||
if (oldList.Any())
|
||||
{
|
||||
var arr = entity.Select(p => p.sKey).ToList();
|
||||
var old = oldList.Where(p => arr.Contains(p.sKey)).ToList();
|
||||
if (old.Any())
|
||||
{
|
||||
old.ForEach(p =>
|
||||
{
|
||||
var o = entity.Find(c => c.sKey == p.sKey);
|
||||
p.sValue = o != null ? o.sValue : "";
|
||||
});
|
||||
bl = await base.UpdateAsync(old);
|
||||
}
|
||||
var arrOld = oldList.Select(p => p.sKey).ToList();
|
||||
var newData = entity.Where(p => !arrOld.Contains(p.sKey)).ToList();
|
||||
if (newData.Any())
|
||||
{
|
||||
var settings = new List<CoreCmsSetting>();
|
||||
newData.ForEach(p =>
|
||||
{
|
||||
settings.Add(new CoreCmsSetting() { sKey = p.sKey, sValue = p.sValue.ToString() });
|
||||
});
|
||||
bl = await base.InsertAsync(settings) > 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var settings = new List<CoreCmsSetting>();
|
||||
entity.ForEach(p =>
|
||||
{
|
||||
settings.Add(new CoreCmsSetting() { sKey = p.sKey, sValue = p.sValue.ToString() });
|
||||
});
|
||||
bl = await base.InsertAsync(settings) > 0;
|
||||
}
|
||||
|
||||
await UpdateCache();
|
||||
|
||||
|
||||
jm.code = bl ? 0 : 1;
|
||||
jm.msg = (bl ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure);
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task UpdateCache()
|
||||
{
|
||||
var list = await _dal.QueryAsync();
|
||||
ManualDataCache.Instance.Set(GlobalConstVars.CacheCoreCmsSettingList, list, 1440);
|
||||
|
||||
var configs = SystemSettingDictionary.GetConfig();
|
||||
foreach (KeyValuePair<string, DictionaryKeyValues> kvp in configs)
|
||||
{
|
||||
var model = list.Find(p => p.sKey == kvp.Key);
|
||||
if (model != null)
|
||||
{
|
||||
kvp.Value.sValue = model.sValue;
|
||||
}
|
||||
}
|
||||
ManualDataCache.Instance.Set(GlobalConstVars.CacheCoreCmsSettingByComparison, configs, 1440);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task<List<CoreCmsSetting>> GetDatas()
|
||||
{
|
||||
var cache = ManualDataCache.Instance.Get<List<CoreCmsSetting>>(GlobalConstVars.CacheCoreCmsSettingList);
|
||||
if (cache == null)
|
||||
{
|
||||
var list = await _dal.QueryAsync();
|
||||
ManualDataCache.Instance.Set(GlobalConstVars.CacheCoreCmsSettingList, list, 1440);
|
||||
return list;
|
||||
}
|
||||
return ManualDataCache.Instance.Get<List<CoreCmsSetting>>(GlobalConstVars.CacheCoreCmsSettingList);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取数据库整合后配置信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<Dictionary<string, DictionaryKeyValues>> GetConfigDictionaries()
|
||||
{
|
||||
var configs = SystemSettingDictionary.GetConfig();
|
||||
var settings = await GetDatas();
|
||||
foreach (KeyValuePair<string, DictionaryKeyValues> kvp in configs)
|
||||
{
|
||||
var model = settings.Find(p => p.sKey == kvp.Key);
|
||||
if (model != null)
|
||||
{
|
||||
kvp.Value.sValue = model.sValue;
|
||||
}
|
||||
}
|
||||
return configs;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取附件存储的配置信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<FilesStorageOptions> GetFilesStorageOptions()
|
||||
{
|
||||
var filesStorageOptions = new FilesStorageOptions();
|
||||
|
||||
var configs = SystemSettingDictionary.GetConfig();
|
||||
var settings = await GetDatas();
|
||||
|
||||
filesStorageOptions.StorageType = GetValue(SystemSettingConstVars.FilesStorageType, configs, settings);
|
||||
filesStorageOptions.Path = GetValue(SystemSettingConstVars.FilesStoragePath, configs, settings);
|
||||
filesStorageOptions.FileTypes = GetValue(SystemSettingConstVars.FilesStorageFileSuffix, configs, settings);
|
||||
filesStorageOptions.MaxSize = GetValue(SystemSettingConstVars.FilesStorageFileMaxSize, configs, settings).ObjectToInt(10);
|
||||
|
||||
//云基础
|
||||
filesStorageOptions.BucketBindUrl = GetValue(SystemSettingConstVars.FilesStorageBucketBindUrl, configs, settings);
|
||||
filesStorageOptions.AccessKeyId = GetValue(SystemSettingConstVars.FilesStorageAccessKeyId, configs, settings);
|
||||
filesStorageOptions.AccessKeySecret = GetValue(SystemSettingConstVars.FilesStorageAccessKeySecret, configs, settings);
|
||||
//腾讯云
|
||||
filesStorageOptions.AccountId = GetValue(SystemSettingConstVars.FilesStorageTencentAccountId, configs, settings);
|
||||
filesStorageOptions.CosRegion = GetValue(SystemSettingConstVars.FilesStorageTencentCosRegion, configs, settings);
|
||||
filesStorageOptions.TencentBucketName = GetValue(SystemSettingConstVars.FilesStorageTencentBucketName, configs, settings);
|
||||
//阿里云
|
||||
filesStorageOptions.BucketName = GetValue(SystemSettingConstVars.FilesStorageAliYunBucketName, configs, settings);
|
||||
filesStorageOptions.Endpoint = GetValue(SystemSettingConstVars.FilesStorageAliYunEndpoint, configs, settings);
|
||||
|
||||
//七牛云
|
||||
filesStorageOptions.QiNiuBucketName = GetValue(SystemSettingConstVars.FilesStorageQiNiuBucketName, configs, settings);
|
||||
|
||||
//格式化存储文件夹路径
|
||||
filesStorageOptions.Path = UpLoadHelper.PathFormat(filesStorageOptions.StorageType, filesStorageOptions.Path);
|
||||
|
||||
return filesStorageOptions;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取短信配置实体
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<SMSOptions> GetSmsOptions()
|
||||
{
|
||||
var sms = new SMSOptions();
|
||||
|
||||
var configs = SystemSettingDictionary.GetConfig();
|
||||
var settings = await GetDatas();
|
||||
|
||||
sms.Enabled = GetValue(SystemSettingConstVars.SmsEnabled, configs, settings).ObjectToInt(1) == 1;
|
||||
sms.UserId = GetValue(SystemSettingConstVars.SmsUserId, configs, settings);
|
||||
sms.Account = GetValue(SystemSettingConstVars.SmsAccount, configs, settings);
|
||||
sms.Password = GetValue(SystemSettingConstVars.SmsPassword, configs, settings);
|
||||
sms.Signature = GetValue(SystemSettingConstVars.SmsSignature, configs, settings);
|
||||
sms.ApiUrl = GetValue(SystemSettingConstVars.SmsApiUrl, configs, settings);
|
||||
|
||||
return sms;
|
||||
}
|
||||
|
||||
|
||||
public string GetValue(string key, Dictionary<string, DictionaryKeyValues> configs, List<CoreCmsSetting> settings)
|
||||
{
|
||||
var objSetting = settings.Find(p => p.sKey == key);
|
||||
if (objSetting != null)
|
||||
{
|
||||
return objSetting.sValue;
|
||||
}
|
||||
configs.TryGetValue(key, out var di);
|
||||
return di?.sValue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
251
CoreCms.Net.Services/Shop/CoreCmsShipServices.cs
Normal file
251
CoreCms.Net.Services/Shop/CoreCmsShipServices.cs
Normal file
@@ -0,0 +1,251 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Extensions;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 配送方式表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsShipServices : BaseServices<CoreCmsShip>, ICoreCmsShipServices
|
||||
{
|
||||
private readonly ICoreCmsShipRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsShipServices(IUnitOfWork unitOfWork, ICoreCmsShipRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsShip entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsShip entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置是否默认
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="isDefault"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> SetIsDefault(int id, bool isDefault)
|
||||
{
|
||||
return await _dal.SetIsDefault(id, isDefault);
|
||||
}
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsShip>> QueryPageAsync(Expression<Func<CoreCmsShip, bool>> predicate,
|
||||
Expression<Func<CoreCmsShip, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 获取配送费用
|
||||
/// </summary>
|
||||
/// <param name="areaId">地区id</param>
|
||||
/// <param name="weight">重量,单位g</param>
|
||||
/// <param name="totalmoney">商品总价</param>
|
||||
/// <returns></returns>
|
||||
public decimal GetShipCost(int areaId = 0, decimal weight = 0, decimal totalmoney = 0)
|
||||
{
|
||||
decimal postfee = 0;
|
||||
|
||||
var idStr = areaId.ToString();
|
||||
//先判断是否子地区满足条件
|
||||
var def = base.QueryByClause(p =>
|
||||
p.status == (int)GlobalEnumVars.ShipStatus.Yes &&
|
||||
p.areaType == (int)GlobalEnumVars.ShipAreaType.Part && p.areaFee.Contains(idStr));
|
||||
//没有子地区取默认
|
||||
if (def == null)
|
||||
{
|
||||
def = base.QueryByClause(p => p.isDefault == true && p.status == (int)GlobalEnumVars.ShipStatus.Yes);
|
||||
}
|
||||
//没有默认取启用状态
|
||||
if (def == null)
|
||||
{
|
||||
def = base.QueryByClause(p => p.status == (int)GlobalEnumVars.ShipStatus.Yes);
|
||||
if (def == null)
|
||||
{//没有配送方式,返回0
|
||||
return postfee;
|
||||
}
|
||||
}
|
||||
//是否包邮
|
||||
if (def.isfreePostage == true)
|
||||
{
|
||||
return postfee;
|
||||
}
|
||||
|
||||
if (def.areaType == (int)GlobalEnumVars.ShipAreaType.Part)
|
||||
{
|
||||
var areaFee = (JArray)JsonConvert.DeserializeObject(def.areaFee);
|
||||
if (areaFee != null && areaFee.Count > 0)
|
||||
{
|
||||
var isIn = false;
|
||||
foreach (var jToken in areaFee)
|
||||
{
|
||||
var item = (JObject)jToken;
|
||||
//if (item.Property("area") == null) continue;
|
||||
var area = item["area"].ObjectToString();
|
||||
var firstunitAreaPrice = item["firstunitAreaPrice"].ObjectToInt(0);
|
||||
if (!string.IsNullOrEmpty(area))
|
||||
{
|
||||
var areaArr = CommonHelper.StringToIntArray(area);
|
||||
if (areaArr.Contains(areaId))
|
||||
{
|
||||
isIn = true;
|
||||
var total = calculate_fee(def, weight, totalmoney, firstunitAreaPrice);
|
||||
postfee = Math.Round(total, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isIn)
|
||||
{
|
||||
var total = calculate_fee(def, weight, totalmoney, 0);
|
||||
postfee = Math.Round(total, 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var total = calculate_fee(def, weight, totalmoney, 0);
|
||||
postfee = Math.Round(total, 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var total = calculate_fee(def, weight, totalmoney, 0);
|
||||
postfee = Math.Round(total, 2);
|
||||
}
|
||||
return postfee;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算运费
|
||||
/// </summary>
|
||||
/// <param name="ship">配送方式内容</param>
|
||||
/// <param name="weight">订单总重</param>
|
||||
/// <param name="totalmoney">商品总价</param>
|
||||
/// <param name="firstunitAreaPrice"></param>
|
||||
/// <returns></returns>
|
||||
public decimal calculate_fee(CoreCmsShip ship, decimal weight, decimal totalmoney = 0, decimal firstunitAreaPrice = 0)
|
||||
{
|
||||
//满多少免运费
|
||||
if (ship.goodsMoney > 0 && totalmoney >= ship.goodsMoney)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (weight > 0 && weight > ship.firstUnit)
|
||||
{
|
||||
decimal shipMoney = ship.firstunitPrice + (Math.Ceiling(Math.Abs(weight - ship.firstUnit) / ship.continueUnit) * ship.continueunitPrice);
|
||||
return shipMoney;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ship.firstunitPrice > 0)
|
||||
{
|
||||
return ship.firstunitPrice;
|
||||
}
|
||||
else
|
||||
{
|
||||
return firstunitAreaPrice;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据地区获取配送方式
|
||||
/// </summary>
|
||||
public CoreCmsShip GetShip(int areaId = 0)
|
||||
{
|
||||
var idStr = areaId.ToString();
|
||||
//先判断是否子地区满足条件
|
||||
var def = base.QueryByClause(p =>
|
||||
p.status == (int)GlobalEnumVars.ShipStatus.Yes &&
|
||||
p.areaType == (int)GlobalEnumVars.ShipAreaType.Part && p.areaFee.Contains(idStr));
|
||||
//没有子地区取默认
|
||||
if (def == null)
|
||||
{
|
||||
def = base.QueryByClause(p => p.isDefault == true && p.status == (int)GlobalEnumVars.ShipStatus.Yes);
|
||||
}
|
||||
//没有默认取启用状态
|
||||
if (def == null)
|
||||
{
|
||||
def = base.QueryByClause(p => p.status == (int)GlobalEnumVars.ShipStatus.Yes);
|
||||
return def;
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
94
CoreCms.Net.Services/Shop/CoreCmsStoreServices.cs
Normal file
94
CoreCms.Net.Services/Shop/CoreCmsStoreServices.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsStoreServices : BaseServices<CoreCmsStore>, ICoreCmsStoreServices
|
||||
{
|
||||
private readonly ICoreCmsStoreRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public CoreCmsStoreServices(IUnitOfWork unitOfWork, ICoreCmsStoreRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsStore entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsStore entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
#region Sql根据条件查询分页数据带距离
|
||||
|
||||
/// <summary>
|
||||
/// Sql根据条件查询分页数据带距离
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="latitude">纬度</param>
|
||||
/// <param name="longitude">精度</param>
|
||||
/// <returns></returns>
|
||||
public async Task<IPageList<CoreCmsStore>> QueryPageAsyncByCoordinate(Expression<Func<CoreCmsStore, bool>> predicate,
|
||||
Expression<Func<CoreCmsStore, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, decimal latitude = 0, decimal longitude = 0)
|
||||
{
|
||||
return await _dal.QueryPageAsyncByCoordinate(predicate, orderByExpression, orderByType, pageIndex, pageSize, latitude, longitude);
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 根据用户序列获取单个门店数据
|
||||
/// </summary>
|
||||
/// <param name="userId">用户序列</param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<CoreCmsStore> GetStoreByUserId(int userId, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.GetStoreByUserId(userId, blUseNoLock);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
116
CoreCms.Net.Services/Stock/CoreCmsStockLogServices.cs
Normal file
116
CoreCms.Net.Services/Stock/CoreCmsStockLogServices.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 库存操作详情表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsStockLogServices : BaseServices<CoreCmsStockLog>, ICoreCmsStockLogServices
|
||||
{
|
||||
private readonly ICoreCmsStockLogRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsStockLogServices(IUnitOfWork unitOfWork, ICoreCmsStockLogRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(CoreCmsStockLog entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsStockLog entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsStockLog> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsStockLog>> QueryPageAsync(Expression<Func<CoreCmsStockLog, bool>> predicate,
|
||||
Expression<Func<CoreCmsStockLog, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
117
CoreCms.Net.Services/Stock/CoreCmsStockServices.cs
Normal file
117
CoreCms.Net.Services/Stock/CoreCmsStockServices.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.FromBody;
|
||||
using CoreCms.Net.Model.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 库存操作表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsStockServices : BaseServices<CoreCmsStock>, ICoreCmsStockServices
|
||||
{
|
||||
private readonly ICoreCmsStockRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public CoreCmsStockServices(IUnitOfWork unitOfWork, ICoreCmsStockRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> InsertAsync(FMCreateStock entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsStock entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<CoreCmsStock> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdAsync(object id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID集合的数据(批量删除)
|
||||
/// </summary>
|
||||
/// <param name="ids"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> DeleteByIdsAsync(int[] ids)
|
||||
{
|
||||
return await _dal.DeleteByIdsAsync(ids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsStock>> QueryPageAsync(Expression<Func<CoreCmsStock, bool>> predicate,
|
||||
Expression<Func<CoreCmsStock, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/System/SysDictionaryDataServices.cs
Normal file
39
CoreCms.Net.Services/System/SysDictionaryDataServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据字典项表 接口实现
|
||||
/// </summary>
|
||||
public class SysDictionaryDataServices : BaseServices<SysDictionaryData>, ISysDictionaryDataServices
|
||||
{
|
||||
private readonly ISysDictionaryDataRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public SysDictionaryDataServices(IUnitOfWork unitOfWork, ISysDictionaryDataRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/System/SysDictionaryServices.cs
Normal file
39
CoreCms.Net.Services/System/SysDictionaryServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据字典表 接口实现
|
||||
/// </summary>
|
||||
public class SysDictionaryServices : BaseServices<SysDictionary>, ISysDictionaryServices
|
||||
{
|
||||
private readonly ISysDictionaryRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public SysDictionaryServices(IUnitOfWork unitOfWork, ISysDictionaryRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
40
CoreCms.Net.Services/System/SysLoginRecordServices.cs
Normal file
40
CoreCms.Net.Services/System/SysLoginRecordServices.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 登录日志表 接口实现
|
||||
/// </summary>
|
||||
public class SysLoginRecordServices : BaseServices<SysLoginRecord>, ISysLoginRecordServices
|
||||
{
|
||||
private readonly ISysLoginRecordRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public SysLoginRecordServices(IUnitOfWork unitOfWork, ISysLoginRecordRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
108
CoreCms.Net.Services/System/SysMenuServices.cs
Normal file
108
CoreCms.Net.Services/System/SysMenuServices.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 菜单表 接口实现
|
||||
/// </summary>
|
||||
public class SysMenuServices : BaseServices<SysMenu>, ISysMenuServices
|
||||
{
|
||||
private readonly ISysMenuRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysMenuServices(IUnitOfWork unitOfWork, ISysMenuRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region 实现重写增删改查操作==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步插入方法
|
||||
/// </summary>
|
||||
/// <param name="entity">实体数据</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> InsertAsync(SysMenu entity)
|
||||
{
|
||||
return await _dal.InsertAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(SysMenu entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写异步更新方法方法
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <returns></returns>
|
||||
public new async Task<AdminUiCallBack> UpdateAsync(List<SysMenu> entity)
|
||||
{
|
||||
return await _dal.UpdateAsync(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写删除指定ID的数据
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AdminUiCallBack> DeleteByIdAsync(int id)
|
||||
{
|
||||
return await _dal.DeleteByIdAsync(id);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取缓存的所有数据==========================================================
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓存的所有数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<SysMenu>> GetCaChe()
|
||||
{
|
||||
return await _dal.GetCaChe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新cache
|
||||
/// </summary>
|
||||
public async Task<List<SysMenu>> UpdateCaChe()
|
||||
{
|
||||
return await _dal.UpdateCaChe();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
39
CoreCms.Net.Services/System/SysNLogRecordsServices.cs
Normal file
39
CoreCms.Net.Services/System/SysNLogRecordsServices.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.Configuration;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// Nlog记录表 接口实现
|
||||
/// </summary>
|
||||
public class SysNLogRecordsServices : BaseServices<SysNLogRecords>, ISysNLogRecordsServices
|
||||
{
|
||||
private readonly ISysNLogRecordsRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
public SysNLogRecordsServices(IUnitOfWork unitOfWork, ISysNLogRecordsRepository dal)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/System/SysOperRecordServices.cs
Normal file
33
CoreCms.Net.Services/System/SysOperRecordServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 操作日志表 接口实现
|
||||
/// </summary>
|
||||
public class SysOperRecordServices : BaseServices<SysOperRecord>, ISysOperRecordServices
|
||||
{
|
||||
private readonly ISysOperRecordRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysOperRecordServices(IUnitOfWork unitOfWork, ISysOperRecordRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/System/SysOrganizationServices.cs
Normal file
33
CoreCms.Net.Services/System/SysOrganizationServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 组织机构表 接口实现
|
||||
/// </summary>
|
||||
public class SysOrganizationServices : BaseServices<SysOrganization>, ISysOrganizationServices
|
||||
{
|
||||
private readonly ISysOrganizationRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysOrganizationServices(IUnitOfWork unitOfWork, ISysOrganizationRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
46
CoreCms.Net.Services/System/SysRoleMenuServices.cs
Normal file
46
CoreCms.Net.Services/System/SysRoleMenuServices.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 角色菜单关联表 接口实现
|
||||
/// </summary>
|
||||
public class SysRoleMenuServices : BaseServices<SysRoleMenu>, ISysRoleMenuServices
|
||||
{
|
||||
private readonly ISysRoleMenuRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysRoleMenuServices(IUnitOfWork unitOfWork, ISysRoleMenuRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 角色权限Map
|
||||
/// RoleModulePermission, Module, Role 三表联合
|
||||
/// 第四个类型 RoleModulePermission 是返回值
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<SysRoleMenu>> RoleModuleMaps()
|
||||
{
|
||||
return await _dal.RoleModuleMaps();
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/System/SysRoleServices.cs
Normal file
33
CoreCms.Net.Services/System/SysRoleServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 角色表 接口实现
|
||||
/// </summary>
|
||||
public class SysRoleServices : BaseServices<SysRole>, ISysRoleServices
|
||||
{
|
||||
private readonly ISysRoleRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysRoleServices(IUnitOfWork unitOfWork, ISysRoleRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/System/SysTaskLogServices.cs
Normal file
33
CoreCms.Net.Services/System/SysTaskLogServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 定时任务日志 接口实现
|
||||
/// </summary>
|
||||
public class SysTaskLogServices : BaseServices<SysTaskLog>, ISysTaskLogServices
|
||||
{
|
||||
private readonly ISysTaskLogRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysTaskLogServices(IUnitOfWork unitOfWork, ISysTaskLogRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
33
CoreCms.Net.Services/System/SysUserRoleServices.cs
Normal file
33
CoreCms.Net.Services/System/SysUserRoleServices.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户角色关联表 接口实现
|
||||
/// </summary>
|
||||
public class SysUserRoleServices : BaseServices<SysUserRole>, ISysUserRoleServices
|
||||
{
|
||||
private readonly ISysUserRoleRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysUserRoleServices(IUnitOfWork unitOfWork, ISysUserRoleRepository dal)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
66
CoreCms.Net.Services/System/SysUserServices.cs
Normal file
66
CoreCms.Net.Services/System/SysUserServices.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CoreCms.Net.IRepository;
|
||||
using CoreCms.Net.IRepository.UnitOfWork;
|
||||
using CoreCms.Net.IServices;
|
||||
using CoreCms.Net.Model.Entities;
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户表 接口实现
|
||||
/// </summary>
|
||||
public class SysUserServices : BaseServices<SysUser>, ISysUserServices
|
||||
{
|
||||
private readonly ISysUserRepository _dal;
|
||||
private readonly ISysRoleRepository _sysRoleRepository;
|
||||
private readonly ISysUserRoleRepository _sysUserRoleRepository;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public SysUserServices(IUnitOfWork unitOfWork, ISysUserRepository dal, ISysRoleRepository sysRoleRepository,
|
||||
ISysUserRoleRepository sysUserRoleRepository)
|
||||
{
|
||||
_dal = dal;
|
||||
BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_sysRoleRepository = sysRoleRepository;
|
||||
_sysUserRoleRepository = sysUserRoleRepository;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
/// <param name="loginName"></param>
|
||||
/// <param name="loginPwd"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<string> GetUserRoleNameStr(string loginName, string loginPwd)
|
||||
{
|
||||
var roleName = "";
|
||||
var user = await QueryByClauseAsync(a => a.userName == loginName && a.passWord == loginPwd);
|
||||
var roleList = await _sysRoleRepository.QueryListByClauseAsync(a => a.deleted == false);
|
||||
if (user != null)
|
||||
{
|
||||
var userRoles = await _sysUserRoleRepository.QueryListByClauseAsync(ur => ur.userId == user.id);
|
||||
if (userRoles.Count > 0)
|
||||
{
|
||||
var arr = userRoles.Select(ur => ur.roleId).ToList();
|
||||
var roles = roleList.Where(d => arr.Contains(d.id));
|
||||
|
||||
roleName = string.Join(',', roles.Select(r => r.roleCode).ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
return roleName;
|
||||
}
|
||||
}
|
||||
}
|
||||
162
CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs
Normal file
162
CoreCms.Net.Services/User/CoreCmsUserBalanceServices.cs
Normal file
@@ -0,0 +1,162 @@
|
||||
/***********************************************************************
|
||||
* Project: CoreCms
|
||||
* ProjectName: 核心内容管理系统
|
||||
* Web: https://www.corecms.net
|
||||
* Author: 大灰灰
|
||||
* Email: jianweie@163.com
|
||||
* CreateTime: 2021/1/31 21:45:10
|
||||
* Description: 暂无
|
||||
***********************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
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.ViewModels.Basics;
|
||||
using CoreCms.Net.Model.ViewModels.UI;
|
||||
using CoreCms.Net.Utility.Helper;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using SqlSugar;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户余额表 接口实现
|
||||
/// </summary>
|
||||
public class CoreCmsUserBalanceServices : BaseServices<CoreCmsUserBalance>, ICoreCmsUserBalanceServices
|
||||
{
|
||||
private readonly ICoreCmsUserBalanceRepository _dal;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public CoreCmsUserBalanceServices(IUnitOfWork unitOfWork, ICoreCmsUserBalanceRepository dal,
|
||||
IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
_unitOfWork = unitOfWork;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 余额变动记录
|
||||
/// </summary>
|
||||
/// <param name="userId">当前用户id,当是店铺的时候,取店铺创始人的userId</param>
|
||||
/// <param name="type">类型</param>
|
||||
/// <param name="money">金额,永远是正的</param>
|
||||
/// <param name="sourceId">资源id</param>
|
||||
/// <param name="cateMoney">服务费金额 (提现)</param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebApiCallBack> Change(int userId, int type, decimal money, string sourceId = "", decimal cateMoney = 0)
|
||||
{
|
||||
using var container = _serviceProvider.CreateScope();
|
||||
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
|
||||
|
||||
var jm = new WebApiCallBack();
|
||||
|
||||
if (money != 0)
|
||||
{
|
||||
//取用户实际余额
|
||||
var userInfo = await userServices.QueryByIdAsync(userId);
|
||||
if (userInfo == null)
|
||||
{
|
||||
jm.data = jm.code = 11004;
|
||||
jm.msg = GlobalErrorCodeVars.Code11004;
|
||||
return jm;
|
||||
}
|
||||
//取描述,并简单校验
|
||||
var res = UserHelper.GetMemo(type, money, cateMoney);
|
||||
if (string.IsNullOrEmpty(res))
|
||||
{
|
||||
return jm;
|
||||
}
|
||||
var memo = res;
|
||||
if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Admin)
|
||||
{
|
||||
//后台充值或调不改绝对值
|
||||
|
||||
}
|
||||
//如果是减余额的操作,还是加余额操作
|
||||
if (type == (int)GlobalEnumVars.UserBalanceSourceTypes.Pay || type == (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash)
|
||||
{
|
||||
money = -money - cateMoney;
|
||||
}
|
||||
if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Service)
|
||||
{
|
||||
//后台充值或调不改绝对值
|
||||
|
||||
}
|
||||
|
||||
|
||||
var balance = userInfo.balance + money;
|
||||
if (balance < 0)
|
||||
{
|
||||
jm.data = jm.code = 11007;
|
||||
jm.msg = GlobalErrorCodeVars.Code11007;
|
||||
return jm;
|
||||
}
|
||||
var balanceModel = new CoreCmsUserBalance();
|
||||
balanceModel.userId = userId;
|
||||
balanceModel.type = type;
|
||||
balanceModel.money = money;
|
||||
balanceModel.balance = balance;
|
||||
balanceModel.sourceId = sourceId;
|
||||
balanceModel.memo = memo;
|
||||
balanceModel.createTime = DateTime.Now;
|
||||
//增加记录
|
||||
var balanceModelId = await _dal.InsertAsync(balanceModel);
|
||||
balanceModel.id = balanceModelId;
|
||||
//更新用户数据
|
||||
await userServices.UpdateAsync(p => new CoreCmsUser() { balance = balance }, p => p.id == userId);
|
||||
|
||||
jm.data = balanceModel;
|
||||
|
||||
}
|
||||
jm.status = true;
|
||||
|
||||
return jm;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户的邀请佣金
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<decimal> GetInviteCommission(int userId)
|
||||
{
|
||||
var type = (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution;
|
||||
var money = await _dal.GetSumAsync(p => p.userId == userId && p.type == type, p => p.money);
|
||||
return money;
|
||||
}
|
||||
|
||||
|
||||
#region 重写根据条件查询分页数据
|
||||
/// <summary>
|
||||
/// 重写根据条件查询分页数据
|
||||
/// </summary>
|
||||
/// <param name="predicate">判断集合</param>
|
||||
/// <param name="orderByType">排序方式</param>
|
||||
/// <param name="pageIndex">当前页面索引</param>
|
||||
/// <param name="pageSize">分布大小</param>
|
||||
/// <param name="orderByExpression"></param>
|
||||
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
|
||||
/// <returns></returns>
|
||||
public new async Task<IPageList<CoreCmsUserBalance>> QueryPageAsync(Expression<Func<CoreCmsUserBalance, bool>> predicate,
|
||||
Expression<Func<CoreCmsUserBalance, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
|
||||
int pageSize = 20, bool blUseNoLock = false)
|
||||
{
|
||||
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user