using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using NCC.Common.Extension; using NCC.Common.Core.Manager; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.Common; using NCC.Extend.Entitys.Dto.LqMdRoom; using NCC.Extend.Entitys.Enum; using NCC.Extend.Entitys.lq_md_room; using NCC.Extend.Entitys.lq_mdxx; using NCC.Extend.Interfaces.LqMdRoom; using NCC.FriendlyException; using SqlSugar; using Yitter.IdGenerator; namespace NCC.Extend.LqMdRoom { /// /// 门店房间维护(供预约等按门店选择房间) /// [ApiDescriptionSettings(Tag = "绿纤门店房间", Name = "LqMdRoom", Order = 201)] [Route("api/Extend/[controller]")] public class LqMdRoomService : ILqMdRoomService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _roomRepository; private readonly SqlSugarScope _db; private readonly IUserManager _userManager; /// /// 初始化 /// public LqMdRoomService(ISqlSugarRepository roomRepository, IUserManager userManager) { _roomRepository = roomRepository; _db = _roomRepository.Context; _userManager = userManager; } /// /// 房间类型下拉 /// [HttpGet("Selector/RoomType")] public List GetRoomTypeSelector() { return Enum.GetValues().Select(e => new EnumOutput { Value = (int)e, Name = e.ToString(), Description = e.GetDescription() }).ToList(); } /// /// 按门店查询房间列表(不分页,按排序号、名称) /// /// 门店ID [HttpGet("GetByStoreId")] public async Task GetByStoreId([FromQuery] string storeId) { if (string.IsNullOrWhiteSpace(storeId)) { throw NCCException.Oh("门店ID不能为空"); } var storeOk = await _db.Queryable().AnyAsync(x => x.Id == storeId); if (!storeOk) { throw NCCException.Oh("门店不存在"); } // 先查实体再映射:避免 SqlSugar 直接 Select 到 DTO 时映射/SQL 异常导致列表为空 var entities = await _db.Queryable() .Where(x => x.StoreId == storeId) .OrderBy(x => x.SortNo) .OrderBy(x => x.RoomName) .ToListAsync(); var list = entities.Select(x => new LqMdRoomListOutput { id = x.Id, storeId = x.StoreId, roomName = x.RoomName, sortNo = x.SortNo, enabled = x.Enabled, roomType = x.RoomType, capacity = x.Capacity, remark = x.Remark, createTime = x.CreateTime, lastModifyTime = x.LastModifyTime }).ToList(); return new { list }; } /// /// 按门店保存房间列表(增量:提交中未包含的已有记录将删除;无 id 行为新增) /// [HttpPost("SaveByStore")] public async Task SaveByStore([FromBody] LqMdRoomSaveInput input) { _ = await _userManager.GetUserInfo(); if (input == null || string.IsNullOrWhiteSpace(input.storeId)) { throw NCCException.Oh("门店ID不能为空"); } var storeOk = await _db.Queryable().AnyAsync(x => x.Id == input.storeId); if (!storeOk) { throw NCCException.Oh("门店不存在"); } var rawRows = input.rooms ?? new List(); var rows = rawRows .Where(r => r != null && !string.IsNullOrWhiteSpace(r.roomName)) .Select(r => new LqMdRoomItemInput { id = string.IsNullOrWhiteSpace(r.id) ? null : r.id.Trim(), roomName = r.roomName.Trim(), sortNo = r.sortNo, enabled = r.enabled, roomType = r.roomType, capacity = r.capacity, remark = string.IsNullOrWhiteSpace(r.remark) ? null : r.remark.Trim() }) .ToList(); if (rows.Count > 200) { throw NCCException.Oh("单个门店房间数量不能超过200条"); } foreach (var r in rows) { if (r.roomName.Length > 64) { throw NCCException.Oh("房间名称长度不能超过64个字符"); } var rt = r.roomType ?? (int)LqStoreRoomTypeEnum.其他; if (!Enum.IsDefined(typeof(LqStoreRoomTypeEnum), rt)) { throw NCCException.Oh("房间类型不合法"); } if (r.remark != null && r.remark.Length > 500) { throw NCCException.Oh("备注长度不能超过500个字符"); } if (r.capacity != null && (r.capacity < 0 || r.capacity > 999)) { throw NCCException.Oh("可容纳人数应在0~999之间"); } } var now = DateTime.Now; var incomingIds = rows.Where(x => !string.IsNullOrEmpty(x.id)).Select(x => x.id).ToList(); var existing = await _db.Queryable() .Where(x => x.StoreId == input.storeId) .ToListAsync(); try { _db.BeginTran(); var idsToDelete = existing.Select(x => x.Id).Except(incomingIds).ToList(); if (idsToDelete.Count > 0) { await _db.Deleteable().In(x => x.Id, idsToDelete).ExecuteCommandAsync(); } foreach (var item in rows) { var en = (item.enabled ?? 1) == 0 ? 0 : 1; var sort = item.sortNo ?? 0; var rt = item.roomType ?? (int)LqStoreRoomTypeEnum.其他; if (!string.IsNullOrEmpty(item.id)) { var old = existing.FirstOrDefault(x => x.Id == item.id); if (old == null || old.StoreId != input.storeId) { throw NCCException.Oh($"房间不存在或不属于当前门店:{item.id}"); } old.RoomName = item.roomName; old.SortNo = sort; old.Enabled = en; old.RoomType = rt; old.Capacity = item.capacity; old.Remark = item.remark; old.LastModifyTime = now; await _db.Updateable(old).ExecuteCommandAsync(); } else { var entity = new LqMdRoomEntity { Id = YitIdHelper.NextId().ToString(), StoreId = input.storeId, RoomName = item.roomName, SortNo = sort, Enabled = en, RoomType = rt, Capacity = item.capacity, Remark = item.remark, CreateTime = now, LastModifyTime = now }; await _db.Insertable(entity).ExecuteCommandAsync(); } } _db.CommitTran(); } catch { _db.RollbackTran(); throw; } } } }