添加项目文件。

This commit is contained in:
JianWeie
2021-12-20 21:27:32 +08:00
parent 747486f5cb
commit 82d825b7a5
3514 changed files with 887941 additions and 0 deletions

View 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;
}
}
}

View 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;
}
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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;
}
}
}

View 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 CoreCmsBillAftersalesItemServices : BaseServices<CoreCmsBillAftersalesItem>,
ICoreCmsBillAftersalesItemServices
{
private readonly ICoreCmsBillAftersalesItemRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsBillAftersalesItemServices(IUnitOfWork unitOfWork, ICoreCmsBillAftersalesItemRepository dal)
{
_dal = dal;
BaseDal = dal;
_unitOfWork = unitOfWork;
}
}
}

View 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 12
/// <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
}
}

View 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;
}
}
}

View 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();
}
}
}

View 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;
}
}
}

View 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
}
}

View 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
}
}

View 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;
}
}
}

View 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
}
}

File diff suppressed because it is too large Load Diff

View 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);
}
}
}

View 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;
}
}
}

View 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
}
}

View 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>

View 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 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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View 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 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
}
}

View 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);
}
}
}

View 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 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;
}
}
}

View 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
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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 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;
}
}
}

View 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
}
}

View 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);
}
}
}

View 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
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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
}
}

View 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);
}
}
}

View 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 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;
}
}
}

View 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.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;
}
}
}

View 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);
}
}
}

View 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 CoreCmsFormItemServices : BaseServices<CoreCmsFormItem>, ICoreCmsFormItemServices
{
private readonly ICoreCmsFormItemRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsFormItemServices(IUnitOfWork unitOfWork, ICoreCmsFormItemRepository dal)
{
_dal = dal;
BaseDal = dal;
_unitOfWork = unitOfWork;
}
}
}

View 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;
}
}
}

View 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 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;
}
}
}

View File

@@ -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);
}
}
}

View 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;
}
}
}
}

View 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;
}
}
}

View 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
}
}

View 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;
}
}
}
}

View 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;
}
}
}

File diff suppressed because it is too large Load Diff

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}
}

View 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
}
}

View 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);
}
}
}

View 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
}
}

View File

@@ -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;
}
}
}
}

View 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
}
}

View 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;
}
}
}

View 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
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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 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;
}
}
}

View 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.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;
}
}
}

View 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 CodeGetCode
/// <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 codeurlGetUrl
/// <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);
}
}
}

View 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
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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;
}
}
}

View 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
}
}

View 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
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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);
}
}
}

View 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
}
}

View 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
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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();
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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