屠宰场管理服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
6.6 KiB

using BWP.B3ClientService.BO;
using BWP.B3Frameworks.Utils;
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.Web.Script.Serialization;
using TSingSoft.WebPluginFramework;
namespace BWP.B3ClientService.Rpcs.BillRpc
{
[Rpc]
public static class DropPigRpc
{
static JavaScriptSerializer serializer = new JavaScriptSerializer();
[Rpc]
public static string GetDropPigOrderList(DateTime butcherDate)
{
var main = new JoinAlias(typeof(OrderDetail));
var second = new JoinAlias(typeof(SecondOrder));
var query = new DQueryDom(main);
query.From.AddJoin(JoinType.Left, new DQDmoSource(second), DQCondition.And(DQCondition.EQ(main, "ID", second, "OrderDetail_ID")));
query.Columns.Add(DQSelectColumn.Field("B3WeighBill_ID"));
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("Order"));
query.Columns.Add(DQSelectColumn.Field("PlanNumber"));
query.Columns.Add(DQSelectColumn.Field("HotFadeNumber", second));
query.Columns.Add(DQSelectColumn.Field("IsDrop"));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Date", butcherDate), DQCondition.EQ("DeleteState", false)));
var list = new List<DropPigOrderList>();
using (var session = Dmo.NewSession())
{
using (var reader = session.ExecuteReader(query))
{
while (reader.Read())
{
var entity = new DropPigOrderList();
entity.B3WeighBill_ID = (long?)reader[0];
entity.OrderDetail_ID = (long)reader[1];
entity.Order = (int)reader[2];
entity.PlanNumber = (int)reader[3];
entity.HotFadeNumber = (int?)reader[4] ?? 0;
entity.IsDrop = (bool)reader[5];
list.Add(entity);
}
}
}
return serializer.Serialize(list);
}
[Rpc]
public static int InsertDropPig(long orderId, int number, short type)
{
using (var session = Dmo.NewSession())
{
SubtractPlanNumber(session, orderId, number);
SubtractHotFadeNumber(session, orderId, number, type);
var order = InsertNewOrder(session, orderId, number, type);
session.Commit();
return order;
}
}
static void SubtractPlanNumber(IDmoSession session, long id, int number)
{
var update = new DQUpdateDom(typeof(OrderDetail));
update.Columns.Add(new DQUpdateColumn("PlanNumber", DQExpression.Subtract(DQExpression.Field("PlanNumber"), DQExpression.Value(number))));
update.Columns.Add(new DQUpdateColumn("Sync", false));
update.Columns.Add(new DQUpdateColumn("ModifyTime", DateTime.Now));
update.Where.Conditions.Add(DQCondition.EQ("ID", id));
session.ExecuteNonQuery(update);
}
static void SubtractHotFadeNumber(IDmoSession session, long orderID, int number, short type)
{
var info = GetSecondOrderInfo(session, orderID);
if (type == 0)
{
if (info == null)
throw new Exception("没有烫褪头数");
else if (info.Item3 < number)
throw new Exception("烫褪头数不足");
var update = new DQUpdateDom(typeof(SecondOrder));
update.Columns.Add(new DQUpdateColumn("HotFadeNumber", DQExpression.Subtract(DQExpression.Field("HotFadeNumber"), DQExpression.Value(number))));
update.Columns.Add(new DQUpdateColumn("Sync", false));
update.Columns.Add(new DQUpdateColumn("ModifyTime", DateTime.Now));
update.Where.Conditions.Add(DQCondition.EQ("ID", info.Item1.Value));
session.ExecuteNonQuery(update);
var iDetail = new SecondOrder_Detail();
iDetail.Number = -number;
iDetail.SecondOrder_ID = info.Item1.Value;
iDetail.Time = DateTime.Now;
session.Insert(iDetail);
}
else
{
var mao = 0;
if (info == null)
mao = InnerBLUtil.GetDmoPropertyByID<int>(session, typeof(SecondOrder), "PlanNumber", orderID);
else
mao = info.Item2.Value - info.Item3.Value;
if (mao < number)
throw new Exception("毛剥头数不足");
}
}
static Tuple<long?, int?, int?> GetSecondOrderInfo(IDmoSession session, long orderID)
{
var query = new DQueryDom(new JoinAlias(typeof(SecondOrder)));
query.Where.Conditions.Add(DQCondition.EQ("OrderDetail_ID", orderID));
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("PlanNumber"));
query.Columns.Add(DQSelectColumn.Field("HotFadeNumber"));
return query.EExecuteScalar<long?, int?, int?>(session);
}
static int InsertNewOrder(IDmoSession session, long orderID, int number, short type)
{
var order = InnerBLUtil.GetSingleDmo<OrderDetail>(session, new Tuple<string, object>("ID", orderID));
var nOrder = new OrderDetail();
DmoUtil.CopyDmoFields(order, nOrder, "B3MainID", "Order", "PlanNumber", "SecondarySplit", "OrderState", "IsDrop", "B3ID", "Sync", "ModifyTime", "ID");
nOrder.Order = GetMaxOrder(session, nOrder.Date.Value) + 1;
nOrder.PlanNumber = number;
nOrder.SecondarySplit = true;
nOrder.OrderState = 20;
nOrder.IsDrop = true;
nOrder.ModifyTime = DateTime.Now;
session.Insert(nOrder);
var sOrder = new SecondOrder();
sOrder.Sync = false;
sOrder.ModifyTime = DateTime.Now;
sOrder.OrderDetail_ID = nOrder.ID;
sOrder.HotFadeNumber = type == 0 ? number : 0;
sOrder.IsOk = true;
sOrder.Finish = true;
sOrder.FinishGrade = true;
session.Insert(sOrder);
if (type == 0)
{
var detail = new SecondOrder_Detail();
detail.Number = number;
detail.SecondOrder_ID = sOrder.ID;
detail.Time = DateTime.Now;
session.Insert(detail);
}
return nOrder.Order;
}
static int GetMaxOrder(IDmoSession session, DateTime date)
{
var query = new DQueryDom(new JoinAlias(typeof(OrderDetail)));
query.Columns.Add(DQSelectColumn.Field("IsDrop"));
query.Columns.Add(DQSelectColumn.Max("Order"));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Date", date), DQCondition.EQ("DeleteState", false)));
query.GroupBy.Expressions.Add(DQExpression.Field("IsDrop"));
var r = query.EExecuteList<bool, int>(session);
var first = r.FirstOrDefault(x => x.Item1);
if (first == null)
return r.First().Item2;
else
return first.Item2;
}
}
}