/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Auth.HttpContextUser; using CoreCms.Net.Caching.AutoMate.RedisCache; using CoreCms.Net.Configuration; 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.Services; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; namespace CoreCms.Net.Web.WebApi.Controllers { /// /// 订单调用接口数据 /// [Route("api/[controller]/[action]")] [ApiController] public class OrderController : ControllerBase { private readonly IHttpContextUser _user; private readonly ICoreCmsOrderServices _orderServices; private readonly ICoreCmsBillAftersalesServices _aftersalesServices; private readonly ICoreCmsSettingServices _settingServices; private readonly ICoreCmsAreaServices _areaServices; private readonly ICoreCmsBillReshipServices _reshipServices; private readonly ICoreCmsShipServices _shipServices; private readonly ICoreCmsLogisticsServices _logisticsServices; private readonly ICoreCmsOrderDistributionModelServices _orderDistributionModelServices; private readonly IRedisOperationRepository _redisOperationRepository; private readonly ICoreCmsUserServices _userServices; private readonly ICoreCmsClerkServices _clerkServices; private readonly ICoreCmsInvoiceServices _invoiceServices; private readonly ICoreCmsPlanOrderServices _planOrderServices; private readonly ICoreCmsPlanOrderItemServices _planOrderItemServices; private readonly ICoreCmsOrderItemServices _orderItemServices; /// /// 构造函数 /// public OrderController(IHttpContextUser user , ICoreCmsOrderServices orderServices , ICoreCmsBillAftersalesServices aftersalesServices , ICoreCmsSettingServices settingServices , ICoreCmsAreaServices areaServices , ICoreCmsBillReshipServices reshipServices, ICoreCmsShipServices shipServices, ICoreCmsLogisticsServices logisticsServices, ICoreCmsOrderDistributionModelServices orderDistributionModelServices, IRedisOperationRepository redisOperationRepository, ICoreCmsUserServices userServices, ICoreCmsClerkServices clerkServices, ICoreCmsInvoiceServices invoiceServices , ICoreCmsPlanOrderServices planOrderServices , ICoreCmsPlanOrderItemServices planOrderItemServices , ICoreCmsOrderItemServices orderItemServices) { _user = user; _orderServices = orderServices; _aftersalesServices = aftersalesServices; _settingServices = settingServices; _areaServices = areaServices; _reshipServices = reshipServices; _shipServices = shipServices; _logisticsServices = logisticsServices; _orderDistributionModelServices = orderDistributionModelServices; _redisOperationRepository = redisOperationRepository; _userServices = userServices; _clerkServices = clerkServices; _invoiceServices = invoiceServices; _planOrderServices = planOrderServices; _planOrderItemServices = planOrderItemServices; _orderItemServices = orderItemServices; } //公共接口==================================================================================================== #region 发票模糊查询================================================== /// /// 发票模糊查询 /// /// [HttpPost] [Authorize] public async Task GetOrderTypeModel([FromBody] GetTaxCodePost entity) { var jm = await _orderServices.GetTaxCode(entity.name); return jm; } #endregion #region 获取不同类型营销下单支持的配送方式================================================== /// /// 获取不同类型营销下单支持的配送方式 /// /// [HttpPost] [Authorize] public async Task GetOrderDistributionModel([FromBody] FMIntId entity) { var jm = new WebApiCallBack() { status = true }; var cache = await _orderDistributionModelServices.GetCaChe(); var model = cache.Find(p => p.orderType == entity.id); if (model == null) { jm.data = new { isOpenMailing = true, isOpenHomeDelivery = true, isOpenSelfDelivery = true }; } else { jm.data = new { model.isOpenMailing, model.isOpenHomeDelivery, model.isOpenSelfDelivery }; } return jm; } #endregion //验证接口==================================================================================================== #region 发票模糊查询================================================== /// /// 发票模糊查询 /// /// [HttpPost] [Authorize] public async Task GetTaxCode([FromBody] GetTaxCodePost entity) { var jm = await _orderServices.GetTaxCode(entity.name); return jm; } #endregion #region 创建订单================================================== /// /// 创建订单 /// /// [HttpPost] [Authorize] public async Task CreateOrder([FromBody] CreateOrder entity) { var jm = new WebApiCallBack(); var lockKey = "LOCK_CreateOrder:user_" + _user.ID; var lockHolder = Guid.NewGuid().ToString("N"); //锁持有者 var redisUserLock = await _redisOperationRepository.LockTakeAsync(lockKey, lockHolder, TimeSpan.FromSeconds(10)); if (redisUserLock) { try { var type = entity.receiptType; switch (type) { case (int)GlobalEnumVars.OrderReceiptType.Logistics: case (int)GlobalEnumVars.OrderReceiptType.IntraCityService: { //收货地址id if (entity.ushipId == 0) { jm.data = 13001; jm.msg = GlobalErrorCodeVars.Code13001; return jm; } break; } case (int)GlobalEnumVars.OrderReceiptType.SelfDelivery: { //提货门店 if (entity.storeId == 0) { jm.data = 13001; jm.msg = GlobalErrorCodeVars.Code13001; return jm; } //提货人姓名 提货人电话 if (string.IsNullOrEmpty(entity.ladingName)) { jm.data = 13001; jm.msg = "请输入提货人姓名"; return jm; } if (string.IsNullOrEmpty(entity.ladingMobile)) { jm.data = 13001; jm.msg = "请输入提货人电话"; return jm; } break; } default: jm.data = 13001; jm.msg = "未查询到配送方式"; return jm; } if (string.IsNullOrEmpty(entity.cartIds)) { jm.data = 10000; jm.msg = GlobalErrorCodeVars.Code10000; return jm; } jm = await _orderServices.ToAdd(_user.ID, entity.orderType, entity.cartIds, entity.receiptType, entity.ushipId, entity.storeId, entity.ladingName, entity.ladingMobile, entity.memo, entity.point, entity.couponCode, entity.source, entity.scene, entity.taxType, entity.taxName, entity.taxCode, entity.objectId, entity.teamId, entity.requireOrder, entity.requiredFundType, entity.traceId, entity.planorderId); } catch (Exception e) { jm.msg = "数据处理异常"; jm.otherData = e; } finally { await _redisOperationRepository.LockReleaseAsync(lockKey, lockHolder); } } else { jm.msg = "当前请求太频繁_请稍后再试"; } return jm; } #endregion #region 订单预览================================================== /// /// 订单预览 /// /// [HttpPost] [Authorize] public async Task OrderDetails([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); var userId = _user.ID; if ((string)entity.data == "merchant") { var allConfigs = await _settingServices.GetConfigDictionaries(); var shopManagerMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopManagerMobile); var user = await _userServices.QueryByClauseAsync(p => p.id == userId); if (user == null) { jm.status = false; jm.msg = "用户获取失败"; return jm; } var isShopManager = !string.IsNullOrEmpty(shopManagerMobile) && shopManagerMobile.Contains(user.mobile); var store = await _clerkServices.QueryByClauseAsync(p => p.userId == userId); if (store == null && isShopManager == false) { jm.status = false; jm.msg = "你不是店员或管理员"; return jm; } else { userId = 0; } } jm = await _orderServices.GetOrderInfoByOrderId(entity.id, userId); return jm; } #endregion #region 订单是否支付状态查询================================================== /// /// 订单预览 /// /// [HttpPost] [Authorize] public async Task CheckOrderIsPaid([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); var lockKey = "LOCK_CheckOrderIsPaid:user_" + _user.ID; var lockHolder = Guid.NewGuid().ToString("N"); //锁持有者 var redisUserLock = await _redisOperationRepository.LockTakeAsync(lockKey, lockHolder, TimeSpan.FromSeconds(5)); if (redisUserLock) { try { if (string.IsNullOrEmpty(entity.id)) { jm.msg = "支付单编号不能为空"; return jm; } var bl = await _orderServices.ExistsAsync(p => p.orderId == entity.id && (p.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || p.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes), true); jm.status = true; jm.data = bl; } catch (Exception e) { jm.msg = "数据处理异常"; jm.otherData = e; NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.ApiRequest, "用户支付支付", JsonConvert.SerializeObject(jm)); } finally { await _redisOperationRepository.LockReleaseAsync(lockKey, lockHolder); } } else { jm.msg = "当前请求太频繁_请稍后再试"; } return jm; } #endregion #region 获取订单不同状态的数量================================================== /// /// 获取订单不同状态的数量 /// /// [HttpPost] [Authorize] public async Task GetOrderStatusNum([FromBody] GetOrderStatusNumPost entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.ids)) { jm.msg = "请提交要查询的订单统计类型"; } var ids = CommonHelper.StringToIntArray(entity.ids); jm = await _orderServices.GetOrderStatusNum(_user.ID, ids, entity.isAfterSale); return jm; } #endregion #region 获取个人订单列表======================================================= /// /// 获取个人订单列表 /// /// [HttpPost] [Authorize] public async Task GetOrderList([FromBody] GetOrderListPost entity) { var jm = await _orderServices.GetOrderList(entity.status, _user.ID, entity.page, entity.limit); return jm; } #endregion #region 获取计划订单列表微信小程序======================================================= /// /// 获取计划订单列表微信小程序 /// /// [HttpPost] [Authorize] public async Task GetPlanOrderList([FromBody] GetOrderListPost entity) { var jm = await _planOrderServices.GetOrderList(entity.status, _user.ID, entity.page, entity.limit, entity.money); return jm; } #endregion #region 获取计划订单详情======================================================= /// /// 获取计划订单详情 /// /// [HttpPost] [Authorize] public async Task GetPlanOrder([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); var model = await _planOrderServices.QueryByIdAsync(entity.id); if (model == null) { jm.msg = "不存在此信息"; return jm; } //获取相关状态描述说明转换 model.statusText = EnumHelper.GetEnumDescriptionByValue(model.status); model.keYongAmount = model.keYongAmount - model.huaFeiAmount; var modelItem = await _planOrderItemServices.QueryListByClauseAsync(p => p.orderId == entity.id && p.isOld == false, p => p.specification, OrderByType.Asc); var modelItem2 = await _planOrderItemServices.QueryListByClauseAsync(p => p.orderId == entity.id && p.isOld == true, p => p.specification, OrderByType.Asc); foreach (var coreCmsPlanOrderItem in modelItem) { var coreCmsPlanOrderItem1 = modelItem2.Where(p => p.name == coreCmsPlanOrderItem.name && p.specification == coreCmsPlanOrderItem.specification).FirstOrDefault(); if (coreCmsPlanOrderItem1 != null) { coreCmsPlanOrderItem.idnew = coreCmsPlanOrderItem1.id; coreCmsPlanOrderItem.numsnew = coreCmsPlanOrderItem1.nums; //原订单计划数量 coreCmsPlanOrderItem.amountnew = coreCmsPlanOrderItem1.amount;//原订单计划金额 } } var coreCmsOrderItems = new List(); //查询用计划订单积分购买的订单 var coreCmsOrders = await _orderServices.QueryListByClauseAsync(p => p.planorderId == model.orderId && p.isdel == false); if (coreCmsOrders != null && coreCmsOrders.Count > 0) { var orderids = new List(); foreach (var coreCmsOrder in coreCmsOrders) { orderids.Add(coreCmsOrder.orderId); } coreCmsOrderItems = await _orderItemServices.QueryListByClauseAsync(p => orderids.Contains(p.orderId)); } jm.code = 0; jm.status = true; jm.data = new { model, modelItem, coreCmsOrderItems }; return jm; } #region 修改计划订单================================================== /// /// 修改计划订单 /// /// [HttpPost] [Authorize] public async Task UpdatePlanOrder([FromBody] CreateOrder entity) { var jm = new WebApiCallBack(); try { if (string.IsNullOrEmpty(entity.itemIds)) { jm.data = 10000; jm.msg = GlobalErrorCodeVars.Code10000; return jm; } jm = await _planOrderServices.ToUpdate(entity.orderId , _user.ID, _user.Name, entity.status, entity.itemIds, entity.itemNums); } catch (Exception e) { jm.msg = "数据处理异常"; jm.otherData = e; } return jm; } #endregion #endregion #region 取消订单==================================================== /// /// 取消订单 /// /// [HttpPost] [Authorize] public async Task CancelOrder([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交要取消的订单号"; return jm; } var ids = entity.id.Split(","); jm = await _orderServices.CancelOrder(ids, _user.ID); return jm; } #endregion #region 删除订单==================================================== /// /// 删除订单 /// /// [HttpPost] [Authorize] public async Task DeleteOrder([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交要取消的订单号"; return jm; } var ids = entity.id.Split(","); jm.status = await _orderServices.DeleteAsync(p => ids.Contains(p.orderId) && p.userId == _user.ID); jm.msg = jm.status ? "删除成功" : "删除失败"; return jm; } #endregion #region 确认签收订单==================================================== /// /// 确认签收订单 /// /// [HttpPost] [Authorize] public async Task OrderConfirm([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交要确认签收的订单号"; return jm; } jm = await _orderServices.ConfirmOrder(entity.id, Convert.ToInt32(entity.data)); return jm; } #endregion #region 添加售后单======================================================= /// /// 添加售后单 /// /// [HttpPost] [Authorize] public async Task AddAftersales([FromBody] ToAddBillAfterSalesPost entity) { var jm = new WebApiCallBack(); jm.otherData = entity; if (string.IsNullOrEmpty(entity.orderId)) { jm.msg = GlobalErrorCodeVars.Code13100; jm.code = 13100; return jm; } if (entity.type == 0) { jm.msg = GlobalErrorCodeVars.Code10051; jm.code = 10051; return jm; } jm = await _aftersalesServices.ToAdd(_user.ID, entity.orderId, entity.type, entity.items, entity.images, entity.reason, entity.refund); jm.otherData = entity; return jm; } #endregion #region 获取售后单列表======================================================= /// /// 获取售后单列表 /// /// [HttpPost] [Authorize] public async Task AftersalesList([FromBody] FMPageByStringId entity) { var jm = new WebApiCallBack(); jm.status = true; jm.msg = "数据获取成功"; var where = PredicateBuilder.True(); where = where.And(p => p.userId == _user.ID); if (!string.IsNullOrEmpty(entity.id)) { where = where.And(p => p.orderId == entity.id); } var data = await _aftersalesServices.QueryPageAsync(where, p => p.createTime, OrderByType.Desc, entity.page, entity.limit); jm.data = new { list = data, page = data.PageIndex, totalPage = data.TotalPages, hasNextPage = data.HasNextPage }; return jm; } #endregion #region 获取单个售后单详情 /// /// 获取售后单列表 /// /// [HttpPost] [Authorize] public async Task Aftersalesinfo([FromBody] FMStringId entity) { var jm = new WebApiCallBack { status = true, msg = "数据获取成功" }; var info = await _aftersalesServices.GetInfo(entity.id, _user.ID); var allConfigs = await _settingServices.GetConfigDictionaries(); var reshipAddress = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAddress); var reshipArea = string.Empty; var reshipId = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipAreaId).ObjectToInt(0); if (reshipId > 0) { var result = await _areaServices.GetAreaFullName(reshipId); if (result.status) { reshipArea = result.data.ToString(); } } var reshipMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipMobile); var reshipName = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ReshipName); var reship = new { reshipAddress, reshipArea, reshipMobile, reshipName }; jm.data = new { info, reship }; return jm; } #endregion #region 提交售后发货快递信息 /// /// 提交售后发货快递信息 /// /// [HttpPost] [Authorize] public async Task SendReship([FromBody] FMBillReshipForSendReshipPost entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.reshipId)) { jm.data = jm.msg = GlobalErrorCodeVars.Code13212; return jm; } else if (string.IsNullOrEmpty(entity.logiCode)) { jm.data = jm.msg = GlobalErrorCodeVars.Code13213; return jm; } else if (string.IsNullOrEmpty(entity.logiNo)) { jm.data = jm.msg = GlobalErrorCodeVars.Code13214; return jm; } var model = await _reshipServices.QueryByIdAsync(entity.reshipId); if (model == null) { jm.data = jm.msg = GlobalErrorCodeVars.Code13211; return jm; } var up = await _reshipServices.UpdateAsync( p => new CoreCmsBillReship() { logiCode = entity.logiCode, logiNo = entity.logiNo, status = (int)GlobalEnumVars.BillReshipStatus.运输中 }, p => p.reshipId == entity.reshipId); jm.status = true; jm.msg = "数据保存成功"; return jm; } #endregion #region 获取配送方式列表======================================================= /// /// 获取配送方式列表 /// /// [HttpPost] [Authorize] public WebApiCallBack GetShip([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); jm.msg = "暂未设置配送方式"; var ship = _shipServices.GetShip(entity.id); if (ship != null) { jm.status = true; jm.data = ship; jm.msg = "获取成功"; } return jm; } #endregion #region 前台物流查询接口======================================================= /// /// 前台物流查询接口 /// /// [HttpPost] [Authorize] public async Task LogisticsByApi([FromBody] FMApiLogisticsByApiPost entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.code) || string.IsNullOrEmpty(entity.no)) { jm.msg = GlobalErrorCodeVars.Code13225; return jm; } var systemLogistics = SystemSettingDictionary.GetSystemLogistics(); foreach (var p in systemLogistics) { if (entity.code == p.sKey) { jm.msg = p.sDescription + "不支持轨迹查询"; return jm; } } jm = await _logisticsServices.ExpressPoll(entity.code, entity.no, entity.mobile); return jm; } #endregion #region 检查订单发票是否已经开具======================================================= /// /// 检查订单发票是否已经开具 /// /// [HttpPost] [Authorize] public async Task CheckInvoice([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交订单编码。"; return jm; } var isHave = await _invoiceServices.ExistsAsync(p => p.sourceId == entity.id && p.category == (int)GlobalEnumVars.OrderTaxCategory.Order); jm.status = true; jm.data = isHave; return jm; } #endregion #region 提交发票申请======================================================= /// /// 提交发票申请 /// /// [HttpPost] [Authorize] public async Task SubmitInvoiceApply([FromBody] FMSubmitInvoiceApply entity) { var jm = new WebApiCallBack(); if (entity.type == 3 && string.IsNullOrEmpty(entity.code)) { jm.msg = "企业发票申请必须填写纳税人识别号"; return jm; } var isHave = await _invoiceServices.ExistsAsync(p => p.sourceId == entity.orderId && p.category == (int)GlobalEnumVars.OrderTaxCategory.Order); if (isHave) { jm.msg = "此订单已经存在发票信息。"; return jm; } var order = await _orderServices.QueryByClauseAsync(p => p.orderId == entity.orderId); if (order == null) { jm.msg = "订单查询失败。"; return jm; } if (order.userId != _user.ID) { jm.msg = "你无权申请发票。"; return jm; } //组装发票信息 var taxInfo = new CoreCmsInvoice { category = (int)GlobalEnumVars.OrderTaxCategory.Order, sourceId = order.orderId, userId = order.userId, type = entity.type, title = entity.name, taxNumber = entity.code, amount = order.orderAmount, status = (int)GlobalEnumVars.OrderTaxStatus.No, createTime = DateTime.Now }; var bl = await _invoiceServices.InsertAsync(taxInfo) > 0; jm.status = true; jm.data = bl; return jm; } #endregion } }