| | |
| | | { |
| | | return UseTransaction(db => |
| | | { |
| | | // 在删除前,先获取要删除的退货通知单明细,用于后续重新计算销售订单状态 |
| | | var returnDetailsToDelete = db.Queryable<MesReturnwareDetails>() |
| | | .Where(it => it.ReturnNo == data.FBillNo && it.ReturnType == data.FBillTypeID) |
| | | .ToList(); |
| | | |
| | | // 先删除退货通知单明细 |
| | | var detailsDeleted = db.Deleteable<MesReturnwareDetails>() |
| | | .Where(it => it.ReturnNo == data.FBillNo && |
| | |
| | | { |
| | | // 删除成功后,调用存储过程删除对应的检验单 |
| | | DeleteInspectionOrder(db, data.FBillTypeID, data.FBillNo); |
| | | |
| | | // 重新计算并更新相关销售订单的over状态(与生成时逻辑相同) |
| | | if (returnDetailsToDelete.Any()) |
| | | { |
| | | UpdateSalesOrderOverStatusAfterDelete(db, returnDetailsToDelete); |
| | | } |
| | | |
| | | return 1; |
| | | } |
| | | |
| | |
| | | else |
| | | { |
| | | Console.WriteLine($"生成检验单成功: {message}"); |
| | | |
| | | // 生成检验单成功后,更新相关销售订单的over字段 |
| | | UpdateSalesOrderOverStatus(db, mesReturnwareDetails); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新销售订单的over状态 |
| | | /// 使用统一逻辑:ORDER_QUANTITY + GIFT_QUANTITY + 退货数量 = DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH |
| | | /// </summary> |
| | | /// <param name="db">数据库连接</param> |
| | | /// <param name="mesReturnwareDetails">退货通知单明细列表</param> |
| | | private void UpdateSalesOrderOverStatus(SqlSugarScope db, List<MesReturnwareDetails> mesReturnwareDetails) |
| | | { |
| | | try |
| | | { |
| | | // 获取所有需要更新的订单信息(去重) |
| | | var orderUpdates = mesReturnwareDetails |
| | | .Where(detail => !string.IsNullOrEmpty(detail.OrderNo) && !string.IsNullOrEmpty(detail.OrderType)) |
| | | .Select(detail => new { detail.OrderNo, detail.OrderType }) |
| | | .Distinct() |
| | | .ToList(); |
| | | |
| | | foreach (var orderInfo in orderUpdates) |
| | | { |
| | | // 获取该订单的所有明细 |
| | | var orderDetails = db.Queryable<MesSalesOrderDetail>() |
| | | .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType) |
| | | .ToList(); |
| | | |
| | | if (!orderDetails.Any()) |
| | | { |
| | | Console.WriteLine($"未找到销售订单明细 {orderInfo.OrderType}-{orderInfo.OrderNo},跳过更新"); |
| | | continue; |
| | | } |
| | | |
| | | // 检查每个订单明细是否完成 |
| | | bool allCompleted = true; |
| | | |
| | | foreach (var orderDetail in orderDetails) |
| | | { |
| | | // 查找匹配的退货明细:通过ORDER_TYPE, ORDER_ID, LINE_NUMBER, PRODUCT_CODE进行匹配 |
| | | var matchingReturnDetails = mesReturnwareDetails |
| | | .Where(detail => detail.OrderType == orderDetail.OrderType && |
| | | detail.OrderNo == orderDetail.OrderId && |
| | | detail.OrderNumber == orderDetail.OrderNumber && |
| | | detail.ItemNo == orderDetail.ProductCode) |
| | | .ToList(); |
| | | |
| | | // 计算匹配的退货数量 |
| | | var returnQuantity = matchingReturnDetails.Sum(x => (x.Quantity ?? 0) + (x.ActualQuantity ?? 0)); |
| | | |
| | | // 计算订单总数量:ORDER_QUANTITY + GIFT_QUANTITY + 销售退货通知单中的数量 |
| | | var orderTotal = (orderDetail.OrderQuantity ?? 0) + |
| | | (orderDetail.GiftQuantity ?? 0) + |
| | | returnQuantity; |
| | | |
| | | // 计算已交付总数量:DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH(销退出货数量) |
| | | var deliveredTotal = (orderDetail.DeliveredQuantity ?? 0) + |
| | | (orderDetail.DeliveredGiftQuantity ?? 0) + |
| | | (orderDetail.Xtch ?? 0); |
| | | |
| | | // 如果订单总数量不等于已交付总数量,则该明细未完成 |
| | | if (orderTotal != deliveredTotal) |
| | | { |
| | | allCompleted = false; |
| | | Console.WriteLine($"订单明细 {orderDetail.ProductCode} 未完成: 订单总数量={orderTotal}, 已交付总数量={deliveredTotal} (订单:{orderDetail.OrderQuantity ?? 0} + 赠品:{orderDetail.GiftQuantity ?? 0} + 退货:{returnQuantity} = 已交付:{orderDetail.DeliveredQuantity ?? 0} + 已交付赠品:{orderDetail.DeliveredGiftQuantity ?? 0} + 销退出货:{orderDetail.Xtch ?? 0})"); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 根据是否全部完成设置over值 |
| | | decimal overValue = allCompleted ? 1 : 0; |
| | | |
| | | // 更新MES_SALES_ORDER表的over字段 |
| | | var updateCount = db.Updateable<MesSalesOrder>() |
| | | .SetColumns(it => it.Over == overValue) |
| | | .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType) |
| | | .ExecuteCommand(); |
| | | |
| | | if (updateCount > 0) |
| | | { |
| | | Console.WriteLine($"成功更新销售订单 {orderInfo.OrderType}-{orderInfo.OrderNo} 的over状态为{overValue} ({(allCompleted ? "已完成" : "未完成")})"); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"未找到销售订单 {orderInfo.OrderType}-{orderInfo.OrderNo},跳过更新"); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 记录错误日志,但不影响退货通知单的保存 |
| | | Console.WriteLine($"更新销售订单over状态时发生错误: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 删除退货通知单后重新计算并更新相关销售订单的over状态 |
| | | /// 使用与生成时相同的逻辑:ORDER_QUANTITY + GIFT_QUANTITY + 退货数量 = DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH |
| | | /// </summary> |
| | | /// <param name="db">数据库连接</param> |
| | | /// <param name="deletedReturnDetails">已删除的退货通知单明细列表</param> |
| | | private void UpdateSalesOrderOverStatusAfterDelete(SqlSugarScope db, List<MesReturnwareDetails> deletedReturnDetails) |
| | | { |
| | | try |
| | | { |
| | | // 获取所有需要重新计算的订单信息(去重) |
| | | var orderUpdates = deletedReturnDetails |
| | | .Where(detail => !string.IsNullOrEmpty(detail.OrderNo) && !string.IsNullOrEmpty(detail.OrderType)) |
| | | .Select(detail => new { detail.OrderNo, detail.OrderType }) |
| | | .Distinct() |
| | | .ToList(); |
| | | |
| | | foreach (var orderInfo in orderUpdates) |
| | | { |
| | | // 获取该订单的所有明细 |
| | | var orderDetails = db.Queryable<MesSalesOrderDetail>() |
| | | .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType) |
| | | .ToList(); |
| | | |
| | | if (!orderDetails.Any()) |
| | | { |
| | | Console.WriteLine($"未找到销售订单明细 {orderInfo.OrderType}-{orderInfo.OrderNo},跳过更新"); |
| | | continue; |
| | | } |
| | | |
| | | // 检查每个订单明细是否完成 |
| | | bool allCompleted = true; |
| | | |
| | | foreach (var orderDetail in orderDetails) |
| | | { |
| | | // 查找所有匹配的退货明细(包括其他未删除的退货通知单) |
| | | // 通过ORDER_TYPE, ORDER_ID, LINE_NUMBER, PRODUCT_CODE进行匹配 |
| | | var matchingReturnDetails = db.Queryable<MesReturnwareDetails>() |
| | | .Where(detail => detail.OrderType == orderDetail.OrderType && |
| | | detail.OrderNo == orderDetail.OrderId && |
| | | detail.OrderNumber == orderDetail.OrderNumber && |
| | | detail.ItemNo == orderDetail.ProductCode) |
| | | .ToList(); |
| | | |
| | | // 计算匹配的退货数量 |
| | | var returnQuantity = matchingReturnDetails.Sum(x => (x.Quantity ?? 0) + (x.ActualQuantity ?? 0)); |
| | | |
| | | // 计算订单总数量:ORDER_QUANTITY + GIFT_QUANTITY + 销售退货通知单中的数量 |
| | | var orderTotal = (orderDetail.OrderQuantity ?? 0) + |
| | | (orderDetail.GiftQuantity ?? 0) + |
| | | returnQuantity; |
| | | |
| | | // 计算已交付总数量:DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH(销退出货数量) |
| | | var deliveredTotal = (orderDetail.DeliveredQuantity ?? 0) + |
| | | (orderDetail.DeliveredGiftQuantity ?? 0) + |
| | | (orderDetail.Xtch ?? 0); |
| | | |
| | | // 如果订单总数量不等于已交付总数量,则该明细未完成 |
| | | if (orderTotal != deliveredTotal) |
| | | { |
| | | allCompleted = false; |
| | | Console.WriteLine($"删除退货通知单后,订单明细 {orderDetail.ProductCode} 未完成: 订单总数量={orderTotal}, 已交付总数量={deliveredTotal} (订单:{orderDetail.OrderQuantity ?? 0} + 赠品:{orderDetail.GiftQuantity ?? 0} + 退货:{returnQuantity} = 已交付:{orderDetail.DeliveredQuantity ?? 0} + 已交付赠品:{orderDetail.DeliveredGiftQuantity ?? 0} + 销退出货:{orderDetail.Xtch ?? 0})"); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 根据是否全部完成设置over值 |
| | | decimal overValue = allCompleted ? 1 : 0; |
| | | |
| | | // 更新MES_SALES_ORDER表的over字段 |
| | | var updateCount = db.Updateable<MesSalesOrder>() |
| | | .SetColumns(it => it.Over == overValue) |
| | | .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType) |
| | | .ExecuteCommand(); |
| | | |
| | | if (updateCount > 0) |
| | | { |
| | | Console.WriteLine($"删除退货通知单后,成功更新销售订单 {orderInfo.OrderType}-{orderInfo.OrderNo} 的over状态为{overValue} ({(allCompleted ? "已完成" : "未完成")})"); |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"删除退货通知单后,未找到销售订单 {orderInfo.OrderType}-{orderInfo.OrderNo},跳过更新"); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 记录错误日志,但不影响退货通知单的删除 |
| | | Console.WriteLine($"删除退货通知单后更新销售订单over状态时发生错误: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调用存储过程删除检验单 |
| | | /// </summary> |
| | | /// <param name="db">数据库连接</param> |