using Appointment.Entity; using Appointment.IRepository; using System; using System.Linq; using System.Collections.Generic; using System.Data; using System.Text; using SqlSugar; using System.Threading.Tasks; using Newtonsoft.Json; using System.Net.Http; using static Appointment.Entity.WechatHelper; namespace Appointment.Repository { /// /// 标准预订业务 /// public class ApptRepo : DbContext, IApptRepo { private readonly log4net.ILog _logger = log4net.LogManager.GetLogger(typeof(ApptRepo)); IApptLogRepo _ApptLog; public ApptRepo(IApptLogRepo apptLog) { _ApptLog = apptLog; } // ---- 会议室 /// /// 可用会议室资源列表 /// /// /// public ApiResult> UsableMeetingList(MeetingReq req) { var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult>.Failed(loginUserRes.Msg); if (req.StartDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[StartTime]不正确!"); req.StartDay = new DateTime(req.StartDay.Year, req.StartDay.Month, req.StartDay.Day); if (req.EndDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[EndTime]不正确!"); var endd = req.EndDay.AddDays(1); req.EndDay = new DateTime(endd.Year, endd.Month, endd.Day); var ls = Db.Queryable((i, c) => new JoinQueryInfos( JoinType.Left, i.Rescode == c.Code )) .Where((i, c) => i.Stime >= req.StartDay && i.Etime <= req.EndDay && c.Sta == "T" && i.Sta != "C") .Select((i, c) => new UsableMeetingMiddleRes() { MeetingName = c.Descript1, Code = c.Code, Stime = i.Stime.Value, Sta = i.Sta == "O" ? "I" : i.Sta, Sfield = i.Sfield, Resby = i.Resby }) .ToList().Replace(); List reList = new List(); var resCode = Db.Queryable() .Where(t => t.Sort == "A" && t.Sta == "T").OrderBy(t => t.Code, OrderByType.Asc).ToList().Replace(); if (resCode == null || resCode.Count == 0) return ApiResult>.Success(string.Empty); int days = (req.EndDay - req.StartDay).Days; /* 封装暂订单数量 */ var zy = Db.Queryable().Where(t => t.ApplyOA == 1 && t.StartDay >= req.StartDay.AddMonths(-2) && t.EndDay <= req.EndDay.AddMonths(2)) .Select(t => t.Guid).ToList(); var meets = Db.Queryable((m, s) => new JoinQueryInfos( JoinType.Left, m.ApptId == s.Id)) .Where((m, s) => s.ApptTypeId == 2 && s.ApptType != 4 && m.MeetingTime >= req.StartDay && m.MeetingTime <= req.EndDay && !zy.Contains(s.Guid)).ToList(); //var inSumGuid = Db.Queryable().Where(t => meets.Select(t => t.ApptId).Contains(t.Id)).Select(t => t.Guid).ToList(); //var _inSumGuid = Db.Queryable().Where(t => t.ApplyOA == 1 && inSumGuid.Contains(t.Guid)).ToList(); //meets= meets.Where(t=> !_inSumGuid.Contains(t.gui)) foreach (var item in resCode) { DateTime curDay = req.StartDay; MeetingRes meetingRes = new MeetingRes(); meetingRes.Code = item.Code; meetingRes.Descript = item.Descript1; meetingRes.DayStatus = new List(); for (int i = 0; i < days; i++) { MeetingStatus meetingStatus = new MeetingStatus(); meetingStatus.Day = curDay; string[] st = new string[] { "", "", "" }; for (int j = 0; j < 3; j++) { var meetingNum = new MeetingNum(); int sField = j + 1; var model = ls.Where(t => t.Stime == curDay && t.Sfield == sField && t.Code == item.Code).FirstOrDefault(); if (model != null) { if (model.Resby == loginUserRes.Info.UserAccount) { meetingNum.Group = "M"; st[j] = "M"; } else { st[j] = model.Sta; meetingNum.Group = model.Sta; } } if (meets != null) { var m = meets.Where(t => t.MeetingTime == meetingStatus.Day && t.MeetingCode == item.Code && t.Groups.Contains(sField.ToString())) .Select(t => t.ApptId.Value).ToList(); meetingNum.Num = m.Count(); if (meetingNum.Num > 0) { meetingNum.SummaryList = m; } } if (meetingStatus.MeetingNums == null) meetingStatus.MeetingNums = new List(); meetingStatus.MeetingNums.Add(meetingNum); } meetingStatus.Status = st; meetingRes.DayStatus.Add(meetingStatus); curDay = curDay.AddDays(1); } reList.Add(meetingRes); } return ApiResult>.Success(string.Empty, reList); } /// /// 当天可用会议室资源 /// /// /// public ApiResult> UsableMeeting(UsableMeetingReq req) { // 获取会议室列表 var resCodeList = Db.Queryable().Where(t => t.Sort == "A").OrderBy(t => t.Code, OrderByType.Asc).ToList(); if (resCodeList == null || resCodeList.Count == 0) return ApiResult>.Success(string.Empty); // 获取占用的会议室 req.Day = new DateTime(req.Day.Year, req.Day.Month, req.Day.Day); ISugarQueryable sugar = Db.Queryable().Where(t => t.Stime == req.Day && t.Sta != "C"); if (req.Groups != null && req.Groups.Length > 0) sugar = sugar.In(t => t.Sfield, req.Groups); var resInfoList = sugar.ToList(); List list = new List(); foreach (var item in resCodeList) { int rows = resInfoList.Where(t => t.Rescode == item.Code).Count(); if (rows > 0) { if (req.Status == 1) { item.Numbers = 0; } else { continue; } } list.Add(item); } // 获取待审核的信息 return ApiResult>.Success(string.Empty, list); } // ---- 客房 /// /// 可用客房资源列表 /// /// /// public ApiResult> UsableRoom(UsableRoomReq req) { if (req.StartDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[StartTime]不正确!"); req.StartDay = new DateTime(req.StartDay.Year, req.StartDay.Month, req.StartDay.Day); if (req.EndDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[EndTime]不正确!"); var endd = req.EndDay.AddDays(-1); req.EndDay = new DateTime(endd.Year, endd.Month, endd.Day); string rm_type = "%"; // 全部 var dt2 = Db.Ado.UseStoredProcedure().SqlQuery("p_yyj_ota_type_rsv_tend", new { rm_type = rm_type, s_time = req.StartDay, e_time = req.EndDay, tentative = "T" }); if (dt2.Count == 0) return ApiResult>.Success(String.Empty, null); dt2 = dt2.Replace(); var ls = Db.Queryable().ToList().Replace(); for (int i = 0; i < dt2.Count; i++) { dt2[i].RoomName = ls.Where(t => t.Id == dt2[i].Type).FirstOrDefault()?.Descript1; dt2[i].RoomPrice = ls.Where(t => t.Id == dt2[i].Type).FirstOrDefault()?.Price; dt2[i].RoomTotal = ls.Where(t => t.Id == dt2[i].Type).FirstOrDefault()?.Total; } dt2 = dt2.OrderBy(t => t.Quan).ToList(); return ApiResult>.Success(String.Empty, dt2); } /// /// 根据时间段获取房类最小可用数 /// /// /// public ApiResult> UsableRoomMin(UsableRoomReq req) { if (req.StartDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[StartTime]不正确!"); req.StartDay = new DateTime(req.StartDay.Year, req.StartDay.Month, req.StartDay.Day); if (req.EndDay == DateTime.MinValue) return ApiResult>.Failed("操作失败,[EndTime]不正确!"); /* 获取基本客房类型数据 */ var ls = Db.Queryable().ToList().Replace(); if (ls == null && ls.Count == 0) return ApiResult>.Success(String.Empty, null); var usableTypeList = new List(); for (int i = 0; i < ls.Count; i++) { usableTypeList.Add(new UsableRoomRes() { Sequence = ls[i].Sequence.Value, Type = ls[i].Id, Quan = ls[i].Total, RoomName = ls[i].Descript1, RoomPrice = ls[i].Price, RoomTotal = ls[i].Total }); } /* 获取正式库客房使用数量 */ var endday = req.EndDay.AddDays(-1); endday = new DateTime(endday.Year, endday.Month, endday.Day); string rm_type = "%"; // 全部 var dt2 = Db.Ado.UseStoredProcedure().SqlQuery("p_yyj_ota_type_rsv_tend", new { rm_type = rm_type, s_time = req.StartDay, e_time = endday, tentative = "T" }); if (dt2.Count == 0) return ApiResult>.Success(String.Empty, null); dt2 = dt2.Replace(); /* 获取临时表客户使用数量 */ //DateTime eTime = req.EndDay.AddDays(1); //var SummaryIds = Db.Queryable() // .Where(t => t.AuditorStatus == (int)EnumAuditorStatus.审核中) // .Select(t => t.Id).ToList(); //var apptRoomList = Db.Queryable() // .In(t => t.ApptId, SummaryIds) // .Where(t => !(t.RoomOut < eTime || t.RoomIn > req.EndDay)) // .ToList(); foreach (var item in usableTypeList) { item.Quan = dt2.Where(t => t.Type == item.Type).Min(t => t.Quan); // 正式数据可使用的最小客房 } usableTypeList = usableTypeList.Where(t => t.Quan > 0).OrderBy(t => t.Sequence).ToList(); return ApiResult>.Success(String.Empty, usableTypeList); } /// /// 备注列表项 /// /// public ApiResult> RemarkList() { var ls = Db.Queryable() .Where(t => t.Class == EnumSysCodeClass.apptremark.ToString()) .OrderBy(t => t.Id, OrderByType.Asc) .Select(t => t.Descript1).ToList().Replace(); return ApiResult>.Success(string.Empty, ls); } // ---- 预订管理 /// /// 创建暂定单 /// /// /// public ApiResult Add(ApptSummaryReq req) { DateTime now = DateTime.Now; var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult.Failed(loginUserRes.Msg); int pid = 0; if (req.Id != 0) { var summary = Db.Queryable().Where(t => t.Id == req.Id).First(); if (summary != null) { if (summary.AuditorStatus == (int)EnumAuditorStatus.审核中) { string oldData = JsonConvert.SerializeObject(summary); summary.AuditorStatus = (int)EnumAuditorStatus.作废; Db.Updateable(summary).UpdateColumns(t => new { t.AuditorStatus }).ExecuteCommand(); string newData = JsonConvert.SerializeObject(summary); _ApptLog.SetLog("appt_summary", summary.Id.ToString(), oldData, newData, loginUserRes.Info.UserAccount, 0); pid = req.Id; } else if (summary.AuditorStatus == (int)EnumAuditorStatus.审核通过 || summary.AuditorStatus == (int)EnumAuditorStatus.作废) { return ApiResult.Failed("操作无效"); } else if (summary.AuditorStatus == (int)EnumAuditorStatus.驳回) { // 驳回的复制新建,原来的不需要更改 } } } if ( (req.ApptRoomList == null || req.ApptRoomList.Count == 0) && (req.ApptMeetingList == null || req.ApptMeetingList.Count == 0) && (req.ApptCateringList == null || req.ApptCateringList.Count == 0) && (req.ApptSpringList == null || req.ApptSpringList.Count == 0) ) { return ApiResult.Failed("添加失败,预订详情全为空!"); } /* 主体 */ // 审批状态 var auditorStatus = EnumAuditorStatus.审核中; int apptTypeId = 0;//现不使用类型 var auditorId = 0; var apptType = Db.Queryable().ToList(); var apptTypeModel = apptType.Where(t => t.Pid == 0).FirstOrDefault(); if (apptTypeModel == null) { auditorId = 0; } else { if (apptTypeModel.OpGroup != loginUserRes.Info.UserGroup) { auditorId = apptTypeModel.Id; } else { var nextAuditor = apptType.Where(t => t.Pid == apptTypeModel.Id).FirstOrDefault(); if (nextAuditor == null) { auditorId = 0; } else { auditorId = nextAuditor.Id; } } } StringBuilder no = new StringBuilder(); string NoPrefix = BaseConfig.App(new string[] { "NoPrefix" }); if (!string.IsNullOrWhiteSpace(NoPrefix)) { no.AppendFormat("{0}-", NoPrefix); } no.Append($"{now:yyyy}-{now:MM}-{now:dd}-"); // 计算序号 DateTime sTime = new DateTime(now.Year, now.Month, now.Day); var count = Db.Queryable() .Where(t => t.CreateTime > sTime).Count() + 1; no.Append(count.ToString().PadLeft(2, '0')); /* 会议室预订明细 */ var apptMeetingList = new List(); if (req.ApptMeetingList != null && req.ApptMeetingList.Count > 0) { List resCodeList = Db.Queryable().Where(t => t.Sort == "A" && t.Sta == "T").ToList(); foreach (var item in req.ApptMeetingList) { if (item.MeetingGroup.Length == 0) return ApiResult.Failed("添加失败,未获取到选择的场次!"); string meetingRoom = item.MeetingRoom; string meetingCode = item.MeetingCode; decimal meetingPrice = item.MeetingPrice == null ? 0 : item.MeetingPrice.Value; if (!string.IsNullOrWhiteSpace(item.MeetingCode)) { var resCode = resCodeList.Where(t => t.Code == item.MeetingCode).FirstOrDefault(); if (resCode == null) return ApiResult.Failed("添加失败,无效的会议厅代码!"); meetingRoom = resCode.Descript1; if (item.MeetingTime != null) { item.MeetingTime = new DateTime(item.MeetingTime.Value.Year, item.MeetingTime.Value.Month, item.MeetingTime.Value.Day); // 判断正式表 会议厅资源是否被占用 var resInfo = Db.Queryable() .Where(t => t.Rescode == item.MeetingCode && t.Stime == item.MeetingTime.Value) .In(t => t.Sfield, item.MeetingGroup).Any(); if (resInfo) return ApiResult.Failed("添加失败,会议室已被占用!"); } } for (int i = 0; i < item.MeetingGroup.Length; i++) { apptMeetingList.Add(new ApptMeeting() { MeetingTime = item.MeetingTime.Value, //MeetingGroup = item.MeetingGroup[i], MeetingRoom = meetingRoom, MeetingCode = meetingCode, MeetingRostrum = item.MeetingRostrum, MeetingShape = item.MeetingShape, MeetingNum = item.MeetingNum == null ? 0 : item.MeetingNum.Value, MeetingPrice = meetingPrice, MeetingTitle = item.MeetingTitle, Remark = item.Remark }); } } } /* 客房预订明细 */ var apptRoomList = new List(); if (req.ApptRoomList != null && req.ApptRoomList.Count > 0) { List roomTypeList = Db.Queryable().ToList(); roomTypeList = StringHelper.Replace(roomTypeList); foreach (var item in req.ApptRoomList) { if (item.RoomIn != null && item.RoomIn.Value.Hour == 0) item.RoomIn = new DateTime(item.RoomIn.Value.Year, item.RoomIn.Value.Month, item.RoomIn.Value.Day, 18, 0, 0); if (item.RoomOut != null && item.RoomOut.Value.Hour == 0) item.RoomOut = new DateTime(item.RoomOut.Value.Year, item.RoomOut.Value.Month, item.RoomOut.Value.Day, 14, 0, 0); if (item.RoomNum == null) return ApiResult.Failed("添加失败,房间数无效!"); string roomGroup = item.RoomGroup; string roomCode = string.Empty; decimal roomPrice = item.RoomPrice == null ? 0 : item.RoomPrice.Value; if (!string.IsNullOrWhiteSpace(item.RooomCode)) { var room = roomTypeList.Where(t => t.Id == item.RooomCode).FirstOrDefault(); if (room == null) return ApiResult.Failed("添加失败,房类代码不存在!"); roomGroup = room.Descript1; roomCode = room.Id; if (roomPrice == 0) roomPrice = room.Price; } if (!string.IsNullOrWhiteSpace(roomCode)) { // 判断正式表 客房资源是否被占用 DateTime s_time = item.RoomIn == null ? now.AddYears(1) : item.RoomIn.Value; DateTime e_time = item.RoomOut == null ? now.AddYears(1) : item.RoomOut.Value.AddDays(-1); string rm_type = roomCode; if (string.IsNullOrEmpty(rm_type)) rm_type = "%"; rm_type = rm_type.PadRight(3, ' '); var _dt = Db.Ado.UseStoredProcedure().GetDataTable("p_yyj_ota_type_rsv_tend", new { rm_type, s_time = item.RoomIn, e_time = item.RoomOut }); if (_dt == null || _dt.Rows.Count == 0) throw new Exception("已没有空的客房"); for (int i = 0; i < _dt.Rows.Count; i++) { int quan = Convert.ToInt32(_dt.Rows[i]["quan"]); string type = _dt.Rows[i]["type"].ToString(); if (quan < item.RoomNum) { return ApiResult.Failed($"操作失败,[{item.RoomIn:yyyy-MM-dd}]房类[{type}]只剩{quan}套!"); } } } apptRoomList.Add(new ApptRoom() { RoomIn = item.RoomIn.Value, RoomOut = item.RoomOut.Value, RoomGroup = roomGroup, RoomCode = roomCode, RoomNum = item.RoomNum.Value, RoomPrice = roomPrice, BreakfastNum = item.BreakfastNum == null ? 0 : item.BreakfastNum.Value, LongDistance = item.LongDistance == null ? 0 : item.LongDistance.Value, MinShop = item.MinShop == null ? 0 : item.MinShop.Value, RoomRemark = item.RoomRemark }); } } /* 餐饮预订明细 */ var apptCateringList = new List(); if (req.ApptCateringList != null && req.ApptCateringList.Count > 0) { foreach (var item in req.ApptCateringList) { string cateringRoom = item.CateringRoom; string cateringCode = item.CateringCode; for (int i = 0; i < item.CateringGroup.Length; i++) { apptCateringList.Add(new ApptCatering() { CateringTime = item.CateringTime.Value, //CateringGroup = item.CateringGroup[i], CateringRoom = item.CateringRoom, CateringCode = item.CateringCode, CateringType = item.CateringType, CateringNum = item.CateringNum, CateringPrice = item.CateringPrice, CateringTable = item.CateringTable, Wine = item.Wine, Remark = item.Remark, }); } } } /* 温泉预订明细 */ var ApptSpringList = new List(); if (req.ApptSpringList != null && req.ApptSpringList.Count > 0) { foreach (var item in req.ApptSpringList) { ApptSpringList.Add(new ApptSpring() { SpringTime = item.SpringTime.Value, PeopleNum = item.PeopleNum == null ? 0 : item.PeopleNum.Value, SpringMen = item.SpringMen == null ? 0 : item.SpringMen.Value, SpringWomen = item.SpringWomen == null ? 0 : item.SpringWomen.Value, Consume = item.Consume, SpringPrice = item.SpringPrice == null ? 0 : item.SpringPrice.Value, Remark = item.Remark, }); } } ApptSummary appt = new ApptSummary { UserId = loginUserRes.Info.UserAccount, CreateTime = DateTime.Now, ApptTypeId = apptTypeId, AuditorStatus = (int)auditorStatus, AuditorId = auditorId, TransferAudit = string.Empty, ApptType = 0, No = no.ToString(), BuyerName = req.BuyerName, BuyerAddress = req.BuyerAddress, BuyerTitle = req.BuyerTitle, LeaderName = req.LeaderName, LeaderMobile = req.LeaderMobile, LeaderRoom = req.LeaderRoom, SaleName = loginUserRes.Info.UserName, SaleMobile = "", // 组织负责人电话从哪获取,获取微信员工手机号 SaleDirector = "", // 营销总监(手工写), RoomRemark = req.RoomRemark, MeetingRemark = req.MeetingRemark, CateringRemark = req.CateringRemark, SpringRemark = req.SpringRemark, Pid = pid }; int summaryId = 0; try { Db.Ado.BeginTran(); var resultSummary = InsertReturnId(appt); if (!resultSummary.IsSuccess) { Db.Ado.RollbackTran(); return ApiResult.Failed(resultSummary.Msg); } summaryId = resultSummary.Info; if (apptRoomList.Count > 0) { for (int i = 0; i < apptRoomList.Count; i++) { apptRoomList[i].ApptId = resultSummary.Info; } InsertRange(apptRoomList); } if (apptMeetingList.Count > 0) { for (int i = 0; i < apptMeetingList.Count; i++) { apptMeetingList[i].ApptId = resultSummary.Info; } InsertRange(apptMeetingList); } if (apptCateringList.Count > 0) { for (int i = 0; i < apptCateringList.Count; i++) { apptCateringList[i].ApptId = resultSummary.Info; } InsertRange(apptCateringList); } if (ApptSpringList.Count > 0) { for (int i = 0; i < ApptSpringList.Count; i++) { ApptSpringList[i].ApptId = resultSummary.Info; } InsertRange(ApptSpringList); } if (req.Remarks != null && req.Remarks.Count > 0) { var reList = new List(); foreach (var item in req.Remarks) { if (!string.IsNullOrEmpty(item.RemarkContent)) { reList.Add(new ApptRemark() { ApptId = resultSummary.Info, Title = item.RemarkName, Info = item.RemarkContent }); } } if (reList.Count > 0) InsertRange(reList); } Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception("提交预订失败,出现异常,异常信息:" + ex.Message); } /* 审批流程 */ if (summaryId > 0) { if (auditorId == 0 && string.IsNullOrEmpty(appt.TransferAudit)) { var auditLog = new ApptAuditLog() { Type = 1, CreateTime = DateTime.Now, UserId = loginUserRes.Info.UserAccount, ApptId = summaryId, AuditorStatus = 3, Remark = "自动" }; InsertReturnId(auditLog); return InAppt(summaryId); } else { SetMsgAuditing(summaryId, auditorId, loginUserRes.Info.Hotelid); } } return ApiResult.Success(); } /// /// 删除预定 /// /// /// public ApiResult DeleteAppt(AuditDeleteReq req) { if (req.Type == 1) { var summary = GetById(req.Id); if (summary != null) { _ApptLog.SetLog("appt_summary", summary.Id.ToString(), JsonConvert.SerializeObject(summary), null, null, 1); DeleteById(req.Id); } } else if (req.Type == 2) { var item = GetById(req.Id); if (item != null) { _ApptLog.SetLog("appt_room", item.Id.ToString(), JsonConvert.SerializeObject(item), null, null, 1); DeleteById(req.Id); } } else if (req.Type == 3) { var item = Db.Queryable().Where(t => t.Id == req.Id).First(); if (item != null) { _ApptLog.SetLog("appt_meeting", item.Id.ToString(), JsonConvert.SerializeObject(item), null, null, 1); DeleteById(req.Id); } } else if (req.Type == 4) { var item = GetById(req.Id); if (item != null) { _ApptLog.SetLog("appt_catering", item.Id.ToString(), JsonConvert.SerializeObject(item), null, null, 1); DeleteById(req.Id); } } else if (req.Type == 5) { var item = GetById(req.Id); if (item != null) { _ApptLog.SetLog("appt_spring", item.Id.ToString(), JsonConvert.SerializeObject(item), null, null, 1); DeleteById(req.Id); } } else { return ApiResult.Failed("操作失败,类型无效!"); } return ApiResult.Success(string.Empty); } /// /// 预订审批 /// /// /// public ApiResult ApptAudit(ApptAuditReq req) { var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult.Failed(loginUserRes.Msg); var sum = GetById(req.ApptId); if (sum == null) return ApiResult.Failed("操作失败,信息不存在!"); if (sum.AuditorStatus != (int)EnumAuditorStatus.审核中) return ApiResult.Failed("操作失败,当前预订不在审核状态!"); var oldData = JsonConvert.SerializeObject(sum); var apptAuditorModel = GetById(sum.AuditorId); if (sum.AuditorId > 0) { if (apptAuditorModel == null) return ApiResult.Failed("操作失败,无效的审核流程!"); if (loginUserRes.Info.UserGroup != apptAuditorModel.OpGroup) return ApiResult.Failed("操作失败,没有审核权限!"); } else if (!string.IsNullOrEmpty(sum.TransferAudit)) { if (sum.TransferAudit != loginUserRes.Info.UserAccount) { return ApiResult.Failed("操作失败,没有审核权限!"); } else { sum.TransferAudit = string.Empty; } } else { return InAppt(req.ApptId); } if (req.AuditorStatus == 1) { var apptMeetingList = Db.Queryable().Where(t => t.ApptId == sum.Id && !SqlFunc.IsNullOrEmpty(t.MeetingCode)).ToList(); //if (apptMeetingList != null && apptMeetingList.Count > 0) //{ // foreach (var item in apptMeetingList) // { // if (!string.IsNullOrWhiteSpace(item.MeetingCode)) // { // DateTime enddate = item.MeetingTime.AddDays(8); // var ls = Db.Ado.UseStoredProcedure().SqlQuery("p_xx_res_info_view3", new { startday = item.MeetingTime, enddate, sort = "A", accnt = "%" }); // if (ls != null && ls.Count > 0) // { // var model = ls.Where(t => t.Code == item.MeetingCode).FirstOrDefault(); // if (model != null) // { // } // } // } // } //} var apptRoomList = Db.Queryable().Where(t => t.ApptId == sum.Id && !SqlFunc.IsNullOrEmpty(t.RoomCode)).ToList(); if (apptRoomList != null && apptRoomList.Count > 0) { foreach (var item in apptRoomList) { string rm_type = item.RoomCode; if (string.IsNullOrEmpty(rm_type)) rm_type = "%"; rm_type = rm_type.PadRight(3, ' '); var _dt = Db.Ado.UseStoredProcedure().GetDataTable("p_yyj_ota_type_rsv_tend", new { rm_type, s_time = item.RoomIn, e_time = item.RoomOut }); if (_dt == null || _dt.Rows.Count == 0) throw new Exception("已没有空的客房"); for (int i = 0; i < _dt.Rows.Count; i++) { int quan = Convert.ToInt32(_dt.Rows[i]["quan"]); string type = _dt.Rows[i]["type"].ToString(); if (quan < item.RoomNum) { return ApiResult.Failed($"操作失败,[{item.RoomIn:yyyy-MM-dd}]房类[{type}]只剩{quan}套!"); } } } } sum.AuditorStatus = (int)EnumAuditorStatus.审核中; } else if (req.AuditorStatus == 0) { sum.AuditorStatus = (int)EnumAuditorStatus.驳回; var usr = Db.Queryable().Where(t => t.OpId == sum.UserId).First(); SetMsgaudited(usr.WxServiceId, EnumAuditorStatus.驳回, loginUserRes.Info.Hotelid, sum.BuyerTitle, req.Remark, loginUserRes.Info.UserName); } else { return ApiResult.Failed($"操作失败,无效操作!"); } var auditLog = new ApptAuditLog() { Type = 1, CreateTime = DateTime.Now, UserId = loginUserRes.Info.UserAccount, ApptId = req.ApptId, AuditorStatus = req.AuditorStatus, Remark = req.Remark }; if (sum.AuditorId > 0) { var nextAudit = Db.Queryable().Where(t => t.Pid == apptAuditorModel.Id).OrderBy(t => t.Id, OrderByType.Desc).First(); if (nextAudit == null) { sum.AuditorId = 0; } else { sum.AuditorId = nextAudit.Id; SetMsgAuditing(req.ApptId, nextAudit.Id, loginUserRes.Info.Hotelid); } } try { Db.Ado.BeginTran(); InsertReturnId(auditLog); Db.Updateable(sum).UpdateColumns(t => new { t.AuditorStatus, t.AuditorId, t.TransferAudit, t.Id }).ExecuteCommand(); _ApptLog.SetLog("appt_summary", req.ApptId.ToString(), oldData, JsonConvert.SerializeObject(sum), null, 1); Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); _logger.Error(ex); throw new Exception(ex.Message); } if (sum.AuditorId == 0 && string.IsNullOrEmpty(sum.TransferAudit) && req.AuditorStatus == 1) { var usr = Db.Queryable().Where(t => t.OpId == sum.UserId).First(); InAppt(sum.Id.Value); SetMsgaudited(usr.WxServiceId, EnumAuditorStatus.审核通过, loginUserRes.Info.Hotelid, sum.BuyerTitle, req.Remark, loginUserRes.Info.UserName); } return ApiResult.Success(string.Empty); } /// /// 取消预订 /// /// /// public ApiResult CancelAudit(ApptAuditReq req) { var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult.Failed(loginUserRes.Msg); var summaryM = GetById(req.ApptId); if (summaryM == null) return ApiResult.Failed("操作失败,信息不存在!"); if (summaryM.AuditorStatus != (int)EnumAuditorStatus.审核中) return ApiResult.Failed($"操作失败,当前为{(EnumAuditorStatus)summaryM.AuditorStatus},不允许取消!"); string oldData = JsonConvert.SerializeObject(summaryM); summaryM.AuditorStatus = (int)EnumAuditorStatus.取消; summaryM.AuditorId = 0; summaryM.TransferAudit = string.Empty; var auditLog = new ApptAuditLog() { Type = 1, CreateTime = DateTime.Now, UserId = loginUserRes.Info.UserAccount, ApptId = req.ApptId, AuditorStatus = (int)EnumAuditorStatus.取消, Remark = req.Remark }; try { Db.Ado.BeginTran(); InsertReturnId(auditLog); Update(summaryM); _ApptLog.SetLog("appt_summary", req.ApptId.ToString(), oldData, JsonConvert.SerializeObject(summaryM), null, 1); Db.Ado.CommitTran(); return ApiResult.Success(string.Empty); } catch (Exception ex) { Db.Ado.RollbackTran(); _logger.Error(ex); throw new Exception(ex.Message); } } /// /// 转审批 /// /// /// public ApiResult TransferAudit(TransferAuditReq req) { bool transferWhere = false; var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult.Failed(loginUserRes.Msg); var sum = GetById(req.ApptId); if (sum == null) return ApiResult.Failed("操作失败,信息不存在!"); if (sum.AuditorStatus != (int)EnumAuditorStatus.审核中) return ApiResult.Failed("操作失败,当前预订不在审核状态!"); if (sum.AuditorId > 0) { var aptAuditorModel = GetById(sum.AuditorId); if (aptAuditorModel != null) { if (aptAuditorModel.OpGroup == loginUserRes.Info.UserGroup) transferWhere = true; } } else if (!string.IsNullOrEmpty(sum.TransferAudit)) { if (sum.TransferAudit == loginUserRes.Info.UserAccount) transferWhere = true; } if (transferWhere) { string oldData = JsonConvert.SerializeObject(sum); var userModel = Db.Queryable().Where(t => t.OpId.Trim() == req.ToAccount && t.Locked == "F").First(); if (userModel == null) return ApiResult.Failed("操作失败,转审批接收人不存在!"); if (string.IsNullOrEmpty(userModel.WxOpenId) || string.IsNullOrEmpty(userModel.WxServiceId)) { return ApiResult.Failed("操作失败,转审批接收人需要授权小程序与公众号!"); } sum.AuditorId = 0; sum.TransferAudit = req.ToAccount; var auditLog = new ApptAuditLog() { Type = 1, CreateTime = DateTime.Now, UserId = loginUserRes.Info.UserAccount, ApptId = req.ApptId, AuditorStatus = 2, Remark = req.Remark }; try { Db.Ado.BeginTran(); Db.Updateable(sum).UpdateColumns(t => new { t.AuditorId, t.TransferAudit }).ExecuteCommand(); InsertReturnId(auditLog); _ApptLog.SetLog("appt_summary", req.ApptId.ToString(), oldData, JsonConvert.SerializeObject(sum), loginUserRes.Info.UserAccount, 2); Db.Ado.CommitTran(); TransferAuditMsg(req.ApptId, userModel.WxServiceId, loginUserRes.Info.Hotelid); return ApiResult.Success(); } catch (Exception ex) { Db.Ado.RollbackTran(); _logger.Error(ex); throw new Exception(ex.Message); } } else { return ApiResult.Failed("转审批失败!"); } } /// /// 抄送 /// /// /// public ApiResult ApptSend(ApptSendReq req) { var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult.Failed(loginUserRes.Msg); DateTime now = DateTime.Now; var summary = GetById(req.ApptId); if (summary == null || summary.AuditorStatus == (int)EnumAuditorStatus.驳回 || summary.AuditorStatus == (int)EnumAuditorStatus.作废 || summary.AuditorStatus == (int)EnumAuditorStatus.取消) return ApiResult.Failed("操作失败,数据不存在!"); if (req.ToUserAccounts == null || req.ToUserAccounts.Length <= 0) return ApiResult.Failed("操作失败,未选择抄送人!"); var userList = Db.Queryable().Where(t => t.Locked == "F").In(t => t.OpId, req.ToUserAccounts).ToList().Replace(); if (userList.Count != req.ToUserAccounts.Length) { List notUser = new List(); for (int i = 0; i < req.ToUserAccounts.Length; i++) { var _userList = userList.Select(t => t.OpId).ToList(); if (!_userList.Contains(req.ToUserAccounts[i])) { notUser.Add(req.ToUserAccounts[i]); } } if (notUser.Count > 0) return ApiResult.Failed($"操作失败,用户[{string.Join(",", notUser)}]不存在!"); } List ls = new List(); for (int i = 0; i < req.ToUserAccounts.Length; i++) { ls.Add(new ApptAuditLog() { Type = 2, CreateTime = now, UserId = req.ToUserAccounts[i], ApptId = req.ApptId, AuditorStatus = 3, Remark = string.Empty, Source = loginUserRes.Info.UserAccount }); } if (ls.Count > 0) InsertRange(ls); return ApiResult.Success(string.Empty); } /// /// 获取实体 /// /// /// public ApiResult GetModel(int id) { ApptSummaryReq result = new ApptSummaryReq(); var apptSum = Db.Queryable().Where(t => t.Id == id).First(); if (apptSum == null) return ApiResult.Success(string.Empty, null); result.Id = apptSum.Id.Value; result.BuyerName = apptSum.BuyerName; result.BuyerAddress = apptSum.BuyerAddress; result.BuyerTitle = apptSum.BuyerTitle; result.LeaderName = apptSum.LeaderName; result.LeaderMobile = apptSum.LeaderMobile; result.LeaderRoom = apptSum.LeaderRoom; result.RoomRemark = apptSum.RoomRemark; result.CateringRemark = apptSum.CateringRemark; result.SpringRemark = apptSum.SpringRemark; result.UserId = apptSum.UserId; result.AuditorStatus = apptSum.AuditorStatus; result.CreateTime = apptSum.CreateTime.Value; result.AccountDES = string.Empty; var ls = new List(); ls.Add(result); var dt = new BaseRepo().FormatApptSummaryReq(ls); if (dt.Count > 0) { return ApiResult.Success(string.Empty, dt[0]); } else { return ApiResult.Success(string.Empty, result); } } /// /// 我发起的预订列表 /// /// /// public ApiResult> MyApptApplyPageReq(MyApptApplyPageReq req) { int total = 0; var reList = new PagerData() { PageIndex = req.PageIndex, PageSize = req.PageSize, Total = total, Data = new List() }; var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult>.Failed(loginUserRes.Msg); int auditorStatus = req.AuditorStatus == null ? 0 : req.AuditorStatus.Value; var _summarys = Db.Queryable() .Where(t => t.UserId == loginUserRes.Info.UserAccount) .WhereIF(auditorStatus == 1, t => t.AuditorStatus == (int)EnumAuditorStatus.审核中) .WhereIF(auditorStatus == 2, t => t.AuditorStatus == (int)EnumAuditorStatus.审核通过) .WhereIF(auditorStatus == 3, t => t.AuditorStatus == (int)EnumAuditorStatus.驳回) .WhereIF(auditorStatus == 6, t => t.AuditorStatus == (int)EnumAuditorStatus.取消) .OrderBy(t => t.Id, OrderByType.Desc) .Select(p => new ApptSummaryReq() { Id = p.Id.Value, AccountDES = string.Empty, BuyerName = p.BuyerName, BuyerAddress = p.BuyerAddress, BuyerTitle = p.BuyerTitle, LeaderName = p.LeaderName, LeaderMobile = p.LeaderMobile, LeaderRoom = p.LeaderRoom, RoomRemark = p.RoomRemark, MeetingRemark = p.MeetingRemark, CateringRemark = p.CateringRemark, SpringRemark = p.SpringRemark, UserId = p.UserId, AuditorStatus = p.AuditorStatus, CreateTime = p.CreateTime.Value, }) .ToPageList(req.PageIndex, req.PageSize, ref total); if (_summarys.Count == 0) return ApiResult>.Success(string.Empty, reList); reList.Total = total; reList.Data = new BaseRepo().FormatApptSummaryReq(_summarys).Replace(); for (int i = 0; i < reList.Data.Count; i++) { if (reList.Data[i].AuditorStatus == (int)EnumAuditorStatus.驳回) { var log = Db.Queryable() .Where(t => t.ApptId == reList.Data[i].Id && t.Type == 1 && t.AuditorStatus == 0) .First(); if (log != null) { reList.Data[i].RebutRemark = log.Remark; } } } List users = reList.Data.Select(t => t.UserId).ToList(); var userList = Db.Queryable().Where(t => t.Locked == "F" && users.Contains(t.OpId)).ToList(); var saleList = Db.Queryable().ToList(); UcLogin ucLogin = null; Saleid saleid = null; reList.Data.ForEach(t => { ucLogin = userList.Where(it => it.OpId == t.UserId).FirstOrDefault(); if (ucLogin != null) { t.SaleName = ucLogin.OpName; t.SalePhone = ucLogin.Mobile; saleid = saleList.Where(it => it.Id == ucLogin.Saleid).FirstOrDefault(); if (saleid != null) t.SaleName = saleid.Name; } }); return ApiResult>.Success(string.Empty, reList); } /// /// 和我关联的预订(我审核的、我有权审核的、我抄送的、抄送给我的) /// /// /// public ApiResult> MyPartakePage(MyApptAuditPageReq req) { int total = 0; PagerData pager = new PagerData() { PageIndex = req.PageIndex, PageSize = req.PageSize, Total = total, Data = new List() }; var loginUserRes = BaseRepo.DECLoginInfo(req.AccountDES); if (!loginUserRes.IsSuccess) return ApiResult>.Failed(loginUserRes.Msg); ISugarQueryable summarys = Db.Queryable(); if (req.AuditorStatus == 0) { var auditApptId = Db.Queryable() .Where(t => t.Type == 1 && t.UserId == loginUserRes.Info.UserAccount && t.AuditorStatus != (int)EnumAuditorStatus.取消) .Select(t => t.ApptId).ToList(); summarys.In(t => t.Id, auditApptId); } else if (req.AuditorStatus == 1) { var auditorIds = Db.Queryable().Where(t => t.OpGroup == loginUserRes.Info.UserGroup).Select(t => t.Id).ToList(); //if (auditorIds.Count == 0) return ApiResult>.Success("没有要审核的预订", pager); summarys.Where(t => t.AuditorStatus == (int)EnumAuditorStatus.审核中).Where(t => auditorIds.Contains(t.AuditorId.Value) || t.TransferAudit == loginUserRes.Info.UserAccount); } else if (req.AuditorStatus == 2) { var auditApptId = Db.Queryable().Where(t => t.Type == 2 && t.Source == loginUserRes.Info.UserAccount).Select(t => t.ApptId).ToList(); summarys.In(t => t.Id, auditApptId); } else if (req.AuditorStatus == 3) { var auditApptId = Db.Queryable().Where(t => t.Type == 2 && t.UserId == loginUserRes.Info.UserAccount).Select(t => t.ApptId).ToList(); summarys.In(t => t.Id, auditApptId); } else { return ApiResult>.Failed("操作失败,无效的审核状态参数!"); } var _summarys = summarys.OrderBy(t => t.Id, OrderByType.Desc) .Select(p => new ApptSummaryReq() { Id = p.Id.Value, AccountDES = string.Empty, BuyerName = p.BuyerName, BuyerAddress = p.BuyerAddress, BuyerTitle = p.BuyerTitle, LeaderName = p.LeaderName, LeaderMobile = p.LeaderMobile, LeaderRoom = p.LeaderRoom, RoomRemark = p.RoomRemark, MeetingRemark = p.MeetingRemark, CateringRemark = p.CateringRemark, SpringRemark = p.SpringRemark, UserId = p.UserId, AuditorStatus = p.AuditorStatus, CreateTime = p.CreateTime.Value, }) .ToPageList(req.PageIndex, req.PageSize, ref total); if (_summarys.Count == 0) return ApiResult>.Success(string.Empty, pager); pager.Total = total; pager.Data = new BaseRepo().FormatApptSummaryReq(_summarys).Replace(); for (int i = 0; i < pager.Data.Count; i++) { if (pager.Data[i].AuditorStatus == (int)EnumAuditorStatus.驳回) { var log = Db.Queryable() .Where(t => t.ApptId == pager.Data[i].Id && t.Type == 1 && t.AuditorStatus == 0) .First(); if (log != null) { pager.Data[i].RebutRemark = log.Remark; } } } List users = pager.Data.Select(t => t.UserId).ToList(); var userList = Db.Queryable().Where(t => t.Locked == "F" && users.Contains(t.OpId)).ToList().Replace(); var saleList = Db.Queryable().ToList().Replace(); UcLogin ucLogin = null; Saleid saleid = null; pager.Data.ForEach(t => { _logger.Debug("测试:userList==" + Newtonsoft.Json.JsonConvert.SerializeObject(userList)); _logger.Debug("测试:UserId==" + t.UserId); ucLogin = userList.Where(it => it.OpId == t.UserId).FirstOrDefault(); if (ucLogin != null) { t.SaleName = ucLogin.OpName; t.SalePhone = ucLogin.Mobile; saleid = saleList.Where(it => it.Id == ucLogin.Saleid).FirstOrDefault(); if (saleid != null) t.SaleName = saleid.Name; } }); return ApiResult>.Success(string.Empty, pager); } /// /// 获取预订审核记录表 /// /// /// public ApiResult AuditorLogTree(CommIntReq req) { if (req.IntValue == null) return ApiResult.Failed("参数无效"); AuditorLogTreeRes auditorLogTreeRes = new AuditorLogTreeRes(); var summaryModel = GetById(req.IntValue.Value); if (summaryModel == null) return ApiResult.Failed("数据不存在"); auditorLogTreeRes.Id = summaryModel.Id.Value; auditorLogTreeRes.CreateTime = summaryModel.CreateTime.Value; auditorLogTreeRes.SaleName = summaryModel.SaleName; var list = Db.Queryable((a, u) => new JoinQueryInfos( JoinType.Left, a.UserId == u.OpId )) .Where((a, u) => a.Type == 1 && a.ApptId == req.IntValue.Value) .OrderBy((a, u) => a.CreateTime, OrderByType.Asc) .Select((a, u) => new AudioLogRes() { Id = a.Id, CreateTime = a.CreateTime, UserName = "审核人:" + u.OpName, Status = a.AuditorStatus, Remark = a.Remark }).ToList(); if (summaryModel.AuditorStatus == (int)EnumAuditorStatus.审核中) { if (summaryModel.AuditorId > 0) { var auditorMo = GetById(summaryModel.AuditorId); if (auditorMo != null) { var userList = Db.Queryable().Where(t => t.OpGroup == auditorMo.OpGroup).Select(t => t.OpName).ToList(); userList = userList.Replace(); for (int i = 0; i < userList.Count; i++) { userList[i] = "【" + userList[i] + "】"; } var users = $"待审核人:{string.Join(",", userList)}"; list.Add(new AudioLogRes() { Id = 0, CreateTime = null, UserName = users, Status = 3, Remark = string.Empty }); } } else if (!string.IsNullOrEmpty(summaryModel.TransferAudit)) { var userM = Db.Queryable().Where(t => t.OpId == summaryModel.TransferAudit).First(); if (userM != null) { userM = userM.Replace(); list.Add(new AudioLogRes() { Id = 0, CreateTime = null, UserName = "审核人:" + userM.OpName, Status = 3, Remark = string.Empty }); } } } else if (summaryModel.AuditorStatus == (int)EnumAuditorStatus.作废) { var sumM = Db.Queryable() .Where(t => t.Pid == summaryModel.Id).First(); if (sumM != null) { list.Add(new AudioLogRes() { Id = 0, CreateTime = sumM.CreateTime, UserName = "审核人:" + summaryModel.SaleName, Status = (int)EnumAuditorStatus.作废, Remark = string.Empty }); } var appS = Db.Queryable().Where(t => t.Pid == summaryModel.Id).First(); if (appS != null) { auditorLogTreeRes.NewName = appS.BuyerTitle; } } auditorLogTreeRes.AudioLogList = list; return ApiResult.Success(string.Empty, auditorLogTreeRes); } public ApiResult Demo(CommPageReq req) { var summary = GetDataModel(1); SetMsgAuditing(1, 1, "85217777"); SetMsgaudited("oGHnajgL33R4afH_emyTIe4B54hg", EnumAuditorStatus.审核通过, "85217777", "DDDD"); return null; } // ---- 私有方法 private ApiResult GetDataModel(int id) { var summary = Db.Queryable() .Where(t => t.Id == id) .Mapper((sum) => { sum.ApptRoomList = Db.Queryable() .Where(t => t.ApptId == sum.Id).ToList(); sum.ApptMeetingList = Db.Queryable() .Where(t => t.ApptId == sum.Id).ToList(); sum.ApptCateringList = Db.Queryable() .Where(t => t.ApptId == sum.Id).ToList(); sum.ApptSpringList = Db.Queryable() .Where(t => t.ApptId == sum.Id).ToList(); sum.ApptRemarks = Db.Queryable() .Where(t => t.ApptId == sum.Id).ToList(); }).First(); if (summary == null) return ApiResult.Failed("操作失败,不存在的数据"); return ApiResult.Success(string.Empty, summary); } /// /// 预订信息入正式表 /// /// /// private ApiResult InAppt(int id) { var appt = GetDataModel(id); if (!appt.IsSuccess) return ApiResult.Failed(appt.Msg); if (appt.Info == null) return ApiResult.Failed("生成正式预订失败,数据不存在!"); if (appt.Info == null || appt.Info.AuditorStatus == (int)EnumAuditorStatus.审核通过) return ApiResult.Success(string.Empty); if (appt.Info.AuditorStatus == (int)EnumAuditorStatus.驳回) return ApiResult.Failed("生成正式预订失败,该预订为驳回状态!"); if (appt.Info.AuditorId != 0) return ApiResult.Failed("生成正式预订失败,请等待上级审核!"); DateTime now = DateTime.Now; var userList = Db.Queryable().ToList().Replace(); var user = userList.Where(t => t.OpId == appt.Info.UserId).FirstOrDefault(); if (user == null && user.Locked == "T") return ApiResult.Failed("生成正式预订失败,提交人不存在!"); // 创建团队 string gname = $"{appt.Info.BuyerName}"; // 团队名称 if (gname.Length > 10) { gname = gname.Substring(0, 10); } string leader = appt.Info.LeaderName; //领队或导游或联系人 string phone = appt.Info.LeaderMobile; //领队电话 DateTime arr = DateTime.MinValue; // 抵达时间 日期和时间,如2019-01-17 18:00:00 DateTime dep = DateTime.MinValue; // 离开时间 日期和时间,如2019-01-18 14:00:00 int rooms = 0; // 团队总共的房间数备注(只是备注,不占用房间) int guests = 0; //团队的总人数备注(只是备注,不占用房间) string remark = appt.Info.UserId + "预订"; //团队主单备注 string log_id = appt.Info.UserId; // 操作员工号(如果操作员没有软件的工号,第三方可以在迪联软件中创建一个通用的工号 string log_ip = ""; //操作电脑或者接口电脑的IP,可以用空字符串或者任意字符串 string saleid = user.Saleid; // 销售员工号,在迪联软件销售菜单下可以打开销售员设置,查看销售员的工号,可以为空字符换 DateTime minTime = DateTime.MinValue; if (appt.Info.ApptRoomList != null && appt.Info.ApptRoomList.Count > 0) { var tempMin = appt.Info.ApptRoomList.Where(t => t.RoomIn != null && t.RoomIn > minTime).Min(t => t.RoomIn); if (tempMin != null) arr = tempMin; var tempMax = appt.Info.ApptRoomList.Where(t => t.RoomOut != null && t.RoomOut > minTime).Max(t => t.RoomOut); if (tempMax != null) dep = tempMax; rooms = appt.Info.ApptRoomList.Sum(t => t.RoomNum); int breakfastNum = appt.Info.ApptRoomList.Sum(t => t.BreakfastNum); if (breakfastNum > 0) { guests = breakfastNum; } else { guests = rooms; } } else if (appt.Info.ApptMeetingList != null && appt.Info.ApptMeetingList.Count > 0) { arr = appt.Info.ApptMeetingList.Min(t => t.MeetingTime); dep = appt.Info.ApptMeetingList.Max(t => t.MeetingTime); if (arr == dep) { dep = dep.AddDays(1);// 创建团队预订时,离开日期不应该早于到达日期,所以必须不在同一天, } guests = appt.Info.ApptMeetingList.Sum(t => t.MeetingNum); } else if (appt.Info.ApptSpringList != null && appt.Info.ApptSpringList.Count > 0) { arr = appt.Info.ApptSpringList.Min(t => t.SpringTime); dep = appt.Info.ApptSpringList.Max(t => t.SpringTime); if (arr == dep) { dep = dep.AddDays(1); } } else if (appt.Info.ApptCateringList != null && appt.Info.ApptCateringList.Count > 0) { arr = appt.Info.ApptCateringList.Min(t => t.CateringTime); dep = appt.Info.ApptCateringList.Max(t => t.CateringTime); if (arr == dep) { dep = dep.AddDays(1); } } if (arr == minTime || dep == minTime) return ApiResult.Failed("生成正式预订失败,抵离时间不允许为空!"); if (arr > dep) return ApiResult.Failed("生成正式预订失败,离开日期必须大于入住日期!"); try { Db.Ado.BeginTran(); // 创建团队 string grpno = string.Empty; var dt = Db.Ado.UseStoredProcedure().GetDataTable("p_yyj_grpadd_inter", new { gname, leader, phone, arr, dep, rooms, guests, remark, log_id, log_ip, saleid }); if (dt.Rows.Count > 0 && dt.Rows[0][0] != null && dt.Rows[0][0].ToString() == "1") { string msg = $"创建团队失败,失败原因:{dt.Rows[0][1]}"; _logger.Error(msg); return ApiResult.Failed(msg); } else if (dt.Rows.Count > 0 && dt.Rows[0][0] != null && dt.Rows[0][0].ToString() == "0") { } else { return ApiResult.Failed("创建团队失败"); } grpno = dt.Rows[0][1].ToString().Trim(); if (appt.Info.ApptMeetingList != null && appt.Info.ApptMeetingList.Count > 0) { foreach (var item in appt.Info.ApptMeetingList) { string accnt = grpno; // 团队账号(创建团队时获得) if (item.MeetingTime == null) { Db.Ado.RollbackTran(); return ApiResult.Failed($"生成正式预订失败,会议预订[{item.MeetingRoom}]日期不可能空!"); } // 会议预订的日期 只要日期不需要时分秒 DateTime date = new DateTime(item.MeetingTime.Year, item.MeetingTime.Month, item.MeetingTime.Day); if (string.IsNullOrWhiteSpace(item.MeetingCode)) continue; string rescode = item.MeetingCode; // 会议室编号,可以从迪联软件查看,或者res_code表取对照code字段 //int sfield = item.MeetingGroup; // 场次, 0代表全天 1上午场 2下午场 3晚场 int sfield = 0; decimal price = item.MeetingPrice; // 价格。可以从迪联软件查看,或者res_code表取price字段,该字段为预设参考价,具体订单价格以该参数为准。 string op_id = appt.Info.UserId; // 操作员工号(如果操作员没有软件的工号,第三方可以在迪联软件中创建一个通用的工号 dt = Db.Ado.UseStoredProcedure().GetDataTable("p_yyj_grpmeet_inter", new { accnt, date, rescode, sfield, price, op_id }); if (dt.Rows.Count > 0 && dt.Rows[0][0] != null && dt.Rows[0][0].ToString() == "1") { string msg = $"创建团队失败,失败原因:{dt.Rows[0][1]}"; _logger.Error(msg); return ApiResult.Failed(msg); } } } if (appt.Info.ApptRoomList != null && appt.Info.ApptRoomList.Count > 0) { foreach (var item in appt.Info.ApptRoomList) { log_id = appt.Info.UserId; // 操作员工号(如果操作员没有软件的工号,第三方可以在迪联软件中创建一个通用的工号) log_ip = ""; // 操作电脑或者接口电脑的IP,可以用空字符串或者任意字符串 if (item.RoomIn == null) { Db.Ado.RollbackTran(); return ApiResult.Failed($"生成正式预订失败,客房预订[{item.RoomGroup}]抵达日期不可能空!"); } arr = new DateTime(item.RoomIn.Year, item.RoomIn.Month, item.RoomIn.Day); // 抵达日期 只要日期不需要时分秒 if (item.RoomOut == null) { Db.Ado.RollbackTran(); return ApiResult.Failed($"生成正式预订失败,客房预订[{item.RoomGroup}]离开日期不可能空!"); } dep = new DateTime(item.RoomOut.Year, item.RoomOut.Month, item.RoomOut.Day); // 离开日期 只要日期不需要时分秒 if (string.IsNullOrWhiteSpace(item.RoomCode)) continue; string type = item.RoomCode; // 房类代码,如BJ,请查看迪联酒店系统中房类的设置 rooms = item.RoomNum; // 预留的数量,此为真实数量,如果超过酒店可用数会返回错误信息 decimal price = item.RoomPrice; // 房价 guests = 1; // 一个房间住几个人,默认为1 remark = item.RoomRemark; // 该预留的备注,排房时可以看到此备注 string rmcode = "RACK"; // 请按照默认的RACK填写,此为房价码 dt = Db.Ado.UseStoredProcedure().GetDataTable("p_yyj_gblock_inter", new { log_id, log_ip, grpno, arr, dep, type, rooms, price, guests, remark, rmcode }); if (dt.Rows.Count > 0 && dt.Rows[0][0] != null && dt.Rows[0][0].ToString() == "1") { string msg = $"创建团队失败,失败原因:{dt.Rows[0][1]}"; _logger.Error(msg); return ApiResult.Failed(msg); } } } var model = GetById(appt.Info.Id); string oldData = JsonConvert.SerializeObject(model); if (model == null) { return ApiResult.Failed("生成正式预订失败,预订信息不存在!"); } model.AuditorStatus = (int)EnumAuditorStatus.审核通过; Update(model); string newData = JsonConvert.SerializeObject(model); _ApptLog.SetLog("appt_summary", appt.Info.Id.ToString(), oldData, newData, null); Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); _logger.Error(ex); throw new Exception(ex.Message); } /* 自动抄送 */ List toSend = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains("#所有部门#")).ToList(); if (appt.Info.ApptRoomList != null && appt.Info.ApptRoomList.Count > 0) { var sendTemp = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains("#客房#")).ToList(); foreach (var item in sendTemp) { if (toSend.Where(t => t.OpId == item.OpId).Count() == 0) { toSend.Add(item); } } } if (appt.Info.ApptMeetingList != null && appt.Info.ApptMeetingList.Count > 0) { var sendTemp = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains("#会议#")).ToList(); foreach (var item in sendTemp) { if (toSend.Where(t => t.OpId == item.OpId).Count() == 0) { toSend.Add(item); } } } if (appt.Info.ApptCateringList != null && appt.Info.ApptCateringList.Count > 0) { var sendTemp = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains("#餐饮#")).ToList(); foreach (var item in sendTemp) { if (toSend.Where(t => t.OpId == item.OpId).Count() == 0) { toSend.Add(item); } } } if (appt.Info.ApptSpringList != null && appt.Info.ApptSpringList.Count > 0) { var sendTemp = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains("#温泉#")).ToList(); foreach (var item in sendTemp) { if (toSend.Where(t => t.OpId == item.OpId).Count() == 0) { toSend.Add(item); } } } if (appt.Info.ApptRemarks != null && appt.Info.ApptRemarks.Count > 0) { foreach (var item in appt.Info.ApptRemarks) { if (!string.IsNullOrEmpty(item.Info)) { var sendTemp = userList.Where(t => !SqlFunc.IsNullOrEmpty(t.Autosendcond) && t.Autosendcond.Contains($"#{item.Title}#")).ToList(); foreach (var _item in sendTemp) { if (toSend.Where(t => t.OpId == _item.OpId).Count() == 0) { toSend.Add(_item); } } } } } if (toSend.Count > 0) { List apptAuditLogs = new List(); foreach (var item in toSend) { apptAuditLogs.Add(new ApptAuditLog() { Type = 2, CreateTime = now, UserId = item.OpId, ApptId = appt.Info.Id.Value, AuditorStatus = 3, Remark = string.Empty, Source = string.Empty }); if (!string.IsNullOrEmpty(item.WxServiceId)) { SetCopyMsg(item.WxServiceId); } } InsertRange(apptAuditLogs); } return ApiResult.Success(string.Empty); } /// /// 向审核人员发送审核消息 /// /// /// /// 酒店id /// private void SetMsgAuditing(int apptId, int auditorId, string hotelid) { try { string AppId = BaseConfig.App(new string[] { "WeChatService", "AppId" }); var apptSummary = Db.Queryable().Where(t => t.Id == apptId && t.AuditorStatus == (int)EnumAuditorStatus.审核中).First(); if (apptSummary == null) return; var auditorModel = GetById(auditorId); if (auditorModel != null) { var userList = Db.Queryable().Where(t => t.OpGroup == auditorModel.OpGroup && !SqlFunc.IsNullOrEmpty(t.WxServiceId)).Select(t => t.WxServiceId).ToList(); if (userList != null && userList.Count > 0) { if (AppId == "wx1f646438a23bd3bc") { List keydows = new List(); keydows.Add($"OA预订:{apptSummary.BuyerTitle}"); keydows.Add(apptSummary.CreateTime.Value.ToString("yyyy-MM-dd HH:mm")); string first = "OA预约待审核"; AizhuhotelHelper.SendTemplateMsg(userList, "DYuAAPUkuy5BCRmZ4jAfsIBuT5_xsisVIFD3nnL9MdA", "pages/index/index?status=2&hotelid=oatest", first, "", keydows); } else { string template_id = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "template_id" }); string first = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "first" }); string remark = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "remark" }); string url = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "url" }); url += $"&hotelid={hotelid}"; string[] keydows = new[] { "新预订:" + apptSummary.BuyerTitle, apptSummary.CreateTime.Value.ToString("yyyy-MM-dd HH:mm") }; AizhuhotelHelper.SendTemplateMsg(userList, template_id, url, first, remark, keydows); } } } } catch (Exception) { } } /// /// 转审批 /// /// /// /// private void TransferAuditMsg(int wxSericeOpenId, string auditorId, string hotelid) { try { string AppId = BaseConfig.App(new string[] { "WeChatService", "AppId" }); var apptSummary = Db.Queryable().Where(t => t.Id == wxSericeOpenId && t.AuditorStatus == (int)EnumAuditorStatus.审核中).First(); if (apptSummary == null) return; var auditorModel = GetById(auditorId); if (auditorModel != null) { var userList = new List() { auditorId }; if (userList != null && userList.Count > 0) { if (AppId == "wx1f646438a23bd3bc") { // 爱住网 List keydows = new List(); keydows.Add($"OA预订:{apptSummary.BuyerTitle}"); keydows.Add(apptSummary.CreateTime.Value.ToString("yyyy-MM-dd HH:mm")); string first = "OA预约待审核"; AizhuhotelHelper.SendTemplateMsg(userList, "DYuAAPUkuy5BCRmZ4jAfsIBuT5_xsisVIFD3nnL9MdA", "pages/index/index?status=2&hotelid=oatest", first, "", keydows.ToArray()); } else { string template_id = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "template_id" }); string first = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "first" }); string remark = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "remark" }); string url = BaseConfig.App(new string[] { "SendTemplateMsgAuditing", "url" }); url += $"&hotelid={hotelid}"; string[] keydows = new[] { "新预订:" + apptSummary.BuyerTitle, apptSummary.CreateTime.Value.ToString("yyyy-MM-dd HH:mm") }; AizhuhotelHelper.SendTemplateMsg(userList, template_id, url, first, remark, keydows); } } } } catch (Exception) { } } /// /// 审核通过向提交人发送信息 /// /// /// /// /// /// /// private void SetMsgaudited(string wxSericeOpenId, EnumAuditorStatus auditorStatus, string hotelid, string title, string reason = "", string auditer = "") { if (string.IsNullOrEmpty(wxSericeOpenId)) return; try { List user = new List() { wxSericeOpenId }; List keydows = new List(); if (auditorStatus == EnumAuditorStatus.审核通过) { keydows.Add("预订审核通过"); } else if (auditorStatus == EnumAuditorStatus.驳回) { keydows.Add("预订被驳回"); } else { keydows.Add("预订有变更"); } keydows.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); string AppId = BaseConfig.App(new string[] { "WeChatService", "AppId" }); if (AppId == "wx1f646438a23bd3bc") { // 爱住网 string[] keydowsArr = new[] { $"OA预订:{title}", auditorStatus.ToString(), reason, auditer }; AizhuhotelHelper.SendTemplateMsg(user, "26IpDf3ii9pSO7SJrQfpevbc_VMqatiGi0PguHuG-Cc", "pages/index/index?status=3&hotelid=oatest", "OA预约审核结果", "", keydowsArr); } else { string template_id = BaseConfig.App(new string[] { "SendTemplateMsgAudited", "template_id" }); string url = BaseConfig.App(new string[] { "SendTemplateMsgAudited", "url" }); url += $"&hotelid={hotelid}"; string first = BaseConfig.App(new string[] { "SendTemplateMsgAudited", "first" }); string remark = BaseConfig.App(new string[] { "SendTemplateMsgAudited", "remark" }); AizhuhotelHelper.SendTemplateMsg(user, template_id, url, first, remark, keydows.ToArray()); } } catch (Exception) { } } /// /// 抄送 消息模板 /// /// 接收人程序openid private void SetCopyMsg(string wxSericeOpenId) { try { string AppId = BaseConfig.App(new string[] { "WeChatService", "AppId" }); if (AppId == "wx3f193488e04b2ed8") { // 江南春 List keydows = new List(); keydows.Add("收到一条新的OA预定抄送"); keydows.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); var first = "您收到一条新的OA预定抄送"; var remark = "点击查看结果"; AizhuhotelHelper.SendTemplateMsg(wxSericeOpenId, "G1L7IvGNZGmSKlgsiYNr1iDtGLLVJ8ZKAKDB525HEA0", "pages/index/index?status=6&hotelid=85217777", first, remark, keydows.ToArray()); } else if (AppId == "wx2b6e92e9e0c6025f") { // 香堤湾 List keydows = new List(); keydows.Add("收到一条新的OA预定抄送"); keydows.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); var first = "您收到一条新的OA预定抄送"; var remark = "点击查看结果"; AizhuhotelHelper.SendTemplateMsg(wxSericeOpenId, "G1L7IvGNZGmSKlgsiYNr1iDtGLLVJ8ZKAKDB525HEA0", "pages/index/index?status=6&hotelid=85216666", first, remark, keydows.ToArray()); } else if (AppId == "wx1f646438a23bd3bc") { // 爱住网 List keydows = new List(); keydows.Add("收到一条新的OA预定抄送"); keydows.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm")); var first = "您收到一条新的OA预定抄送"; var remark = "点击查看结果"; AizhuhotelHelper.SendTemplateMsg(wxSericeOpenId, "DYuAAPUkuy5BCRmZ4jAfsIBuT5_xsisVIFD3nnL9MdA", "pages/index/index?status=6&hotelid=oatest", first, remark, keydows.ToArray()); } } catch (Exception ex) { _logger.Error(ex.ToString()); } } } }