using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.UI; using BWP.B3CowButcherManage.BO; using BWP.B3Frameworks; using BWP.Web.Pages.B3UnitedInfos.Bills.StockTake_; using BWP.Web.WebControls; using Forks.EnterpriseServices.BusinessInterfaces; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using Forks.EnterpriseServices.JsonRpc; using Forks.EnterpriseServices.SqlDoms; using Forks.Utils; using TSingSoft.WebControls2; namespace BWP.Web.Pages.Overlays { class StockTakeEdit_Ext: StockTakeEdit { protected override void AddCustomerToolsPanel(HLayoutPanel hPanel) { hPanel.Add(new LiteralControl("  ")); hPanel.Add(new TSButton("根据条码载入盘点数量", delegate { mDFContainer.GetFromUI(); _detailGrid.GetFromUI(); var list = GetBarCodeData(); var dic = new Dictionary, Money?>>(); foreach (var detail in Dmo.Details) { var results = list.Where(x => x.GoodsBatch_ID == detail.GoodsBatch_ID && x.Goods_ID == detail.Goods_ID); if (results.Count() > 0) { var first = results.First(); detail.TakeNumber = first.Weight; detail.SecondTakeNumber = first.Num; } } _detailGrid.DataBind(); AspUtil.Alert(this, "操作成功"); })); var btn_x = hPanel.Add(new DialogButton { Text = "查看本库条码", Url = "~/B3_QiLianMuGe/Dialogs/QueryBarCode.aspx?Store_ID='+__DFContainer.getValue('Store_ID')+'" }); btn_x.Click += delegate { }; var deleteBtn = new TSButton("删除盘点条码"); deleteBtn.Click += delegate { var dom = new DQDeleteDom(typeof(StockTakeCEUploadBarCode)); using (var context = new TransactionContext()) { context.Session.ExecuteNonQuery(dom); context.Session.Commit(); } AspUtil.Alert(this, "操作成功"); }; deleteBtn.Attributes.Add("OnClick", "javascript:return confirm('确认要删除所有仓库盘点的条码吗?请先确认所有仓库是否都盘点完毕后再删除,删除条码后无法恢复')"); hPanel.Add(deleteBtn); } class MinSaelBarCode { public string PackageBarCode { get; set; } public string BarCode { get; set; } public long? Goods_ID { get; set; } public string Goods_Name { get; set; } public string Goods_Code { get; set; } public decimal? Weight { get; set; } public string Product_Batch { get; set; } public decimal? PackageWeight { get; set; } public long? PackageID { get; set; } public string PackageProduct_Batch { get; set; } public DateTime? RightInStoreTime { get; set; } public bool? IsOpen { get; set; } public long? Store_ID { get; set; } public string Store_Name { get; set; } public bool? IsAssignGoods { get; set; } public long? AssignBillID { get; set; } public int? PickType { get; set; } public string RightProduct_Batch { get; set; } public string CeBarCode { get; set; } public DateTime? PickTime { get; set; } } private class BarCodeData { public long? Goods_ID { get; set; } public string Product_Batch { get; set; } public decimal? Weight { get; set; } public decimal? Num { get; set; } public long? GoodsBatch_ID { get; set; } } private List GetBarCodeData() { var uploadBarCode = new JoinAlias(typeof(StockTakeCEUploadBarCode)); var left = new JoinAlias("_l", typeof(BarCodeProductionInfo)); var right = new JoinAlias("_r", typeof(BarCodeProductionInfo)); var goods = new JoinAlias("_g", typeof(BWP.B3CowButcherManage.BO.Goods)); var query = new DQueryDom(left); query.From.AddJoin(JoinType.Inner, new DQDmoSource(uploadBarCode), DQCondition.EQ(left, "BarCode", uploadBarCode, "BarCode")); query.From.AddJoin(JoinType.Left, new DQDmoSource(right), DQCondition.EQ(left, "ID", right, "PackageID")); query.From.AddJoin(JoinType.Left, new DQDmoSource(goods), DQCondition.EQ(left, "Goods_ID", goods, "ID")); var arr = new string[] { "Goods_ID", "Goods_Name", "Goods_Code", "Weight", "InStoreTime", "Store_ID", "Store_Name", "IsAssignGoods", "AssignBillID", "PickType","BarCode" }; foreach (var f in arr) query.Columns.Add(DQSelectColumn.Create(DQExpression.LogicCase(DQCondition.EQ(left, "BarType", 3), DQExpression.Field(right, f), DQExpression.Field(left, f)), f)); query.Columns.Add(DQSelectColumn.Field("PackageWeight", goods)); query.Columns.Add(DQSelectColumn.Field("PackageID", right)); query.Columns.Add(DQSelectColumn.Field("Product_Batch", left)); query.Columns.Add(DQSelectColumn.Field("IsOpen", left)); query.Columns.Add(DQSelectColumn.Field("Product_Batch", right)); query.Columns.Add(DQSelectColumn.Field("BarCode", uploadBarCode)); var list = new List(); using (var contex = new TransactionContext()) { using (var reader = contex.Session.ExecuteReader(query)) { while (reader.Read()) { decimal? packageWeight = null; var num = (Money?)reader[11]; if (num != null) { packageWeight = num.Value.Value; } var obj = new MinSaelBarCode() { Goods_ID = (long?)reader[0], Goods_Name = (string)reader[1], Goods_Code = (string)reader[2], Weight = (decimal?)reader[3], RightInStoreTime = (DateTime?)reader[4], Store_ID = (long?)reader[5], Store_Name = (string)reader[6], IsAssignGoods = (bool?)reader[7], AssignBillID = (long?)reader[8], PickType = (int?)reader[9], BarCode = (string)reader[10], PackageWeight = packageWeight, PackageID = (long?)reader[12], Product_Batch = (string)reader[13], IsOpen = (bool?)reader[14], RightProduct_Batch = (string)reader[15], CeBarCode = (string)reader[16], }; list.Add(obj); } } } var groups = list.GroupBy(x => x.BarCode); var resultlist = new List(); //既扫了箱码又单扫了箱里面的子码,去除单扫箱里面子码的情况 foreach (var group in groups) { if(group.Count() > 1) { var result = group.Where(x => x.PackageID != null); if (result.Count() > 0) { resultlist.Add(result.First()); }else { resultlist.Add(group.First()); } }else { resultlist.Add(group.First()); } } var weightList = new List(); //当前仓库已入库的条码 var results = resultlist.Where(x => x.Goods_ID != null && x.Store_ID == Dmo.Store_ID); if (results.Count() > 0) { var barCodes = results.Where(x => x.PackageID != null); var unPackage = barCodes.Where(x => x.IsOpen == true || x.PickType != null); var items = barCodes.Where(x => !unPackage.Any(y => y.BarCode == x.BarCode)); var packageGroups = items.GroupBy(x => x.PackageID); foreach (var package in packageGroups) { var datas = package.Where(x => x.PackageWeight != null); if (datas.Count() > 0) { var result = datas.First(); weightList.Add(new BarCodeData { Goods_ID = result.Goods_ID, Product_Batch = result.Product_Batch, Weight = result.PackageWeight, Num = datas.Count()}); }else { foreach (var item in package) { weightList.Add(new BarCodeData { Goods_ID = item.Goods_ID, Product_Batch = item.RightProduct_Batch, Weight = item.Weight, Num = 1 }); } } } var items2 = results.Where(x => x.PackageID == null && x.PickType==null); foreach (var item in items2) { weightList.Add(new BarCodeData { Goods_ID = item.Goods_ID, Product_Batch = item.Product_Batch, Weight = item.Weight, Num = 1 }); } } var batchGroups = weightList.GroupBy(x => x.Product_Batch); foreach (var group in batchGroups) { var tuples = new List>(); var goodsIds = group.Select(x => x.Goods_ID ?? 0).Distinct(); var goodsLists = SplitListWithCount(goodsIds.ToList(), 1000); foreach (var goodslist in goodsLists) { var batchs = QuerytGoodsBatch(group.Key, goodslist); batchs.ForEach(x => tuples.Add(x)); } foreach (var item in group) { var batch = tuples.Where(x => x.Item1 == item.Goods_ID); if(batch.Count() > 0) { item.GoodsBatch_ID = batch.First().Item2; } } } var details = new List(); var goodsGroups = weightList.GroupBy(x => x.Goods_ID); foreach (var group in goodsGroups) { var goodsBatchGroups = group.GroupBy(x=>x.GoodsBatch_ID); foreach (var item in goodsBatchGroups) { var codeData = new BarCodeData(); codeData.Goods_ID = group.Key; codeData.GoodsBatch_ID = item.Key; codeData.Weight = item.Sum(x=>x.Weight); codeData.Num = item.Sum(x=>x.Num); details.Add(codeData); } } return details; } private List> QuerytGoodsBatch(string batch, IEnumerable goodsIds) { var query = new DQueryDom(new JoinAlias(typeof(BWP.B3UnitedInfos.BO.GoodsBatch))); query.Columns.Add(DQSelectColumn.Field("Goods_ID")); query.Columns.Add(DQSelectColumn.Field("ID")); query.Where.Conditions.Add(DQCondition.And(DQCondition.InList(DQExpression.Field("Goods_ID"), goodsIds.Select(x => DQExpression.Value(x)).ToArray()), DQCondition.EQ("Name", batch))); query.Where.Conditions.Add(DQCondition.EQ("Stopped", false)); query.Where.Conditions.Add(DQCondition.EQ("Domain_ID", DomainContext.Current.ID)); var list = new List>(); using (var context2 = new TransactionContext()) { using (var reader = context2.Session.ExecuteReader(query)) { while (reader.Read()) { list.Add(new Tuple((long)reader[0], (long)reader[1])); } } } return list; } private List> SplitListWithCount(IList list, int count) { var num = list.Count / count; var num2 = list.Count % count; var results = new List>(); for (int i = 1; i <= num; i++) { var l = new List(); for (int j = (i - 1) * count; j < count * i; j++) { l.Add(list[j]); } results.Add(l); } if (num2 > 0) { var l = new List(); for (int i = num * count; i < list.Count; i++) { l.Add(list[i]); } results.Add(l); } return results; } } }