using iWareSql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iWareSql.DBModel;
using XiGang.Core.Model;
using iWareSql.DataAccess;
using iWareCommon.Common.Globle;
using System.Threading;
using iWareCommon.Utils;
using iWareModel;
namespace iWareCC
{
///
/// 虚拟出库处理,并且不在出库计划任务中的线程
///
public class VirtualTaskNoOutPlanTaskHandler
{
///
/// 处理【虚拟出库处理】的出库计划任务
///
public static void Handler()
{
var errMsg = "";
while (true)
{
try
{
if (SystemValue.isAllowRuning_DataProcess_RobotBuffer_FinishTask && SystemValue.isStartedModel)
{
errMsg = "";//重置
using (DbModel mycontext = new DbModel())
{
try
{
SingleOutPlanTaskHandler(mycontext, ref errMsg);
if (string.IsNullOrEmpty(errMsg))
{
SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask = "成功处理";
}
else
{
SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask = errMsg;
}
}
catch (Exception ex)
{
Log4NetHelper.WriteErrorLog(LogType.OutPlanTask, "处理【虚拟出库处理】的出库计划任务=>" + errMsg + ",异常:" + ex.Message, ex);
SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask = "处理【虚拟出库处理】的出库计划任务=>" + errMsg + ",异常:" + ex.Message;
}
}
}
}
catch (Exception ex)
{
SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask = "出现异常:" + ex.Message;
Log4NetHelper.WriteErrorLog(LogType.DataProcess_RobotBuffer_FinishTask, "VirtualTaskNoOutPlanTaskHandler出现异常:" + ex.Message, ex);
}
Thread.Sleep(10 * 1000);//休眠10秒
}
}
private static void SingleOutPlanTaskHandler(DbModel context, ref string errMsg)
{
errMsg = "";
List noPlanTaskList = new List();
//当前虚拟库存
var virtualStroeList = context.Wms_VirtualStore.ToList();
if (virtualStroeList != null && virtualStroeList.Count > 0)
{
var queryState1 = (int)OutTaskDetailStateEnum.等待中;
var queryState2 = (int)OutTaskDetailStateEnum.缺料;
var detaiList = context.Plan_OutTaskDetail.Where(x => x.OutTaskDetailState == queryState1 || x.OutTaskDetailState == queryState2).ToList();
if (detaiList != null && detaiList.Count > 0)
{
foreach (var virtualStroe in virtualStroeList)
{
var isExist = false;
//判断这些计划是否有符合 虚拟库存中的
foreach (var planDetail in detaiList)
{
var queliaoReason = "";
var findStore = StoreHandler.FindStoreForOutPlan(context, planDetail, ref errMsg, ref queliaoReason);
if (findStore != null)
{
isExist = true;
break;
}
}
if (isExist == false)
{
noPlanTaskList.Add(virtualStroe);
}
}
//处理 不再出库计划中的虚拟库存,将他们统统认定为人工出库
foreach (var item in noPlanTaskList)
{
SingleTaskHandlerForVirtual(context, item, ref errMsg);
}
}
else
{
//不予处理
}
}
}
///
/// 单个处理出库-虚拟库存中处理 [Editby shaocx,2022-07-28]
///
///
///
///
///
///
private static bool SingleTaskHandlerForVirtual(DbModel context, Wms_VirtualStore findVirtualStore, ref string errMsg)
{
errMsg = "";
var remark = "消费虚拟库存,让他人工出库";
#region 事务处理
using (var trans = context.Database.BeginTransaction())
{
try
{
//1、库存移除
context.Wms_VirtualStore.Remove(findVirtualStore);
//findVirtualStore.IsDeleted = true;
//findVirtualStore.ModifyBy = "";
//findVirtualStore.OperationRemark = remark + "[锁定库存]";
//findVirtualStore.ModifyTime = DateTime.Now;
//2、创建虚拟出库任务,注意:任务状态必须是已完成,因为是虚拟出库
FunRetEntity addOutStoreTaskResult = MainTaskHandler.AddOutStoreTaskForVirtual(null, findVirtualStore, context, MainTaskTypeEnum.手动出库, new SysUser()
{
ID = 0,
Name = SysGloble.WCSSystem
});
if (addOutStoreTaskResult.result == false)
{
errMsg = addOutStoreTaskResult.resMsg;
throw new Exception(errMsg);
}
//4、更新出库明细表
var mainTask = addOutStoreTaskResult.resData as Task_Main;
if (mainTask == null)
{
errMsg = "新建的主任务对象为NULL";
throw new Exception(errMsg);
}
//保存数据库
context.SaveChanges();
trans.Commit();
return true;
}
catch (Exception ex)
{
trans.Rollback();
SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask = "SingleTaskHandlerForVirtual出现异常:" + ex.Message;
Log4NetHelper.WriteErrorLog(LogType.DataProcess_RobotBuffer_FinishTask, "SingleTaskHandlerForVirtual 出现异常:" + ex.Message, ex);
throw ex;
}
}
#endregion
}
}
}