using System; using System.Collections.Generic; using System.Linq; using System.Text; using BWP.B3Frameworks; using BWP.B3Frameworks.BO.NamedValueTemplate; using BWP.B3Frameworks.Utils; using BWP.B3Sale.BL; using BWP.B3Sale.BO; using BWP.B3Sale.Utils; using BWP.B3UnitedInfos.BO; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using Forks.Utils; using TSingSoft.WebPluginFramework; namespace B3_QiLianMuGe.Utils { [TypeIOC(typeof(SaleOutStoreBL), typeof(SaleOutStoreBL.ICreateInOutStoreBill))] public class CreateInOutStoreBillIOC : SaleOutStoreBL.ICreateInOutStoreBill { public void Invoke(IDmoSession session, SaleOutStore saleOutStore, InOutStoreBill target, ref bool flag) { SetInOutStoreBillDetailByWeightInfos(session, saleOutStore, target); if (target.Details.Count > 0) flag = true; else flag = false; } /// /// 处理扫条码按条码的生产批次对应的存货批次出库 /// /// /// private void SetInOutStoreBillDetailByWeightInfos(IDmoSession Session,SaleOutStore dmo, InOutStoreBill target) { var query = new DQueryDom(new JoinAlias(typeof(WeightingInfor))); query.Columns.Add(DQSelectColumn.Field("DetailID")); query.Columns.Add(DQSelectColumn.Field("Goods_ID")); query.Columns.Add(DQSelectColumn.Field("Product_Batch")); query.Columns.Add(DQSelectColumn.Sum("MainUnitNum")); query.Columns.Add(DQSelectColumn.Sum("SecondNumber")); query.Where.Conditions.Add(DQCondition.EQ("BillType", DmoTypeIDAttribute.GetID(typeof(SaleOutStore)))); query.Where.Conditions.Add(DQCondition.EQ("BillID", dmo.ID)); query.GroupBy.Expressions.Add(DQExpression.Field("DetailID")); query.GroupBy.Expressions.Add(DQExpression.Field("Goods_ID")); query.GroupBy.Expressions.Add(DQExpression.Field("Product_Batch")); var tuples = query.EExecuteList?, Money?>(Session); if (tuples.Count() > 0) { var results = tuples.Where(x => string.IsNullOrEmpty(x.Item3) && x.Item4 > 0); foreach (var result in results) { var oDetails = dmo.Details.Where(x => x.ID == result.Item1); if (oDetails.Count() > 0) { var detail = oDetails.First(); detail.UnitNum = result.Item4; detail.Number = result.Item4; detail.SecondNumber = result.Item5; detail.GoodsBatch_ID = null; var dic = new Dictionary>(); var outDetails = AddDetailByPdAndBatchNo(Session, dmo, detail, dic); foreach (var item in outDetails) { var targetDetail = new InOutStoreBill_Detail(); target.Details.Add(targetDetail); var details = dmo.Details.Where(x => x.ID == detail.ID); SaleOutStore_Detail outDetail = null; if (details.Count() > 0) { outDetail = details.First(); } if (dmo.BusinessProperty == B3Sale业务属性.正常出库) targetDetail.Store_ID = dmo.Store_ID ?? 0; else { if (outDetail != null) targetDetail.Store_ID = outDetail.Store_ID ?? 0; } targetDetail.Goods_ID = item.SaleGoods_ID; targetDetail.Number = item.Number.Value; targetDetail.SecondNumber = item.SecondNumber; targetDetail.GoodsBatch_ID = item.GoodsBatch_ID; if (outDetail != null) { targetDetail.CargoSpace_ID = item.CargoSpace_ID; targetDetail.Price = item.Price; targetDetail.Money = item.Price * item.Number; targetDetail.BrandItem_ID = item.BrandItem_ID; } } } } foreach (var detail in tuples.Where(x => !string.IsNullOrEmpty(x.Item3))) { if (detail.Item4 == null || detail.Item4 == 0) { continue; } var targetDetail = new InOutStoreBill_Detail(); target.Details.Add(targetDetail); var details = dmo.Details.Where(x => x.ID == detail.Item1); SaleOutStore_Detail outDetail = null; if (details.Count() > 0) { outDetail = details.First(); } if (dmo.BusinessProperty == B3Sale业务属性.正常出库) targetDetail.Store_ID = dmo.Store_ID ?? 0; else { if (outDetail != null) targetDetail.Store_ID = outDetail.Store_ID ?? 0; } targetDetail.Goods_ID = detail.Item2.Value; targetDetail.Number = detail.Item4 ?? 0; targetDetail.SecondNumber = detail.Item5 ?? 0; var tuple = SaleUtil.GetGoodsBatch(DomainContext.Current.ID, detail.Item3, detail.Item2.Value); if (tuple != null) targetDetail.GoodsBatch_ID = tuple.Item1; if (outDetail != null) { targetDetail.CargoSpace_ID = outDetail.CargoSpace_ID; targetDetail.Price = outDetail.Price; targetDetail.Money = outDetail.Price * targetDetail.Number; targetDetail.BrandItem_ID = outDetail.BrandItem_ID; } } } } static List AddDetailByPdAndBatchNo(IDmoSession session, SaleOutStore saleOutStore, SaleOutStore_Detail outStoreDetail, Dictionary> dic) { if (!dic.ContainsKey(outStoreDetail.SaleGoods_ID)) { dic.Add(outStoreDetail.SaleGoods_ID, GetStoreDetailInfor(session, saleOutStore.Store_ID, outStoreDetail.SaleGoods_ID)); } var list = dic[outStoreDetail.SaleGoods_ID]; var theNum = outStoreDetail.Number ?? 0;//需要转的数量 var theSecNum = outStoreDetail.SecondNumber ?? 0;//需要转的辅数量 var num = theNum; var details = new List(); foreach (var unionView in list) { if (num <= 0) break; if (unionView.Number <= 0) continue; Money thisNum;//当前明细分配数量 Money thisSecNum;//当前明细分配辅数量 if (unionView.Number >= num) { thisNum = num; } else { thisNum = unionView.Number; } if (unionView.SecondNumber >= theSecNum) { thisSecNum = theSecNum; } else { thisSecNum = unionView.SecondNumber; } var outDetail = new SaleOutStore_Detail(); DmoUtil.CopyDmoFields(outStoreDetail, outDetail, "UnitNum", "Number", "SecondNumber", "Money", "RebateMoney"); outDetail.Price = outStoreDetail.Price; outDetail.ProductionDate = unionView.ProductionDate; outDetail.GoodsBatch_ID = unionView.GoodsBatch_ID; outDetail.Number = thisNum; if (outDetail.RightRatio != 0) outDetail.UnitNum = outDetail.Number / outDetail.RightRatio * outDetail.LeftRatio; if (outDetail.Goods_UnitConvertDirection == 主辅转换方向.由主至辅 || outDetail.Goods_UnitConvertDirection == 主辅转换方向.双向转换) { outDetail.SecondNumber = outDetail.Number / outDetail.RightRatio * outDetail.LeftRatio; thisSecNum = outDetail.SecondNumber ?? 0; } else { outDetail.SecondNumber = thisSecNum; } outDetail.HiddenNumber = outDetail.Number; outDetail.HiddenUnitNum = outDetail.UnitNum; outDetail.HiddenSecondNumber = outDetail.SecondNumber; details.Add(outDetail); num -= thisNum; theSecNum -= thisSecNum; unionView.Number -= thisNum; unionView.SecondNumber -= thisSecNum; } if (num != 0) throw new Exception(string.Format("{0}可用库存还差{1},不允许出库,审核失败", outStoreDetail.Goods_Name, num)); var lastDetail = details.LastOrDefault(); if (lastDetail != null) { lastDetail.Money = (lastDetail.Money ?? 0m) + (outStoreDetail.Money ?? 0) - details.Sum(x => (x.Money ?? 0).Value); lastDetail.SecondNumber = (lastDetail.SecondNumber ?? 0m) + (outStoreDetail.SecondNumber ?? 0) - details.Sum(x => (x.SecondNumber ?? 0).Value); } return details; } static List GetStoreDetailInfor(IDmoSession session, long? store_ID, long? saleGoods_ID) { var dom1 = new DQueryDom(new JoinAlias(typeof(StoreDetail))); dom1.Columns.Add(DQSelectColumn.Field("GoodsBatch_ProductionDate")); dom1.Columns.Add(DQSelectColumn.Field("GoodsBatch_ID")); dom1.Columns.Add(DQSelectColumn.Field("Number")); dom1.Columns.Add(DQSelectColumn.Field("SecondNumber")); dom1.Where.Conditions.Add(DQCondition.EQ("Goods_ID", saleGoods_ID)); dom1.Where.Conditions.Add(DQCondition.EQ("Store_ID", store_ID)); dom1.Where.Conditions.Add(DQCondition.GreaterThan(DQExpression.Field("Number"), DQExpression.Value(0))); dom1.OrderBy.Expressions.Add(DQOrderByExpression.Create("GoodsBatch_ProductionDate")); dom1.OrderBy.Expressions.Add(DQOrderByExpression.Create("GoodsBatch_ID")); var list = new List(); using (var reader = session.ExecuteReader(dom1)) { while (reader.Read()) { var tmp = new TmpData(); tmp.ProductionDate = (DateTime?)reader[0]; tmp.GoodsBatch_ID = (long?)reader[1]; tmp.Number = (Money?)reader[2] ?? 0; tmp.SecondNumber = (Money?)reader[3] ?? 0; list.Add(tmp); } } return list; } class TmpData { public long? GoodsBatch_ID { get; set; } public DateTime? ProductionDate { get; set; } public Money Number { get; set; } public Money SecondNumber { get; set; } } } }