祁连牧歌客户模块
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

298 lines
11 KiB

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;
}
}
}