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;
}
}
}