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<string, Tuple<Money<decimal>, Money<decimal>?>>();
|
|
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<BarCodeData> 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<MinSaelBarCode>();
|
|
using (var contex = new TransactionContext())
|
|
{
|
|
using (var reader = contex.Session.ExecuteReader(query))
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
decimal? packageWeight = null;
|
|
var num = (Money<decimal>?)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<MinSaelBarCode>();
|
|
//既扫了箱码又单扫了箱里面的子码,去除单扫箱里面子码的情况
|
|
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<BarCodeData>();
|
|
//当前仓库已入库的条码
|
|
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<Tuple<long,long>>();
|
|
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<BarCodeData>();
|
|
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<Tuple<long, long>> QuerytGoodsBatch(string batch, IEnumerable<long> 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<Tuple<long, long>>();
|
|
using (var context2 = new TransactionContext())
|
|
{
|
|
using (var reader = context2.Session.ExecuteReader(query))
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
list.Add(new Tuple<long, long>((long)reader[0], (long)reader[1]));
|
|
}
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private List<List<T>> SplitListWithCount<T>(IList<T> list, int count)
|
|
{
|
|
var num = list.Count / count;
|
|
var num2 = list.Count % count;
|
|
var results = new List<List<T>>();
|
|
for (int i = 1; i <= num; i++)
|
|
{
|
|
var l = new List<T>();
|
|
for (int j = (i - 1) * count; j < count * i; j++)
|
|
{
|
|
l.Add(list[j]);
|
|
}
|
|
results.Add(l);
|
|
}
|
|
if (num2 > 0)
|
|
{
|
|
var l = new List<T>();
|
|
for (int i = num * count; i < list.Count; i++)
|
|
{
|
|
l.Add(list[i]);
|
|
}
|
|
results.Add(l);
|
|
}
|
|
return results;
|
|
}
|
|
|
|
}
|
|
}
|