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.SQ; using CoreCms.Net.Services; using CoreCms.Net.Utility.Helper; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace CoreCms.Net.Services { /// /// 房间时段价格服务实现 /// public class SQRoomPricingServices : BaseServices, ISQRoomPricingServices { private readonly ISQRoomPricingRepository _pricingRepository; private readonly IUnitOfWork _unitOfWork; public SQRoomPricingServices(IUnitOfWork unitOfWork, ISQRoomPricingRepository pricingRepository) { _unitOfWork = unitOfWork; _pricingRepository = pricingRepository; BaseDal = pricingRepository; } /// /// 获取房间指定时段的价格配置 /// public async Task GetRoomPricingAsync(int roomId, int timeSlotType, DateTime? date = null) { // 构建查询条件 var where = PredicateBuilder.True(); where = where.And(p => p.room_id == roomId); where = where.And(p => p.time_slot_type == timeSlotType); where = where.And(p => p.is_active == true); if (date.HasValue) { var queryDate = date.Value.Date; // 优先查询有日期范围的价格配置 var dateRangePricing = await _pricingRepository.QueryByClauseAsync( p => p.room_id == roomId && p.time_slot_type == timeSlotType && p.is_active == true && p.effective_date_start <= queryDate && p.effective_date_end >= queryDate, p => p.id, OrderByType.Desc); if (dateRangePricing != null) { return dateRangePricing; } } // 查询默认价格配置(日期范围为NULL) where = where.And(p => p.effective_date_start == null && p.effective_date_end == null); return await _pricingRepository.QueryByClauseAsync(where, p => p.id, OrderByType.Desc); } /// /// 获取房间所有时段的价格配置 /// public async Task> GetRoomAllPricingAsync(int roomId, DateTime? date = null) { var result = new List(); // 获取4个时段的价格配置 for (int i = 0; i <= 3; i++) { var pricing = await GetRoomPricingAsync(roomId, i, date); if (pricing != null) { result.Add(pricing); } } return result; } /// /// 设置房间时段价格 /// public async Task SetRoomPricingAsync(SetRoomPricingDto dto) { // 检查是否已存在相同配置 var existing = await _pricingRepository.QueryByClauseAsync( p => p.room_id == dto.room_id && p.time_slot_type == dto.time_slot_type && p.effective_date_start == dto.effective_date_start && p.effective_date_end == dto.effective_date_end, p => p.id, OrderByType.Desc); if (existing != null) { // 更新现有配置 existing.standard_price = dto.standard_price; existing.member_price = dto.member_price; existing.price_desc_standard = dto.price_desc_standard ?? $"{dto.standard_price}元/时段"; existing.price_desc_member = dto.price_desc_member ?? $"{dto.member_price}元/时段"; existing.updated_at = DateTime.Now; return await _pricingRepository.UpdateAsync(existing); } else { // 创建新配置 var pricing = new SQRoomPricing { room_id = dto.room_id, time_slot_type = dto.time_slot_type, standard_price = dto.standard_price, member_price = dto.member_price, price_desc_standard = dto.price_desc_standard ?? $"{dto.standard_price}元/时段", price_desc_member = dto.price_desc_member ?? $"{dto.member_price}元/时段", effective_date_start = dto.effective_date_start, effective_date_end = dto.effective_date_end, is_active = true, created_at = DateTime.Now, updated_at = DateTime.Now }; var id = await _pricingRepository.InsertAsync(pricing); return id > 0; } } /// /// 批量设置房间价格 /// public async Task BatchSetRoomPricingAsync(BatchSetRoomPricingDto dto) { if (dto.room_ids == null || dto.room_ids.Count == 0) { return false; } try { foreach (var roomId in dto.room_ids) { var singleDto = new SetRoomPricingDto { room_id = roomId, time_slot_type = dto.time_slot_type, standard_price = dto.standard_price, member_price = dto.member_price, price_desc_standard = dto.price_desc_standard, price_desc_member = dto.price_desc_member, effective_date_start = dto.effective_date_start, effective_date_end = dto.effective_date_end }; await SetRoomPricingAsync(singleDto); } return true; } catch { return false; } } /// /// 获取房间价格列表(含时段名称) /// public async Task> GetRoomPricingListAsync(int roomId) { var pricingList = await GetRoomAllPricingAsync(roomId); var result = pricingList.Select(p => new SQRoomPricingDto { id = p.id, room_id = p.room_id, time_slot_type = p.time_slot_type, time_slot_name = TimeSlotHelper.GetTimeSlotName(p.time_slot_type), standard_price = p.standard_price, member_price = p.member_price, price_desc_standard = p.price_desc_standard, price_desc_member = p.price_desc_member, effective_date_start = p.effective_date_start, effective_date_end = p.effective_date_end, is_active = p.is_active, created_at = p.created_at, updated_at = p.updated_at }).ToList(); return result; } /// /// 设置节假日价格 /// public async Task SetHolidayPricingAsync(SetHolidayPricingDto dto) { if (dto.slot_prices == null || dto.slot_prices.Count == 0) { return false; } try { // 如果没有指定房间,则获取所有房间 var roomIds = dto.room_ids; if (roomIds == null || roomIds.Count == 0) { // 这里需要注入房间服务来获取所有房间,暂时简化处理 return false; } foreach (var roomId in roomIds) { foreach (var slotPrice in dto.slot_prices) { var setDto = new SetRoomPricingDto { room_id = roomId, time_slot_type = slotPrice.time_slot_type, standard_price = slotPrice.standard_price, member_price = slotPrice.member_price, price_desc_standard = $"{slotPrice.standard_price}元/时段({dto.holiday_name})", price_desc_member = $"{slotPrice.member_price}元/时段({dto.holiday_name})", effective_date_start = dto.start_date, effective_date_end = dto.end_date }; await SetRoomPricingAsync(setDto); } } return true; } catch { return false; } } /// /// 查询某房间某日期的节假日价格列表 /// public async Task> GetHolidayPricingByDateAsync(int roomId, DateTime date) { var queryDate = date.Date; // 查询该日期的节假日价格(有日期范围的价格配置) var holidayPricing = await _pricingRepository.QueryListByClauseAsync( p => p.room_id == roomId && p.effective_date_start != null && p.effective_date_end != null && p.effective_date_start <= queryDate && p.effective_date_end >= queryDate && p.is_active == true, p => p.time_slot_type, OrderByType.Asc ); return holidayPricing ?? new List(); } /// /// 删除某房间某日期的节假日价格 /// public async Task DeleteHolidayPricingAsync(int roomId, DateTime date) { try { var queryDate = date.Date; // 查询该日期的节假日价格 var holidayPricing = await GetHolidayPricingByDateAsync(roomId, queryDate); if (holidayPricing == null || holidayPricing.Count == 0) { return true; // 没有数据,直接返回成功 } // 删除所有节假日价格记录 var ids = holidayPricing.Select(p => p.id).ToArray(); return await _pricingRepository.DeleteByIdsAsync(ids); } catch { return false; } } /// /// 检查某房间某日期是否设置了节假日价格 /// public async Task HasHolidayPricingAsync(int roomId, DateTime date) { var holidayPricing = await GetHolidayPricingByDateAsync(roomId, date); return holidayPricing != null && holidayPricing.Count > 0; } } }