/// <summary> /// 用户预约的服务完成后发送微信模板消息通知 /// </summary> /// <param name="consumptionGuid"></param> private void NotifyUser(string consumptionGuid) { Task.Run(() => { if (string.IsNullOrWhiteSpace(PlatformSettings.UserAppointmentCompletedNotificationTemplate)) { return; } var userOpenId = ""; string controllerName = ControllerContext.ActionDescriptor.ControllerName; string actionName = ControllerContext.ActionDescriptor.ActionName; try { var model = new ConsumptionBiz().GetModel(consumptionGuid); var userModel = new UserBiz().GetModelAsync(model.UserGuid).Result; Logger.Debug($"NotifyUser-用户预约的服务已完成-用户openid-{userModel?.WechatOpenid}"); if (string.IsNullOrWhiteSpace(userModel?.WechatOpenid ?? "")) { return; } var merchantModel = new MerchantBiz().GetAsync(model.MerchantGuid).Result; var projectModel = new ProjectBiz().GetAsync(model.ProjectGuid).Result; var resToken = WeChartApi.GetAccessToken(PlatformSettings.CDClientAppId, PlatformSettings.CDClientAppSecret).Result; Logger.Debug($"NotifyUser-用户预约的服务已完成-获取token-{JsonConvert.SerializeObject(resToken)}"); if (string.IsNullOrWhiteSpace(resToken.AccessToken)) { Common.Helper.Logger.Error($"GD.API.Controllers.Consumer.{controllerName}.{actionName} openId:[{userOpenId}] {Environment.NewLine} error:用户预约后发送模板消息通知云医执行端公众号-获取token失败。{resToken.Errmsg}"); return; } userOpenId = userModel.WechatOpenid; var clientMsg = new WeChatTemplateMsg { Touser = userModel.WechatOpenid, Template_Id = PlatformSettings.UserAppointmentNotificationTemplate, Data = new { First = new { Value = "【您预约的服务已完成】" }, //完成时间 Keyword1 = new { Value = $"{model.ConsumptionEndDate.Value.ToString("MM月dd日 HH:mm")}" }, //服务项目 Keyword2 = new { Value = projectModel?.ProjectName }, //服务门店 Keyword3 = new { Value = merchantModel.MerchantName }, //备注 Remark = new { Value = "如对我们服务有什么建议,请及时与我们联系" }, } }; var clientTempMsgRes = WeChartApi.SendTemplateMsg(clientMsg, resToken.AccessToken); Logger.Debug($"NotifyUser-用户预约的服务已完成-发送模板消息-{JsonConvert.SerializeObject(clientTempMsgRes)}"); } catch (Exception ex) { Logger.Error($"GD.API.Controllers.Consumer.{controllerName}.{actionName} openId:[{userOpenId}] {Environment.NewLine} error:用户预约服务完成后发送模板消息通知云医用户端公众号端失败。{ex.Message}"); } }); }
public object UpdatePermission(object json) { return(ProjectBiz.UpdatePermission(json)); }
public object GetPermission(int userId, int projectId) { return(ProjectBiz.GetPermission(userId, projectId)); }
public object GetMemberList(int projectId) { return(ProjectBiz.GetMemberList(projectId)); }
public object DeleteMember(object json) { return(ProjectBiz.DeleteMember(json)); }
public object AddMember(object json) { return(ProjectBiz.AddMember(json)); }
public object GetList(int userId) { return(ProjectBiz.GetList(userId)); }
public object ChangeOwner(object json) { return(ProjectBiz.ChangeOwner(json)); }
public object UpdateInfo(object json) { return(ProjectBiz.UpdateInfo(json)); }
public object GetInfo(int projectId) { return(ProjectBiz.GetInfo(projectId)); }
public object DeleteProject(object json) { return(ProjectBiz.DeleteProject(json)); }
public object GetProgressList(int projectId) { return(ProjectBiz.GetProgressList(projectId)); }
public object UpdateProgressOrder(object json) { return(ProjectBiz.UpdateProgressOrder(json)); }
public object CreateProject(object json) { return(ProjectBiz.CreateProject(json)); }
public object UpdateProgressName(object json) { return(ProjectBiz.UpdateProgressName(json)); }
public async Task <IActionResult> AddAppointment([FromBody] AddAppointmentRequestDto requestDto) { #region 校验请求参数 DateTime.TryParse(requestDto.StartTime, out var startTime); if (startTime == DateTime.MinValue) { return(Failed(ErrorCode.Empty, "预约时间格式不正确,请修改!")); } if (!string.IsNullOrEmpty(requestDto.Remark)) { if (requestDto.Remark.Length > 500) { return(Failed(ErrorCode.Empty, "备注超过最大长度限制,请修改!")); } } #endregion #region 校验用户账号是否存在 var userModel = new UserBiz().GetUserByPhone(requestDto.Phone); if (userModel == null) { return(Failed(ErrorCode.Empty, $"用户“{requestDto.Phone}”不存在或已禁用!")); } #endregion #region 若服务对象存在则校验 if (!string.IsNullOrEmpty(requestDto.ServiceMemberGuid)) { var members = await new ServiceMemberBiz().GetServiceMemberListAsync(userModel.UserGuid); if (members != null && members.Count > 0) { if (!members.Any(d => d.ServiceMemberGuid == requestDto.ServiceMemberGuid)) { return(Failed(ErrorCode.Empty, "服务对象不存在!")); } } } #endregion #region 校验用户指定卡下服务项目是否可用 var goodsItemBiz = new GoodsItemBiz(); var goodsItemModel = await goodsItemBiz.GetModelAsync(requestDto.FromItemGuid); if (goodsItemModel is null) { return(Failed(ErrorCode.Empty, "抱歉,尚未有可用的卡项")); } #endregion #region 校验商户下项目是否存在 var projectBiz = new ProjectBiz(); var projectModel = await projectBiz.GetMerchantPorjectModelById(UserID, goodsItemModel.ProjectGuid); if (projectModel is null) { return(Failed(ErrorCode.Empty, "服务项目不存在!")); } #endregion var startDate = startTime.AddMinutes(projectModel.OperationTime); requestDto.EndTime = startDate.ToString("HH:mm"); #region 校验用户指定卡是否可用并获取旧卡 var goodBiz = new GoodsBiz(); //按照卡创建时间倒序,优先扣除旧卡使用次数 var goodsModel = await goodBiz.GetAvailableGoods(userModel.UserGuid); if (goodsModel is null || goodsModel.Count <= 0) { return(Failed(ErrorCode.Empty, "抱歉,尚未有可用的卡项")); } //首先获取有过期时间限制的卡,优先扣除使用次数 var goodModel = goodsModel.FirstOrDefault(d => d.EffectiveStartDate.HasValue && d.EffectiveEndDate.HasValue && DateTime.Now < d.EffectiveEndDate.Value); if (goodModel is null) { //若没有过期时间限制则获取第一张卡 goodModel = goodsModel.FirstOrDefault(d => !d.EffectiveStartDate.HasValue && !d.EffectiveEndDate.HasValue); if (goodModel is null) { return(Failed(ErrorCode.UserData, "抱歉,尚未有可用的卡项")); } } #endregion #region 查询排班是否存在或已约满 //预约项目需间隔15分钟,即预约项目成功后随即锁定后续的15分钟时间 int lockTime = 15; var merchantScheduleBiz = new MerchantScheduleBiz(); var scheduleModel = await merchantScheduleBiz.GetModelAsync(requestDto.ScheduleGuid); if (scheduleModel == null) { return(Failed(ErrorCode.Empty, $"服务项目“{projectModel.ProjectName}”无排班信息")); } if (scheduleModel.FullStatus) { return(Failed(ErrorCode.Empty, "排班已约满")); } #endregion #region 查询预约时间段是否已被预约 var merchantScheduleDetaiBiz = new MerchantScheduleDetailBiz(); var occupied = await merchantScheduleDetaiBiz.CheckScheduleDetailOccupied(requestDto.ScheduleGuid, requestDto.StartTime, startDate.AddMinutes(lockTime).ToString("HH:mm")); if (occupied) { return(Failed(ErrorCode.UserData, $"服务时间“{requestDto.StartTime}”不可预约")); } #endregion goodsItemModel.Remain--; goodsItemModel.Used++; goodsItemModel.Available = goodsItemModel.Remain > 0; var consumptionGuid = Guid.NewGuid(); var consumptionModel = new ConsumptionModel { Remark = requestDto.Remark, ConsumptionGuid = consumptionGuid.ToString("N"), ConsumptionNo = BitConverter.ToInt64(consumptionGuid.ToByteArray(), 0).ToString(), UserGuid = userModel.UserGuid, FromItemGuid = goodsItemModel.GoodsItemGuid, ProjectGuid = goodsItemModel.ProjectGuid, AppointmentDate = Convert.ToDateTime(scheduleModel.ScheduleDate.ToString("yyyy-MM-dd") + " " + requestDto.StartTime), MerchantGuid = scheduleModel.MerchantGuid, OperatorGuid = scheduleModel.TargetGuid, PlatformType = scheduleModel.PlatformType, ConsumptionStatus = ConsumptionStatusEnum.Booked.ToString(), CreatedBy = UserID, LastUpdatedBy = UserID, OrgGuid = "GuoDan" }; if (!string.IsNullOrEmpty(requestDto.ServiceMemberGuid)) { consumptionModel.ServiceMemberGuid = requestDto.ServiceMemberGuid; } var merchantScheduleDetailModel = new MerchantScheduleDetailModel { ScheduleDetailGuid = Guid.NewGuid().ToString("N"), ScheduleGuid = requestDto.ScheduleGuid, StartTime = requestDto.StartTime, EndTime = requestDto.EndTime, ConsumptionGuid = string.Empty, CreatedBy = UserID, LastUpdatedBy = UserID, OrgGuid = "GuoDan" }; var lockScheduleDetailModel = (MerchantScheduleDetailModel)null; if (lockTime > 0) { lockScheduleDetailModel = new MerchantScheduleDetailModel { ScheduleDetailGuid = Guid.NewGuid().ToString("N"), ScheduleGuid = requestDto.ScheduleGuid, StartTime = requestDto.EndTime, EndTime = startDate.AddMinutes(lockTime).ToString("HH:mm"), ConsumptionGuid = string.Empty, CreatedBy = UserID, LastUpdatedBy = UserID, OrgGuid = "GuoDan" }; } var result = await new ConsumptionBiz().MakeAnAppointmentWithConsumption(consumptionModel, merchantScheduleDetailModel, goodsItemModel, lockScheduleDetailModel); return(!result?Failed(ErrorCode.DataBaseError, "预约失败") : Success()); }