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