using ButcherFactory.BO.Utils; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using Forks.EnterpriseServices.SqlDoms; 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 CarcassTakeOutBL { const string RpcPath = @"/MainSystem/B3ClientService/Rpcs/CarcassTakeOutRpc/"; public static CarcassTakeOut Insert(long? workUnitID, long? batchID, long? goodsID, string barCode,long storeID) { using (var session = DmoSession.New()) { var exist = CheckExist(barCode, session); if (exist) return null; var entity = new CarcassTakeOut(); entity.WorkUnit_ID = workUnitID; if (string.IsNullOrEmpty(barCode)) { entity.ProductBatch_ID = batchID; entity.Goods_ID = goodsID; } entity.Number = 1; entity.Store_ID = storeID; entity.UserID = BO.Utils.AppContext.Worker.ID; entity.BarCode = barCode; entity.RowIndex = GenerateRowIndex(session); session.Insert(entity); session.Commit(); return entity; } } static int GenerateRowIndex(IDmoSession session) { var query = new DQueryDom(new JoinAlias("_main", typeof(CarcassTakeOut))); query.Columns.Add(DQSelectColumn.Max("RowIndex")); query.Where.Conditions.Add(DQCondition.EQ(DQExpression.Snippet("CAST([_main].[CreateTime] AS DATE)"), DQExpression.Value(DateTime.Today))); return (query.EExecuteScalar(session) ?? 0) + 1; } static bool CheckExist(string barCode, IDmoSession session) { if (string.IsNullOrEmpty(barCode)) return false; var query = new DQueryDom(new JoinAlias(typeof(CarcassTakeOut))); query.Columns.Add(DQSelectColumn.Create(DQExpression.Value(1), "c")); query.Where.Conditions.Add(DQCondition.EQ("BarCode", barCode)); return query.EExecuteScalar(session) != null; } static void Update(long id, IDmoSession session, params Tuple[] updates) { var update = new DQUpdateDom(typeof(CarcassTakeOut)); update.Where.Conditions.Add(DQCondition.EQ("ID", id)); foreach (var item in updates) update.Columns.Add(new DQUpdateColumn(item.Item1, item.Item2)); update.Columns.Add(new DQUpdateColumn("Sync", false)); update.Columns.Add(new DQUpdateColumn("RowVersion", DQExpression.Add(DQExpression.Field("RowVersion"), DQExpression.Value(1)))); session.ExecuteNonQuery(update); } public static void Update(long id, params Tuple[] updates) { using (var session = DmoSession.New()) { Update(id, session, updates); session.Commit(); } } public static BindingList GetWeightList() { var query = new DQueryDom(new JoinAlias(typeof(CarcassTakeOutWeightTemp))); query.Columns.Add(DQSelectColumn.Field("ID")); query.Columns.Add(DQSelectColumn.Field("Weight")); query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID", true)); var result = new BindingList(); query.EExecuteList().ForEach(x => result.Add(new CarcassTakeOutWeightTemp { ID = x.Item1, Weight = x.Item2 })); return result; } public static CarcassTakeOutWeightTemp InsertWeight(decimal weight) { using (var session = DmoSession.New()) { var entity = new CarcassTakeOutWeightTemp { Weight = weight }; session.Insert(entity); session.Commit(); return entity; } } public static BindingList GetLocalDataWithState(bool history) { var query = new DQueryDom(new JoinAlias(typeof(CarcassTakeOut))); query.Columns.Add(DQSelectColumn.Field("RowIndex")); query.Columns.Add(DQSelectColumn.Field("ID")); query.Columns.Add(DQSelectColumn.Field("BarCode")); query.Columns.Add(DQSelectColumn.Field("Goods_Name")); query.Columns.Add(DQSelectColumn.Field("BeforeWeight")); query.Columns.Add(DQSelectColumn.Field("Weight")); query.Columns.Add(DQSelectColumn.Field("Number")); query.Columns.Add(DQSelectColumn.Field("IsCarcass")); if (history) query.Range = SelectRange.Top(30); query.Where.Conditions.Add(DQCondition.EQ("Submited", history)); query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID", true)); var result = new BindingList(); using (var session = DmoSession.New()) { using (var reader = session.ExecuteReader(query)) { while (reader.Read()) { var entity = new CarcassTakeOut(); result.Add(entity); entity.RowIndex = (int?)reader[0]; entity.ID = (long)reader[1]; entity.BarCode = (string)reader[2]; entity.Goods_Name = (string)reader[3]; entity.BeforeWeight = (decimal?)reader[4]; entity.Weight = (decimal?)reader[5]; entity.Number = (int)reader[6]; entity.IsCarcass = (bool)reader[7]; } } } return result; } static void GroupUpdate(IEnumerable ids, IDmoSession session, params Tuple[] updates) { if (ids.Count() == 0) return; var arr = ButcherFactoryUtil.SplitList(ids.ToList(), 500); foreach (var items in arr) { var update = new DQUpdateDom(typeof(CarcassTakeOut)); update.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("ID"), items.Select(x => DQExpression.Value(x)).ToArray())); foreach (var item in updates) update.Columns.Add(new DQUpdateColumn(item.Item1, item.Item2)); update.Columns.Add(new DQUpdateColumn("Sync", false)); update.Columns.Add(new DQUpdateColumn("RowVersion", DQExpression.Add(DQExpression.Field("RowVersion"), DQExpression.Value(1)))); session.ExecuteNonQuery(update); } } public static void Submit(decimal weight, List list) { using (var session = DmoSession.New()) { var ids = list.Select(x => x.ID); var id = list.Max(x => x.ID); Update(id, session, new Tuple("GroupID", id), new Tuple("Weight", weight)); GroupUpdate(ids.Where(x => x != id), session, new Tuple("GroupID", id), new Tuple("Weight", 0)); foreach (var item in list) { if (item.ID == id) item.Weight = weight; else item.Weight = 0; } GroupUpdate(ids, session, new Tuple("Submited", true)); var sql = @"truncate table [Butcher_CarcassTakeOutWeightTemp];"; session.ExecuteSqlNonQuery(sql); session.Commit(); } } public static List GetBeforeInfo(IEnumerable codeList) { try { var json = RpcFacade.Call(RpcPath + "GetBeforeInfo", codeList); var list = JsonConvert.DeserializeObject>(json); if (list.Any()) { using (var session = DmoSession.New()) { foreach (var item in list) SaveBeforeInfoInDB(item, session); session.Commit(); } } return list; } catch { #if DEBUG throw; #endif return new List(); } } private static void SaveBeforeInfoInDB(ExtensionObj obj, IDmoSession session) { var update = new DQUpdateDom(typeof(CarcassTakeOut)); update.Where.Conditions.Add(DQCondition.EQ("BarCode", obj.StringExt1)); update.Columns.Add(new DQUpdateColumn("Goods_ID", obj.LongExt1)); update.Columns.Add(new DQUpdateColumn("BeforeWeight", obj.DecimalExt1)); session.ExecuteNonQuery(update); } static string carcassMethod = RpcPath + "UploadCarcassInfo"; public static void UploadCarcassInfo() { try { using (var session = DmoSession.New()) { var needUpload = GetUnSyncData(session); if (needUpload.Count == 0) return; var json = JsonConvert.SerializeObject(needUpload); RpcFacade.Call(carcassMethod, json); foreach (var item in needUpload) SetLocalAsSyncd(item, session); session.Commit(); } } catch { #if DEBUG throw; #endif } } static List GetUnSyncData(IDmoSession session) { var query = new DQueryDom(new JoinAlias(typeof(CarcassTakeOut))); query.Columns.Add(DQSelectColumn.Field("ID")); query.Columns.Add(DQSelectColumn.Field("RowVersion")); query.Columns.Add(DQSelectColumn.Field("BarCode")); query.Columns.Add(DQSelectColumn.Field("UserID")); query.Columns.Add(DQSelectColumn.Field("WorkUnit_ID")); query.Columns.Add(DQSelectColumn.Field("ProductBatch_ID")); query.Columns.Add(DQSelectColumn.Field("Goods_ID")); query.Columns.Add(DQSelectColumn.Field("Weight")); query.Columns.Add(DQSelectColumn.Field("CreateTime")); query.Columns.Add(DQSelectColumn.Field("GroupID")); query.Columns.Add(DQSelectColumn.Field("Number")); query.Columns.Add(DQSelectColumn.Field("IsCarcass")); query.Columns.Add(DQSelectColumn.Field("UserID")); query.Columns.Add(DQSelectColumn.Field("Store_ID")); query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Submited", true), DQCondition.EQ("Sync", false))); query.Range = SelectRange.Top(10); query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID")); var upload = new List(); using (var reader = session.ExecuteReader(query)) { while (reader.Read()) { var obj = new CarcassTakeOutObj(); obj.ID = (long)reader[0]; obj.RowVersion = (int)reader[1]; obj.BarCode = (string)reader[2]; obj.TakeOutWorker_ID = (long)reader[3]; obj.WorkUnit_ID = (long?)reader[4]; if (string.IsNullOrEmpty(obj.BarCode)) { obj.ProductBatch_ID = (long?)reader[5]; obj.Goods_ID = (long?)reader[6]; } obj.Weight = (decimal)reader[7]; obj.Time = (DateTime)reader[8]; obj.GroupID = (long?)reader[9]; obj.Number = (int)reader[10]; obj.IsCarcass = (bool)reader[11]; obj.Worker_ID = (long)reader[12]; obj.Store_ID = (long?)reader[13]; upload.Add(obj); } } return upload; } static void SetLocalAsSyncd(CarcassTakeOutObj obj, IDmoSession session) { var update = new DQUpdateDom(typeof(CarcassTakeOut)); update.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("ID", obj.ID), DQCondition.EQ("RowVersion", obj.RowVersion))); update.Columns.Add(new DQUpdateColumn("Sync", true)); session.ExecuteNonQuery(update); } } class CarcassTakeOutObj { [JsonIgnore] public long ID { get; set; } [JsonIgnore] public long RowVersion { get; set; } public string BarCode { get; set; } public long? TakeOutWorker_ID { get; set; } public long? WorkUnit_ID { get; set; } public long? ProductBatch_ID { get; set; } public long? Goods_ID { get; set; } public decimal? Weight { get; set; } public DateTime? Time { get; set; } public long? GroupID { get; set; } public int Number { get; set; } public bool IsCarcass { get; set; } public long Worker_ID { get; set; } public long? Store_ID { get; set; } } }