/*********************************************************************** * 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.Auth.HttpContextUser; using CoreCms.Net.Configuration; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.Entities.Expression; using CoreCms.Net.Model.FromBody; using CoreCms.Net.Model.ViewModels.UI; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Essensoft.Paylink.Alipay.Domain; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SqlSugar; using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaAddNearbyPOIResponse.Types; namespace CoreCms.Net.Web.WebApi.Controllers { /// /// 服务卡控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class ServiceController : ControllerBase { private readonly ICoreCmsServicesServices _servicesServices; private readonly ICoreCmsUserServicesOrderServices _userServicesOrderServices; private readonly ICoreCmsUserServicesTicketServices _userServicesTicketServices; private readonly ICoreCmsUserServices _userServices; private readonly ICoreCmsUserServicesTicketVerificationLogServices _ticketVerificationLogServices; private readonly ICoreCmsClerkServices _clerkServices; private readonly ICoreCmsStoreServices _storeServices; private readonly ICoreCmsUserGradeServices _userGradeServices; private readonly ICoreCmsSettingServices _settingServices; private readonly IHttpContextUser _user; /// /// 构造函数 /// public ServiceController(ICoreCmsServicesServices servicesServices, IHttpContextUser user, ICoreCmsUserServicesOrderServices userServicesOrderServices, ICoreCmsUserServicesTicketServices userServicesTicketServices, ICoreCmsUserServices userServices, ICoreCmsClerkServices clerkServices, ICoreCmsUserServicesTicketVerificationLogServices ticketVerificationLogServices, ICoreCmsStoreServices storeServices, ICoreCmsUserGradeServices userGradeServices, ICoreCmsSettingServices settingServices) { _servicesServices = servicesServices; _user = user; _userServicesOrderServices = userServicesOrderServices; _userServicesTicketServices = userServicesTicketServices; _userServices = userServices; _clerkServices = clerkServices; _ticketVerificationLogServices = ticketVerificationLogServices; _storeServices = storeServices; _userGradeServices = userGradeServices; _settingServices = settingServices; } #region 取得服务卡列表信息 /// /// 取得服务卡列表信息 /// /// [HttpPost] //[Authorize] public async Task GetPageList([FromBody] FMPageByIntId entity) { var jm = new WebApiCallBack(); var dt = DateTime.Now; var where = PredicateBuilder.True(); 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); var list = await _servicesServices.QueryPageAsync(where, p => p.createTime, OrderByType.Desc, entity.page, entity.limit); if (list.Any()) { var storesAll = await _storeServices.QueryAsync(); var userGradesAll = await _userGradeServices.QueryAsync(); foreach (var item in list) { if (item.startTime > dt) { item.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.notBegun; TimeSpan ts = item.startTime.Subtract(dt); item.timestamp = (int)ts.TotalSeconds; } else if (item.startTime <= dt && item.endTime > dt) { item.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.begin; TimeSpan ts = item.endTime.Subtract(dt); item.timestamp = (int)ts.TotalSeconds; } else { item.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.haveExpired; } if (!string.IsNullOrEmpty(item.consumableStore)) { var consumableStoreStr = CommonHelper.GetCaptureInterceptedText(item.consumableStore, ","); var consumableStoreIds = CommonHelper.StringToIntArray(consumableStoreStr); if (consumableStoreIds.Any()) { var stores = storesAll.Where(p => consumableStoreIds.Contains(p.id)).ToList(); item.consumableStores = stores.Select(p => p.storeName).ToList(); } } if (!string.IsNullOrEmpty(item.allowedMembership)) { var allowedMembershipStr = CommonHelper.GetCaptureInterceptedText(item.allowedMembership, ","); var allowedMembershipIds = CommonHelper.StringToIntArray(allowedMembershipStr); if (allowedMembershipIds.Any()) { var userGrades = userGradesAll.Where(p => allowedMembershipIds.Contains(p.id)).ToList(); item.allowedMemberships = userGrades.Select(p => p.title).ToList(); } } } } jm.status = true; jm.data = new { list = list, count = list.TotalCount, }; return jm; } #endregion #region 获取服务卡详情 /// /// 获取服务卡详情 /// /// [HttpPost] //[Authorize] public async Task GetDetails([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); var serviceInfo = await _servicesServices.QueryByClauseAsync(p => p.id == entity.id); if (serviceInfo == null) { jm.msg = "服务获取失败"; return jm; } var dt = DateTime.Now; if (!string.IsNullOrEmpty(serviceInfo.consumableStore)) { var consumableStoreStr = CommonHelper.GetCaptureInterceptedText(serviceInfo.consumableStore, ","); var consumableStoreIds = CommonHelper.StringToIntArray(consumableStoreStr); if (consumableStoreIds.Any()) { var stores = await _storeServices.QueryListByClauseAsync(p => consumableStoreIds.Contains(p.id)); serviceInfo.consumableStores = stores.Select(p => p.storeName).ToList(); } } if (!string.IsNullOrEmpty(serviceInfo.allowedMembership)) { var allowedMembershipStr = CommonHelper.GetCaptureInterceptedText(serviceInfo.allowedMembership, ","); var allowedMembershipIds = CommonHelper.StringToIntArray(allowedMembershipStr); if (allowedMembershipIds.Any()) { var userGrades = await _userGradeServices.QueryListByClauseAsync(p => allowedMembershipIds.Contains(p.id)); serviceInfo.allowedMemberships = userGrades.Select(p => p.title).ToList(); } } if (serviceInfo.startTime > dt) { serviceInfo.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.notBegun; var ts = serviceInfo.startTime.Subtract(dt); serviceInfo.timestamp = (int)ts.TotalSeconds; } else if (serviceInfo.startTime <= dt && serviceInfo.endTime > dt) { serviceInfo.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.begin; var ts = serviceInfo.endTime.Subtract(dt); serviceInfo.timestamp = (int)ts.TotalSeconds; } else { serviceInfo.openStatus = (int)GlobalEnumVars.ServicesOpenStatus.haveExpired; } jm.status = true; jm.data = serviceInfo; return jm; } #endregion //验证接口==================================================================================================== #region 添加服务订单 /// /// 取得服务卡列表信息 /// /// [HttpPost] [Authorize] public async Task AddServiceOrder([FromBody] FMIntId entity) { var jm = new WebApiCallBack(); var data = await _servicesServices.QueryByClauseAsync(p => p.id == entity.id); if (data == null) { jm.msg = "服务数据获取失败"; return jm; } var user = await _userServices.QueryByIdAsync(_user.ID); if (user == null) { jm.msg = "用户数据获取失败"; return jm; } if (!data.allowedMembership.Contains("," + user.grade + ",")) { jm.msg = "您所在的用户级别不支持购买"; return jm; } var order = new CoreCmsUserServicesOrder(); order.serviceOrderId = CommonHelper.GetSerialNumberType((int)GlobalEnumVars.SerialNumberType.服务订单编号); order.userId = _user.ID; order.servicesId = entity.id; order.isPay = false; order.status = (int)GlobalEnumVars.ServicesOrderStatus.正常; order.createTime = DateTime.Now; var bl = await _userServicesOrderServices.InsertAsync(order) > 0; jm.status = bl; jm.data = order.serviceOrderId; return jm; } #endregion #region 店铺核销的服务券列表 /// /// 店铺核销的服务券列表 /// /// [HttpPost] [Authorize] public async Task VerificationPageList([FromBody] FMPageByIntId entity) { var jm = await _ticketVerificationLogServices.GetVerificationLogs(_user.ID, entity.id, entity.page, entity.limit); return jm; } #endregion #region 软删除服务券核销单数据 /// /// 软删除服务券核销单数据 /// /// [HttpPost] [Authorize] public async Task LogDelete([FromBody] FMIntId entity) { var jm = await _ticketVerificationLogServices.LogDelete(entity.id, _user.ID); return jm; } #endregion #region 获取单个提货单详情 /// /// 获取单个提货单详情 /// /// [HttpPost] [Authorize] public async Task GetTicketInfo([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交查询数据关键词"; return jm; } var ticket = await _userServicesTicketServices.QueryByClauseAsync(p => p.redeemCode == entity.id); if (ticket == null) { jm.msg = "未查询到服务券"; return jm; } var enumModel = EnumHelper.GetEnumberEntity(ticket.status); ticket.statusStr = enumModel.title; var service = await _servicesServices.QueryByClauseAsync(p => p.id == ticket.serviceId); var serviceOrder = await _userServicesOrderServices.QueryByClauseAsync(p => p.serviceOrderId == ticket.serviceOrderId); jm.status = true; jm.data = new { ticket, service, serviceOrder }; return jm; } #endregion #region 核销服务券 /// /// 核销服务券 /// /// [HttpPost] [Authorize] public async Task VerificationTicket([FromBody] FMStringId entity) { var jm = new WebApiCallBack(); if (string.IsNullOrEmpty(entity.id)) { jm.msg = "请提交查询数据关键词"; return jm; } var ticket = await _userServicesTicketServices.QueryByClauseAsync(p => p.redeemCode == entity.id); if (ticket == null) { jm.msg = "未查询到服务券"; return jm; } var order = await _userServicesOrderServices.QueryByClauseAsync(p => p.serviceOrderId == ticket.serviceOrderId); if (order == null) { jm.msg = "订单信息获取失败"; return jm; } var service = await _servicesServices.QueryByClauseAsync(p => p.id == order.servicesId, true); if (service == null) { jm.msg = "服务商品获取失败"; return jm; } var dt = DateTime.Now; if (service.validityType == 2 && dt > ticket.validityEndTime) { jm.msg = "服务券已经过期"; return jm; } if (ticket.status != (int)GlobalEnumVars.ServicesTicketStatus.正常) { jm.msg = "服务券状态不支持核销"; return jm; } var user = await _userServices.QueryByIdAsync(_user.ID); if (user == null) { jm.msg = "未获取到审核权限"; return jm; } var allConfigs = await _settingServices.GetConfigDictionaries(); var shopManagerMobile = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopManagerMobile); var isManager = !string.IsNullOrEmpty(shopManagerMobile) && shopManagerMobile.Contains(user.mobile); var clerk = await _clerkServices.QueryByClauseAsync(p => p.userId == user.id); if (!isManager) { if (clerk == null) { jm.msg = "非门店店员无权限核验"; return jm; } if (!service.consumableStore.Contains("," + clerk.storeId + ",")) { jm.msg = "您所在的门店无权核销此券"; return jm; } } //开始更新数据 var log = new CoreCmsUserServicesTicketVerificationLog { storeId = clerk?.storeId ?? 0, verificationUserId = _user.ID, ticketId = ticket.id, ticketRedeemCode = ticket.redeemCode, verificationTime = DateTime.Now, serviceId = ticket.serviceId, isDel = false }; ticket.status = (int)GlobalEnumVars.ServicesTicketStatus.已核销; ticket.verificationTime = DateTime.Now; ticket.isVerification = true; var up = await _userServicesTicketServices.UpdateAsync(ticket); var bl = false; if (up) { bl = await _ticketVerificationLogServices.InsertAsync(log) > 0; } jm.status = up && bl; jm.msg = jm.status ? "核销成功" : "核销失败"; return jm; } #endregion } }