/// <summary> /// 入库操作 /// </summary> /// <param name="entryInfo"></param> /// <param name="entryDetailInfos"></param> /// <param name="errorMsg"></param> /// <returns></returns> internal void DoEntry(I_Entry entryInfo, List <I_EntryDetail> entryDetailInfos, ref string errorMsg) { //1 先插入主表 I_Entry tempEntry = (from e in db.I_Entry where e.EntryCode == entryInfo.EntryCode select e).FirstOrDefault(); if (tempEntry == null) { dalContext.II_EntryDAL.Add(entryInfo); } foreach (I_EntryDetail info in entryDetailInfos) { I_EntryDetail tempEntryDetail = (from e in db.I_EntryDetail where e.EntryDetailCode == info.EntryDetailCode select e).FirstOrDefault(); if (tempEntryDetail != null) { info.EntryDetailCode = (Convert.ToInt32(info.EntryDetailCode) + 1).ToString(); } //2. 再插入从表信息 红充流程注意记录RedEntryDetailCode信息 dalContext.II_EntryDetailDAL.Add(info); //3. 保存剩余流水表 dalContext.II_SurplusDAL.SaveEntrySurplusInfo(info, entryInfo.EntryType, ref errorMsg); } }
/// <summary> /// 红充操作 /// </summary> /// <param name="newEntryInfo">新入库单</param> /// <param name="orientryDetailInfo">原入单从表</param> /// <param name="newEntryDetailInfo">新入库单从表</param> /// <param name="errorMsg"></param> /// <returns></returns> public bool EntryRedOperate(I_Entry newEntryInfo, I_EntryDetail orientryDetailInfo, I_EntryDetail newEntryDetailInfo, ref string errorMsg) { //创建事务 using (var tran = db.Database.BeginTransaction()) { try { //修改红冲入库单号 orientryDetailInfo 不能被EF框架跟踪 dalContext.II_EntryDetailDAL.Modify(orientryDetailInfo, "RedEntryDetailCode"); //更新被红充编码 List <I_EntryDetail> entryDetailInfos = new List <I_EntryDetail>(); entryDetailInfos.Add(newEntryDetailInfo); this.DoEntry(newEntryInfo, entryDetailInfos, ref errorMsg); //做入库操作 tran.Commit(); //提交事务 return(true); } catch (Exception ex) { if (tran != null) { tran.Rollback(); //回滚事务 } errorMsg = "入库操作失败! 操作已取消!~~" + ex.Message; return(false); } } }
public ActionResult SaveEntry() { string sEntryDetailInfo = Request.Form["sEntryDetailInfo"].ToString(); List <EntryDetailInfo> relist = JsonHelper.GetJsonInfoBy <List <EntryDetailInfo> >(sEntryDetailInfo); I_Entry entryInfo = new I_Entry(); entryInfo.EntryCode = DateTime.Now.AddSeconds(1).ToString("yyyyMMddHHmmss") + entryInfo.OperatorCode; //生成入库编码 entryInfo.EntryDate = Convert.ToDateTime(Request.Form["EntryDate"]); entryInfo.EntryType = "MatertalInType-1"; entryInfo.OperationTime = DateTime.Now; entryInfo.OperatorCode = UserOperateContext.Current.Session_UsrInfo.ID; entryInfo.EntryStorageID = int.Parse(Request.Form["StorageCode"]); entryInfo.Remark = Request.Form["Remark"].ToString().Trim(); List <I_EntryDetail> list = new List <Model.I_EntryDetail>(); int ind = 0; foreach (EntryDetailInfo item in relist) { ind++; I_EntryDetail detailinfo = new I_EntryDetail(); detailinfo.EntryDetailCode = entryInfo.EntryCode + entryInfo.OperatorCode + ind.ToString(); detailinfo.BatchNo = item.BatchNo; detailinfo.RealBatchNo = item.RealBatchNo; detailinfo.EntryCode = entryInfo.EntryCode; detailinfo.EntryCounts = item.EntryCounts; detailinfo.EntryDate = item.EntryDate; detailinfo.MaterialID = item.MaterialID; detailinfo.OperatorCode = UserOperateContext.Current.Session_UsrInfo.ID; detailinfo.RedEntryDetailCode = ""; detailinfo.RelatedOrderNum = item.RelatedOrderNum; detailinfo.Remark = item.Remark.Trim(); detailinfo.Specification = item.Specification; detailinfo.StorageCode = item.StorageCode; detailinfo.TotalPrice = item.TotalPrice; detailinfo.Unit = item.Unit; if (item.ValidityDateStr == "无有效期") { detailinfo.ValidityDate = DateTime.MaxValue; } else { detailinfo.ValidityDate = Convert.ToDateTime(item.ValidityDateStr); } list.Add(detailinfo); } string errorMsg = ""; if (new I_EntryBLL().EntryOperate(entryInfo, list, ref errorMsg)) { return(this.JsonResult(Utility.E_JsonResult.OK, "入库信息成功!", null, null)); } else { return(this.JsonResult(Utility.E_JsonResult.Error, errorMsg, null, null)); } }
/// <summary> /// 入库操作 /// </summary> /// <param name="userID"></param> /// <param name="entryInfo"></param> /// <param name="entryDetailInfos"></param> /// <param name="errorMsg"></param> /// <returns></returns> public bool EntryOperate(I_Entry entryInfo, List <I_EntryDetail> entryDetailInfos, ref string errorMsg) { //创建事务 using (var tran = db.Database.BeginTransaction()) { try { this.DoEntry(entryInfo, entryDetailInfos, ref errorMsg); tran.Commit(); //提交事务 return(true); } catch (Exception ex) { if (tran != null) { tran.Rollback(); //回滚事务 } errorMsg = "入库操作失败! 操作已取消!~~" + ex.Message; return(false); } } }
/// <summary> /// 保存出库结余信息 /// TODO:1.先查询出库结余 2.如果有则更新结余 3.如没有则提示错误 4.插入出库入库流水 /// </summary> /// <param name="info"></param> /// <param name="strEntryType"></param> public void SaveDeliverySurplusInfo(I_DeliveryDetail info, string strDeliveryType, ref string errorMsg) { decimal price = 0; try { //查结余 I_Surplus surplusinfo = base.GetModelWithOutTrace(s => s.BatchNo == info.BatchNo && s.MaterialID == info.MaterialID && s.StorageCode == info.EntryStorageCode && s.RealBatchNo == info.RealBatchNo); if (surplusinfo != null) //有结余数据 { double surplus = surplusinfo.Surplus - info.DeliveryCounts; if (surplusinfo.Surplus > 0) //剩余必须大于 0 才能计算出平均单价 { price = surplusinfo.SurplusPrice / Convert.ToDecimal(surplusinfo.Surplus); } if (surplus >= 0) { surplusinfo.Surplus = surplusinfo.Surplus - info.DeliveryCounts; } else { errorMsg = "该批次号库存不足,出库失败!"; throw new Exception(errorMsg); } surplusinfo.SurplusPrice = surplusinfo.SurplusPrice - price * Convert.ToDecimal(info.DeliveryCounts); base.Modify(surplusinfo, "Surplus", "SurplusPrice"); //更新结余信息 } else { errorMsg = "未找到该批次号商品信息,出库失败!"; throw new Exception(errorMsg); } #region 2.记录出库信息 I_InventoryRecord record = new I_InventoryRecord(); record.BatchNo = info.BatchNo; //批次号 record.RealBatchNo = info.RealBatchNo; //真实批次号 record.DeliveryEntryType = strDeliveryType; //出入库类型 record.DeliveryDetailCode = info.DeliveryDetailCode; //出库详细编码 record.Is_Entry = false; //入库标识 record.MaterialID = info.MaterialID; //物资编码 record.OperatorDateTime = info.DeliveryTime; //出库日期 record.StorageCode = info.EntryStorageCode; //仓储编码 record.OriginalSurplus = surplusinfo.Surplus + info.DeliveryCounts; // 原结余数量= 当前库存结余数量+ 出库数量 record.ChangeSurplus = -info.DeliveryCounts; //改变数量=出库数量 record.Surplus = surplusinfo.Surplus; //当前库存结余数量 record.SurplusPrice = surplusinfo.SurplusPrice; //当前库存结余价格 record.OperatorCode = info.OperatorCode; //操作人员编码 //插入出入库流水 dalContext.II_InventoryRecordDAL.Add(record); #endregion #region 3.自动生成转库入库单 I_Entry entry = new I_Entry(); // 入库主表 entry.EntryCode = info.DeliveryCode; //出库编码 entry.EntryDate = info.DeliveryTime; // 出库时间 entry.EntryStorageID = info.TargetStorageCode; //入库仓库编码=出库目的编码 if (info.RedDeliveryDetailCode != null) { entry.EntryType = "MatertalInType-3"; //红充入库单 } else { entry.EntryType = "MatertalInType-2"; //转库入库单 } entry.OperationTime = DateTime.Now; // 操作时刻 entry.OperatorCode = info.OperatorCode; entry.Remark = ""; I_EntryDetail entryDetail = new I_EntryDetail(); //入库从表 entryDetail.BatchNo = info.BatchNo; entryDetail.RealBatchNo = info.RealBatchNo; //真实批次号 entryDetail.EntryCode = info.DeliveryCode; //入库编码=出库编码 entryDetail.EntryCounts = info.DeliveryCounts; //入库数量 = 出库数量 entryDetail.EntryDate = info.DeliveryTime; // 入库时间 = 出库时间 entryDetail.EntryDetailCode = info.DeliveryDetailCode; //出库子编码 entryDetail.MaterialID = info.MaterialID; entryDetail.OperatorCode = info.OperatorCode; entryDetail.StorageCode = info.TargetStorageCode; entryDetail.TotalPrice = price; //当前库存结余价格; entryDetail.ValidityDate = surplusinfo.ValidityDate; //有效期 //如果被红充的出库信息不为空 if (info.RedDeliveryDetailCode != null) { entryDetail.RedEntryDetailCode = info.RedDeliveryDetailCode; //被红充入库编码 = 被红充出库编码 } List <I_EntryDetail> list = new List <I_EntryDetail>(); list.Add(entryDetail); //入库操作 new I_EntryDAL().DoEntry(entry, list, ref errorMsg); //调用入库流程 #endregion } catch (Exception e) { errorMsg = "结余操作失败!原因: " + e.Message; throw new Exception(errorMsg); } }