using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aop.Api.Domain; using Aspose.Cells.Drawing; using JNPF.Common.Core.Manager; using JNPF.Common.Models.VisualDev; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.JsonSerialization; using JNPF.Systems.Interfaces.System; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula.Functions; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.BasicData.Entities.Dto; using Tnb.BasicData.Entities.Dto.BasCalendar; using Tnb.BasicData.Entities.Enums; using Tnb.BasicData.Interfaces; namespace Tnb.BasicData { /// /// 工作日管理 /// [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] [Route("api/[area]/[controller]/[action]")] public class BasCalendarService: IBasCalendarService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _repository; private readonly IUserManager _userManager; public BasCalendarService(ISqlSugarRepository repository, IUserManager userManager) { _repository = repository; _userManager = userManager; } /// /// 保存工作日历 /// /// /// [HttpPost] public async Task SaveData(CalendarInput CalendarInput) { var db = _repository.AsSugarClient(); await db.Deleteable(p=>p.datetext== CalendarInput.datetext).ExecuteCommandAsync(); BasCalendar BasCalendar = new BasCalendar(); BasCalendar.datetext = CalendarInput.datetext; BasCalendar.datetype = CalendarInput.datetype; BasCalendar.workhour = CalendarInput.workhour; BasCalendar.worktype = CalendarInput.worktype; BasCalendar.create_id = _userManager.UserId; BasCalendar.create_time = DateTime.Now; await db.Insertable(BasCalendar).ExecuteCommandAsync(); } /// /// 获取工作日历 /// /// [HttpPost] public async Task GetWorkData(CalendarInput CalendarInput) { List CalendarOuts = new List(); if (CalendarInput.calendartype == (int)EnumCalendarType.分类) { var db = _repository.AsSugarClient(); var lists = await db.Queryable().Where(p => p.worktype == CalendarInput.worktype).ToListAsync(); foreach (var list in lists) { CalendarOut CalendarOut = new CalendarOut(); CalendarOut.datetext = list.datetext; CalendarOut.datetype = list.datetype; CalendarOut.workhour = JSON.Deserialize>(list.workhour); CalendarOut.worktype = list.worktype; CalendarOuts.Add(CalendarOut); } } else if (CalendarInput.calendartype == (int)EnumCalendarType.班组) { var db = _repository.AsSugarClient(); var Shifts = await db.Queryable().Where(p => p.workgroup_id == CalendarInput.workgroupid).Select(p=>p.shift_id).ToListAsync(); if (Shifts != null && Shifts.Count > 0) { var BasTimePeriods = await db.Queryable((a, b) => new object[] { JoinType.Inner, a.shifttype_id == b.id }) .Where((a,b) => Shifts.Contains(a.shifttype_id!)) .Select((a, b) => new Shift { startday = b.shiftb_time, endday = b.shifte_time, workhour = new WorkHour { start=a.tpb_time,end=a.tpe_time }, } ).ToListAsync(); var BasTimePeriodRests = await db.Queryable((a, b) => new object[] { JoinType.Inner, a.shift_type_id == b.id }) .Where((a, b) => Shifts.Contains(a.shift_type_id!)) .Select((a, b) => new Shift { startday = b.shiftb_time, endday = b.shifte_time, workhour = new WorkHour { start = a.tp_b_time, end = a.tp_e_time }, }).ToListAsync(); foreach (var BasTimePeriod in BasTimePeriods) { var start = DateTime.Parse(BasTimePeriod.startday!); var end = DateTime.Parse(BasTimePeriod.endday!); for (DateTime date = start; date <= end; date = date.AddDays(1)) { if (CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).Any()) CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).First().workhour!.Add(BasTimePeriod.workhour!); else { CalendarOut CalendarOut = new CalendarOut(); CalendarOut.datetext = date.ToString("yyyy-MM-dd"); CalendarOut.datetype = "workDay"; CalendarOut.workhour = new List { BasTimePeriod.workhour }; CalendarOuts.Add(CalendarOut); } } } foreach (var BasTimePeriodRest in BasTimePeriodRests) { var start = DateTime.Parse(BasTimePeriodRest.startday!); var end = DateTime.Parse(BasTimePeriodRest.endday!); for (DateTime date = start; date <= end; date = date.AddDays(1)) { if (CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).Any()) CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).First().workhour!.Add(BasTimePeriodRest.workhour!); else { CalendarOut CalendarOut = new CalendarOut(); CalendarOut.datetext = date.ToString("yyyy-MM-dd"); CalendarOut.datetype = "dayOff"; CalendarOut.workhour = new List { BasTimePeriodRest.workhour! }; CalendarOuts.Add(CalendarOut); } } } } } else if (CalendarInput.calendartype == (int)EnumCalendarType.个人) { var db = _repository.AsSugarClient(); var groups = await db.Queryable().Where(p => p.employee_id == CalendarInput.userid).Select(p => p.group_id).ToListAsync(); var Shifts = await db.Queryable().Where(p => groups.Contains(p.workgroup_id)).Select(p => p.shift_id).ToListAsync(); if (Shifts != null && Shifts.Count > 0) { var BasTimePeriods = await db.Queryable((a, b) => new object[] { JoinType.Inner, a.shifttype_id == b.id }) .Where((a, b) => Shifts.Contains(a.shifttype_id!)) .Select((a, b) => new Shift { startday = b.shiftb_time, endday = b.shifte_time, workhour = new WorkHour { start = a.tpb_time, end = a.tpe_time }, } ).ToListAsync(); var BasTimePeriodRests = await db.Queryable((a, b) => new object[] { JoinType.Inner, a.shift_type_id == b.id }) .Where((a, b) => Shifts.Contains(a.shift_type_id!)) .Select((a, b) => new Shift { startday = b.shiftb_time, endday = b.shifte_time, workhour = new WorkHour { start = a.tp_b_time, end = a.tp_e_time }, }).ToListAsync(); foreach (var BasTimePeriod in BasTimePeriods) { var start = DateTime.Parse(BasTimePeriod.startday!); var end = DateTime.Parse(BasTimePeriod.endday!); for (DateTime date = start; date <= end; date = date.AddDays(1)) { if (CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).Any()) CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).First().workhour!.Add(BasTimePeriod.workhour!); else { CalendarOut CalendarOut = new CalendarOut(); CalendarOut.datetext = date.ToString("yyyy-MM-dd"); CalendarOut.datetype = "workDay"; CalendarOut.workhour = new List { BasTimePeriod.workhour! }; CalendarOuts.Add(CalendarOut); } } } foreach (var BasTimePeriodRest in BasTimePeriodRests) { var start = DateTime.Parse(BasTimePeriodRest.startday!); var end = DateTime.Parse(BasTimePeriodRest.endday!); for (DateTime date = start; date <= end; date = date.AddDays(1)) { if (CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).Any()) CalendarOuts.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).First().workhour!.Add(BasTimePeriodRest.workhour!); else { CalendarOut CalendarOut = new CalendarOut(); CalendarOut.datetext = date.ToString("yyyy-MM-dd"); CalendarOut.datetype = "dayOff"; CalendarOut.workhour = new List { BasTimePeriodRest.workhour! }; CalendarOuts.Add(CalendarOut); } } } } } return CalendarOuts; } /// /// 批量保存工作日历 /// /// /// public async Task SaveBatchData(CalendarBatchInput CalendarBatchInput) { var db = _repository.AsSugarClient(); DateTime start = DateTime.Parse(CalendarBatchInput.startenday![0]); DateTime end = DateTime.Parse(CalendarBatchInput.startenday![1]); List BasCalendars = new List(); var lists=await db.Queryable().Where(p=>start<=DateTime.Parse(p.datetext!)&&end>= DateTime.Parse(p.datetext!)&& p.worktype== CalendarBatchInput.worktype).ToListAsync(); var updatelist=new List(); for (DateTime date = start; date <= end; date = date.AddDays(1)) { if (CalendarBatchInput.weekday!.Contains((int)date.DayOfWeek)) { if (lists.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).Any()) { var BasCalendar = lists.Where(p => p.datetext == date.ToString("yyyy-MM-dd")).First(); BasCalendar.datetype = CalendarBatchInput.datetype; updatelist.Add(BasCalendar); } else { BasCalendar BasCalendar = new BasCalendar(); BasCalendar.datetext = date.ToString("yyyy-MM-dd"); BasCalendar.datetype = CalendarBatchInput.datetype; BasCalendar.workhour = CalendarBatchInput.workhour; BasCalendar.worktype = CalendarBatchInput.worktype; BasCalendar.create_id = _userManager.UserId; BasCalendar.create_time = DateTime.Now; BasCalendars.Add(BasCalendar); } } } await db.Updateable(updatelist).ExecuteCommandAsync(); await db.Insertable(BasCalendars).ExecuteCommandAsync(); } } }