diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmBlankRecordController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmBlankRecordController.cs index 447c6a1e..3bc9a89b 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmBlankRecordController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmBlankRecordController.cs @@ -11,7 +11,7 @@ namespace ZR.Admin.WebApi.Controllers /// /// 毛坯库存库存变动记录表 /// - [Verify] + // [Verify] [Route("/mes/wm/WmBlankRecord")] public class WmBlankRecordController : BaseController { diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs index ae9f3c7d..20341b48 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs @@ -115,8 +115,8 @@ namespace ZR.Admin.WebApi.Controllers { parm.PageNum = 1; parm.PageSize = 10000; - var list = _WmOneTimeInventoryService.GetList(parm); - var result = ExportExcelMini(list.Result, "onetime", "一次合格品仓库数据"); + var list = _WmOneTimeInventoryService.GetExportList(parm); + var result = ExportExcelMini(list, "wm_one_time_inventory", "一次合格品仓库数据"); return ExportExcel(result.Item2, result.Item1); } diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmPolishInventoryController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmPolishInventoryController.cs index 69ce9135..c910227a 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmPolishInventoryController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmPolishInventoryController.cs @@ -118,9 +118,9 @@ namespace ZR.Admin.WebApi.Controllers { parm.PageNum = 1; parm.PageSize = 10000; - var list = _WmPolishInventoryService.GetList(parm); + var list = _WmPolishInventoryService.GetExportList(parm); - var result = ExportExcelMini(list.Result, "polish", "抛光仓库数据"); + var result = ExportExcelMini(list, "wm_polish_inventory", "抛光仓库数据"); return ExportExcel(result.Item2, result.Item1); } diff --git a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs index 26ce6970..470a1217 100644 --- a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs +++ b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs @@ -56,4 +56,19 @@ namespace ZR.Model.MES.wms.Dto public DateTime? UpdatedTime { get; set; } } + // 一次合格导出 + public class WmOneTimeInventoryExportDto + { + public string 零件号 { get; set; } + + public string 颜色 { get; set; } + + public string 规格 { get; set; } + + public string 描述 { get; set; } + + public int 盘点数 { get; set; } = 0; + + public int 现有库存 { get; set; } = 0; + } } diff --git a/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs index efdc811b..0c028a95 100644 --- a/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs +++ b/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs @@ -35,6 +35,8 @@ namespace ZR.Model.MES.wms.Dto public int? Quantity { get; set; } + public int RealQuantity { get; set; } = 0; + public int? MaxNum { get; set; } public int? MinNum { get; set; } @@ -57,4 +59,20 @@ namespace ZR.Model.MES.wms.Dto public DateTime? UpdatedTime { get; set; } } + + public class WmPolishInventoryExportDto + { + public string 零件号 { get; set; } + + public string 颜色 { get; set; } + + public string 规格 { get; set; } + + public string 描述 { get; set; } + + public int 盘点数 { get; set; } = 0; + + public int 现有库存 { get; set; } = 0; + } + } diff --git a/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs b/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs index dab20215..2597ec24 100644 --- a/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs +++ b/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs @@ -72,7 +72,7 @@ namespace ZR.Model.MES.wms public DateTime? EndTime { get; set; } /// - /// 类别(0-默认 1-直接出库) + /// 类别(0-默认 1-跳过后道) /// public int? Type { get; set; } diff --git a/ZR.Service/mes/qc/CommonFQCService.cs b/ZR.Service/mes/qc/CommonFQCService.cs index 760ca485..489b3a63 100644 --- a/ZR.Service/mes/qc/CommonFQCService.cs +++ b/ZR.Service/mes/qc/CommonFQCService.cs @@ -1229,6 +1229,166 @@ namespace ZR.Service.mes.qc return result; } + // 获取抛光报表变动后 每个零件 的实际库存 startTime 必填 + public Dictionary GetBatchPolishPartRealStock( + List partNumbers, + DateTime startTime + ) + { + var result = new Dictionary(); + try + { + foreach (var partNumber in partNumbers) + { + int polishWarehouseTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Sum(it => it.Quantity) ?? 0; + + int productPolishTotal = + Context + .Queryable() + .Where(it => it.FinishedPartNumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.PaoguangTotal) ?? 0; + + int afterPolishPolishTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.PaoguangTotal) ?? 0; + + int gP12PolishTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.PaoguangTotal) ?? 0; + + int polishRequireTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.RequireNumber) ?? 0; + + int realStock = + polishWarehouseTotal + + productPolishTotal + + afterPolishPolishTotal + + gP12PolishTotal + - polishRequireTotal; + + result.Add(partNumber, realStock); + } + + return result; + } + catch (Exception ex) + { + // 此处应记录日志而不是直接抛出异常或返回0,否则调用者无法区别正常0库存与错误 + Console.WriteLine($"An error occurred: {ex.Message}"); + throw; // 重新抛出异常以告知调用者 + } + } + + // 获取GP12报表变动后 一次合格品 每个零件 的实际库存 startTime 必填 + public Dictionary GetBatchOneTimePartRealStock( + List partNumbers, + DateTime startTime + ) + { + var result = new Dictionary(); + try + { + foreach (var partNumber in partNumbers) + { + // 基本值 + int oneTimeWarehouseTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Sum(it => it.Quantity) ?? 0; + + // 产线倒车雷达 + // 倒车雷达提取 + string[] checkStrArray2 = { "倒车雷达" }; + var ParkingSensorPartNumberCheck = Expressionable.Create(); + foreach (string checkStr in checkStrArray2) + { + ParkingSensorPartNumberCheck.Or(it => it.Description.Contains(checkStr)); + } + ; + ParkingSensorPartNumberCheck.And(it => it.Type == 1).And(it => it.Status == 1); + List ParkingSensorPartNumberList = Context + .Queryable() + .Where(ParkingSensorPartNumberCheck.ToExpression()) + .Select(it => it.Partnumber) + .ToList(); + var predicateParkingSensor = Expressionable + .Create() + .And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)) + .And(it => it.FinishedPartNumber == partNumber) + .And(it => it.StartTime >= startTime.ToLocalTime()) + .ToExpression(); + // 倒车雷达 + int productParkingSensorbQualifiedTotal = + Context + .Queryable() + .Where(predicateParkingSensor) + .Sum(it => it.QualifiedNumber) ?? 0; + // 产线合格 - 倒车雷达 + int productQualifiedTotal = + Context + .Queryable() + .Where(it => it.FinishedPartNumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.QualifiedNumber) ?? 0 - productParkingSensorbQualifiedTotal; + // 抛光合格 + int polishQualifiedTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.QualifiedNumber) ?? 0; + // gp12投入 + int gP12RequireTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Sum(it => it.RequireNumber) ?? 0; + // 后道直接出库 + int afterPolishOutTotal = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Where(it => it.StartTime >= startTime.ToLocalTime()) + .Where(it => it.Type == 1) + .Sum(it => it.RequireNumber) ?? 0; + + int realStock = + oneTimeWarehouseTotal + + productQualifiedTotal + + polishQualifiedTotal + - gP12RequireTotal + - afterPolishOutTotal; + + result.Add(partNumber, realStock); + } + + return result; + } + catch (Exception ex) + { + // 此处应记录日志而不是直接抛出异常或返回0,否则调用者无法区别正常0库存与错误 + Console.WriteLine($"An error occurred: {ex.Message}"); + throw; // 重新抛出异常以告知调用者 + } + } + /// /// 检查零件号是否是门把手 /// diff --git a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs index ccb95e4a..23bf427a 100644 --- a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs @@ -11,6 +11,13 @@ namespace ZR.Service.mes.wms.IService { PagedInfo GetList(WmOneTimeInventoryQueryDto parm); + /// + /// 一次合格导出 + /// + /// + /// + List GetExportList(WmOneTimeInventoryQueryDto parm); + WmOneTimeInventory GetInfo(string Id); WmOneTimeInventory AddWmOneTimeInventory(WmOneTimeInventory parm); diff --git a/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs b/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs index 30fc0caf..664309df 100644 --- a/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs +++ b/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using ZR.Model; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; @@ -11,6 +12,13 @@ namespace ZR.Service.mes.wms.IService { PagedInfo GetList(WmPolishInventoryQueryDto parm); + /// + /// 获取导出数据 + /// + /// + /// + List GetExportList(WmPolishInventoryQueryDto parm); + WmPolishInventory GetInfo(string Id); WmPolishInventory AddWmPolishInventory(WmPolishInventory parm); diff --git a/ZR.Service/mes/wms/WmBlankRecordService.cs b/ZR.Service/mes/wms/WmBlankRecordService.cs index fcaee294..cae0ec08 100644 --- a/ZR.Service/mes/wms/WmBlankRecordService.cs +++ b/ZR.Service/mes/wms/WmBlankRecordService.cs @@ -328,6 +328,7 @@ namespace ZR.Service.mes.wms .First(); if (workOrderInfo == null) { + Context.Ado.RollbackTran(); throw new Exception("工单记录不存在!" + workOrderId); } if (workOrderInfo.Remark1.Contains("返工")) @@ -343,6 +344,7 @@ namespace ZR.Service.mes.wms .First(); if (blankInventory == null) { + Context.Ado.RollbackTran(); throw new Exception("毛坯记录不存在!请检查毛坯仓库,毛坯号:" + workOrderInfo.BlankNumber); } WmBlankInventory updateInfo = diff --git a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs index 9d83961b..ce6c7c9b 100644 --- a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs @@ -1,10 +1,12 @@ using System; +using System.Linq; using Infrastructure.Attribute; using SqlSugar; using ZR.Model; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; using ZR.Repository; +using ZR.Service.mes.qc; using ZR.Service.mes.wms.IService; namespace ZR.Service.mes.wms @@ -51,7 +53,7 @@ namespace ZR.Service.mes.wms var response = Queryable() .Where(predicate.ToExpression()) - .OrderByDescending(it => it.UpdatedTime) + .OrderBy(it => it.Partnumber) .ToPage(parm); if (response.Result.Count > 0) { @@ -406,5 +408,95 @@ namespace ZR.Service.mes.wms .Where(it => it.Status == 1) .Sum(it => it.Quantity) ?? 0; } + + // Util 获取物料清单,不包含毛坯 + public List GetWmMaterialList(string partnumber) + { + // 获取物料信息 + return Context + .Queryable() + .WhereIF( + !string.IsNullOrEmpty(partnumber), + it => it.Partnumber.Contains(partnumber) + ) + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .Distinct() + .OrderBy(it => it.Description) + .ToList(); + } + + public List GetExportList(WmOneTimeInventoryQueryDto parm) + { + try + { + List materials = GetWmMaterialList(parm.Partnumber); + + // 获取所有partnumber列表 + List partnumbers = materials + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Select(it => it.Partnumber) + .Distinct() + .ToList(); + + // 批量获取盘点数和现有库存 + Dictionary stockNumbers = GetBatchOneTimeStockPartNum(partnumbers); + Dictionary realNumbers = GetBatchOneTimeRealPartNum(partnumbers); + + // 构建导出数据 + List exportDto = materials + .Select(it => + { + bool found1 = stockNumbers.TryGetValue(it.Partnumber, out object value1); + int stockNumber = found1 && value1 != null ? Convert.ToInt32(value1) : 0; + bool found2 = realNumbers.TryGetValue(it.Partnumber, out int realNumber); + + return new WmOneTimeInventoryExportDto + { + 零件号 = it.Partnumber, + 颜色 = it.Color, + 规格 = it.Specification, + 描述 = it.Description, + 盘点数 = stockNumber, + 现有库存 = found2 ? realNumber : 0, + }; + }) + .ToList(); + return exportDto; + } + catch (Exception e) + { + throw; + } + } + + // Util 获取指定抛光库零件盘点库存 + public Dictionary GetBatchOneTimeStockPartNum(List partnumbers) + { + return Context + .Queryable() + .Where(it => partnumbers.Contains(it.Partnumber)) + .GroupBy(it => it.Partnumber) + .ToDictionary(g => g.Partnumber, g => SqlFunc.AggregateSum(g.Quantity) ?? 0); + } + + // Util 获取指定抛光库零件加报表后库存 + public Dictionary GetBatchOneTimeRealPartNum(List partnumbers) + { + try + { + // 盘点时间 + DateTime checkTime = new(2024, 10, 20, 0, 0, 0); + CommonFQCService commonFQCService = new(); + // 获取报表数据 + // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库 + return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime); + } + catch (Exception e) + { + throw; + } + } } } diff --git a/ZR.Service/mes/wms/WmOutOrderService.cs b/ZR.Service/mes/wms/WmOutOrderService.cs index 6556e376..f87a96b8 100644 --- a/ZR.Service/mes/wms/WmOutOrderService.cs +++ b/ZR.Service/mes/wms/WmOutOrderService.cs @@ -392,7 +392,8 @@ namespace ZR.Service.mes.wms int accumulation_num = 0; foreach (var witem in wmGoodsNowsList) { - if (require_num >= accumulation_num) + //TODO 修改>= 为 > 查看情况 + if (require_num > accumulation_num) { WmOutOrderPlan orderPlan = new WmOutOrderPlan(); orderPlan.FkOutOrderId = shipment_num; diff --git a/ZR.Service/mes/wms/WmPolishInventoryService.cs b/ZR.Service/mes/wms/WmPolishInventoryService.cs index 06b50d58..32d4f606 100644 --- a/ZR.Service/mes/wms/WmPolishInventoryService.cs +++ b/ZR.Service/mes/wms/WmPolishInventoryService.cs @@ -1,12 +1,20 @@ using System; +using System.Linq; +using System.Threading.Tasks; using Aliyun.OSS; using Infrastructure.Attribute; +using Infrastructure.Extensions; +using Microsoft.AspNetCore.DataProtection.KeyManagement; +using Newtonsoft.Json.Linq; using SqlSugar; using ZR.Model; +using ZR.Model.MES.qc.DTO; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; using ZR.Repository; +using ZR.Service.mes.qc; using ZR.Service.mes.wms.IService; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service.mes.wms { @@ -52,12 +60,13 @@ namespace ZR.Service.mes.wms var response = Queryable() .Where(predicate.ToExpression()) - .OrderByDescending(it => it.UpdatedTime) + .OrderBy(it => it.Partnumber) .ToPage(parm); if (response.Result.Count > 0) { foreach (WmPolishInventoryDto item in response.Result) { + // 获取物料信息 WmMaterial material = Context .Queryable() .Where(it => it.Partnumber == item.Partnumber) @@ -472,5 +481,96 @@ namespace ZR.Service.mes.wms .Where(it => it.Status == 1) .Sum(it => it.Quantity) ?? 0; } + + // Util 获取物料清单,不包含毛坯 + public List GetWmMaterialList(string partnumber) + { + // 获取物料信息 + return Context + .Queryable() + .WhereIF( + !string.IsNullOrEmpty(partnumber), + it => it.Partnumber.Contains(partnumber) + ) + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .Distinct() + .OrderBy(it => it.Description) + .ToList(); + } + + // 获取Excel导出数据 + public List GetExportList(WmPolishInventoryQueryDto parm) + { + try + { + List materials = GetWmMaterialList(parm.Partnumber); + + // 获取所有partnumber列表 + List partnumbers = materials + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Select(it => it.Partnumber) + .Distinct() + .ToList(); + + // 批量获取盘点数和现有库存 + Dictionary stockNumbers = GetBatchPolishStockPartNum(partnumbers); + Dictionary realNumbers = GetBatchPolishRealPartNum(partnumbers); + + // 构建导出数据 + List exportDto = materials + .Select(it => + { + bool found1 = stockNumbers.TryGetValue(it.Partnumber, out object value1); + int stockNumber = found1 && value1 != null ? Convert.ToInt32(value1) : 0; + bool found2 = realNumbers.TryGetValue(it.Partnumber, out int realNumber); + + return new WmPolishInventoryExportDto + { + 零件号 = it.Partnumber, + 颜色 = it.Color, + 规格 = it.Specification, + 描述 = it.Description, + 盘点数 = stockNumber, + 现有库存 = found2 ? realNumber : 0, + }; + }) + .ToList(); + return exportDto; + } + catch (Exception e) + { + throw; + } + } + + // Util 获取指定抛光库零件盘点库存 + public Dictionary GetBatchPolishStockPartNum(List partnumbers) + { + return Context + .Queryable() + .Where(it => partnumbers.Contains(it.Partnumber)) + .GroupBy(it => it.Partnumber) + .ToDictionary(g => g.Partnumber, g => SqlFunc.AggregateSum(g.Quantity) ?? 0); + } + + // Util 获取指定抛光库零件加报表后库存 + public Dictionary GetBatchPolishRealPartNum(List partnumbers) + { + try + { + // 盘点时间 + DateTime checkTime = new(2024, 10, 20, 0, 0, 0); + CommonFQCService commonFQCService = new(); + // 获取报表数据 + // 抛光计算后库存 = 盘点库存 + 产线抛光 + 后道反抛 + GP12反抛 - 抛光投入 + return commonFQCService.GetBatchPolishPartRealStock(partnumbers, checkTime); + } + catch (Exception e) + { + throw; + } + } } } diff --git a/ZR.Service/mes/wms/WmPolishWorkQualityStatisticsService.cs b/ZR.Service/mes/wms/WmPolishWorkQualityStatisticsService.cs index de8fcafb..42abdc68 100644 --- a/ZR.Service/mes/wms/WmPolishWorkQualityStatisticsService.cs +++ b/ZR.Service/mes/wms/WmPolishWorkQualityStatisticsService.cs @@ -122,7 +122,7 @@ namespace ZR.Service.mes.wms if(model.IsOutbound) { model.Type = 1; - model.Remark += "[直接出库]"; + model.Remark += "[跳过后道]"; } else { @@ -263,6 +263,7 @@ namespace ZR.Service.mes.wms if (model.IsOutbound) { model.Type = 1; + model.Remark = "[跳过后道]"; } else {