using ButcherFactory.BO.Utils; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using Forks.JsonRpc.Client; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ButcherFactory.BO.LocalBL { public static class CarcassSaleOutBL { const string RpcPath = @"/MainSystem/B3Sale/Rpcs/"; const string MESPath = @"/MainSystem/B3ClientService/Rpcs/"; public static BindingList GetSaleOutStoreList(DateTime sendDate, long? deliverGoodsLineID, long? customerID, int billState, long? storeID, bool already = false) { var json = RpcFacade.Call(RpcPath + "SaleOutStoreRpc/GetSaleOutStoreList", sendDate, billState, deliverGoodsLineID, customerID, storeID, already); var list = JsonConvert.DeserializeObject>(json); return new BindingList(list); } public static BindingList GetSaleOutStoreDetailList(long id) { var json = RpcFacade.Call(RpcPath + "SaleOutStoreRpc/GetSaleOutStoreDetailList", id); var list = JsonConvert.DeserializeObject>(json); return new BindingList(list); } public static BindingList GetWeightRecord(long detailID) { var query = new DmoQuery(typeof(CarcassSaleOut_Detail)); query.Where.Conditions.Add(DQCondition.EQ("DetailID", detailID)); query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID", true)); var list = query.EExecuteList().Cast().ToList(); return new BindingList(list); } public static CarcassSaleOut_Detail Insert(decimal weight) { using (var session = DmoSession.New()) { var detail = new CarcassSaleOut_Detail() { Weight = weight, Number = 1 }; session.Insert(detail); session.Commit(); return detail; } } public static BindingList GetUnSubmitWeightRecord() { var query = new DmoQuery(typeof(CarcassSaleOut_Detail)); query.Where.Conditions.Add(DQCondition.IsNull(DQExpression.Field("DetailID"))); query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID", true)); var list = query.EExecuteList().Cast().ToList(); var idx = list.Count; foreach (var item in list) { item.Idx = idx; idx--; } return new BindingList(list); } public static void FillDetail(CarcassSaleOut_Detail first, string barCode, long? batchID) { using (var session = DmoSession.New()) { var list = new List>(); if (barCode.StartsWith("G")) { var arr = barCode.TrimStart('G').Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries); var gid = long.Parse(arr[0]); var gInfo = GetGoodsInfo(gid); first.Goods_ID = gid; first.Goods_Name = gInfo.Item1; first.Goods_Code = gInfo.Item2; first.ProductBatch_ID = batchID; if (arr.Length == 2) { first.Number = 0.5m; list.Add(new Tuple("Number", first.Number)); } list.Add(new Tuple("ProductBatch_ID", first.ProductBatch_ID)); } else { var json = ButcherFactoryUtil.SimpleMESCall(MESPath + "CarcassSaleOutStoreRpc/GetCarcassInstoreInfo", barCode); var mesInfo = JsonConvert.DeserializeObject(json); if (!string.IsNullOrEmpty(mesInfo.Goods_Code)) { if (mesInfo.Goods_Code == "X002") mesInfo.Goods_Code = "0001"; var gInfo = GetGoodsInfo(mesInfo.Goods_Code); first.Goods_Code = mesInfo.Goods_Code; first.InStoreWeight = mesInfo.InStoreWeight; first.Goods_ID = gInfo.Item1; first.Goods_Name = gInfo.Item2; } first.BarCode = barCode; list.Add(new Tuple("BarCode", first.BarCode)); list.Add(new Tuple("InStoreWeight", first.InStoreWeight)); } first.Filled = true; list.Add(new Tuple("Goods_ID", first.Goods_ID)); list.Add(new Tuple("Goods_Name", first.Goods_Name)); list.Add(new Tuple("Goods_Code", first.Goods_Code)); list.Add(new Tuple("Filled", first.Filled)); Update(session, first.ID, list.ToArray()); session.Commit(); } } static void Update(IDmoSession session, long id, params Tuple[] pops) { var update = new DQUpdateDom(typeof(CarcassSaleOut_Detail)); foreach (var item in pops) update.Columns.Add(new DQUpdateColumn(item.Item1, item.Item2)); update.Where.Conditions.Add(DQCondition.EQ("ID", id)); session.ExecuteNonQuery(update); } static Dictionary> goodsIdInfo = new Dictionary>(); static Tuple GetGoodsInfo(long id) { if (!goodsIdInfo.ContainsKey(id)) { var json = RpcFacade.Call(RpcPath + "BaseInfoSelectRpc/GetGoodsInfo", "ID", id); var g = JsonConvert.DeserializeObject(json); if (g.LongExt1 == null) throw new Exception("没有找到存货No." + id); goodsIdInfo.Add(id, new Tuple(g.StringExt1, g.StringExt2)); } return goodsIdInfo[id]; } static Dictionary> goodsCodeInfo = new Dictionary>(); public static Tuple GetGoodsInfo(string code) { if (!goodsCodeInfo.ContainsKey(code)) { var json = RpcFacade.Call(RpcPath + "BaseInfoSelectRpc/GetGoodsInfo", "Code", code); var g = JsonConvert.DeserializeObject(json); if (g.LongExt1 == null) throw new Exception("没有找到存货编码 " + code); goodsCodeInfo.Add(code, new Tuple(g.LongExt1.Value, g.StringExt1)); } return goodsCodeInfo[code]; } public static List GetBatchFromEMS() { var json = ButcherFactoryUtil.SimpleMESCall(MESPath + "SyncBaseInfoRpc/GetProductBatch", 9); return JsonConvert.DeserializeObject>(json); } public static void SubmitDetails(IEnumerable details, SaleOutStore_Detail detail) { var arr = details.Select(x => new WeightRecord { WeightTime = x.Time, MainUnitNum = x.Weight, SecondNumber = x.Number, ProductBatch_ID = x.ProductBatch_ID, BarCode = x.BarCode }); RpcFacade.Call(RpcPath + "SaleOutStoreRpc/SaveWeightRecord", JsonConvert.SerializeObject(arr), detail.ID); var update = new DQUpdateDom(typeof(CarcassSaleOut_Detail)); update.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("ID"), details.Select(x => DQExpression.Value(x.ID)).ToArray())); update.Columns.Add(new DQUpdateColumn("BillID", detail.SaleOutStore_ID)); update.Columns.Add(new DQUpdateColumn("DetailID", detail.ID)); update.EExecute(); detail.SNumber = (detail.SNumber ?? 0) + details.Sum(x => x.Weight); detail.SSecondNumber = (detail.SSecondNumber ?? 0) + details.Sum(x => x.Number); } public static void SaveAssignNum(long id, decimal number) { RpcFacade.Call(RpcPath + "SaleOutStoreRpc/SaveAssignNum", id, number); } public static void SetGoodsFinish(long id) { RpcFacade.Call(RpcPath + "SaleOutStoreRpc/SetFinishAssignState", id); } public static void Delete(long id) { var delete = new DQDeleteDom(typeof(CarcassSaleOut_Detail)); delete.Where.Conditions.Add(DQCondition.EQ("ID", id)); delete.EExecute(); } } class SaleOutCarcassObj { public string Goods_Code { get; set; } public decimal? InStoreWeight { get; set; } } class WeightRecord { public string BarCode { get; set; } public long? ProductBatch_ID { get; set; } public DateTime WeightTime { get; set; } public decimal? MainUnitNum { get; set; } public decimal? SecondNumber { get; set; } } }