屠宰场管理服务
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.

295 lines
13 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 Forks.JsonRpc.Client.Data;
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 HouseAndSanctionRpc
{
static JavaScriptSerializer serializer = new JavaScriptSerializer();
[Rpc]
public static string GetHouseAndSanctionList(DateTime date)
{
var main = new JoinAlias(typeof(WeightBill));
var detail = new JoinAlias(typeof(WeightBill_Detail));
var query = new DQueryDom(main);
query.From.AddJoin(JoinType.Left, new DQDmoSource(detail), DQCondition.And(DQCondition.EQ(detail, "DeleteState", false), DQCondition.EQ(main, "ID", detail, "WeightBill_ID")));
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("B3ID"));
query.Columns.Add(DQSelectColumn.Field("Employee_Name"));
query.Columns.Add(DQSelectColumn.Field("Supplier_Name"));
query.Columns.Add(DQSelectColumn.Field("HouseNames"));
query.Columns.Add(DQSelectColumn.Field("Number", detail));
query.Where.Conditions.Add(DQCondition.And(DQCondition.Between("WeighTime", date, date + new TimeSpan(23, 59, 29)), DQCondition.EQ("DeleteState", false)));
var list = new List<HouseAndSanctionList>();
using (var session = Dmo.NewSession())
{
using (var reader = session.ExecuteReader(query))
{
while (reader.Read())
{
var entity = new HouseAndSanctionList();
entity.ID = (long)reader[0];
entity.B3ID = (long?)reader[1];
entity.Employee_Name = (string)reader[2];
entity.Supplier_Name = (string)reader[3];
entity.HouseNames = (string)reader[4];
entity.Number = (int?)reader[5];
list.Add(entity);
}
}
}
return serializer.Serialize(list);
}
[Rpc]
public static int GetDetailTotalNumber(DateTime date)
{
var main = new JoinAlias(typeof(WeightBill));
var detail = new JoinAlias(typeof(WeightBill_Detail));
var query = new DQueryDom(main);
query.From.AddJoin(JoinType.Left, new DQDmoSource(detail), DQCondition.EQ(main, "ID", detail, "WeightBill_ID"));
query.Where.Conditions.Add(DQCondition.And(DQCondition.And(DQCondition.EQ(detail, "DeleteState", false), DQCondition.EQ("DeleteState", false), DQCondition.Between("WeighTime", date.Date, date.Date + new TimeSpan(23, 59, 29)))));
query.Columns.Add(DQSelectColumn.Sum(detail, "Number"));
var result = query.EExecuteScalar();
if (result == null)
return 0;
return Convert.ToInt32(result);
}
[Rpc]
public static string GetHouseAndSanctionDetail(long id)
{
var result = new HouseAndSanctionEdit();
using (var session = Dmo.NewSession())
{
var exist = ClientServiceUtils.Exist<WeightBill>(id);
if (!exist)
throw new Exception("过磅单已被删除");
result.ID = id;
result.HogGrade_ID = InnerBLUtil.GetDmoPropertyByID<long?>(session, typeof(WeightBill), "HogGrade_ID", id);
result.Number = InnerBLUtil.GetDmoProperty<int?>(session, typeof(WeightBill_Detail), "Number", new Tuple<string, object>("WeightBill_ID", id), new Tuple<string, object>("DeleteState", false));
result.HouseDetails = InnerBLUtil.GetPartialFieldsDmoList<WeightBill_HouseDetail>(session, (query) =>
{
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("WeightBill_ID", id), DQCondition.EQ("DeleteState", false)));
}, "ID", "LiveColonyHouse_ID").ToList();
result.SanctionDetails = InnerBLUtil.GetPartialFieldsDmoList<WeightBill_SanctionDetail>(session, (query) =>
{
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("WeightBill_ID", id), DQCondition.EQ("DeleteState", false)));
}, "ID", "AbnormalItem_ID", "Number").ToList();
}
return serializer.Serialize(result);
}
[Rpc]
public static bool UpdateInsertHouseAndSanction(string json)
{
var entity = serializer.Deserialize<HouseAndSanctionEdit>(json);
var exist = ClientServiceUtils.Exist<WeightBill>(entity.ID);
if (!exist)
throw new Exception("过磅单已被删除,提交失败!");
var detailExist = ClientServiceUtils.Exist<WeightBill_Detail>("WeightBill_ID", entity.ID);
if (!detailExist)
throw new Exception("过磅记录已被删除,提交失败!");
bool multilOrder = false;
using (var session = Dmo.NewSession())
{
//为了节省ID,把传过来的通过栋舍匹配,并到原有明细里。然后从新的集合里把上传的集合里不存在的剔除掉
var houseDetail = GetList<WeightBill_HouseDetail>(entity.ID);
foreach (var item in entity.HouseDetails)
{
var first = houseDetail.FirstOrDefault(x => x.LiveColonyHouse_ID == item.LiveColonyHouse_ID);
if (first == null)
houseDetail.Add(item);
else
first.Index = item.Index;
}
var delete = new List<long>();
var houseNames = new List<string>();
foreach (var item in houseDetail)
{
if (entity.HouseDetails.Any(x => x.LiveColonyHouse_ID == item.LiveColonyHouse_ID))
{
UpdateOrInsertHouseDetail(session, item);
houseNames.Add(item.LiveColonyHouse_Name);
}
else
delete.Add(item.LiveColonyHouse_ID ?? 0);
}
if (delete.Any())
{
Delete<WeightBill_HouseDetail>(session, entity.ID, (dom) =>
{
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("LiveColonyHouse_ID"), delete.Select(x => DQExpression.Value(x)).ToArray()));
});
}
delete.Clear();
var sanctionDetail = GetList<WeightBill_SanctionDetail>(entity.ID);
foreach (var item in entity.SanctionDetails)
{
var first = sanctionDetail.FirstOrDefault(x => x.Sanction_ID == item.Sanction_ID);
if (first == null)
sanctionDetail.Add(item);
else
{
first.Index = item.Index;
first.Number = item.Number;
}
}
foreach (var item in sanctionDetail)
{
if (entity.SanctionDetails.Any(x => x.Sanction_ID == item.Sanction_ID))
UpdateOrInsertSanctionDetail(session, item);
else
delete.Add(item.Sanction_ID ?? 0);
}
if (delete.Any())
{
Delete<WeightBill_SanctionDetail>(session, entity.ID, (dom) =>
{
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("Sanction_ID"), delete.Select(x => DQExpression.Value(x)).ToArray()));
});
}
int oldNumber;
UpdateWeightNumber(session, entity.ID, entity.Number.Value, out oldNumber);
multilOrder = UpdateOrderNumber(session, entity.ID, entity.Number.Value, oldNumber);
var update = new DQUpdateDom(typeof(WeightBill));
update.Columns.Add(new DQUpdateColumn("HogGrade_ID", entity.HogGrade_ID));
update.Columns.Add(new DQUpdateColumn("HogGrade_Name", entity.HogGrade_Name));
update.Columns.Add(new DQUpdateColumn("Inspector_ID", entity.Inspector_ID));
update.Columns.Add(new DQUpdateColumn("Inspector_Name", entity.Inspector_Name));
update.Columns.Add(new DQUpdateColumn("HouseNames", string.Join(",", houseNames)));
update.Columns.Add(new DQUpdateColumn("Sync", false));
update.Columns.Add(new DQUpdateColumn("RowVersion", DQExpression.Add(DQExpression.Field("RowVersion"), DQExpression.Value(1))));
update.Columns.Add(new DQUpdateColumn("ModifyTime", DateTime.Now));
update.Where.Conditions.Add(DQCondition.EQ("ID", entity.ID));
session.ExecuteNonQuery(update);
session.Commit();
}
return multilOrder;
}
static void UpdateWeightNumber(IDmoSession session, long weightID, int number, out int oldNumber)
{
var query = new DQueryDom(new JoinAlias(typeof(WeightBill_Detail)));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("WeightBill_ID", weightID), DQCondition.EQ("DeleteState", false)));
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("Number"));
query.Range = SelectRange.Top(1);
var r = query.EExecuteScalar<long, int?>();
oldNumber = r.Item2 ?? 0;
if (number == oldNumber)
return;
var dUpdate = new DQUpdateDom(typeof(WeightBill_Detail));
dUpdate.Columns.Add(new DQUpdateColumn("Number", number));
dUpdate.Where.Conditions.Add(DQCondition.EQ("ID", r.Item1));
session.ExecuteNonQuery(dUpdate);
}
static bool UpdateOrderNumber(IDmoSession session, long weightID, int newNumber, int oldNumber)
{
if (newNumber == oldNumber)
return false;
var unOrderNumber = HurryRecordUnOrderNumber(session, weightID);
var query = new DQueryDom(new JoinAlias(typeof(OrderDetail)));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("WeightBill_ID", weightID), DQCondition.EQ("DeleteState", false)));//, DQCondition.EQ("IsHurryButcher", false), DQCondition.EQ("IsDrop", false)
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("PlanNumber"));
query.Columns.Add(DQSelectColumn.Field("IsHurryButcher"));
query.Columns.Add(DQSelectColumn.Field("IsDrop"));
var order = query.EExecuteList<long, int, bool, bool>(session);
if (order.Count == 0)
return false;
var tags = order.Where(x => !x.Item3 && !x.Item4);
if (tags.Count() == 0)
return false;
if (tags.Count() > 1)
return true;
else if (oldNumber - unOrderNumber - order.Sum(x => x.Item2) > 0)
return true;
var update = new DQUpdateDom(typeof(OrderDetail));
update.Where.Conditions.Add(DQCondition.EQ("ID", tags.First().Item1));
update.Columns.Add(new DQUpdateColumn("PlanNumber", DQExpression.Add(DQExpression.Field("PlanNumber"), DQExpression.Value(newNumber - oldNumber))));
session.ExecuteNonQuery(update);
return false;
}
static int HurryRecordUnOrderNumber(IDmoSession session, long wid)
{
var query = new DQueryDom(new JoinAlias(typeof(HurryRecord)));
query.Columns.Add(DQSelectColumn.Sum("HurryNumber"));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("WeightBill_ID", wid), DQCondition.IsNull(DQExpression.Field("ToOrderDetail_ID"))));
var rst = query.EExecuteScalar(session);
if (rst != null)
return Convert.ToInt32(rst);
return 0;
}
static List<T> GetList<T>(long billID)
{
var query = new DmoQuery(typeof(T));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("DeleteState", false), DQCondition.EQ("WeightBill_ID", billID)));
return query.EExecuteList().Cast<T>().ToList();
}
static void Delete<T>(IDmoSession session, long billID, Action<DQUpdateDom> conditions)
where T : SyncBase
{
var delete = new DQUpdateDom(typeof(T));
delete.Columns.Add(new DQUpdateColumn("DeleteState", true));
delete.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("DeleteState", false), DQCondition.EQ("WeightBill_ID", billID)));
conditions(delete);
session.ExecuteNonQuery(delete);
}
static void UpdateOrInsertHouseDetail(IDmoSession session, WeightBill_HouseDetail detail)
{
if (detail.ID == 0)
{
session.Insert(detail);
return;
}
var update = new DQUpdateDom(typeof(WeightBill_HouseDetail));
update.Columns.Add(new DQUpdateColumn("Index", detail.Index));
update.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("DeleteState", false), DQCondition.EQ("LiveColonyHouse_ID", detail.LiveColonyHouse_ID), DQCondition.EQ("WeightBill_ID", detail.WeightBill_ID)));
session.ExecuteNonQuery(update);
}
static void UpdateOrInsertSanctionDetail(IDmoSession session, WeightBill_SanctionDetail detail)
{
if (detail.ID == 0)
{
session.Insert(detail);
return;
}
var update = new DQUpdateDom(typeof(WeightBill_SanctionDetail));
update.Columns.Add(new DQUpdateColumn("Index", detail.Index));
update.Columns.Add(new DQUpdateColumn("Number", detail.Number));
update.Columns.Add(new DQUpdateColumn("Sanction_ID", detail.Sanction_ID));
update.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("DeleteState", false), DQCondition.EQ("WeightBill_ID", detail.WeightBill_ID), DQCondition.EQ("AbnormalItem_ID", detail.AbnormalItem_ID)));
session.ExecuteNonQuery(update);
}
}
}