using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.HybridCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using MMDAL.CustomCode.Scheduling; using MMDAL.DTO.Scheduling; using static GB5Shared.GB5Constant.Constant; namespace MMBLL.Scheduling { public class WorkCenterShiftMapBLL : IWorkCenterShiftMapBLL { private readonly IWorkCenterShiftMapDAL _WorkCenterShiftMapDAL; private readonly AutoNumber _AutoNumber; private readonly IQueryExecutor _QueryExecutor; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; public WorkCenterShiftMapBLL( IWorkCenterShiftMapDAL workCenterShiftMapDAL, AutoNumber autoNumber, IQueryExecutor queryExecutor, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService) { _WorkCenterShiftMapDAL = workCenterShiftMapDAL; _AutoNumber = autoNumber; _QueryExecutor = queryExecutor; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; } // ── Reads ───────────────────────────────────────────────────────── public async Task GetShiftMap( int shiftMapId, LoginDTO loginDTO, CancellationToken ct = default) { try { return await _WorkCenterShiftMapDAL .GetShiftMap(shiftMapId, loginDTO, ct) .ConfigureAwait(false); } catch (Exception) { throw; } } public async Task> GetShiftMapList( int workCenterId, LoginDTO loginDTO, CancellationToken ct = default) { try { return await _WorkCenterShiftMapDAL .GetShiftMapList(workCenterId, loginDTO, ct) .ConfigureAwait(false); } catch (Exception) { throw; } } public async Task> GetShiftMapForDate( int workCenterId, DateTime scheduleDate, byte dayOfWeek, LoginDTO loginDTO, CancellationToken ct = default) { try { return await _WorkCenterShiftMapDAL .GetShiftMapForDate(workCenterId, scheduleDate, dayOfWeek, loginDTO, ct) .ConfigureAwait(false); } catch (Exception) { throw; } } // ── Save (insert or update) ─────────────────────────────────────── public async Task SaveShiftMap(WorkCenterShiftMapDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { bool isNew = dto.ShiftMapId == 0; if (isNew) { var auto = await _AutoNumber.GetNumberAsync( 1, AUTONUMBERCONSTANT.SHIFTMAP, loginDTO); dto.ShiftMapId = auto.StartNumber; } await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTSHIFTMAP, EventTypeConstant.SAVESHIFTMAPEVENTTYPEID, dto, loginDTO, async tx => { var result = isNew ? await _WorkCenterShiftMapDAL.SaveShiftMap(dto, loginDTO, tx) : await _WorkCenterShiftMapDAL.UpdateShiftMap(dto, loginDTO, tx); return dto.ShiftMapId; }, null, -1, -1, Trans); await _QueryExecutor.CommitAsync(Trans); var cacheKey = CacheKeyGenerator.KeyGeneration( dto.ShiftMapId, EntityConstant.OBJECTSHIFTMAP, CacheKeyLevel.CLIENT_LEVEL,null!, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey); return isNew ? SuccessResponse.SaveSuccess : SuccessResponse.UpdateSuccess; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } // ── Delete ──────────────────────────────────────────────────────── public async Task DeleteShiftMap(int shiftMapId, LoginDTO loginDTO) { var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTSHIFTMAP, EventTypeConstant.DELETESHIFTMAPEVENTTYPEID, new WorkCenterShiftMapDTO { ShiftMapId = shiftMapId }, loginDTO, async tx => { await _WorkCenterShiftMapDAL.DeleteShiftMap(shiftMapId, loginDTO, tx); return shiftMapId; }, null, -1, -1, Trans); await _QueryExecutor.CommitAsync(Trans); var cacheKey = CacheKeyGenerator.KeyGeneration( shiftMapId, EntityConstant.OBJECTSHIFTMAP, CacheKeyLevel.CLIENT_LEVEL,null!, loginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey); return SuccessResponse.DeleteSuccessMessage; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } } }