242 lines
9.9 KiB
C#
242 lines
9.9 KiB
C#
|
|
using AutoMapper;
|
|||
|
|
using APT.BaseData.Domain.Entities;
|
|||
|
|
using APT.BaseData.Domain.Entities;
|
|||
|
|
using APT.BaseData.Domain.Enums;
|
|||
|
|
using APT.BaseData.Domain.IServices;
|
|||
|
|
using APT.BaseData.Domain.Msg;
|
|||
|
|
using APT.Infrastructure.Core;
|
|||
|
|
using APT.Utility;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Linq.Expressions;
|
|||
|
|
using APT.Infrastructure.Api;
|
|||
|
|
namespace APT.BaseData.Services.DomainServices
|
|||
|
|
{
|
|||
|
|
public partial class PFCodeRuleSerialService : CommonService, IPFCodeRuleSerialService
|
|||
|
|
{
|
|||
|
|
public PFCodeRuleSerialService(IRepository repository)
|
|||
|
|
: base(repository)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 跑批
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool RunBatch()
|
|||
|
|
{
|
|||
|
|
//增加跑批日志表
|
|||
|
|
var logs = this.GetEntities<T_PF_CODE_RULE_RUN_LOG>(i => i.IS_COMPLETE == false);
|
|||
|
|
if (logs.Any())
|
|||
|
|
{
|
|||
|
|
foreach (var l in logs)
|
|||
|
|
{
|
|||
|
|
if (l.START_TIME <= DateTime.Now.AddHours(-6))
|
|||
|
|
{
|
|||
|
|
l.IS_COMPLETE = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
this.BantchUpdateEntity(logs);
|
|||
|
|
//如果有未完成的跑批数据不继续跑批,如超过6个小时,则认为是异常中断
|
|||
|
|
if (logs.Any(i => i.START_TIME > DateTime.Now.AddHours(-6)))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//开始跑批
|
|||
|
|
const int Day = -2;
|
|||
|
|
var date = DateTime.Now.ToString("yyyyMMdd");
|
|||
|
|
var nextDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");
|
|||
|
|
var codeRules = this.GetEntities<T_PF_CODE_RULE>(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
|
|||
|
|
new BaseFilter(), new string[] { "Nav_Org" }).ToList();
|
|||
|
|
if (codeRules.Any())
|
|||
|
|
{
|
|||
|
|
//跑批日志表增加一条数据
|
|||
|
|
var log = new T_PF_CODE_RULE_RUN_LOG
|
|||
|
|
{
|
|||
|
|
ID = Guid.NewGuid(),
|
|||
|
|
CREATE_TIME = DateTime.Now,
|
|||
|
|
START_TIME = DateTime.Now,
|
|||
|
|
IS_COMPLETE = false,
|
|||
|
|
ORG_ID = codeRules.FirstOrDefault().ORG_ID
|
|||
|
|
};
|
|||
|
|
this.AddEntity(log);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//var dbCodeRuleSerials=this.GetEntities<T_PF_CODE_RULE_SERIAL>(t => t.STATUS == (int)PFCodeRuleStatus.未用).ToList();
|
|||
|
|
List<T_PF_CODE_RULE_SERIAL> codeRuleSerials = new List<T_PF_CODE_RULE_SERIAL>();
|
|||
|
|
foreach (var rule in codeRules)
|
|||
|
|
{
|
|||
|
|
DoGenSerialByRule(rule, date, codeRuleSerials);
|
|||
|
|
}
|
|||
|
|
//预生成第二天的编码 因为工厂通常有夜班 编码未必可以及时生成
|
|||
|
|
foreach (var rule in codeRules)
|
|||
|
|
{
|
|||
|
|
DoGenSerialByRule(rule, nextDate, codeRuleSerials);
|
|||
|
|
}
|
|||
|
|
this.BantchAddEntity(codeRuleSerials);
|
|||
|
|
|
|||
|
|
var towDay = DateTime.Now.AddDays(Day).ToString("yyyyMMdd");
|
|||
|
|
var serialLogs = this.GetEntities<T_PF_CODE_RULE_SERIAL>(i => i.DATE_VALUE != null
|
|||
|
|
&& string.Compare(i.DATE_VALUE, towDay) <= 0, true).ToList();
|
|||
|
|
if (serialLogs.Any())
|
|||
|
|
{
|
|||
|
|
var seialAddLogs = new List<T_PF_CODE_RULE_SERIAL>();
|
|||
|
|
foreach (var s in serialLogs)
|
|||
|
|
{
|
|||
|
|
seialAddLogs.Add(s);
|
|||
|
|
if (seialAddLogs.Count >= 10000)
|
|||
|
|
{
|
|||
|
|
AddLogByInValidSerial(seialAddLogs);
|
|||
|
|
seialAddLogs.Clear();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AddLogByInValidSerial(seialAddLogs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
var oldLog = this.GetEntity<T_PF_CODE_RULE_RUN_LOG>(log.ID.ToString());
|
|||
|
|
if (oldLog != null)
|
|||
|
|
{
|
|||
|
|
oldLog.END_TIME = DateTime.Now;
|
|||
|
|
oldLog.IS_COMPLETE = true;
|
|||
|
|
this.UpdateEntity(oldLog);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void AddLogByInValidSerial(List<T_PF_CODE_RULE_SERIAL> list)
|
|||
|
|
{
|
|||
|
|
if (list == null || !list.Any()) return;
|
|||
|
|
this.DeleteEntity<T_PF_CODE_RULE_SERIAL>(list);
|
|||
|
|
//var seialAddLogs = new List<T_PF_CODE_RULE_SERIAL_LOG>();
|
|||
|
|
//foreach (var s in list)
|
|||
|
|
//{
|
|||
|
|
// var log = new T_PF_CODE_RULE_SERIAL_LOG();// Mapper.Map<T_PF_CODE_RULE_SERIAL, T_PF_CODE_RULE_SERIAL_LOG>(s);
|
|||
|
|
// log.ORG_ID = log.ORG_ID;
|
|||
|
|
// CopyUtils.CopyObject(log, s);
|
|||
|
|
// seialAddLogs.Add(log);
|
|||
|
|
//}
|
|||
|
|
//this.BantchAddEntity(seialAddLogs);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoGenSerialByRule(T_PF_CODE_RULE rule, string date, List<T_PF_CODE_RULE_SERIAL> codeRuleSerials)
|
|||
|
|
{
|
|||
|
|
Expression<Func<T_PF_CODE_RULE_SERIAL, bool>> expression = t => t.ORG_ID == rule.ORG_ID
|
|||
|
|
&& t.CODE_TYPE == rule.CODE_TYPE;
|
|||
|
|
if (!rule.IS_IGNORE_DATE.HasValue || !rule.IS_IGNORE_DATE.Value)
|
|||
|
|
expression = expression.And(t => t.DATE_VALUE == date);
|
|||
|
|
var pageFilter = new BasePageFilter(1, 1);
|
|||
|
|
pageFilter.Sort = "NUM";
|
|||
|
|
pageFilter.Order = DbOrder.DESC;
|
|||
|
|
var maxDbCodeRuleSerial = this.GetOrderPageEntities<T_PF_CODE_RULE_SERIAL>(expression, pageFilter);
|
|||
|
|
int num = 0;
|
|||
|
|
T_PF_CODE_RULE_SERIAL maxCodeRuleSerail = null;
|
|||
|
|
if (maxDbCodeRuleSerial.Items.Any())
|
|||
|
|
{
|
|||
|
|
maxCodeRuleSerail = maxDbCodeRuleSerial.Items.FirstOrDefault();
|
|||
|
|
if (maxCodeRuleSerail != null)
|
|||
|
|
num = maxCodeRuleSerail.NUM;
|
|||
|
|
}
|
|||
|
|
num++;
|
|||
|
|
|
|||
|
|
Expression<Func<T_PF_CODE_RULE_SERIAL, bool>> expression1 = t => t.ORG_ID == rule.ORG_ID
|
|||
|
|
&& t.CODE_TYPE == rule.CODE_TYPE && t.STATUS == (int)PFCodeRuleStatus.未用;
|
|||
|
|
if (!rule.IS_IGNORE_DATE.HasValue || !rule.IS_IGNORE_DATE.Value)
|
|||
|
|
expression1 = expression1.And(t => t.DATE_VALUE == date);
|
|||
|
|
|
|||
|
|
var minUnUseSerial = this.GetEntity<T_PF_CODE_RULE_SERIAL>(expression1, new BaseFilter()
|
|||
|
|
{
|
|||
|
|
Order = DbOrder.ASC,
|
|||
|
|
Sort = "NUM"
|
|||
|
|
});
|
|||
|
|
int minUnUseNum = 0;
|
|||
|
|
if (minUnUseSerial != null)
|
|||
|
|
minUnUseNum = minUnUseSerial.NUM - 1;
|
|||
|
|
else if (maxCodeRuleSerail != null && maxCodeRuleSerail.STATUS != (int)PFCodeRuleStatus.未用)
|
|||
|
|
minUnUseNum = maxCodeRuleSerail.NUM;
|
|||
|
|
|
|||
|
|
var maxQty = rule.QTY == null || rule.QTY == 0 ? 100 : rule.QTY;
|
|||
|
|
maxQty += minUnUseNum;
|
|||
|
|
var serial = new T_PF_CODE_RULE_SERIAL
|
|||
|
|
{
|
|||
|
|
ORG_ID = rule.ORG_ID,
|
|||
|
|
CODE_TYPE = rule.CODE_TYPE,
|
|||
|
|
DATE_VALUE = rule.IS_IGNORE_DATE.HasValue && rule.IS_IGNORE_DATE.Value ? null : date,
|
|||
|
|
STATUS = (int)PFCodeRuleStatus.未用
|
|||
|
|
};
|
|||
|
|
//位数限制
|
|||
|
|
var ruleMaxQty = Math.Floor(Math.Pow(10, rule.SERIAL_NUM_LEN) - 1);
|
|||
|
|
if (maxQty > (int)ruleMaxQty)
|
|||
|
|
maxQty = (int)ruleMaxQty;
|
|||
|
|
|
|||
|
|
for (int i = num; i <= maxQty; i++)
|
|||
|
|
{
|
|||
|
|
var cpSerial = (T_PF_CODE_RULE_SERIAL)serial.Clone();
|
|||
|
|
cpSerial.ID = Guid.NewGuid();
|
|||
|
|
cpSerial.NUM = i;
|
|||
|
|
cpSerial.SERIAL = string.Concat(rule.CODE_PREFIX,
|
|||
|
|
(rule.Nav_Org == null ? string.Empty : (rule.Nav_Org.CODE)),
|
|||
|
|
(rule.IS_IGNORE_DATE.HasValue && rule.IS_IGNORE_DATE.Value ? string.Empty : date),
|
|||
|
|
i.ToString().PadLeft(rule.SERIAL_NUM_LEN, '0'));
|
|||
|
|
codeRuleSerials.Add(cpSerial);
|
|||
|
|
if (codeRuleSerials.Count >= 1000)
|
|||
|
|
{
|
|||
|
|
this.BantchAddEntity(codeRuleSerials);
|
|||
|
|
codeRuleSerials.Clear();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 手动触发
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="filter"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool GenSerial(KeywordFilter filter)
|
|||
|
|
{
|
|||
|
|
var date = DateTime.Now.ToString("yyyyMMdd");
|
|||
|
|
var type = int.Parse(filter.Keyword);
|
|||
|
|
filter.Sort = string.Empty;
|
|||
|
|
var codeRule = this.GetEntity<T_PF_CODE_RULE>(i => i.CODE_TYPE == type, filter, new string[] { "Nav_Org" });
|
|||
|
|
|
|||
|
|
if (codeRule == null)
|
|||
|
|
throw new Exception(ErrMsg.PF_ERR_CODE_RULE_TYPE + ":" + type);
|
|||
|
|
|
|||
|
|
List<T_PF_CODE_RULE_SERIAL> codeRuleSerials = new List<T_PF_CODE_RULE_SERIAL>();
|
|||
|
|
DoGenSerialByRule(codeRule, date, codeRuleSerials);
|
|||
|
|
this.BantchAddEntity(codeRuleSerials);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检验预取流水
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool SerialCheck()
|
|||
|
|
{
|
|||
|
|
var checkSerial = this.GetEntities<T_PF_CODE_RULE_SERIAL>(i => i.STATUS == (int)PFCodeRuleStatus.预取
|
|||
|
|
&& i.RELEASE_TIME != null && i.RELEASE_TIME < DateTime.Now).ToList();
|
|||
|
|
if (checkSerial.Any())
|
|||
|
|
{
|
|||
|
|
checkSerial.ForEach(i =>
|
|||
|
|
{
|
|||
|
|
i.STATUS = (int)PFCodeRuleStatus.未用;
|
|||
|
|
i.TAKE_TIME = null; i.RELEASE_TIME = null;
|
|||
|
|
});
|
|||
|
|
//commit
|
|||
|
|
//1.初始化当前的数据
|
|||
|
|
this.BantchUpdateEntity(checkSerial);
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|