using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
using HH.WCS.Mobox3.DSZSH.Consts;
|
using HH.WCS.Mobox3.DSZSH.Helpers;
|
using HH.WCS.Mobox3.DSZSH.Helpers.Model;
|
using HH.WCS.Mobox3.DSZSH.Models;
|
|
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
|
/// <summary>
|
/// 定时轮询任务:抽检业务核心
|
/// </summary>
|
public class CheckCore {
|
/// <summary>
|
/// 轮询查看抽检单是否有执行中的项目
|
/// </summary>
|
public void CheckOrderState() {
|
var db = DbHelper.GetDbClient();
|
try {
|
var orderList = db.Queryable<TN_Check_Order>()
|
.Where(c => c.N_B_STATE == 0)
|
.OrderBy(c => c.T_CREATE).ToList();
|
|
using (var tran = db.Ado.UseTran()) {
|
foreach (var order in orderList) {
|
var startLocList = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
|
((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
|
.Where((l, c, d) => d.S_CG_ID == order.S_CG_ID && d.S_BATCH_NO == order.S_BATCH_NO)
|
.Select((l, c) => new { Location = l, Container = c })
|
.Take(order.N_QTY).ToList(); // 获取指定数量的货位数,随机抽取故无需排序
|
|
if (startLocList.Count < order.N_QTY) {
|
LogHelper.Info($"轮询 | 当前可抽检的物料数量 {startLocList.Count} 无法满足抽检单数量 {order.N_QTY} 要求");
|
return;
|
}
|
|
var endLocList = db.Queryable<TN_Location>()
|
.Where(l => l.S_AREA_CODE == order.S_END_AREA)
|
.Where(ExprHelper.LocIsFree)
|
.Where(ExprHelper.LocIsEmpty)
|
.Take(order.N_QTY).ToList(); // 获取指定数量的货位数
|
|
if (endLocList.Count < order.N_QTY) {
|
LogHelper.Info($"轮询 | 终点区域可用货位 {startLocList.Count} 无法满足抽检单数量 {order.N_QTY} 要求");
|
return;
|
}
|
|
// TODO 参考出库,如果要求任务顺序也要新创建表存储,有需求再更新
|
for (var i = 0; i < order.N_QTY; i++) {
|
if (!TaskHelper.LogCreateTask(startLocList[i].Location.S_CODE, startLocList[i].Container.S_CNTR_CODE,
|
endLocList[i].S_CODE, TaskName.抽检)) {
|
tran.RollbackTran();
|
}
|
}
|
|
order.N_B_STATE = 1;
|
db.Updateable<TN_Check_Order>(endLocList).UpdateColumns(c => c.N_B_STATE);
|
tran.CommitTran();
|
}
|
}
|
}
|
catch (Exception ex) {
|
LogHelper.InfoEx(ex);
|
}
|
}
|
}
|
}
|