using Infrastructure.Attribute; using Quartz; using SqlSugar; using SqlSugar.IOC; using System; using System.Collections.Generic; using System.Globalization; using System.Threading.Tasks; using ZR.Model.MES.pro; using ZR.Model.MES.wms; namespace ZR.Tasks.TaskScheduler { /// /// 毛坯库存调试定时扣除 /// /// [AppService(ServiceType = typeof(Job_Blank), ServiceLifetime = LifeTime.Scoped)] public class Job_Blank : JobBase, IJob { //private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public async Task Execute(IJobExecutionContext context) { await ExecuteJob(context, async () => await Run()); } public async Task Run() { Console.WriteLine("=================执行毛坯调试自动出库==============="); await Task.Delay(1); //TODO 业务逻辑 DateTime nowTime = DateTime.Now; List proWorkorders = GetDodayWorkOrder(); if (proWorkorders.Count > 0) { int num = 0; foreach (var item in proWorkorders) { using (var _db = DbScoped.SugarScope) { _db.Ado.BeginTran(); var predicate = Expressionable .Create() .And(it => it.BlankNum == item.BlankNumber) .And(it => it.Type == (item.Remark1.Contains("返工") ? 2 : 1)) .ToExpression(); WmBlankInventory wmBlankInventory = _db.Queryable() .Where(predicate) .First(); if (wmBlankInventory != null) { int newQuantity = wmBlankInventory.Quantity ?? 0 - item.PreviousNumber; wmBlankInventory.Quantity = newQuantity; _db.Updateable(wmBlankInventory).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); WmBlankRecord res = new() { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkBlankInventoryId = wmBlankInventory.Id, BlankNum = wmBlankInventory.BlankNum, ChangeQuantity = item.PreviousNumber, Type = 2, Status = 1, ActionTime = nowTime, Remark = "自动添加备注:工单主键" + item.Id + ",上件数" + item.PreviousNumber + "每日调试自动毛坯出库。", CreatedBy = "系统", CreatedTime = nowTime }; //添加库存记录 _db.Insertable(res).ExecuteCommand(); _db.Ado.CommitTran(); num++; } else { Console.WriteLine("调试工单毛坯号异常:" + item.BlankNumber); _db.Ado.RollbackTran(); } } } Console.WriteLine("每日毛坯调试自动出库数:" + num); } else { Console.WriteLine("无调试工单"); } } /// /// 获取今日带调试的工单列表 /// /// private List GetDodayWorkOrder() { try { var today = DateTime.Now; int year = today.Year; int week = GetWeekOfYear(today); int date = ConvertDayOfWeekToCustomFormat(today.DayOfWeek); using (var _db = DbScoped.SugarScope) { var predicate = Expressionable .Create() .And(it => it.Year == year) .And(it => it.Week == week) .And(it => it.Date == date) .And(it => !it.Remark1.Contains("不扣")) .And(it => it.Remark2.Contains("调试")) // .And(it => it.Remark3 == "是") .ToExpression(); return _db.Queryable() .Where(predicate) .OrderBy(it => it.Sort) .ToList(); } } catch (Exception) { return null; } } /// /// 获取今天是本年的第几周 /// /// /// static int GetWeekOfYear(DateTime date) { // 使用ISO 8601标准计算一年中的第几周 return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear( date, CalendarWeekRule.FirstFourDayWeek, // 每年的第一周必须至少有4天属于该年 DayOfWeek.Monday ); // 设置一周的第一天为星期一 } /// /// 获取星期几的数字(7为周日) /// /// /// static int ConvertDayOfWeekToCustomFormat(DayOfWeek dayOfWeek) { // 将 DayOfWeek 枚举值转换为自定义格式:周一为1,周日为7 if (dayOfWeek == DayOfWeek.Sunday) { return 7; } else { return (int)dayOfWeek; } } } }