using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using NCC.Common.Core.Manager; using NCC.Common.Enum; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys.Dto.LqCompanyCalendar; using NCC.Extend.Entitys.Enum; using NCC.Extend.Entitys.lq_company_calendar; using NCC.Extend.Interfaces.LqCompanyCalendar; using NCC.FriendlyException; using SqlSugar; using Yitter.IdGenerator; namespace NCC.Extend { /// /// 公司日历服务 /// [ApiDescriptionSettings(Tag = "绿纤公司日历管理", Name = "LqCompanyCalendar", Order = 200)] [Route("api/Extend/LqCompanyCalendar")] public class LqCompanyCalendarService : IDynamicApiController, ITransient, ILqCompanyCalendarService { private readonly IUserManager _userManager; private readonly ILogger _logger; private readonly ISqlSugarClient _db; /// /// 构造函数 /// public LqCompanyCalendarService(IUserManager userManager, ILogger logger, ISqlSugarClient db) { _userManager = userManager; _logger = logger; _db = db; } #region 事件类型管理 /// /// 获取事件类型列表 /// [HttpPost("GetEventTypeList")] public async Task> GetEventTypeListAsync([FromBody] LqCompanyCalendarTypeQueryInput input) { try { var query = _db.Queryable() .Where(x => x.IsEffective == StatusEnum.有效.GetHashCode()); if (!string.IsNullOrWhiteSpace(input?.TypeName)) { query = query.Where(x => x.TypeName.Contains(input.TypeName)); } var list = await query.OrderBy(x => x.SortCode).ToListAsync(); return list.Select(x => new LqCompanyCalendarTypeOutput { Id = x.Id, TypeName = x.TypeName, TypeCode = x.TypeCode, Color = x.Color, SortCode = x.SortCode, CreateTime = x.CreateTime }).ToList(); } catch (Exception ex) { _logger.LogError(ex, "获取事件类型列表失败"); throw NCCException.Oh($"获取失败:{ex.Message}"); } } /// /// 创建事件类型 /// [HttpPost("CreateEventType")] public async Task CreateEventTypeAsync([FromBody] LqCompanyCalendarTypeCreateInput input) { try { var exists = await _db.Queryable() .Where(x => x.TypeCode == input.TypeCode && x.IsEffective == StatusEnum.有效.GetHashCode()) .AnyAsync(); if (exists) { throw NCCException.Oh("类型编码已存在"); } var id = YitIdHelper.NextId().ToString(); var entity = new LqCompanyCalendarTypeEntity { Id = id, TypeName = input.TypeName, TypeCode = input.TypeCode, Color = input.Color, SortCode = input.SortCode, IsEffective = StatusEnum.有效.GetHashCode(), CreateUser = _userManager.UserId, CreateTime = DateTime.Now }; await _db.Insertable(entity).ExecuteCommandAsync(); return id; } catch (Exception ex) { _logger.LogError(ex, "创建事件类型失败"); throw NCCException.Oh($"创建失败:{ex.Message}"); } } /// /// 更新事件类型 /// [HttpPost("UpdateEventType")] public async Task UpdateEventTypeAsync([FromBody] LqCompanyCalendarTypeUpdateInput input) { try { var entity = await _db.Queryable() .Where(x => x.Id == input.Id && x.IsEffective == StatusEnum.有效.GetHashCode()) .FirstAsync(); if (entity == null) { throw NCCException.Oh("事件类型不存在或已失效"); } var codeExists = await _db.Queryable() .Where(x => x.TypeCode == input.TypeCode && x.Id != input.Id && x.IsEffective == StatusEnum.有效.GetHashCode()) .AnyAsync(); if (codeExists) { throw NCCException.Oh("类型编码已存在"); } entity.TypeName = input.TypeName; entity.TypeCode = input.TypeCode; entity.Color = input.Color; entity.SortCode = input.SortCode; entity.UpdateUser = _userManager.UserId; entity.UpdateTime = DateTime.Now; await _db.Updateable(entity).ExecuteCommandAsync(); return true; } catch (Exception ex) { _logger.LogError(ex, "更新事件类型失败"); throw NCCException.Oh($"更新失败:{ex.Message}"); } } /// /// 删除事件类型 /// [HttpPost("DeleteEventType/{id}")] public async Task DeleteEventTypeAsync(string id) { try { var hasEvents = await _db.Queryable() .Where(x => x.EventType == id && x.IsEffective == StatusEnum.有效.GetHashCode()) .AnyAsync(); if (hasEvents) { throw NCCException.Oh("该类型下存在事件,无法删除"); } var entity = await _db.Queryable() .Where(x => x.Id == id && x.IsEffective == StatusEnum.有效.GetHashCode()) .FirstAsync(); if (entity == null) { throw NCCException.Oh("事件类型不存在或已失效"); } entity.IsEffective = StatusEnum.无效.GetHashCode(); entity.UpdateUser = _userManager.UserId; entity.UpdateTime = DateTime.Now; await _db.Updateable(entity).ExecuteCommandAsync(); return true; } catch (Exception ex) { _logger.LogError(ex, "删除事件类型失败"); throw NCCException.Oh($"删除失败:{ex.Message}"); } } #endregion #region 事件管理 /// /// 获取公司日历事件列表(分页) /// [HttpPost("GetCalendarEvents")] public async Task GetCalendarEventsAsync([FromBody] LqCompanyCalendarQueryInput input) { try { var page = input.CurrentPage < 1 ? 1 : input.CurrentPage; var pageSize = input.PageSize < 1 ? 20 : (input.PageSize > 100 ? 100 : input.PageSize); var query = _db.Queryable() .Where(x => x.IsEffective == StatusEnum.有效.GetHashCode()); if (input.StartTime.HasValue) { query = query.Where(x => x.EndTime >= input.StartTime.Value); } if (input.EndTime.HasValue) { query = query.Where(x => x.StartTime <= input.EndTime.Value); } if (!string.IsNullOrWhiteSpace(input.EventType)) { query = query.Where(x => x.EventType == input.EventType); } if (!string.IsNullOrWhiteSpace(input.StoreId)) { query = query.Where(x => x.StoreId == input.StoreId); } var total = await query.CountAsync(); var list = await query.OrderBy(x => x.StartTime, OrderByType.Desc) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); var typeIds = list.Select(x => x.EventType).Distinct().ToList(); var types = await _db.Queryable() .Where(x => typeIds.Contains(x.Id) && x.IsEffective == StatusEnum.有效.GetHashCode()) .ToListAsync(); var typeMap = types.ToDictionary(x => x.Id, x => x); return new LqCompanyCalendarPageOutput { List = list.Select(x => { var type = typeMap.ContainsKey(x.EventType) ? typeMap[x.EventType] : null; return new LqCompanyCalendarOutput { Id = x.Id, Title = x.Title, EventType = x.EventType, EventTypeName = type?.TypeName ?? "", EventTypeColor = type?.Color ?? "#3b82f6", Date = x.StartTime.ToString("yyyy-MM-dd"), Start = x.StartTime.ToString("yyyy-MM-ddTHH:mm:ss"), End = x.EndTime.ToString("yyyy-MM-ddTHH:mm:ss"), Desc = x.Description, StoreId = x.StoreId, Store = x.StoreName, Remark = x.Remark, Attachments = x.Attachments, CreateUser = x.CreateUser, CreateTime = x.CreateTime }; }).ToList(), Total = total }; } catch (Exception ex) { _logger.LogError(ex, "获取公司日历事件列表失败"); throw NCCException.Oh($"获取失败:{ex.Message}"); } } /// /// 获取公司日历事件列表(不分页,用于日历展示) /// [HttpPost("GetCalendarEventList")] public async Task> GetCalendarEventListAsync([FromBody] LqCompanyCalendarQueryInput input) { try { var query = _db.Queryable() .Where(x => x.IsEffective == StatusEnum.有效.GetHashCode()); if (input.StartTime.HasValue) { query = query.Where(x => x.EndTime >= input.StartTime.Value); } if (input.EndTime.HasValue) { query = query.Where(x => x.StartTime <= input.EndTime.Value); } if (!string.IsNullOrWhiteSpace(input.EventType)) { query = query.Where(x => x.EventType == input.EventType); } if (!string.IsNullOrWhiteSpace(input.StoreId)) { query = query.Where(x => x.StoreId == input.StoreId); } var list = await query.OrderBy(x => x.StartTime).ToListAsync(); var typeIds = list.Select(x => x.EventType).Distinct().ToList(); var types = await _db.Queryable() .Where(x => typeIds.Contains(x.Id) && x.IsEffective == StatusEnum.有效.GetHashCode()) .ToListAsync(); var typeMap = types.ToDictionary(x => x.Id, x => x); return list.Select(x => { var type = typeMap.ContainsKey(x.EventType) ? typeMap[x.EventType] : null; return new LqCompanyCalendarOutput { Id = x.Id, Title = x.Title, EventType = x.EventType, EventTypeName = type?.TypeName ?? "", EventTypeColor = type?.Color ?? "#3b82f6", Date = x.StartTime.ToString("yyyy-MM-dd"), Start = x.StartTime.ToString("yyyy-MM-ddTHH:mm:ss"), End = x.EndTime.ToString("yyyy-MM-ddTHH:mm:ss"), Desc = x.Description, StoreId = x.StoreId, Store = x.StoreName, Remark = x.Remark, Attachments = x.Attachments, CreateUser = x.CreateUser, CreateTime = x.CreateTime }; }).ToList(); } catch (Exception ex) { _logger.LogError(ex, "获取公司日历事件列表失败"); throw NCCException.Oh($"获取失败:{ex.Message}"); } } /// /// 创建公司日历事件 /// [HttpPost("CreateCalendarEvent")] public async Task CreateCalendarEventAsync([FromBody] LqCompanyCalendarCreateInput input) { try { var id = YitIdHelper.NextId().ToString(); var entity = new LqCompanyCalendarEntity { Id = id, Title = input.Title, EventType = input.EventType, StartTime = input.StartTime, EndTime = input.EndTime, Description = input.Description, StoreId = input.StoreId, StoreName = input.StoreName, Remark = input.Remark, Attachments = input.Attachments, IsEffective = StatusEnum.有效.GetHashCode(), CreateUser = _userManager.UserId, CreateTime = DateTime.Now }; await _db.Insertable(entity).ExecuteCommandAsync(); return id; } catch (Exception ex) { _logger.LogError(ex, "创建公司日历事件失败"); throw NCCException.Oh($"创建失败:{ex.Message}"); } } /// /// 更新公司日历事件 /// [HttpPost("UpdateCalendarEvent")] public async Task UpdateCalendarEventAsync([FromBody] LqCompanyCalendarUpdateInput input) { try { var entity = await _db.Queryable() .Where(x => x.Id == input.Id && x.IsEffective == StatusEnum.有效.GetHashCode()) .FirstAsync(); if (entity == null) { throw NCCException.Oh("事件不存在或已失效"); } entity.Title = input.Title; entity.EventType = input.EventType; entity.StartTime = input.StartTime; entity.EndTime = input.EndTime; entity.Description = input.Description; entity.StoreId = input.StoreId; entity.StoreName = input.StoreName; entity.Remark = input.Remark; entity.Attachments = input.Attachments; entity.UpdateUser = _userManager.UserId; entity.UpdateTime = DateTime.Now; await _db.Updateable(entity).ExecuteCommandAsync(); return true; } catch (Exception ex) { _logger.LogError(ex, "更新公司日历事件失败"); throw NCCException.Oh($"更新失败:{ex.Message}"); } } /// /// 删除公司日历事件 /// [HttpPost("DeleteCalendarEvent/{id}")] public async Task DeleteCalendarEventAsync(string id) { try { var entity = await _db.Queryable() .Where(x => x.Id == id && x.IsEffective == StatusEnum.有效.GetHashCode()) .FirstAsync(); if (entity == null) { throw NCCException.Oh("事件不存在或已失效"); } entity.IsEffective = StatusEnum.无效.GetHashCode(); entity.UpdateUser = _userManager.UserId; entity.UpdateTime = DateTime.Now; await _db.Updateable(entity).ExecuteCommandAsync(); return true; } catch (Exception ex) { _logger.LogError(ex, "删除公司日历事件失败"); throw NCCException.Oh($"删除失败:{ex.Message}"); } } #endregion } }