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;
|
||
}
|
||
|
||
}
|
||
}
|