mh_lcmk_sms_service/APT.BaseData.Services/Services/PF/PFCodeRuleSerialService.cs

242 lines
9.9 KiB
C#
Raw Permalink Normal View History

2024-07-12 16:37:09 +08:00
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;
}
}
}