diff --git a/B3ClientService/B3ClientService.csproj b/B3ClientService/B3ClientService.csproj
index 2f5c9ad..91e7475 100644
--- a/B3ClientService/B3ClientService.csproj
+++ b/B3ClientService/B3ClientService.csproj
@@ -77,6 +77,8 @@
+
+
@@ -102,6 +104,7 @@
+
diff --git a/B3ClientService/BO/Bill/SecondOrder/SecondOrder.cs b/B3ClientService/BO/Bill/SecondOrder/SecondOrder.cs
new file mode 100644
index 0000000..6093e99
--- /dev/null
+++ b/B3ClientService/BO/Bill/SecondOrder/SecondOrder.cs
@@ -0,0 +1,35 @@
+using BWP.B3Frameworks.BO;
+using Forks.EnterpriseServices.DomainObjects2;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TSingSoft.WebPluginFramework;
+
+namespace BWP.B3ClientService.BO
+{
+ [Serializable]
+ public class SecondOrder : Base
+ {
+ public bool Sync { get; set; }
+
+ public DateTime ModifyTime { get; set; }
+
+ public long OrderDetail_ID { get; set; }
+
+ [ReferenceTo(typeof(OrderDetail), "Order")]
+ [Join("OrderDetail_ID", "ID")]
+ public int? Order { get; set; }
+
+ [ReferenceTo(typeof(OrderDetail), "PlanNumber")]
+ [Join("OrderDetail_ID", "ID")]
+ public int? PlanNumber { get; set; }
+
+ public int HotFadeNumber { get; set; }
+
+ public bool IsOk { get; set; }
+
+ public bool FinishGrade { get; set; }
+ }
+}
diff --git a/B3ClientService/BO/Bill/SecondOrder/SecondOrder_Detail.cs b/B3ClientService/BO/Bill/SecondOrder/SecondOrder_Detail.cs
new file mode 100644
index 0000000..4ce7638
--- /dev/null
+++ b/B3ClientService/BO/Bill/SecondOrder/SecondOrder_Detail.cs
@@ -0,0 +1,19 @@
+using BWP.B3Frameworks.BO;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BWP.B3ClientService.BO
+{
+ [Serializable]
+ public class SecondOrder_Detail : Base
+ {
+ public long SecondOrder_ID { get; set; }
+
+ public int Number { get; set; }
+
+ public DateTime Time { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/B3ClientService/Rpcs/BillRpc/SecondOrderRpc.cs b/B3ClientService/Rpcs/BillRpc/SecondOrderRpc.cs
new file mode 100644
index 0000000..3f5bbeb
--- /dev/null
+++ b/B3ClientService/Rpcs/BillRpc/SecondOrderRpc.cs
@@ -0,0 +1,138 @@
+using BWP.B3ClientService.BO;
+using Forks.EnterpriseServices.DomainObjects2;
+using Forks.EnterpriseServices.DomainObjects2.DQuery;
+using Forks.EnterpriseServices.JsonRpc;
+using Forks.EnterpriseServices.SqlDoms;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Script.Serialization;
+using TSingSoft.WebPluginFramework;
+
+namespace BWP.B3ClientService.Rpcs.BillRpc
+{
+ [Rpc]
+ public static class SecondOrderRpc
+ {
+ static JavaScriptSerializer serializer = new JavaScriptSerializer();
+
+ [Rpc]
+ public static string SyncSecondOrder(DateTime date)
+ {
+ var main = new JoinAlias(typeof(OrderDetail));
+ var detail = new JoinAlias(typeof(SecondOrder));
+ var query = new DQueryDom(main);
+ query.From.AddJoin(JoinType.Left, new DQDmoSource(detail), DQCondition.EQ(main, "ID", detail, "OrderDetail_ID"));
+ query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("DeleteState", false), DQCondition.EQ("Date", date)));
+ query.Where.Conditions.Add(DQCondition.Or(DQCondition.IsNull(DQExpression.Field(detail, "FinishGrade")), DQCondition.EQ(detail, "FinishGrade", false)));
+ query.Columns.Add(DQSelectColumn.Field("ID", main));
+ query.Columns.Add(DQSelectColumn.Field("ID", detail));
+ query.Columns.Add(DQSelectColumn.Field("Order", main));
+ query.Columns.Add(DQSelectColumn.Field("PlanNumber", main));
+ query.Columns.Add(DQSelectColumn.Field("HotFadeNumber", detail));
+ query.Columns.Add(DQSelectColumn.Field("IsOk", detail));
+ var list = new List();
+ using (var session = Dmo.NewSession())
+ {
+ using (var reader = session.ExecuteReader(query))
+ {
+ while (reader.Read())
+ {
+ var item = new SecondOrder();
+ list.Add(item);
+ item.OrderDetail_ID = (long)reader[0];
+ item.ID = (long?)reader[1] ?? 0;
+ item.Order = (int)reader[2];
+ item.PlanNumber = (int)reader[3];
+ item.HotFadeNumber = (int?)reader[4] ?? 0;
+ item.IsOk = (bool?)reader[5] ?? false;
+ }
+ }
+ }
+ return serializer.Serialize(list);
+ }
+
+ [Rpc]
+ public static long InsertDetail(string json, string mainJson)
+ {
+ var detail = serializer.Deserialize(json);
+
+ using (var session = Dmo.NewSession())
+ {
+ if (detail.SecondOrder_ID == 0)
+ {
+ var entity = serializer.Deserialize(mainJson);
+ entity.ModifyTime = DateTime.Now;
+ session.Insert(entity);
+ detail.SecondOrder_ID = entity.ID;
+ }
+ else
+ UpdateMainNumber(session, detail.SecondOrder_ID, detail.Number);
+ session.Insert(detail);
+ session.Commit();
+ }
+ return detail.SecondOrder_ID;
+ }
+
+ [Rpc]
+ public static int DetailDetail(long id, long mainID, int number)
+ {
+ using (var session = Dmo.NewSession())
+ {
+ var delete = new DQDeleteDom(typeof(SecondOrder_Detail));
+ delete.Where.Conditions.Add(DQCondition.EQ("ID", id));
+ session.ExecuteNonQuery(delete);
+ UpdateMainNumber(session, mainID, -number);
+ session.Commit();
+ }
+ return 1;
+ }
+
+ static void UpdateMainNumber(IDmoSession session, long id, int number)
+ {
+ var update = new DQUpdateDom(typeof(SecondOrder));
+ update.Where.Conditions.Add(DQCondition.EQ("ID", id));
+ update.Columns.Add(new DQUpdateColumn("Sync", false));
+ update.Columns.Add(new DQUpdateColumn("ModifyTime", DateTime.Now));
+ update.Columns.Add(new DQUpdateColumn("HotFadeNumber", DQExpression.Add(DQExpression.Field("HotFadeNumber"), DQExpression.Value(number))));
+ session.ExecuteNonQuery(update);
+ }
+
+ [Rpc]
+ public static long SetOk(long id, string json)
+ {
+ using (var session = Dmo.NewSession())
+ {
+ if (id == 0)
+ {
+ var entity = serializer.Deserialize(json);
+ entity.ModifyTime = DateTime.Now;
+ entity.IsOk = true;
+ session.Insert(entity);
+ id = entity.ID;
+ }
+ else
+ {
+ var update = new DQUpdateDom(typeof(SecondOrder));
+ update.Where.Conditions.Add(DQCondition.EQ("ID", id));
+ update.Columns.Add(new DQUpdateColumn("Sync", false));
+ update.Columns.Add(new DQUpdateColumn("ModifyTime", DateTime.Now));
+ update.Columns.Add(new DQUpdateColumn("IsOk", true));
+ session.ExecuteNonQuery(update);
+ }
+ session.Commit();
+ }
+ return id;
+ }
+
+ [Rpc]
+ public static string GetSecondOrderDetails(long id)
+ {
+ var query = new DmoQuery(typeof(SecondOrder_Detail));
+ query.Where.Conditions.Add(DQCondition.EQ("SecondOrder_ID", id));
+ return serializer.Serialize(query.EExecuteList().Cast().ToList());
+ }
+ }
+}