using System;
using System.Collections.Generic;
using System.Linq;
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;
using Newtonsoft.Json;
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
///
/// 定时轮询任务:出库业务核心
///
public class OutboundCore {
///
/// 后台轮询出库单/出库明细单,生成出库任务表
///
public static void CheckOutboundOrder() {
var db = DbHelper.GetDbClient();
try {
// 查找所有的 等待出库 的 出库单,按 先创建先处理 排序
var orders = db.Queryable()
.Where(o => o.N_B_STATE == 0)
.OrderBy(o => o.T_CREATE)
.Mapper(
o => o.Details, // 将子表数据映射到主表的 Details 属性
o => o.S_NO, // 主表关联字段
d => d.S_NO // 子表关联字段
)
.ToList();
if (orders.Count == 0) {
LogHelper.Info("轮询 | 当前没有等待执行的出库单");
return;
}
using (var tran = db.Ado.UseTran()) {
foreach (var o in orders) {
foreach (var d in o.Details) {
for (int i = 0; i < d.N_QTY; i++) {
var task = new TN_Outbound_Task {
S_CG_ID = d.S_CG_ID,
S_END_AREA = d.S_END_AREA,
N_FORCE = o.N_FORCE,
S_BATCH_NO = d.S_BATCH_NO,
N_STATE = 0
};
if (db.Insertable(task).ExecuteCommand() <= 0) {
tran.RollbackTran();
LogHelper.Info("插入任务出错");
return;
}
}
d.N_B_STATE = 1;
if (db.Updateable(d).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) {
LogHelper.Info("更新 N_B_STATE 成功");
}
else {
tran.RollbackTran();
LogHelper.Info("更新 N_B_STATE 失败");
return;
}
}
o.N_B_STATE = 1;
if (db.Updateable(o).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) {
LogHelper.Info("更新 N_B_STATE 成功");
}
else {
tran.RollbackTran();
LogHelper.Info("更新 N_B_STATE 失败");
return;
}
}
tran.CommitTran();
}
}
catch (Exception ex) {
LogHelper.InfoEx(ex);
throw;
}
}
///
/// 轮询出库
///
public static void CheckOutboundTask() {
var db = DbHelper.GetDbClient();
try {
var task = db.Queryable()
.Where(t => t.N_STATE == 0).First();
if (task == null) {
LogHelper.Info("轮询 | 出库任务队列 暂无待执行的任务");
return;
}
var headTask = task;
if (headTask.N_STATE != 0) {
LogHelper.Info("轮询 | 出库任务队列 队头任务尚未完成");
return;
}
var locCntr = 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 == headTask.S_CG_ID && d.S_BATCH_NO == headTask.S_BATCH_NO)
// 如果不是强制出库,物料状态必须必须合格
// 否则,只要不是正在检验的物料即可
.Where((l, c, d) => (headTask.N_FORCE == 0 && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格")
|| (headTask.N_FORCE != 0 && d.N_ITEM_STATE != 3 && d.S_ITEM_STATE != "正在检验"))
// 物料状态对应的数字,越小越优先
.OrderBy((l, c, d) => d.N_ITEM_STATE)
.OrderBy(l => l.N_LAYER)
.Select((l, c) => new { Location = l, Container = c }).First();
if (locCntr == null) {
LogHelper.Info("轮询 | 不存在符合条件的物料货位");
return;
}
var endLoc = db.Queryable()
.Where(l => l.S_AREA_CODE == headTask.S_END_AREA)
.Where(ExprHelper.LocIsFree)
.Where(ExprHelper.LocIsEmpty)
.OrderBy(l => l.S_CODE)
.First();
if (endLoc == null) {
LogHelper.Info("轮询 | 不存在符合条件的出库终点库位");
return;
}
using (var tran = db.Ado.UseTran()) {
if (TaskHelper.LogCreateTask(locCntr.Location.S_CODE, locCntr.Container.S_CNTR_CODE, endLoc.S_CODE, TaskName.成品胶出库)) {
task.N_STATE = 1;
if (db.Updateable(task).UpdateColumns(c => c.N_STATE).ExecuteCommand() <= 0) {
tran.RollbackTran();
LogHelper.Info("修改出库任务状态错误");
}
else {
tran.CommitTran();
LogHelper.Info("修改出库任务状态成功");
}
}
}
}
catch (Exception ex) {
LogHelper.InfoEx(ex);
}
}
///
///
///
///
public static void UpdateTaskState(int state = 2) {
}
}
}