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

132 lines
4.0 KiB

using BWP.B3ClientService.BO;
using Forks.EnterpriseServices.BusinessInterfaces;
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;
using TSingSoft.WebPluginFramework.TimerTasks;
namespace BWP.B3ClientService.Tasks
{
public class CreateB3OutputTask : ITimerTask
{
private static volatile object _lockObj = new object();
public void Execute()
{
if (!Monitor.TryEnter(_lockObj))
{
throw new SameTaskNotFinishException(this);
}
var serverUri = ServerHost.GetServerUrl();
if (string.IsNullOrEmpty(serverUri))
throw new Exception("请配置服务器地址");
try
{
RpcFacade.Init(serverUri, "B3ClientServer");
}
catch (Exception ex)
{
if (ex.Message != "Can only start once")
throw;
}
try
{
DoExecute();
}
catch (Exception e)
{
throw new ApplicationException(e.ToString());
}
finally
{
Monitor.Exit(_lockObj);
}
}
string method = "MainSystem/B3ButcherManage/Rpcs/OutputRpc/CreateOutput";
private void DoExecute()
{
using (var context = new TransactionContext())
{
var list = GetUnSyncdList(context.Session);
if (list.Count == 0)
return;
TransferToB3(list);
SetAsSyncd(context.Session, list.Select(x => x.ID));
context.Commit();
}
}
void TransferToB3(List<Temp> list)
{
var arr = list.GroupBy(x => new { x.Date, x.UserName, x.ProductBatch, x.Goods_Code }).Select(x => new
{
Date = x.Key.Date,
UserName = x.Key.UserName,
ProductBatch = x.Key.ProductBatch,
Goods_Code = x.Key.Goods_Code,
Weight = x.Sum(y => y.Weight),
Number = x.Count()
});
RpcFacade.Call<int>(method, JsonConvert.SerializeObject(arr));
}
private void SetAsSyncd(IDmoSession session, IEnumerable<long> ids)
{
var update = new DQUpdateDom(typeof(SegmentProductionInfo));
update.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("ID"), ids.Select(x => DQExpression.Value(x)).ToArray()));
update.Columns.Add(new DQUpdateColumn("CreateOutput", true));
session.ExecuteNonQuery(update);
}
private List<Temp> GetUnSyncdList(IDmoSession session)
{
var query = new DQueryDom(new JoinAlias(typeof(SegmentProductionInfo)));
query.Columns.Add(DQSelectColumn.Field("ID"));
query.Columns.Add(DQSelectColumn.Field("ProductTime"));
query.Columns.Add(DQSelectColumn.Field("Goods_Code"));
query.Columns.Add(DQSelectColumn.Field("Worker_Name"));
query.Columns.Add(DQSelectColumn.Field("ProductBatch_Name"));
query.Columns.Add(DQSelectColumn.Field("Weight"));
query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("CreateOutput", false), DQCondition.IsNotNull(DQExpression.Field("Worker_ID")), DQCondition.IsNotNull(DQExpression.Field("ProductTime"))));
query.Range = SelectRange.Top(100);
var list = new List<Temp>();
using (var reader = session.ExecuteReader(query))
{
while (reader.Read())
{
var entity = new Temp();
entity.ID = (long)reader[0];
entity.Date = ((DateTime)reader[1]).Date;
entity.Goods_Code = (string)reader[2];
entity.UserName = (string)reader[3];
entity.ProductBatch = (string)reader[4];
entity.Weight = (decimal)reader[5];
list.Add(entity);
}
}
return list;
}
}
class Temp
{
public long ID { get; set; }
public DateTime Date { get; set; }
public string Goods_Code { get; set; }
public string UserName { get; set; }
public string ProductBatch { get; set; }
public decimal Weight { get; set; }
}
}