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 {
///
/// 定时轮询任务:抽检业务核心
///
public class CheckCore {
///
/// 轮询查看抽检单是否有执行中的项目
///
public void CheckOrderState() {
var db = DbHelper.GetDbClient();
try {
var orderList = db.Queryable()
.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
((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()
.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(endLocList).UpdateColumns(c => c.N_B_STATE);
tran.CommitTran();
}
}
}
catch (Exception ex) {
LogHelper.InfoEx(ex);
}
}
}
}