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.Linq; using System.Text; using System.Threading.Tasks; namespace ButcherFactory.BO.Rpcs { public static class BaseInfoSyncRpc { const string baseInfoRpcPath = @"/MainSystem/B3ClientService/Rpcs/SyncBaseInfoRpc/"; public static void SyncBaseInfo(string methodName = null) where T : BaseInfo { var type = typeof(T); if (string.IsNullOrEmpty(methodName)) methodName = "Sync" + type.Name; using (var session = DmoSession.New()) { var localVersion = GetLocalVersion(session); var json = RpcFacade.Call(baseInfoRpcPath + methodName, JsonConvert.SerializeObject(localVersion)); var result = JsonConvert.DeserializeObject, List, List>>(json);//insert,update,delete foreach (var item in result.Item1) session.Insert(item); foreach (var item in result.Item2) session.Update(item); if (result.Item3.Any()) Delete(session, result.Item3); session.Commit(); } } static void Delete(IDmoSession session, List ids) where T : BaseInfo { var delete = new DQDeleteDom(typeof(T)); delete.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("ID"), ids.Select(x => DQExpression.Value(x)).ToArray())); session.ExecuteNonQuery(delete); } static List> GetLocalVersion(IDmoSession session) where T : BaseInfo { var query = new DQueryDom(new JoinAlias(typeof(T))); query.Columns.Add(DQSelectColumn.Field("ID")); query.Columns.Add(DQSelectColumn.Field("RowVersion")); return query.EExecuteList(session); } public static void SyncProductBatch(int batchType) { using (var session = DmoSession.New()) { var local = GetLocalVersion(session); var json = RpcFacade.Call(baseInfoRpcPath + "SyncProductBatchByType", batchType, JsonConvert.SerializeObject(local)); var result = JsonConvert.DeserializeObject, List, List>>(json);//insert,update,delete foreach (var item in result.Item1) session.Insert(item); foreach (var item in result.Item2) session.Update(item); if (result.Item3.Any()) Delete(session, result.Item3); session.Commit(); } } public static void SyncGoodsByTag(ApplyClient applyClient) { using (var session = DmoSession.New()) { var local = GetLocalVersion(session); var g2 = GetLocalVersion(session); var json = RpcFacade.Call(baseInfoRpcPath + "SyncClientGoodsSetByClient", (short)applyClient, JsonConvert.SerializeObject(local), JsonConvert.SerializeObject(g2)); var result = JsonConvert.DeserializeObject, List, List, List, List, List>>(json);//insert,update,delete foreach (var item in result.Item1) Insert(item, session); foreach (var item in result.Item2) Update(item, session); foreach (var item in result.Item3) DeleteClientSet(item, session); foreach (var item in result.Item4) session.Insert(item); foreach (var item in result.Item5) session.Update(item); if (result.Item6.Any()) Delete(session, result.Item6); session.Commit(); } } static void DeleteClientSet(long id, IDmoSession session) { var detail = new DQDeleteDom(typeof(ClientGoodsSet_Detail)); detail.Where.Conditions.Add(DQCondition.EQ("ClientGoodsSet_ID", id)); session.ExecuteNonQuery(detail); var main = new DQDeleteDom(typeof(ClientGoodsSet)); main.Where.Conditions.Add(DQCondition.EQ("ID", id)); session.ExecuteNonQuery(main); } static void Insert(ClientGoodsSet entity, IDmoSession session) { session.Insert(entity); foreach (var detail in entity.Details) session.Insert(detail); } static void Update(ClientGoodsSet entity, IDmoSession session) { session.Update(entity); foreach (var detail in entity.Details) session.AddUpdateOrInsert(detail); } } }