diff --git a/ZR.Service/mes/pro/ProWorkplanServiceV2.cs b/ZR.Service/mes/pro/ProWorkplanServiceV2.cs index 9ea18056..4bde8951 100644 --- a/ZR.Service/mes/pro/ProWorkplanServiceV2.cs +++ b/ZR.Service/mes/pro/ProWorkplanServiceV2.cs @@ -6,6 +6,7 @@ using Model.DBModel; using SqlSugar; using System; using System.IO; +using System.Linq; using ZR.Model.mes.pro; using ZR.Model.MES.pro.DTO; using ZR.Model.MES.wms; @@ -20,6 +21,12 @@ namespace ZR.Service.mes.pro public (List, int) GetAllData(int pageNum, int pageSize, int year, int week, string partNumber, string color) { + // 如果年份为空(小于等于0),使用当天的年份 + if (year <= 0) + { + year = DateTime.Now.Year; + } + var predicate = Expressionable.Create() .AndIF(year > 0, it => it.Year == year) .AndIF(week > 0, it => it.Week == week) @@ -31,7 +38,7 @@ namespace ZR.Service.mes.pro .Where(predicate) .OrderBy(it => it.Id) .ToPageList(pageNum, pageSize, ref totalCount); - // 计划正确性检查 + // 计划是否正确检查 List proWorkplanDtoList = new List(); foreach (ProWorklplan_v2 item in proWorkplanList) { @@ -77,69 +84,74 @@ namespace ZR.Service.mes.pro public int AddWorkPlan(ProWorklplan_v2 proWorkplan) { - proWorkplan.Id = "MP" + DateTime.Now.ToString("yyyyMMdd") + Getworkplanid_max().ToString("000"); - proWorkplan.Remark = "手动插入"; - return Context.Insertable(proWorkplan).ExecuteCommand(); - } - /// - /// 获取生产计划id - /// - /// - private int Getworkplanid_max() - { - - ProWorklplan_v2 max_workplan = Context.Queryable().OrderBy(it => it.Id, OrderByType.Desc).First(); - if (max_workplan != null && !string.IsNullOrEmpty(max_workplan.Id) && max_workplan.Id.Substring(2, 8) == DateTime.Now.ToString("yyyyMMdd")) + // 获取当前日期和周信息 + DateTime now = DateTime.Now; + int currentYear = now.Year; + int currentWeek = GetWeekNumber(now); + if (proWorkplan.Year <= 0) { - int num = Convert.ToInt32(max_workplan.Id.Substring(10)) + 1; - return num; + proWorkplan.Year = currentYear; + } + if (proWorkplan.Week <= 0) + { + proWorkplan.Week = currentWeek; + } + + string timeStr; + // 判断是否为本周 + if (proWorkplan.Year == currentYear && proWorkplan.Week == currentWeek) + { + // 本周使用当前日期 + timeStr = now.ToString("yyyyMMdd"); } else { - return 0; + // 非本周使用该周的周一日期(yyyyMMdd格式) + DateTime weekMonday = GetMondayOfWeek(proWorkplan.Year, proWorkplan.Week); + timeStr = weekMonday.ToString("yyyyMMdd"); } - - } - - // 修改 - public int UpdateWorkPlan(ProWorklplan_v2 proWorkplan) - { - - - - return Context.Updateable() - .SetColumns(it => new ProWorklplan_v2() - { - BlankNum = proWorkplan.BlankNum, - Partnumber = proWorkplan.Partnumber, - ProductName = proWorkplan.ProductName, - Specification = proWorkplan.Specification, - ColorCode = proWorkplan.ColorCode, - RequireNum = proWorkplan.RequireNum, - EveryHangerNum = proWorkplan.EveryHangerNum, - ProductionBeat = proWorkplan.ProductionBeat, - AllHangerNum = proWorkplan.AllHangerNum, - TurnNumber = proWorkplan.TurnNumber, - ProductTime = proWorkplan.ProductTime, - RequireHanger = proWorkplan.RequireHanger, - }) - .Where(it => it.Id == proWorkplan.Id) - .ExecuteCommand(); - } - - public int DeleteWorkPlan(string id) - { - return Context.Deleteable().In(id).ExecuteCommand(); + proWorkplan.Id = "MP" + timeStr + Getworkplanid_max(timeStr).ToString("000"); + proWorkplan.Remark = "手动插入"; + return Context.Insertable(proWorkplan).ExecuteCommand(); } public string ImportExceldata(List worklplanList) { - int max_id = Getworkplanid_max(); + if (worklplanList == null || worklplanList.Count == 0) + { + return "导入数据为空"; + } + + // 获取第一条数据的年份和周信息 + ProWorklplan_v2 firstPlan = worklplanList.First(); + int year = firstPlan.Year; + int week = firstPlan.Week; + + // 获取当前日期和周信息 + DateTime now = DateTime.Now; + int currentYear = now.Year; + int currentWeek = GetWeekNumber(now); + + string timeStr; + // 判断是否为本周 + if (year == currentYear && week == currentWeek) + { + // 本周使用当前日期 + timeStr = now.ToString("yyyyMMdd"); + } + else + { + // 非本周使用该周的周一日期(yyyyMMdd格式) + DateTime weekMonday = GetMondayOfWeek(year, week); + timeStr = weekMonday.ToString("yyyyMMdd"); + } + + int max_id = Getworkplanid_max(timeStr); worklplanList.ForEach(it => { - it.Id = "MP" + DateTime.Now.ToString("yyyyMMdd") + max_id.ToString("000"); + it.Id = "MP" + timeStr + max_id.ToString("000"); it.Remark = "Excel导入"; max_id++; }); @@ -147,7 +159,7 @@ namespace ZR.Service.mes.pro var x = Context.Storageable(worklplanList) .SplitUpdate(it => it.Any())//存在更新 .SplitInsert(it => true)//否则插入(更新优先级大于插入) - .WhereColumns(it => new { it.Year, it.Week, it.Partnumber })//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) + .WhereColumns(it => new { it.Id, it.Year, it.Week, it.Partnumber })//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) .ToStorage(); x.AsInsertable.ExecuteCommand();//插入可插入部分; @@ -175,6 +187,12 @@ namespace ZR.Service.mes.pro /// public (string, string) ExportExceldata(int year, int week) { + // 如果年份为空(小于等于0),使用当天的年份 + if (year <= 0) + { + year = DateTime.Now.Year; + } + //1.0 读取表数据 var list = Queryable().Where(it => it.Year == year && it.Week == week).ToList(); @@ -205,10 +223,6 @@ namespace ZR.Service.mes.pro //3.0 返回路径和文件名 return (sFileName, fullPath); - - - - } public List GetWorkorderListByPlanId(string id) @@ -223,7 +237,6 @@ namespace ZR.Service.mes.pro public int AddWorkorder(ProWorkorder proWorkorder) { - return Context.Insertable(proWorkorder).ExecuteCommand(); } @@ -237,15 +250,14 @@ namespace ZR.Service.mes.pro return Context.Deleteable().In(id).ExecuteCommand(); } - - - /// - /// 周计划汇总 - /// - /// - /// public WorkplanSummaryDto GetWeekSummary(int year, int week) { + // 如果年份为空(小于等于0),使用当天的年份 + if (year <= 0) + { + year = DateTime.Now.Year; + } + return Context.Queryable().Where(it => it.Year == year && it.Week == week) .GroupBy(it => new { it.Week }) .Select(it => new WorkplanSummaryDto @@ -257,18 +269,16 @@ namespace ZR.Service.mes.pro }) .First(); - - - } - /// - /// 删除周计划全部 - /// - /// - /// - /// + public int DeleteAllWorkPlan(int year, int week) { + // 如果年份为空(小于等于0),使用当天的年份 + if (year <= 0) + { + year = DateTime.Now.Year; + } + return Context.Deleteable().Where(it => it.Year == year && it.Week == week).ExecuteCommand(); } @@ -303,5 +313,116 @@ namespace ZR.Service.mes.pro } } + + // 修改 + public int UpdateWorkPlan(ProWorklplan_v2 proWorkplan) + { + return Context.Updateable() + .SetColumns(it => new ProWorklplan_v2() + { + BlankNum = proWorkplan.BlankNum, + Partnumber = proWorkplan.Partnumber, + ProductName = proWorkplan.ProductName, + Specification = proWorkplan.Specification, + ColorCode = proWorkplan.ColorCode, + RequireNum = proWorkplan.RequireNum, + EveryHangerNum = proWorkplan.EveryHangerNum, + ProductionBeat = proWorkplan.ProductionBeat, + AllHangerNum = proWorkplan.AllHangerNum, + TurnNumber = proWorkplan.TurnNumber, + ProductTime = proWorkplan.ProductTime, + RequireHanger = proWorkplan.RequireHanger, + }) + .Where(it => it.Id == proWorkplan.Id) + .ExecuteCommand(); + } + + public int DeleteWorkPlan(string id) + { + return Context.Deleteable().In(id).ExecuteCommand(); + } + + /// + /// 获取指定日期所在的周数(不依赖Globalization) + /// + private int GetWeekNumber(DateTime date) + { + // 每年1月1日所在的周可能属于上一年的最后一周 + // 这里简化处理,假设每年1月1日所在的周为第1周 + DateTime startOfYear = new DateTime(date.Year, 1, 1); + + // 计算与1月1日的天数差 + int daysDiff = (date - startOfYear).Days; + + // 计算1月1日是星期几 + int firstDayOfWeek = (int)startOfYear.DayOfWeek; + if (firstDayOfWeek == 0) firstDayOfWeek = 7; // 将Sunday(0)转为7 + + // 调整到周一为一周的开始 + int adjustedDays = daysDiff + (8 - firstDayOfWeek); + + // 计算周数 + int weekNumber = adjustedDays / 7; + + // 处理特殊情况:1月1日可能属于上一年的最后一周 + if (weekNumber == 0) + { + // 获取上一年的最后一天 + DateTime lastDayOfPrevYear = startOfYear.AddDays(-1); + // 计算上一年最后一天所在的周数 + return GetWeekNumber(lastDayOfPrevYear); + } + + return weekNumber; + } + + /// + /// 获取指定年份和周数的周一日期(不依赖Globalization) + /// + private DateTime GetMondayOfWeek(int year, int week) + { + // 获取该年的第一天 + DateTime firstDayOfYear = new DateTime(year, 1, 1); + + // 计算1月1日是星期几 + int firstDayOfWeek = (int)firstDayOfYear.DayOfWeek; + if (firstDayOfWeek == 0) firstDayOfWeek = 7; // 将Sunday(0)转为7 + + // 计算第一周的周一 + DateTime firstMonday = firstDayOfYear.AddDays(8 - firstDayOfWeek - 7); + + // 如果第一周的周一在上一年,则第一周的周一为本年的1月1日之后的第一个周一 + if (firstMonday.Year < year) + { + firstMonday = firstMonday.AddDays(7); + } + + // 计算目标周的周一 + DateTime targetMonday = firstMonday.AddDays((week - 1) * 7); + + return targetMonday; + } + + /// + /// 获取生产计划id + /// + /// + private int Getworkplanid_max(string timeStr) + { + ProWorklplan_v2 max_workplan = Context.Queryable() + .Where(it => it.Id.StartsWith("MP" + timeStr)) + .OrderBy(it => it.Id, OrderByType.Desc) + .First(); + + if (max_workplan != null && !string.IsNullOrEmpty(max_workplan.Id)) + { + int num = Convert.ToInt32(max_workplan.Id.Substring(2 + timeStr.Length)) + 1; + return num; + } + else + { + return 1; + } + } } }