| @ -1,237 +0,0 @@ | |||||
| 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 SegmentSaleOutBL | |||||
| { | |||||
| const string RpcPath = @"/MainSystem/B3Sale/Rpcs/"; | |||||
| const string MESPath = @"/MainSystem/B3ClientService/Rpcs/"; | |||||
| public static BindingList<SaleOutStore> GetSaleOutStoreList(DateTime sendDate, long? deliverGoodsLineID, long? customerID, int billState, long? storeID, bool already = false) | |||||
| { | |||||
| return CarcassSaleOutBL.GetSaleOutStoreList(sendDate, deliverGoodsLineID, customerID, billState, storeID, already); | |||||
| } | |||||
| public static BindingList<SaleOutStore_Detail> GetSaleOutStoreDetailList(long id) | |||||
| { | |||||
| return CarcassSaleOutBL.GetSaleOutStoreDetailList(id); | |||||
| } | |||||
| public static bool HasNoAssignDetail(long billID) | |||||
| { | |||||
| return CarcassSaleOutBL.HasNoAssignDetail(billID); | |||||
| } | |||||
| public static BindingList<SegmentSaleOut_Detail> GetWeightRecord(long detailID) | |||||
| { | |||||
| var query = new DmoQuery(typeof(SegmentSaleOut_Detail)); | |||||
| query.Where.Conditions.Add(DQCondition.EQ("DetailID", detailID)); | |||||
| query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID", true)); | |||||
| var list = query.EExecuteList().Cast<SegmentSaleOut_Detail>().ToList(); | |||||
| var idx = list.Count; | |||||
| foreach (var item in list) | |||||
| { | |||||
| item.Idx = idx; | |||||
| idx--; | |||||
| } | |||||
| return new BindingList<SegmentSaleOut_Detail>(list); | |||||
| } | |||||
| public static SegmentSaleOut_Detail Insert(decimal weight) | |||||
| { | |||||
| using (var session = DmoSession.New()) | |||||
| { | |||||
| var detail = new SegmentSaleOut_Detail() { Number = weight, SecondNumber = 1 }; | |||||
| session.Insert(detail); | |||||
| session.Commit(); | |||||
| return detail; | |||||
| } | |||||
| } | |||||
| public static List<ProductBatch> GetBatchFromEMS() | |||||
| { | |||||
| return CarcassSaleOutBL.GetBatchFromEMS(1); | |||||
| } | |||||
| static void SubmitDetails(IDmoSession session, IEnumerable<SegmentSaleOut_Detail> details, SaleOutStore_Detail detail, int flag) | |||||
| { | |||||
| var arr = details.Select(x => new WeightRecord { Flag = flag, ID = x.ID, WeightTime = x.Time, MainUnitNum = x.Number, SecondNumber = x.SecondNumber, ProductBatch_ID = x.ProductBatch_ID, BarCode = x.BarCode }); | |||||
| var json = RpcFacade.Call<string>(RpcPath + "SaleOutStoreRpc/SaveWeightRecord", JsonConvert.SerializeObject(arr), detail.ID); | |||||
| var back = JsonConvert.DeserializeObject<Tuple<decimal?, decimal?, List<ExtensionObj>>>(json); | |||||
| foreach (var item in details) | |||||
| { | |||||
| var first = back.Item3.First(x => x.LongExt1 == item.ID); | |||||
| Update(session, item.ID, | |||||
| new Tuple<string, object>("WeightRecord_ID", first.LongExt2), | |||||
| new Tuple<string, object>("ScanRecord_ID", first.LongExt3) | |||||
| ); | |||||
| item.WeightRecord_ID = first.LongExt2; | |||||
| item.ScanRecord_ID = first.LongExt3; | |||||
| } | |||||
| } | |||||
| static void Update(IDmoSession session, long id, params Tuple<string, object>[] pops) | |||||
| { | |||||
| var update = new DQUpdateDom(typeof(SegmentSaleOut_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); | |||||
| } | |||||
| public static void SetGoodsFinish(long id) | |||||
| { | |||||
| CarcassSaleOutBL.SetGoodsFinish(id); | |||||
| } | |||||
| public static void SetGoodsUnFinish(long id) | |||||
| { | |||||
| CarcassSaleOutBL.SetGoodsUnFinish(id); | |||||
| } | |||||
| static void Delete(long id) | |||||
| { | |||||
| var delete = new DQDeleteDom(typeof(SegmentSaleOut_Detail)); | |||||
| delete.Where.Conditions.Add(DQCondition.EQ("ID", id)); | |||||
| delete.EExecute(); | |||||
| } | |||||
| public static void AddAndUpdate(SegmentSaleOut_Detail detail) | |||||
| { | |||||
| using (var session = DmoSession.New()) | |||||
| { | |||||
| session.Insert(detail); | |||||
| var arr = new List<WeightRecord> { new WeightRecord { Flag = 2, ID = detail.ID, WeightTime = detail.Time, MainUnitNum = detail.Number, SecondNumber = detail.SecondNumber } }; | |||||
| var json = RpcFacade.Call<string>(RpcPath + "SaleOutStoreRpc/SaveWeightRecord", JsonConvert.SerializeObject(arr), detail.DetailID); | |||||
| var back = JsonConvert.DeserializeObject<Tuple<decimal?, decimal?, List<ExtensionObj>>>(json); | |||||
| var first = back.Item3.First(); | |||||
| Update(session, detail.ID, new Tuple<string, object>("WeightRecord_ID", first.LongExt2), | |||||
| new Tuple<string, object>("ScanRecord_ID", first.LongExt3) | |||||
| ); | |||||
| session.Commit(); | |||||
| } | |||||
| } | |||||
| public static void DeleteAndUpdate(SegmentSaleOut_Detail tag) | |||||
| { | |||||
| var json = JsonConvert.SerializeObject(new List<ExtensionObj>() { new ExtensionObj { LongExt1 = tag.DetailID, LongExt2 = tag.WeightRecord_ID, LongExt3 = tag.ScanRecord_ID } }); | |||||
| RpcFacade.Call<int>(RpcPath + "SaleOutStoreRpc/DeleteAndUpdate", json); | |||||
| Delete(tag.ID); | |||||
| } | |||||
| public static long InsertByCode(BindingList<SaleOutStore_Detail> orderDetails, SegmentSaleOut_Detail detail) | |||||
| { | |||||
| var json = ButcherFactoryUtil.SecondUrlCall<string>(MESPath + "SegmentSaleOutStoreRpc/GetSegmentInfo", detail.BarCode); | |||||
| var scanInfo = JsonConvert.DeserializeObject<ExtensionObj>(json); | |||||
| var first = orderDetails.FirstOrDefault(x => x.Goods_Code == scanInfo.StringExt1); | |||||
| if (first == null) | |||||
| throw new Exception(string.Format("扫码存货在发货明细中不存在,存货编码{0}", scanInfo.StringExt1)); | |||||
| detail.BillID = first.SaleOutStore_ID; | |||||
| detail.DetailID = first.ID; | |||||
| detail.Goods_ID = first.Goods_ID; | |||||
| detail.Goods_Code = first.Goods_Code; | |||||
| detail.Goods_Name = first.Goods_Name; | |||||
| detail.Number = scanInfo.DecimalExt1.Value; | |||||
| if (first.Number.HasValue && first.SecondNumber.HasValue && first.Number != 0) | |||||
| detail.SecondNumber = decimal.Round(first.SecondNumber.Value * detail.Number / first.Number.Value, 2); | |||||
| detail.Operator = "扫码发货"; | |||||
| using (var session = DmoSession.New()) | |||||
| { | |||||
| session.Insert(detail); | |||||
| SubmitDetails(session, new SegmentSaleOut_Detail[] { detail }, first, 1); | |||||
| session.Commit(); | |||||
| } | |||||
| return first.ID; | |||||
| } | |||||
| public static void InsertReadWeight(SaleOutStore_Detail orderDetail, SegmentSaleOut_Detail detail) | |||||
| { | |||||
| detail.BillID = orderDetail.SaleOutStore_ID; | |||||
| detail.DetailID = orderDetail.ID; | |||||
| detail.Goods_ID = orderDetail.Goods_ID; | |||||
| detail.Goods_Code = orderDetail.Goods_Code; | |||||
| detail.Goods_Name = orderDetail.Goods_Name; | |||||
| if (orderDetail.Number.HasValue && orderDetail.SecondNumber.HasValue && orderDetail.Number != 0) | |||||
| detail.SecondNumber = decimal.Round(orderDetail.SecondNumber.Value * detail.Number / orderDetail.Number.Value, 2); | |||||
| detail.Operator = "读入重量"; | |||||
| using (var session = DmoSession.New()) | |||||
| { | |||||
| session.Insert(detail); | |||||
| SubmitDetails(session, new SegmentSaleOut_Detail[] { detail }, orderDetail, 2); | |||||
| session.Commit(); | |||||
| } | |||||
| } | |||||
| public static bool BarCodeUsed(string barCode) | |||||
| { | |||||
| var query = new DQueryDom(new JoinAlias(typeof(SegmentSaleOut_Detail))); | |||||
| query.Where.Conditions.Add(DQCondition.EQ("BarCode", barCode)); | |||||
| query.Columns.Add(DQSelectColumn.Create(DQExpression.Value(1), "c")); | |||||
| return query.EExecuteScalar() != null; | |||||
| } | |||||
| public static List<SegmentSaleOut_Detail> InsertByStockUp(string barCode, IEnumerable<SaleOutStore_Detail> orderDetails) | |||||
| { | |||||
| var id = orderDetails.First().SaleOutStore_ID; | |||||
| var json = RpcFacade.Call<string>(RpcPath + "SaleOutStoreRpc/GetCustomerStockUp", barCode, id); | |||||
| if (string.IsNullOrEmpty(json)) | |||||
| throw new Exception("无备货信息或条码跟客户不匹配"); | |||||
| var list = JsonConvert.DeserializeObject<List<SegmentSaleOut_Detail>>(json); | |||||
| //detail.BillID = orderDetail.SaleOutStore_ID; | |||||
| //detail.DetailID = orderDetail.ID; | |||||
| //detail.Goods_ID = orderDetail.Goods_ID; | |||||
| //detail.Goods_Code = orderDetail.Goods_Code; | |||||
| //detail.Goods_Name = orderDetail.Goods_Name; | |||||
| //detail.Number = scanInfo.DecimalExt1.Value; | |||||
| //if (orderDetail.Number.HasValue && orderDetail.SecondNumber.HasValue && orderDetail.Number != 0) | |||||
| // detail.SecondNumber = decimal.Round(orderDetail.SecondNumber.Value * detail.Number / orderDetail.Number.Value, 2); | |||||
| //detail.Operator = "扫码发货"; | |||||
| using (var session = DmoSession.New()) | |||||
| { | |||||
| if (list.Any()) | |||||
| { | |||||
| var existCodes = GetExistCodes(session, list.Select(x => x.BarCode)); | |||||
| foreach (var item in existCodes) | |||||
| list.Remove(list.First(x => x.BarCode == item)); | |||||
| } | |||||
| foreach (var item in list) | |||||
| { | |||||
| item.BillID = id; | |||||
| item.Operator = "按备货发货"; | |||||
| session.Insert(item); | |||||
| } | |||||
| foreach (var g in list.GroupBy(x => x.DetailID)) | |||||
| { | |||||
| var first = orderDetails.FirstOrDefault(x => x.ID == g.Key); | |||||
| if (first == null) | |||||
| throw new Exception(string.Format("备货与出库单不符,出库单缺少存货{0}", g.First().Goods_Name)); | |||||
| SubmitDetails(session, g, first, 1); | |||||
| } | |||||
| session.Commit(); | |||||
| } | |||||
| return list; | |||||
| } | |||||
| private static List<string> GetExistCodes(IDmoSession session, IEnumerable<string> codes) | |||||
| { | |||||
| var query = new DQueryDom(new JoinAlias(typeof(SegmentSaleOut_Detail))); | |||||
| query.Columns.Add(DQSelectColumn.Field("BarCode")); | |||||
| query.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("BarCode"), codes.Select(x => DQExpression.Value(x)).ToArray())); | |||||
| return query.EExecuteList<string>(session); | |||||
| } | |||||
| } | |||||
| } | |||||