| | |
| | | return WebResponseContent.Instance.Error("未找到入库单信息"); |
| | | } |
| | | var allBoxCodesForDetail = BaseDal.Db.Queryable<Dt_StockInfoDetailCP>() |
| | | .Where(x => x.StockDetailId == dt_StockInfo.Details.FirstOrDefault().Id) |
| | | .Select(x => x.BoxCode) |
| | | .ToList(); |
| | | .Where(x => dt_StockInfo.Details.Select(d => d.Id).Contains(x.StockDetailId)) |
| | | .Select(x => x.BoxCode) |
| | | .ToList(); |
| | | |
| | | // 2. 获取托盘下的所有箱号 |
| | | var boxCodes = new List<string>(); |
| | |
| | | .ToList(); |
| | | } |
| | | |
| | | // 更新成品入库明细状态 |
| | | if (cpInboundDetails.Any()) |
| | | { |
| | | foreach (var cpDetail in cpInboundDetails) |
| | | { |
| | | cpDetail.CPOrderDetailStatus = InboundStatusEnum.入库完成.ObjToInt(); |
| | | } |
| | | } |
| | | |
| | | // 4. 查询并更新成品库存明细(如果有单独的成品库存表) |
| | | List<Dt_StockInfoDetailCP> cpStockDetails = new List<Dt_StockInfoDetailCP>(); |
| | |
| | | // 更新成品入库明细状态 |
| | | if (cpInboundDetails.Any()) |
| | | { |
| | | BaseDal.Db.Updateable(cpInboundDetails).ExecuteCommand(); |
| | | BaseDal.Db.Deleteable(cpInboundDetails).ExecuteCommand(); |
| | | } |
| | | |
| | | // 更新成品库存明细状态 |
| | |
| | | } |
| | | if (inboundOrder.OrderStatus == InboundStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType == 0 && inboundOrder.System.Equals("SMOM")) |
| | | { |
| | | |
| | | //SendInboundInfoToWMS(task, inboundOrder, stockInfo); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InboundStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType == 2 && inboundOrder.System.Equals("SMOM")) |
| | | { |
| | |
| | | |
| | | if (inboundOrder == null) return WebResponseContent.Instance.Error("未找到出库单信息"); |
| | | |
| | | Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail(); |
| | | foreach (var detail in stockInfo.Details) |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>(); |
| | | foreach(var detail in stockInfo.Details) |
| | | { |
| | | outboundOrderDetail = _outboundService.OutboundOrderService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == inboundOrder.Id && x.BatchNo == detail.BatchNo) |
| | | .First(); |
| | | if (outboundOrderDetail != null) break; |
| | | |
| | | Dt_OutboundOrderDetail outboundOrderDetail = _outboundService.OutboundOrderService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == inboundOrder.Id && x.BatchNo == detail.BatchNo).First(); |
| | | outboundOrderDetails.Add(outboundOrderDetail); |
| | | } |
| | | |
| | | if (outboundOrderDetail.LocationName != null && outboundOrderDetail.LocationName != "") |
| | | for(var i = 0; i<outboundOrderDetails.Count; i++) |
| | | { |
| | | foreach (var detail in stockInfo.Details) |
| | | if (outboundOrderDetails[i].LocationName != null && outboundOrderDetails[i].LocationName != "") |
| | | { |
| | | outboundOrderDetail = _outboundService.OutboundOrderService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == inboundOrder.Id && x.BatchNo == detail.BatchNo && x.LocationName == stockInfo.LocationCode) |
| | | .First(); |
| | | if (outboundOrderDetail != null) break; |
| | | foreach (var detail in stockInfo.Details) |
| | | { |
| | | Dt_OutboundOrderDetail newOutboundOrderDetail = _outboundService.OutboundOrderService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == inboundOrder.Id && x.BatchNo == detail.BatchNo && x.LocationName == stockInfo.LocationCode) |
| | | .First(); |
| | | outboundOrderDetails[i] = newOutboundOrderDetail; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (outboundOrderDetail == null) return WebResponseContent.Instance.Error("未找到出库单信息"); |
| | | DWANDYSUpdateOutboundOrderDetails(stockInfo, inboundOrder, ref outboundOrderDetail); |
| | | if (outboundOrderDetails == null) return WebResponseContent.Instance.Error("未找到出库单信息"); |
| | | DWANDYSUpdateOutboundOrderDetails(stockInfo, inboundOrder, ref outboundOrderDetails); |
| | | // 3. 执行核心出库逻辑 |
| | | return ExecuteOutboundLogic(task, stockInfo, locationInfo, outboundOrderDetail, inboundOrder); |
| | | return DWANDYSExecuteOutboundLogic(task, stockInfo, locationInfo, outboundOrderDetails, inboundOrder); |
| | | } |
| | | else |
| | | { |
| | |
| | | _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); |
| | | |
| | | // 更新库存状态 回库单 |
| | | if (locationInfo.RoadwayNo.Contains("DW") || locationInfo.RoadwayNo.Contains("YS")) |
| | | { |
| | | AddDWANDYSRetrueOrder(stockInfo, inboundOrder); |
| | | } |
| | | else |
| | | { |
| | | AddRetrueOrder(stockInfo, inboundOrder); |
| | | } |
| | | |
| | | AddRetrueOrder(stockInfo, inboundOrder); |
| | | |
| | | |
| | | // 区分单据数据来源更新货位状态 |
| | | if (inboundOrder.System == null) |
| | | { |
| | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | private WebResponseContent DWANDYSExecuteOutboundLogic(Dt_Task task, Dt_StockInfo stockInfo, |
| | | Dt_LocationInfo locationInfo, List<Dt_OutboundOrderDetail> outboundOrderDetails, Dt_OutboundOrder inboundOrder) |
| | | { |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | ///更新出库单 |
| | | _outboundService.OutboundOrderService.Repository.UpdateData(inboundOrder); |
| | | // 更新出库订单详情 |
| | | _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); |
| | | |
| | | // 更新库存状态 回库单 |
| | | if (locationInfo.RoadwayNo.Contains("DW") || locationInfo.RoadwayNo.Contains("YS")) |
| | | { |
| | | AddDWANDYSRetrueOrder(stockInfo, inboundOrder); |
| | | } |
| | | |
| | | // 区分单据数据来源更新货位状态 |
| | | if (inboundOrder.System == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("出库单数据源为空"); |
| | | } |
| | | if (!inboundOrder.System.Equals("SMOM")) |
| | | { |
| | | UpdateLocationStatus(locationInfo); |
| | | } |
| | | // 处理任务完成 |
| | | CompleteTask(task); |
| | | |
| | | // 添加状态变更记录 |
| | | AddStatusChangeRecord(task, stockInfo, locationInfo); |
| | | |
| | | // 根据订单类型处理不同逻辑 |
| | | |
| | | var outboundOrder = _outboundService.OutboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.OrderNo == inboundOrder.OrderNo).First(); |
| | | foreach(var outboundOrderDetail in outboundOrderDetails) |
| | | { |
| | | var outDetail = _outboundService.OutboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .Where(x => x.OrderId == outboundOrder.Id && x.BatchNo == outboundOrderDetail.BatchNo).First(); |
| | | string path = "http://fr.mankun.com:8080/webroot/decision/view/report?viewlet=fr-report\\SMOM/Product/Produce/OutBoundDetileReport.cpt&op=write&format=pdf"; |
| | | string fullPath = AppDomain.CurrentDomain.BaseDirectory; |
| | | var url = Path.Combine(fullPath, "wwwroot", "Reports"); |
| | | string savePath = Path.Combine(url, "本次出库.pdf"); |
| | | |
| | | |
| | | if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt() && inboundOrder.System.Equals("ERP")) |
| | | { |
| | | FeedBackOutERP(outboundOrder.OrderNo, outboundOrderDetail.LinId); |
| | | DownloadReport(path, savePath, outboundOrderDetail.Id); |
| | | } |
| | | ///单据完成推送SMOM系统 |
| | | if (outboundOrder.OrderStatus == OutboundStatusEnum.出库完成.ObjToInt() && inboundOrder.System.Equals("SMOM")) |
| | | { |
| | | var stockInfoDetail = stockInfo.Details.FirstOrDefault(); |
| | | ProcessNormalOutbound(task, stockInfo, outboundOrder, outDetail); |
| | | //DownloadReport(path, savePath, outboundOrderDetails.Id); |
| | | //printTest(savePath); |
| | | //SendNormalOutboundToWMS(task, outboundOrder, stockInfoDetail, outDetail); |
| | | } |
| | | |
| | | if (outboundOrder.OrderType == 240) // 盘点出库 |
| | | { |
| | | // 盘点出库特殊处理逻辑 |
| | | } |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | throw; |
| | | } |
| | | } |
| | | private void UpdateOutboundOrderDetails(Dt_StockInfo stockInfo, Dt_OutboundOrder inboundOrder, ref Dt_OutboundOrderDetail inboundOrderDetail) |
| | | { |
| | | int overCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); |
| | |
| | | } |
| | | |
| | | //低温、药水 |
| | | private void DWANDYSUpdateOutboundOrderDetails(Dt_StockInfo stockInfo, Dt_OutboundOrder inboundOrder, ref Dt_OutboundOrderDetail inboundOrderDetail) |
| | | private void DWANDYSUpdateOutboundOrderDetails(Dt_StockInfo stockInfo, Dt_OutboundOrder inboundOrder, ref List<Dt_OutboundOrderDetail> inboundOrderDetails) |
| | | { |
| | | string BatchNo = inboundOrderDetail.BatchNo; |
| | | int overCount = inboundOrder.Details.Where(x => x.BatchNo == BatchNo).Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); |
| | | //inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == stockInfo.Details.FirstOrDefault()?.BatchNo&&x.LPNNo==stockInfo.PalletCode); |
| | | |
| | | foreach (var item in stockInfo.Details) |
| | | List<Dt_OutboundOrderDetail> newOutboundOrderDetails = inboundOrderDetails; |
| | | int overCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); |
| | | foreach (var newOutboundOrderDetail in newOutboundOrderDetails) |
| | | { |
| | | if (inboundOrderDetail == null) continue; |
| | | string BatchNo = newOutboundOrderDetail.BatchNo; |
| | | //inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == stockInfo.Details.FirstOrDefault()?.BatchNo&&x.LPNNo==stockInfo.PalletCode); |
| | | |
| | | if (inboundOrderDetail.BatchNo == item.BatchNo) |
| | | foreach (var item in stockInfo.Details) |
| | | { |
| | | inboundOrderDetail.OverOutQuantity += item.OutboundQuantity; |
| | | if (newOutboundOrderDetail == null) continue; |
| | | |
| | | if (inboundOrderDetail.OverOutQuantity == inboundOrderDetail.OrderQuantity) |
| | | if (newOutboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) continue; |
| | | |
| | | if (newOutboundOrderDetail.BatchNo == item.BatchNo) |
| | | { |
| | | inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | overCount++; |
| | | } |
| | | else if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) |
| | | { |
| | | inboundOrderDetail.OrderDetailStatus = OutboundStatusEnum.出库中.ObjToInt(); |
| | | inboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); |
| | | newOutboundOrderDetail.OverOutQuantity += item.OutboundQuantity; |
| | | |
| | | if (newOutboundOrderDetail.OverOutQuantity == newOutboundOrderDetail.OrderQuantity) |
| | | { |
| | | newOutboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | overCount++; |
| | | } |
| | | else if (newOutboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) |
| | | { |
| | | newOutboundOrderDetail.OrderDetailStatus = OutboundStatusEnum.出库中.ObjToInt(); |
| | | inboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); |
| | | } |
| | | } |
| | | } |
| | | if (inboundOrder.Details.Count() == overCount) |
| | | { |
| | | inboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt(); |
| | | } |
| | | } |
| | | if (inboundOrder.Details.Count == overCount) |
| | | { |
| | | inboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt(); |
| | | } |
| | | |
| | | } |
| | | |
| | | private void DeleteAndMoveIntoHtStockStatus(Dt_StockInfo stockInfo) |
| | |
| | | return; |
| | | } |
| | | |
| | | // 获取打印机名称 |
| | | // 获取配置的打印机名称 |
| | | string printerName = AppSettings.app("PrinterName"); |
| | | |
| | | PrintUsingSpireSimple(fullPath, printerName); |
| | | if (string.IsNullOrEmpty(printerName)) |
| | | { |
| | | Console.WriteLine("✗ 打印失败:未配置打印机名称"); |
| | | return; |
| | | } |
| | | |
| | | |
| | | Console.WriteLine("所有打印方法都失败"); |
| | | // 直接使用配置的打印机名称,不进行任何转换 |
| | | PrintUsingConfiguredPrinter(fullPath, printerName.Trim()); |
| | | } |
| | | |
| | | |
| | | private void PrintUsingSpireSimple(string filePath, string printerName) |
| | | /// <summary> |
| | | /// 只使用配置的打印机进行打印 |
| | | /// </summary> |
| | | private void PrintUsingConfiguredPrinter(string filePath, string printerName) |
| | | { |
| | | try |
| | | { |
| | | // 1. 首先验证打印机是否存在 |
| | | if (!IsPrinterInstalled(printerName)) |
| | | { |
| | | Console.WriteLine($"✗ 打印机 '{printerName}' 未安装或不存在"); |
| | | Console.WriteLine("\n系统已安装的打印机列表:"); |
| | | foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters) |
| | | { |
| | | Console.WriteLine($" - {printer}"); |
| | | } |
| | | throw new InvalidOperationException($"打印机 '{printerName}' 未安装"); |
| | | } |
| | | |
| | | // 3. 使用 Spire.PDF 打印 |
| | | using (Spire.Pdf.PdfDocument pdf = new Spire.Pdf.PdfDocument()) |
| | | { |
| | | // 加载文件 |
| | | pdf.LoadFromFile(filePath); |
| | | |
| | | // 获取实际的打印机名称 |
| | | string actualPrinterName = GetActualPrinterName(printerName); |
| | | // 设置打印机名称(只使用配置的名称) |
| | | pdf.PrintSettings.PrinterName = printerName; |
| | | |
| | | Console.WriteLine($"配置的打印机名称: {printerName}"); |
| | | Console.WriteLine($"实际使用的打印机名称: {actualPrinterName}"); |
| | | |
| | | // 如果找不到实际打印机,使用默认打印机 |
| | | if (!string.IsNullOrEmpty(actualPrinterName) && IsPrinterInstalled(actualPrinterName)) |
| | | { |
| | | pdf.PrintSettings.PrinterName = actualPrinterName; |
| | | Console.WriteLine($"✓ 已设置打印机: {actualPrinterName}"); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"⚠️ 打印机 '{actualPrinterName}' 未找到,使用默认打印机"); |
| | | } |
| | | Console.WriteLine($"✓ 使用配置的打印机: {printerName}"); |
| | | Console.WriteLine($"✓ 正在打印: {Path.GetFileName(filePath)}"); |
| | | |
| | | // 直接打印 |
| | | pdf.Print(); |
| | | Console.WriteLine("✓ 打印任务已提交成功"); |
| | | Console.WriteLine("✓ 打印任务已提交"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"✗ Spire.PDF打印失败: {ex.Message}"); |
| | | |
| | | // 输出所有可用打印机,帮助调试 |
| | | Console.WriteLine("\n系统所有可用打印机:"); |
| | | foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters) |
| | | { |
| | | Console.WriteLine($" - {printer}"); |
| | | } |
| | | |
| | | Console.WriteLine($"✗ 打印失败: {ex.Message}"); |
| | | throw; |
| | | } |
| | | } |