| | |
| | | using NewPdaSqlServer.DB; |
| | | using System.Data; |
| | | using System.Data.SqlClient; |
| | | using NewPdaSqlServer.DB; |
| | | using NewPdaSqlServer.Dto.service; |
| | | using NewPdaSqlServer.entity; |
| | | using NewPdaSqlServer.util; |
| | | using SqlSugar; |
| | | |
| | | namespace NewPdaSqlServer.service.Warehouse; |
| | | |
| | | /// <summary> |
| | | /// 调拨出库管理类 |
| | | /// 调拨出入库管理类 |
| | | /// 负责处理调拨出库相关的业务逻辑 |
| | | /// </summary> |
| | | public class TransferOutManager : Repository<TransferOut> |
| | |
| | | ScanMoveBarcode(WarehouseQuery query) |
| | | { |
| | | var p_bill_no = query.billNo; |
| | | var c_user = query.userName; |
| | | var p_item_barcode = query.barcode; |
| | | |
| | | var p_bill_type_id = 300; // 单据类型ID |
| | | var p_transaction_no = 301; // 交易编号 |
| | | |
| | | // 验证单据号 |
| | | if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!"); |
| | |
| | | .First(); |
| | | if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}"); |
| | | |
| | | // 验证仓库一致性 |
| | | if (stock.DepotsCode != transferOut.InvCode) |
| | | throw new Exception( |
| | | $"条码库存仓库{stock.DepotsCode}和申请仓库不一致{transferOut.InvCode}"); |
| | | |
| | | // 查询物料信息 |
| | | var item = Db.Queryable<MesItems>() |
| | | .Where(x => x.Id == stock.ItemId) |
| | | .First(); |
| | | if (item == null) throw new Exception("未找到物料"); |
| | | |
| | | // 查询调拨明细并验证 |
| | | var detail = Db.Queryable<TransferOutDetail>() |
| | | .Where(x => x.ItemId == stock.ItemId && x.Pid == transferOut.Guid) |
| | | .First(); |
| | | if (detail == null) throw new Exception("未找到条码物料相应的调拨申请"); |
| | | |
| | | // 验证数量是否超出未扫数量 |
| | | if ((detail.ShNum ?? 0) - (detail.YsNum ?? 0) < stock.Quantity) |
| | | throw new Exception("条码数量大于申请未扫数量,请拆分了再扫码"); |
| | | |
| | | // 使用事务处理数据更新 |
| | | UseTransaction(db => |
| | | var _strMsg = ""; |
| | | var _intSum = ""; |
| | | using (var conn = new SqlConnection(DbHelperSQL.strConn)) |
| | | { |
| | | // 查询现有移库记录 |
| | | var existingMove = db.Queryable<MesInvItemMoves>() |
| | | .Where(x => x.TaskNo == p_bill_no |
| | | && x.TransactionNo == p_transaction_no |
| | | && (x.Status ?? 0) == 0) |
| | | .First(); |
| | | |
| | | var commit = 0; // 记录更新操作次数 |
| | | var c_id = Guid.Empty; |
| | | |
| | | // 处理移库主表记录 |
| | | if (existingMove != null) |
| | | using (var cmd = new SqlCommand("[prc_pda_DBCK]", conn)) |
| | | { |
| | | // 更新现有记录的最后修改信息 |
| | | commit += db.Updateable<MesInvItemMoves>() |
| | | .SetColumns(s => s.LastupdateDate == DateTime.Now) |
| | | .SetColumns(s => s.LastupdateBy == c_user) |
| | | .Where(s => s.Guid == existingMove.Guid) |
| | | .ExecuteCommand(); |
| | | |
| | | c_id = existingMove.Guid; |
| | | } |
| | | else |
| | | { |
| | | // 查询相关仓库信息 |
| | | var mesDepots = db.Queryable<MesDepots>() |
| | | .Where(s => s.DepotCode == transferOut.FromCode) |
| | | .First(); |
| | | |
| | | var invMesDepots = db.Queryable<MesDepots>() |
| | | .Where(s => s.DepotCode == transferOut.InvCode) |
| | | .First(); |
| | | |
| | | c_id = Guid.NewGuid(); |
| | | |
| | | // 创建新的移库记录 |
| | | var newMove = new MesInvItemMoves |
| | | try |
| | | { |
| | | Guid = c_id, |
| | | BillNo = BillNo.GetBillNo("DBCKD"), |
| | | CreateBy = c_user, |
| | | CreateDate = DateTime.Now, |
| | | BillTypeId = p_bill_type_id, |
| | | TransactionNo = p_transaction_no, |
| | | InvDepotSectionsId = mesDepots.DepotId, |
| | | // InvDepotSectionsCode = transferOut.FromCode, |
| | | // FromDepotsCode = transferOut.InvCode, |
| | | FromDepotsId = invMesDepots.DepotId.ToString(), |
| | | TaskNo = p_bill_no |
| | | }; |
| | | commit += db.Insertable(newMove).IgnoreColumns(true) |
| | | .ExecuteCommand(); |
| | | } |
| | | conn.Open(); |
| | | cmd.CommandType = CommandType.StoredProcedure; |
| | | SqlParameter[] parameters = |
| | | { |
| | | new("@outMsg", SqlDbType.NVarChar, 300), |
| | | new("@outSum", SqlDbType.NVarChar, 300), |
| | | new("@barcode_num", SqlDbType.NVarChar, 300), |
| | | new("@split_num", SqlDbType.NVarChar, 300), |
| | | new("@c_user", query.userName), |
| | | new("@p_bill_no", p_bill_no), |
| | | new("@p_item_barcode", p_item_barcode), |
| | | }; |
| | | parameters[0].Direction = ParameterDirection.Output; |
| | | parameters[1].Direction = ParameterDirection.Output; |
| | | parameters[2].Direction = ParameterDirection.Output; |
| | | parameters[3].Direction = ParameterDirection.Output; |
| | | foreach (var parameter in parameters) |
| | | cmd.Parameters.Add(parameter); |
| | | cmd.ExecuteNonQuery(); |
| | | _strMsg = parameters[0].Value.ToString(); |
| | | _intSum = parameters[1].Value.ToString(); |
| | | |
| | | // 写入老条码交易明细 |
| | | var business = new MesInvBusiness2 |
| | | { |
| | | Guid = Guid.NewGuid(), |
| | | Status = 1, |
| | | BillTypeId = p_bill_type_id, |
| | | TransactionCode = p_transaction_no.ToString(), |
| | | BusinessType = -1, |
| | | ItemBarcode = p_item_barcode, |
| | | ItemNo = item.ItemNo, |
| | | LotNo = stock.LotNo, |
| | | EpFlag = true, |
| | | Quantity = stock.Quantity, |
| | | FromInvDepotsCode = stock.DepotsCode, |
| | | FromInvDepotSectionsCode = stock.DepotSectionsCode, |
| | | ToInvDepotsCode = transferOut.FromCode, |
| | | ToInvDepotSectionsCode = stock.DepotSectionsCode, |
| | | CreateBy = c_user, |
| | | CreateDate = DateTime.Now, |
| | | LastupdateBy = c_user, |
| | | LastupdateDate = DateTime.Now, |
| | | Factory = stock.Factory, |
| | | Company = stock.Company, |
| | | TaskNo = stock.TaskNo, |
| | | BillNo = p_bill_no, |
| | | WorkNo = stock.WorkNo, |
| | | WorkLine = stock.WorkLine, |
| | | SuppNo = stock.SuppNo, |
| | | ItemId = stock.ItemId, |
| | | EbelnK3id = stock.EbelnK3id, |
| | | LineK3id = stock.LineK3id |
| | | // RkDepot = transferOut.RkDepot, |
| | | // CkDepot = transferOut.CkDepot |
| | | }; |
| | | var barcodeNum = parameters[2].Value.ToString(); |
| | | var splitNum = parameters[3].Value.ToString(); |
| | | |
| | | var result = Convert.ToInt32(_intSum); |
| | | if (result <= 0) throw new Exception(_strMsg); |
| | | |
| | | commit += db.Insertable(business).IgnoreColumns(true) |
| | | .ExecuteCommand(); |
| | | query.itemNo = item.ItemNo; |
| | | query.Num = Convert.ToDecimal(barcodeNum); |
| | | query.Fum = Convert.ToDecimal(splitNum); |
| | | |
| | | // 写入新条码交易明细 |
| | | var moveDetail = new MesInvItemMovesCDetails |
| | | { |
| | | Guid = Guid.NewGuid(), |
| | | ItemMoveGuid = c_id, |
| | | ItemBarcode = p_item_barcode, |
| | | CItemCode = stock.CItemCode, |
| | | ItemNo = item.ItemNo, |
| | | LotNo = stock.LotNo, |
| | | Quantity = stock.Quantity, |
| | | EpFlag = stock.EpFlag, |
| | | CreateBy = c_user, |
| | | CreateDate = DateTime.Now, |
| | | LastupdateBy = c_user, |
| | | LastupdateDate = DateTime.Now, |
| | | // CustomerNo = stock.CustomerNo, |
| | | TaskNo = stock.TaskNo, |
| | | FromDepotsCode = stock.DepotsCode, |
| | | FromDepotSectionsCode = stock.DepotSectionsCode, |
| | | Factory = stock.Factory, |
| | | Company = stock.Company, |
| | | InvDepotsCode = transferOut.FromCode, |
| | | // InvDepotSectionsCode = p_sectioncode, |
| | | IqcStatus = stock.IqcStatus, |
| | | Fcar = stock.Fcar, |
| | | IndepDate = stock.IndepDate, |
| | | VisableSubmit = stock.VisableSubmit, |
| | | VisableSubmitBy = stock.VisableSubmitBy, |
| | | VisableSubmitDate = stock.VisableSubmitDate, |
| | | BoardStyle = stock.BoardStyle, |
| | | WorkNo = stock.WorkNo, |
| | | WorkLine = stock.WorkLine, |
| | | SuppNo = stock.SuppNo, |
| | | ItemId = (int)stock.ItemId, |
| | | EbelnK3id = stock.EbelnK3id, |
| | | LineK3id = stock.LineK3id |
| | | // RkDepot = transferOut.RkDepot, |
| | | // CkDepot = transferOut.CkDepot |
| | | }; |
| | | |
| | | commit += db.Insertable(moveDetail).IgnoreColumns(true) |
| | | .ExecuteCommand(); |
| | | |
| | | // 更新或插入出库明细记录 |
| | | var outItem = db.Queryable<MesInvItemOutItems>() |
| | | .Where(x => x.ItemOutId == c_id && x.ItemId == stock.ItemId) |
| | | .First(); |
| | | |
| | | if (outItem != null) |
| | | { |
| | | // 更新现有记录的数量 |
| | | outItem.Quantity += stock.Quantity; |
| | | commit += db.Updateable<MesInvItemOutItems>() |
| | | .SetColumns(x => x.Quantity == outItem.Quantity) |
| | | .Where(x => x.Guid == outItem.Guid) |
| | | .ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | // 插入新记录 |
| | | var newOutItem = new MesInvItemOutItems |
| | | // 返回更新后的表单和待处理明细 |
| | | return (query, GetTransferOutDetailListByBillNo(query)); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Guid = Guid.NewGuid(), |
| | | ItemOutId = c_id, |
| | | ItemId = stock.ItemId, |
| | | CreateBy = c_user, |
| | | CreateDate = DateTime.Now, |
| | | TaskNo = stock.TaskNo, |
| | | WorkNo = stock.WorkNo, |
| | | WorkLine = stock.WorkLine, |
| | | EbelnK3id = (int)stock.EbelnK3id, |
| | | LineK3id = (int)stock.LineK3id, |
| | | Quantity = stock.Quantity |
| | | // Unit = stock.ItemUnit |
| | | }; |
| | | |
| | | commit += db.Insertable(newOutItem).IgnoreColumns(true) |
| | | .ExecuteCommand(); |
| | | } |
| | | |
| | | // 更新调拨申请已扫数量 |
| | | detail = db.Queryable<TransferOutDetail>() |
| | | .Where(x => x.Guid == detail.Guid) |
| | | .First(); |
| | | |
| | | if (detail != null) |
| | | { |
| | | detail.YsNum = (detail.YsNum ?? 0) + stock.Quantity as int?; |
| | | commit += db.Updateable<TransferOutDetail>() |
| | | .SetColumns(x => x.YsNum == detail.YsNum) |
| | | .Where(x => x.Guid == detail.Guid) |
| | | .ExecuteCommand(); |
| | | } |
| | | |
| | | // 检查是否所有明细都已完成 |
| | | var totals = db.Queryable<TransferOutDetail, TransferOut>((b, a) => |
| | | new JoinQueryInfos(JoinType.Left, b.Pid == a.Guid)) |
| | | .Where((b, a) => a.BillNo == p_bill_no) |
| | | .Select((b, a) => new |
| | | throw new Exception(ex.Message); |
| | | } |
| | | finally |
| | | { |
| | | ShNum = SqlFunc.AggregateSum(b.ShNum), // 申请总数量 |
| | | YsNum = SqlFunc.AggregateSum(b.YsNum) // 已扫总数量 |
| | | }) |
| | | .First(); |
| | | |
| | | // 如果申请数量等于已扫数量,更新单据完成状态 |
| | | if (totals.ShNum == totals.YsNum) |
| | | commit += db.Updateable<TransferOut>() |
| | | .SetColumns(x => x.IsWc == 1) |
| | | .Where(x => x.BillNo == p_bill_no) |
| | | .ExecuteCommand(); |
| | | |
| | | // 更新返回参数 |
| | | query.itemNo = item.ItemNo; |
| | | query.Num = stock.Quantity; |
| | | |
| | | // 验证更新操作是否全部成功 |
| | | if (commit < 4) throw new Exception("更新失败"); |
| | | |
| | | return commit; |
| | | }); |
| | | |
| | | // 返回更新后的表单和待处理明细 |
| | | return (query, GetTransferOutDetailListByBillNo(query)); |
| | | conn.Close(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |