using HH.WCS.Mobox3.YNJuXing.device;
|
using HH.WCS.Mobox3.YNJuXing.dispatch;
|
using HH.WCS.Mobox3.YNJuXing.models;
|
using HH.WCS.Mobox3.YNJuXing.process;
|
using HH.WCS.Mobox3.YNJuXing.util;
|
using HH.WCS.Mobox3.YNJuXing.wms;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Threading;
|
using static HH.WCS.Mobox3.YNJuXing.api.ApiModel;
|
using static HH.WCS.Mobox3.YNJuXing.api.OtherModel;
|
using static HH.WCS.Mobox3.YNJuXing.wms.WMSHelper;
|
|
namespace HH.WCS.Mobox3.YNJuXing.api
|
{
|
/// <summary>
|
/// api接口辅助类
|
/// </summary>
|
public class ApiHelper
|
{
|
private static HttpHelper httpHelper = new HttpHelper();
|
static ApiHelper()
|
{
|
|
}
|
|
|
internal static SimpleResult Putaway_Order_In(Putaway_Order_In model)
|
{
|
var result = new SimpleResult();
|
//创建入库单主子表
|
var po = WMSHelper.GetPutawayOrder(model.Data.arrival_no);
|
if (po == null)
|
{
|
po = new PutawayOrder { S_NO = model.Data.arrival_no, S_BS_TYPE = model.Data.op_type };
|
po.Details = new List<PutawayDetail>();
|
if (model.Data.items.Count > 0)
|
{
|
model.Data.items.ForEach(a =>
|
{
|
po.Details.Add(new PutawayDetail
|
{
|
S_PUTAWAY_NO = model.Data.arrival_no,
|
N_ROW_NO = po.Details.Count + 1,
|
S_ITEM_CODE = a.item_code,
|
F_QTY = a.qty,
|
S_BATCH_NO = a.batch_no,
|
});
|
});
|
WMSHelper.CreatePutawayOrder(po);
|
}
|
|
}
|
return result;
|
}
|
|
internal static PlcRinglineres PlcRinglineCallbackState(PlcRinglineState model)
|
{
|
var result = new PlcRinglineres();
|
var db = new SqlHelper<object>().GetInstance();
|
var loclist = new List<Location>();
|
Location endbit = null;
|
var newendbitlist = new List<summodel>();
|
var peizhi = db.Queryable<PeiZhi>().Where(a => a.PLCLOCATION == model.startBit).First();
|
if (peizhi != null)
|
{
|
|
//寻找最优巷道
|
LogHelper.Info($"是否可入{model.isYn} wcs发送巷道{model.roadWay} 寻找最优巷道");
|
|
|
var endbitlist = db.Queryable<Location>()
|
.Where(a => a.S_AREA_CODE == peizhi.LIKUAREACODE)
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM), a.N_ROADWAY })
|
//.PartitionBy(a => a.N_ROADWAY)
|
.GroupBy(a => a.N_ROADWAY)
|
.MergeTable()
|
.OrderBy(a => a.sum)
|
.ToList();
|
|
endbitlist.ForEach(a =>
|
{
|
//查找入库锁数量 加上去
|
var loc = db.Queryable<Location>()
|
.Where(it => it.S_AREA_CODE == peizhi.LIKUAREACODE && it.N_ROADWAY == a.N_ROADWAY && it.S_LOCK_STATE == "入库锁")
|
.ToList();
|
newendbitlist.Add(new summodel { sum = a.sum, roadway = a.N_ROADWAY, locksum = loc.Count });
|
});
|
|
newendbitlist = newendbitlist.OrderBy(a => a.sum).ToList();
|
//newendbitlist = newendbitlist.OrderBy(a => a.locksum).ToList();
|
|
foreach (var item in newendbitlist)
|
{
|
if (item.roadway < int.Parse(model.roadWay))
|
{
|
continue;
|
}
|
if (DuiDuoBool(item.roadway, peizhi.BITCODE))
|
{
|
loclist = db.Queryable<Location>()
|
.Where(a => a.S_AREA_CODE == peizhi.LIKUAREACODE && a.N_ROADWAY == item.roadway && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "无")
|
.OrderByDescending(it => new { N_LAYER = SqlFunc.Asc(it.N_LAYER), N_COL = SqlFunc.Asc(it.N_COL), N_ROW = SqlFunc.Asc(it.N_ROW), N_SIDE = SqlFunc.Desc(it.N_SIDE) })
|
.ToList();
|
|
if (loclist.Count > 0)
|
{
|
foreach (var it in loclist)
|
{
|
if (it.N_SIDE == 2)
|
{
|
//校验外面的货位是否有货 或有锁
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.S_AREA_CODE && a.N_ROW == it.N_ROW && a.N_COL == it.N_COL && a.N_LAYER == it.N_LAYER && a.N_SIDE == 1).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM == 0 && nextloc.S_LOCK_STATE == "无")
|
{
|
endbit = it;
|
break;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"查询不到货位{it.S_CODE} 的相邻货位信息");
|
}
|
}
|
else
|
{
|
//校验内侧托盘是否需要出库
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == it.S_AREA_CODE && a.N_ROW == it.N_ROW && a.N_COL == it.N_COL && a.N_LAYER == it.N_LAYER && a.N_SIDE == 2).Includes(a => a.LocCntrRel).First();
|
if (nextloc != null)
|
{
|
if (nextloc.S_LOCK_STATE == "无")
|
{
|
if (nextloc.LocCntrRel != null)
|
{
|
var outtask = db.Queryable<OutTask>().Where(a => a.TRAYCODE == nextloc.LocCntrRel.S_CNTR_CODE).First();
|
if (outtask == null)
|
{
|
endbit = it;
|
break;
|
}
|
}
|
else
|
{
|
endbit = it;
|
break;
|
}
|
}
|
|
}
|
else
|
{
|
endbit = it;
|
break;
|
}
|
}
|
}
|
if (endbit != null)
|
{
|
LogHelper.Info($"获取到巷道{item.roadway} 有可入货位");
|
if (model.isYn == "Y" && endbit.N_ROADWAY >= int.Parse(model.roadWay))
|
{
|
UpdateRangline(model, db, endbit);
|
result.roadway = endbit.N_ROADWAY.ToString();
|
break;
|
}
|
|
if (model.isYn == "N" && endbit.N_ROADWAY > int.Parse(model.roadWay))
|
{
|
UpdateRangline(model, db, endbit);
|
result.roadway = endbit.N_ROADWAY.ToString();
|
break;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"巷道{item.roadway} 无可入货位");
|
}
|
|
}
|
else
|
{
|
LogHelper.Info($"巷道{item.roadway} 无可入货位");
|
}
|
}
|
|
}
|
if (string.IsNullOrEmpty(result.roadway))
|
{
|
//强制分配
|
result.roadway = model.roadWay;
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = $"点位{model.startBit} 未配置";
|
LogHelper.Info($"点位{model.startBit} 未配置");
|
}
|
|
return result;
|
}
|
|
internal static SimpleResult MoboxCompleteTask(MoboxTaskBase model, SimpleResult result)
|
{
|
string taskInfo = "";
|
var db = new SqlHelper<object>().GetInstance();
|
var task = WCSHelper.GetTask(model.TaskNo);
|
if (task != null)
|
{
|
taskInfo = JsonConvert.SerializeObject(task);
|
string taskType = task.S_B_STATE.Trim();
|
if (!WCSHelper.CheckActionRecordExist(task.S_CODE, 1))
|
{
|
result.resultMsg = "任务未执行,不允许强制完成!" + $"任务状态:{taskType}";
|
result.resultCode = 1;
|
}
|
else if (task.S_B_STATE != "取消" && task.S_B_STATE != "完成" && task.S_B_STATE != "关闭" && task.S_B_STATE != "强制完成")
|
{
|
//已推送但是没有完成或者取消,通知hosttoagv
|
if (task.S_SCHEDULE_TYPE == "WCS")
|
{
|
if (TaskProcess.Cancel(task))
|
{
|
TaskProcess.ThirdReportStatus(task.S_OP_CODE, "", "Y", "", task);
|
result.resultMsg = "任务完成已经发送给plc" + $"任务状态:{taskType}";
|
//TaskProcess.TaskCanCelOrComplete(task, false);
|
WCSHelper.UpdateEndTime(task);
|
TaskProcess.OperateStatus(task, 4);
|
TaskProcess.OperateStatus(task, 6);
|
TaskProcess.DeleteTaskPool(task);
|
TaskProcess.PlcSencondTask(task, false);
|
WCSHelper.UpdateStatus(model.TaskNo, 6);
|
db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
}
|
else
|
{
|
result.resultMsg = "任务强制完成失败";
|
result.resultCode = 1;
|
}
|
}
|
else
|
{
|
result.resultMsg = "任务完成已经发送给小车" + $"任务状态:{taskType}";
|
WCSHelper.UpdateStatus(model.TaskNo, 3);
|
NDCHelper.Cancel(task.S_CODE.Trim());
|
TaskProcess.CacheBitCancelUpdate(task, false);
|
//db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == task.S_CNTRS).ExecuteCommand();
|
if (task.S_TYPE == "AGV出库")
|
{
|
TaskProcess.ThirdReportStatus(task.S_OP_CODE.Trim(), "", "Y", "", task);
|
TaskProcess.DeleteTaskPool(task);
|
}
|
if (task.S_TYPE == "AGV入库")
|
{
|
TaskProcess.ThirdReportStatus(task.S_OP_CODE, "", "Y", "", task, false);
|
}
|
}
|
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "任务已结束" + $"任务状态:{taskType}";
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "任务不存在" + $"任务号:{model.TaskNo}";
|
}
|
LogHelper.Info("CompleteTask Return:" + JsonConvert.SerializeObject(result) + ",TaskInfo:" + taskInfo, "MoboxTask");
|
return result;
|
}
|
|
internal static SimpleResult AddDesignateTask(AddDesignateTaskModel model, SimpleResult result)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
if (!string.IsNullOrEmpty(model.cntrNo))
|
{
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrInfo != null)
|
{
|
var startbit = cntrInfo.S_LOC_CODE;
|
var lockinfo = db.Queryable<Location>().Where(a => (a.S_CODE == startbit || a.S_CODE == model.endBit) && a.S_LOCK_STATE != "无").First();
|
if (lockinfo == null)
|
{
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == startbit).Includes(a => a.LocCntrRel).First();
|
var endinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.endBit).First();
|
|
if (startinfo != null)
|
{
|
var res = false;
|
if (startinfo.N_SIDE == 2)
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_ROW == startinfo.N_ROW && a.N_COL == startinfo.N_COL && a.N_LAYER == startinfo.N_LAYER && a.N_SIDE == 1).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM > 0 || nextloc.S_LOCK_STATE != "无")
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{startbit}不满足生成任务";
|
LogHelper.Info($"起点{startbit}不满足生成任务");
|
}
|
else res = true;
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"找不到起点{startbit}相邻货位信息";
|
LogHelper.Info($"找不到起点{startbit}相邻货位信息");
|
}
|
}
|
else res = true;
|
if (res)
|
{
|
if (startinfo.N_CURRENT_NUM > 0)
|
{
|
if (startinfo.LocCntrRel != null)
|
{
|
string msg = "";
|
var endbit = db.Queryable<Location>().Where(a => a.S_CODE == model.endBit && a.N_LOCK_STATE == 0 && a.N_CURRENT_NUM == 0).First();
|
if (endbit != null)
|
{
|
//IntensiveArea.CreateTransport(startinfo.S_LOC_CODE, endbit.S_LOC_CODE, "移动", startinfo.LocCntrRel.S_CNTR_CODE, "plc", startinfo.LocCntrRel.S_SRC_SYS, "", "", 1, startinfo.LocCntrRel.TrayType);
|
WMSHelper.CreateWmsTask("", startinfo, endbit, startinfo.LocCntrRel.S_CNTR_CODE, "出库", 2, "WCS", 1, startinfo.LocCntrRel.S_SRC_SYS, startinfo.LocCntrRel.TRAYTYPE);
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = $"终点{model.endBit} 不满足呼叫托盘";
|
LogHelper.Info($"终点{model.endBit} 不满足呼叫托盘");
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "查询不到起点绑定托盘类型";
|
LogHelper.Info($"查询不到起点绑定托盘类型");
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "起点数量异常 无法生成任务";
|
LogHelper.Info($"起点数量异常 无法生成任务");
|
}
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "起点或终点货位状态异常";
|
LogHelper.Info($"货位{lockinfo.S_CODE}锁状态异常");
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = $"找不到托盘{model.cntrNo} 绑定的货位";
|
LogHelper.Info($"找不到托盘{model.cntrNo} 绑定的货位");
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "托盘不能为空";
|
LogHelper.Info($"托盘不能为空");
|
}
|
return result;
|
}
|
|
internal static SimpleResultModel GetEmptyTaskList(GetEmptyTaskListModel model, SimpleResultModel result)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
|
if (!string.IsNullOrEmpty(model.endLoc))
|
{
|
var WorkOrder = db.Queryable<GridstructureOutTaskWorkOrder>().Where(a => a.S_END_LOC == model.endLoc && a.S_STATE == "执行").First();
|
if (WorkOrder == null)
|
{
|
WorkOrder = new GridstructureOutTaskWorkOrder
|
{
|
S_END_LOC = model.endLoc,
|
N_MAX_SUM = model.sum
|
};
|
db.Insertable(WorkOrder).ExecuteCommand();
|
}
|
else
|
{
|
LogHelper.Info($"点位{model.endLoc} 有未完成的单子 无法插入");
|
result.errCode = 1;
|
result.success = false;
|
result.errMsg = $"点位{model.endLoc} 有未完成的单子 无法插入";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"输入参数有误");
|
result.errCode = 1;
|
result.success = false;
|
result.errMsg = "输入参数有误";
|
}
|
|
|
|
|
|
return result;
|
}
|
|
internal static SimpleResultModel GetEmptyTask(List<GetEmptyTaskModel> models, SimpleResultModel result)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
//var itemInfoList = new List<CntrItemRel>();
|
//Location startLoc = null;
|
//string cntrCode = "";
|
foreach (var model in models)
|
{
|
if (!string.IsNullOrEmpty(model.endLoc) && model.length >= 0)
|
{
|
if (model.length > 2)
|
{
|
var Info = new GridstructureOutTask { S_END_LOC = model.endLoc, S_TRAY_TYPE = "空托" };
|
db.Insertable(Info).ExecuteCommand();
|
//空托
|
//itemInfoList = db.Queryable<CntrItemRel>().Where(a => a.F_QTY == 0).ToList();
|
}
|
else
|
{
|
var Info = new GridstructureOutTask { S_END_LOC = model.endLoc, S_TRAY_TYPE = "不满框", F_LENGTH = ConvertDoubleToFloatWithTwoDecimals(model.length) };
|
db.Insertable(Info).ExecuteCommand();
|
//不满托
|
//itemInfoList = db.Queryable<CntrItemRel>().Where(a => a.F_QTY < (a.F_MAX_QTY - model.length) && a.F_QTY > 0).ToList();
|
}
|
//if (itemInfoList.Count > 0)
|
//{
|
// foreach (var item in itemInfoList)
|
// {
|
// var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == item.S_CNTR_CODE).First();
|
// if (cntrInfo != null)
|
// {
|
// var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == cntrInfo.S_LOC_CODE).First();
|
// if (locinfo != null)
|
// {
|
// if (locinfo.N_SIDE == 1 && (locinfo.S_LOCK_STATE == "无" || locinfo.S_LOCK_STATE == "锁定"))
|
// {
|
// //直接生成任务 查询终点接驳位 接驳位信息(未定)
|
// if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
// {
|
// startLoc = locinfo;
|
// break;
|
// }
|
// else
|
// {
|
// LogHelper.Info($"出库任务 托盘{item.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
// }
|
//
|
// }
|
// else if (locinfo.N_SIDE == 2 && locinfo.S_LOCK_STATE == "无")
|
// {
|
// var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locinfo.S_AREA_CODE && a.N_ROW == locinfo.N_ROW && a.N_COL == locinfo.N_COL && a.N_LAYER == locinfo.N_LAYER && a.N_SIDE == 1).Includes(a => a.LocCntrRel).First();
|
// if (nextloc != null)
|
// {
|
// if (nextloc.N_CURRENT_NUM == 0 && nextloc.S_LOCK_STATE == "无")
|
// {
|
// if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
// {
|
// startLoc = locinfo;
|
// break;
|
// }
|
// else
|
// {
|
// LogHelper.Info($"出库任务 托盘{item.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
// }
|
// }
|
// else if (nextloc.N_CURRENT_NUM == 1 && nextloc.S_LOCK_STATE == "无")
|
// {
|
// //能不移就不移 先记录托盘
|
// }
|
// }
|
// else
|
// {
|
// LogHelper.Info($"站点异常 找不到站点{locinfo.S_CODE} 的相邻货位信息", "出库");
|
// }
|
// }
|
// }
|
// }
|
// }
|
//}
|
//else
|
//{
|
// LogHelper.Info("未找到符合条件的容器");
|
// result.errCode = 1;
|
// result.success = false;
|
// result.errMsg = "未找到符合条件的容器";
|
//}
|
}
|
else
|
{
|
LogHelper.Info($"输入参数有误");
|
result.errCode = 1;
|
result.success = false;
|
result.errMsg = "输入参数有误";
|
return result;
|
}
|
}
|
|
|
|
|
|
|
return result;
|
}
|
|
|
|
public static float ConvertDoubleToFloatWithTwoDecimals(double value)
|
{
|
// 1. 转换为 decimal 进行精确四舍五入
|
decimal decimalValue = (decimal)value;
|
|
// 2. 四舍五入到两位小数(使用传统四舍五入规则)
|
decimal roundedDecimal = Math.Round(decimalValue, 2, MidpointRounding.AwayFromZero);
|
|
// 3. 转换为 float 存储
|
return (float)roundedDecimal;
|
}
|
|
|
|
private static void UpdateRangline(PlcRinglineState model, SqlSugarClient db, Location endbit)
|
{
|
var RanglineInfo = db.Queryable<RanglineContrl>().Where(a => a.S_CNTR_CODE == model.cntrCode).First();
|
if (RanglineInfo != null)
|
{
|
if (!string.IsNullOrEmpty(RanglineInfo.S_END_LOC))
|
{
|
LocationHelper.UnLockLoc(RanglineInfo.S_END_LOC);
|
}
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
RanglineInfo.S_END_LOC = endbit.S_CODE;
|
RanglineInfo.N_ROADWAY = endbit.N_ROADWAY;
|
db.Updateable(RanglineInfo).UpdateColumns(it => new { it.S_END_LOC, it.N_ROADWAY }).ExecuteCommand();
|
}
|
}
|
|
internal static TaskStateresutl GetTaskState(GetTaskStateModel model)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
TaskStateresutl result = new TaskStateresutl { success = false, code = 0 };
|
if (!string.IsNullOrEmpty(model.taskNo))
|
{
|
var info = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.taskNo).First();
|
if (info != null)
|
{
|
var TaskStates = db.Queryable<TaskAction>().Where(a => a.S_TASK_CODE == info.S_CODE).ToList();
|
TaskStates = TaskStates.OrderBy(a => a.T_CREATE).ToList();
|
for (int i = 0; i < TaskStates.Count; i++)
|
{
|
TaskState task = new TaskState
|
{
|
state = TaskStates[i].N_ACTION_CODE.ToString(),
|
errMsg = "",
|
taskNo = model.taskNo,
|
transferTime = TaskStates[i].T_CREATE.ToString()
|
};
|
if (!string.IsNullOrEmpty(TaskStates[i].S_EQ_CODE))
|
{
|
task.agvNo = int.Parse(TaskStates[i].S_EQ_CODE);
|
}
|
result.data.Add(task);
|
}
|
result.success = true;
|
}
|
else
|
{
|
result.code = 1;
|
result.msg = "该任务号没有状态记录!";
|
}
|
}
|
else
|
{
|
result.code = 1;
|
result.msg = "请求任务号不能为空!";
|
}
|
return result;
|
}
|
|
|
|
|
|
|
internal static PlcSendTaskres PlcCallbackState(PlcState model)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var result = new PlcSendTaskres { requestPk = model.requestPk, code = "0" };
|
string message = "";
|
if (model.noticeType == "0")
|
{
|
var peizhi = db.Queryable<PeiZhi>().Where(a => a.PLCLOCATION == model.curPos).First();
|
if (peizhi != null)
|
{
|
//if (peizhi.LIKUAREACODE == Settings.LiKUAreaNo && !string.IsNullOrEmpty(model.groupNo))
|
//{
|
// result.code = "1";
|
// result.msg = $"当前点位库区所属一期立库 二期托盘无法入库";
|
// return result;
|
//}
|
//
|
//if (peizhi.LIKUAREACODE == Settings.LiKUAreaNo2 && string.IsNullOrEmpty(model.groupNo))
|
//{
|
// result.code = "1";
|
// result.msg = $"当前点位库区所属二期立库 托盘高度不能为空";
|
// return result;
|
//}
|
//检测托盘合格 根据当前位置和容器表中的目的库区算取目的位置(需要给巨星WMS传输托盘号 获取物料信息 物料信息用处待定)
|
|
//if (LocationHelper.CheckLocFree(peizhi.BitCode))
|
if (WCSHelper.IsFree(model.contNo, peizhi.BITCODE, ref message))
|
{
|
string sourNo = "";
|
string startbit = "";
|
string traytype = "";
|
string msg = "";
|
int pri = 0;
|
string islong = "";
|
string sysNo = "";
|
string endarea = "";
|
float length = 0;
|
int isdouble = 0;
|
if (WCSHelper.JuXingTaskBool(model.contNo, "入库", ref sourNo, ref traytype, ref pri, ref islong, ref sysNo, ref endarea, ref isdouble, ref length))
|
//if(JuXingTaskBol(model.contNo,"入库",ref sourNo,ref startbit))
|
{
|
if (endarea == Settings.LiKUAreaNo || endarea == Settings.LiKUAreaNo2)
|
{
|
//校验入库点位和终点库区是否匹配
|
if (peizhi.LIKUAREACODE != endarea)
|
{
|
result.code = "1";
|
result.msg = $"当前点位入库与终点库区不匹配 无法入库";
|
return result;
|
}
|
}
|
|
if (StartAreaBool(peizhi.BITCODE))
|
{
|
if (!string.IsNullOrEmpty(sourNo))
|
{
|
if (Settings.ContrlBitList.Contains(peizhi.BITCODE))
|
{
|
LogHelper.Info("11111111111");
|
//算取是否有可入库位有的话 添加进中间表中 发送任务
|
var Emptysum = db.Queryable<Location>().Where(a => a.S_AREA_CODE == peizhi.LIKUAREACODE && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0).ToList();
|
var Ranglinesum = db.Queryable<RanglineContrl>().ToList();
|
if (Emptysum.Count - Ranglinesum.Count > 0)
|
{
|
//插入任务托盘 发送任务
|
var RanglineInfo = db.Queryable<RanglineContrl>().Where(a => a.S_CNTR_CODE == model.contNo).First();
|
if (RanglineInfo == null)
|
{
|
RanglineInfo = new RanglineContrl { S_CNTR_CODE = model.contNo };
|
db.Insertable(RanglineInfo).ExecuteCommand();
|
}
|
//推送任务 发给wcs
|
}
|
}
|
else
|
{
|
LogHelper.Info("2222222222222");
|
Location startLoc = db.Queryable<Location>().Where(a => a.S_CODE == peizhi.BITCODE).First();
|
Location endbit = null;
|
//if (endarea != peizhi.LIKUAREACODE && !string.IsNullOrEmpty(endarea))
|
//{
|
// endbit = WMSHelper.GetConnectBit(ref endarea, 0);
|
//}
|
//else
|
//{
|
if (!string.IsNullOrEmpty(model.Roadway))
|
{
|
LogHelper.Info("2222222222222");
|
var RanglineInfo = db.Queryable<RanglineContrl>().Where(a => a.S_CNTR_CODE == model.contNo).First();
|
if (RanglineInfo != null)
|
{
|
endbit = db.Queryable<Location>().Where(a => a.S_CODE == RanglineInfo.S_END_LOC).First();
|
}
|
}
|
else
|
{
|
LogHelper.Info("3333333333333");
|
endbit = WMSHelper.GetLiKuLocationIn(peizhi.LIKUAREACODE, isdouble, peizhi.ROADWAY, ref msg, model.groupNo, "0", peizhi.BITCODE);
|
}
|
//}
|
|
if (endbit != null)
|
{
|
//创建任务
|
//WMSHelper.CreateTransport(peizhi.BitCode, endbit.S_LOC_CODE, "入库", model.contNo, "plc", sysNo, sourNo, "", pri, traytype, model.groupNo);
|
var res = WMSHelper.CreateWmsTask(sourNo, startLoc, endbit, model.contNo, "入库", 1, "WCS", pri, sysNo, traytype, model.groupNo);
|
if (res)
|
{
|
var cntr = db.Queryable<Container>().Where(a => a.S_CODE == model.contNo).First();
|
if (cntr == null)
|
{
|
cntr = new Container { S_CODE = model.contNo, S_SRC = sysNo };
|
db.Insertable(cntr).ExecuteCommand();
|
}
|
if (length >= 0)
|
{
|
var itemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == model.contNo).First();
|
if (itemInfo != null)
|
{
|
itemInfo.F_QTY = itemInfo.F_QTY + length;
|
db.Updateable(itemInfo).UpdateColumns(a => new { a.F_QTY }).ExecuteCommand();
|
}
|
else
|
{
|
itemInfo = new CntrItemRel {S_CNTR_CODE=model.contNo, F_QTY = length };
|
db.Insertable(itemInfo).ExecuteCommand();
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"任务创建失败 获取不到终点货位");
|
result.msg = msg;
|
result.code = "2";
|
}
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = $"任务池传输上游任务号为空";
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = $"当前位置{model.curPos} 出入库模式存在冲突 禁止入库";
|
}
|
}
|
else
|
{
|
//LogHelper.Info($"巨星返回任务号及起点有误");
|
result.code = "1";
|
result.msg = $"托盘{model.contNo}不在任务池 不予创建";
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = message;
|
}
|
}
|
else
|
{
|
result.code = "2";
|
result.msg = "传输点位有误 配置不存在";
|
}
|
}
|
else
|
{
|
var task = WCSHelper.GetTask(model.requestPk);
|
if (task != null)
|
{
|
if (!WCSHelper.CheckActionRecordExist(task.S_CODE, int.Parse(model.noticeType)))
|
{
|
switch (model.noticeType)
|
{
|
case "1":
|
//执行状态
|
WCSHelper.Begin(task);
|
break;
|
case "2":
|
//完成状态 (出库任务生成第二段agv任务) 解绑起点终点
|
if (task.S_B_STATE != "取消" && task.S_B_STATE != "完成" && task.S_B_STATE != "关闭" && task.S_B_STATE != "强制完成")
|
{
|
TaskProcess.OperateStatus(task, 4);
|
TaskProcess.OperateStatus(task, 6);
|
WCSHelper.End(task);
|
WMSHelper.End(task);
|
TaskProcess.PlcSencondTask(task);
|
}
|
break;
|
case "8":
|
//取货无货(释放货位)
|
quhuowuhuo(db, task);
|
break;
|
case "9":
|
//放货有货 (重分货位)
|
fanghuoyouhuo(db, result, task);
|
break;
|
case "10":
|
//取深浅有 取消当前任务 外侧托盘标记锁定
|
qushenqianyou(db, task);
|
break;
|
case "11":
|
//放深浅有 (重分货位)
|
fangshenqianyou(db, result, task);
|
break;
|
}
|
WCSHelper.AddActionRecord(model.requestPk, int.Parse(model.noticeType), "", "");
|
//TaskProcess.ThirdReportStatus("", "", int.Parse(model.noticeType), "", task, false);
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = "该任务编号不存在";
|
}
|
}
|
return result;
|
}
|
|
private static void fangshenqianyou(SqlSugarClient db, PlcSendTaskres result, WCSTask task)
|
{
|
string msg = "";
|
var loc = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
|
var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == loc.S_AREA_CODE && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL && a.N_LAYER == loc.N_LAYER && a.N_SIDE == 1).First();
|
locinfo.N_CURRENT_NUM = 1;
|
locinfo.S_LOCK_STATE = "锁定";
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
|
|
//分配改道货位
|
LogHelper.Info($"查找改道货位 优先查找{locinfo.N_ROADWAY}巷道货位");
|
Location endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, 0, locinfo.N_ROADWAY.ToString(), ref msg, task.S_ITEM_HEIGHT);
|
if (endbit != null)
|
{
|
LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
//修改任务数据 终点 备注:改位
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
LocationHelper.UnLockLoc(task.S_END_LOC);
|
|
task.S_END_LOC = endbit.S_CODE;
|
task.S_NOTE = "改位";
|
db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
result.new_locate_no = endbit.S_CODE;
|
}
|
else
|
{
|
LogHelper.Info($"{locinfo.N_ROADWAY} 巷道找不到可入货位 随机分配货位");
|
endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, 0, "", ref msg, task.S_ITEM_HEIGHT);
|
if (endbit != null)
|
{
|
LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
//修改任务数据 终点 备注:改位
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
LocationHelper.UnLockLoc(task.S_END_LOC);
|
|
task.S_END_LOC = endbit.S_CODE;
|
task.S_NOTE = "改位";
|
db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
result.new_locate_no = endbit.S_CODE;
|
}
|
}
|
}
|
|
|
private static void fanghuoyouhuo(SqlSugarClient db, PlcSendTaskres result, WCSTask task)
|
{
|
string msg = "";
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
|
locinfo.N_CURRENT_NUM = 1;
|
locinfo.S_LOCK_STATE = "锁定";
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
|
|
//分配改道货位
|
LogHelper.Info($"查找改道货位 优先查找{locinfo.N_ROADWAY}巷道货位");
|
Location endbit = WMSHelper.GetLiKuLocationIn(Settings.LiKUAreaNo, 0, locinfo.N_ROADWAY.ToString(), ref msg, task.S_ITEM_HEIGHT);
|
if (endbit != null)
|
{
|
LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
//修改任务数据 终点 备注:改位
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
task.S_END_LOC = endbit.S_CODE;
|
task.S_NOTE = "改位";
|
db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
result.new_locate_no = endbit.S_CODE;
|
}
|
else
|
{
|
LogHelper.Info($"{locinfo.N_ROADWAY} 巷道找不到可入货位 随机分配货位");
|
endbit = WMSHelper.GetLiKuLocationIn(Settings.LiKUAreaNo, 0, "", ref msg, task.S_ITEM_HEIGHT);
|
if (endbit != null)
|
{
|
LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
//修改任务数据 终点 备注:改位
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
task.S_END_LOC = endbit.S_CODE;
|
task.S_NOTE = "改位";
|
db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
result.new_locate_no = endbit.S_CODE;
|
}
|
}
|
}
|
|
|
private static void qushenqianyou(SqlSugarClient db, WCSTask task)
|
{
|
TaskProcess.Cancel(task);
|
var loc = db.Queryable<Location>().Where(a => a.S_CODE == task.S_START_LOC).First();
|
var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == loc.S_AREA_CODE && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL && a.N_LAYER == loc.N_LAYER && a.N_SIDE == 1).First();
|
locinfo.N_CURRENT_NUM = 1;
|
locinfo.S_LOCK_STATE = "锁定";
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
|
db.Deleteable<ContainerDest>().Where(a => a.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
task.N_B_STATE = 4;
|
WCSHelper.UpdateStatus(task, "关闭");
|
db.Deleteable<OutTask>().Where(a => a.TRAYCODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<ContainerDest>().Where(a => a.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
TaskProcess.OperateStatus(task, 7);
|
TaskProcess.ThirdReportStatus(task.S_OP_CODE, "", "H", "", task);
|
task.S_NOTE = "异常";
|
db.Updateable(task).UpdateColumns(it => new { it.S_NOTE }).ExecuteCommand();
|
}
|
|
public static bool StartAreaBool(string bitCode)
|
{
|
var result = true;
|
var db = new SqlHelper<object>().GetInstance();
|
//var locinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == bitCode).First();
|
var typeinfo = db.Queryable<InOutType>().Where(a => a.LOCATION == bitCode).First();
|
if (typeinfo != null)
|
{
|
if (typeinfo.TYPE != "入库" && typeinfo.TYPE.Trim() != "空")
|
{
|
result = false;
|
}
|
}
|
|
|
return result;
|
}
|
|
internal static SimpleResult OutboundOrderExecute(OutboundOrderCheck model)
|
{
|
var result = new SimpleResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var nolist = model.out_no.Split(',').ToList();
|
nolist.ForEach(a =>
|
{
|
var OutboundOrder = db.Queryable<TN_Outbound_Order>().Where(it => it.S_NO == a && it.N_B_STATE == 0).Includes(it => it.Details).First();
|
if (OutboundOrder != null)
|
{
|
var res = false;
|
for (int i = 0; i < OutboundOrder.Details.Count; i++)
|
{
|
var detail = OutboundOrder.Details[i];
|
var whi = db.Queryable<WHInventory>().Where(w => w.S_ITEM_CODE == detail.S_ITEM_CODE).First();
|
if (whi != null && whi.F_QTY - whi.F_ALLOC_QTY > 0)
|
{
|
res = true;
|
Expression<Func<CntrItemRel, bool>> expression = x => x.S_ITEM_CODE == detail.S_ITEM_CODE;
|
expression.AndAlso(x => x.Cntr.C_ENABLE == "Y");
|
expression.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) > (detail.F_QTY - detail.F_ACC_D_QTY));
|
expression.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) / 2 < (detail.F_QTY - detail.F_ACC_D_QTY));
|
if (!string.IsNullOrEmpty(detail.S_BATCH_NO)) expression.AndAlso(x => x.S_BATCH_NO == detail.S_BATCH_NO);
|
if (!string.IsNullOrEmpty(detail.S_OWNER)) expression.AndAlso(x => x.S_OWNER == detail.S_OWNER);
|
if (!string.IsNullOrEmpty(detail.S_ERP_WH_CODE)) expression.AndAlso(x => x.S_ERP_WH_CODE == detail.S_ERP_WH_CODE);
|
var bol = false;
|
var fjlist = db.Queryable<CntrItemRel>().Includes(c => c.Cntr)
|
.Where(expression)
|
.OrderBy(c => c.T_CREATE)
|
.ToList();
|
for (int j = 0; j < fjlist.Count; j++)
|
{
|
//检测这个托盘物料是否单一
|
var cir = fjlist[j];
|
//var isfj = db.Queryable<TN_Distribution_CNTR>().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.C_REVERSE == "Y" && c.N_B_STATE < 2).First();
|
//if (isfj == null)
|
//{
|
// var itemlist = db.Queryable<CntrItemRel>().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.F_QTY > 0).ToList();
|
// if (itemlist.Count == 1)
|
// {
|
// var dc_no = WMSHelper.GenerateDistrbutionCntrNo();
|
// bol = true;
|
// var dc = new TN_Distribution_CNTR
|
// {
|
// S_DC_NO = dc_no,
|
// S_BS_NO = detail.S_DO_NO,
|
// S_BS_TYPE = OutboundOrder.S_BS_TYPE,
|
// S_CNTR_CODE = cir.S_CNTR_CODE,
|
// S_EXIT_AREA_CODE = OutboundOrder.S_AREA_CODE,
|
// S_OP_TYPE = OutboundOrder.S_BS_TYPE,
|
// C_REVERSE = "Y"
|
// };
|
// db.Insertable(dc).ExecuteCommand();
|
//
|
// var dc_detail = new TN_Distribution_CNTR_Detail
|
// {
|
// S_ITEM_CODE = detail.S_ITEM_CODE,
|
// S_ITEM_NAME = detail.S_ITEM_NAME,
|
// S_BATCH_NO = detail.S_BATCH_NO,
|
// S_ERP_WH_CODE = detail.S_ERP_WH_CODE,
|
// S_SUPPLIER_NO = detail.S_SUPPLIER_NO,
|
// S_OWNER = detail.S_OWNER,
|
// N_BS_ROW_NO = detail.N_ROW_NO,
|
// S_BS_TYPE = OutboundOrder.S_BS_TYPE,
|
// S_DC_NO = dc_no,
|
// S_BS_NO = OutboundOrder.S_NO,
|
// F_QTY = (itemlist[0].F_QTY - itemlist[0].F_ALLOC_QTY) - (detail.F_QTY - detail.F_ACC_D_QTY),
|
// };
|
// db.Insertable(dc_detail).ExecuteCommand();
|
// //更新容器货品表分配量
|
// cir.F_ALLOC_QTY += (float)dc_detail.F_QTY;
|
// cir.T_MODIFY = DateTime.Now;
|
// db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
|
// //更新分拣单子表的量
|
// detail.F_ACC_D_QTY += detail.F_QTY - detail.F_ACC_D_QTY;
|
// detail.T_MODIFY = DateTime.Now;
|
// db.Updateable(detail).UpdateColumns(it => new { it.F_ACC_D_QTY, it.T_MODIFY }).ExecuteCommand();
|
// whi.F_ALLOC_QTY += (float)(detail.F_QTY - detail.F_ACC_D_QTY);
|
// whi.T_MODIFY = DateTime.Now;
|
// db.Updateable(whi).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
|
// break;
|
// }
|
//}
|
}
|
|
|
Expression<Func<CntrItemRel, bool>> expression1 = x => x.S_ITEM_CODE == detail.S_ITEM_CODE;
|
expression1.AndAlso(x => x.Cntr.C_ENABLE == "Y");
|
expression1.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) > 0);
|
if (!string.IsNullOrEmpty(detail.S_BATCH_NO)) expression1.AndAlso(x => x.S_BATCH_NO == detail.S_BATCH_NO);
|
if (!string.IsNullOrEmpty(detail.S_OWNER)) expression1.AndAlso(x => x.S_OWNER == detail.S_OWNER);
|
if (!string.IsNullOrEmpty(detail.S_ERP_WH_CODE)) expression1.AndAlso(x => x.S_ERP_WH_CODE == detail.S_ERP_WH_CODE);
|
|
if (!bol)
|
{
|
//按分拣单子表去配货,查找可用托盘(先查所有符合的,后面再优化)
|
var cirList = db.Queryable<CntrItemRel>().Includes(c => c.Cntr)
|
.Where(expression1)
|
.OrderBy(c => c.T_CREATE)
|
.ToList();
|
for (int j = 0; j < cirList.Count; j++)
|
{
|
var cir = cirList[j];
|
//var isfj = db.Queryable<TN_Distribution_CNTR>().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.C_REVERSE == "Y" && c.N_B_STATE < 2).First();
|
//if (isfj == null)
|
//{
|
// var dc_no = WMSHelper.GenerateDistrbutionCntrNo();
|
// bol = true;
|
// var dc = new TN_Distribution_CNTR
|
// {
|
// S_DC_NO = dc_no,
|
// S_BS_NO = detail.S_DO_NO,
|
// S_BS_TYPE = OutboundOrder.S_BS_TYPE,
|
// S_CNTR_CODE = cir.S_CNTR_CODE,
|
// S_EXIT_AREA_CODE = OutboundOrder.S_AREA_CODE,
|
// S_OP_TYPE = OutboundOrder.S_BS_TYPE
|
// };
|
// db.Insertable(dc).ExecuteCommand();
|
// var dc_detail = new TN_Distribution_CNTR_Detail
|
// {
|
// S_ITEM_CODE = detail.S_ITEM_CODE,
|
// S_ITEM_NAME = detail.S_ITEM_NAME,
|
// S_BATCH_NO = detail.S_BATCH_NO,
|
// S_ERP_WH_CODE = detail.S_ERP_WH_CODE,
|
// S_SUPPLIER_NO = detail.S_SUPPLIER_NO,
|
// S_OWNER = detail.S_OWNER,
|
// N_BS_ROW_NO = detail.N_ROW_NO,
|
// S_BS_TYPE = OutboundOrder.S_BS_TYPE,
|
// S_DC_NO = dc_no,
|
// S_BS_NO = OutboundOrder.S_NO,
|
// };
|
// bool needBreak = false;
|
// if (cir.F_QTY - cir.F_ALLOC_QTY >= (detail.F_QTY - detail.F_ACC_D_QTY))
|
// {
|
// dc_detail.F_QTY = detail.F_QTY - detail.F_ACC_D_QTY;
|
// needBreak = true;
|
// }
|
// else
|
// {
|
// //生成分拣明细,继续创建
|
// dc_detail.F_QTY = cir.F_QTY - cir.F_ALLOC_QTY;
|
// }
|
// db.Insertable(dc_detail).ExecuteCommand();
|
// //更新容器货品表分配量
|
// cir.F_ALLOC_QTY += (float)dc_detail.F_QTY;
|
// cir.T_MODIFY = DateTime.Now;
|
// db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
|
// //更新分拣单子表的量
|
// detail.F_ACC_D_QTY += dc_detail.F_QTY;
|
// detail.T_MODIFY = DateTime.Now;
|
// db.Updateable(detail).UpdateColumns(it => new { it.F_ACC_D_QTY, it.T_MODIFY }).ExecuteCommand();
|
// whi.F_ALLOC_QTY += (float)dc_detail.F_QTY;
|
// whi.T_MODIFY = DateTime.Now;
|
// db.Updateable(whi).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
|
// if (needBreak)
|
// {
|
// break;
|
// }
|
//}
|
}
|
}
|
}
|
else
|
{
|
//修改出库单明细状态为缺件
|
}
|
}
|
}
|
|
//修改出库单状态为执行
|
});
|
|
return result;
|
}
|
|
private static void quhuowuhuo(SqlSugarClient db, WCSTask task)
|
{
|
TaskProcess.OperateStatus(task, 7);
|
task.S_NOTE = "异常";
|
db.Updateable(task).UpdateColumns(it => new { it.S_NOTE }).ExecuteCommand();
|
}
|
|
|
/// <summary>
|
/// 出库
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
internal static OutResultModel OutWorkArea(OutWorkAreaModel model)
|
{
|
var endAreaContrlList = new List<endAreaContrl>();
|
endAreaContrlList.Add(new endAreaContrl { endArea = "D24", roadwayList = new List<int> { 1, 2, 7, 8, 11, 12 } });
|
endAreaContrlList.Add(new endAreaContrl { endArea = "ZF1", roadwayList = new List<int> { 10 } });
|
endAreaContrlList.Add(new endAreaContrl { endArea = "ZF2", roadwayList = new List<int> { 11 } });
|
|
OutResultModel result = new OutResultModel { success = true };
|
var res = new IsTaskPoolModel { success = true };
|
var db = new SqlHelper<object>().GetInstance();
|
var roadwayList = new List<int> { 1, 2, 7, 8, 11, 12 };
|
//if (!string.IsNullOrEmpty(model.workorderNo))
|
//{
|
var info = db.Queryable<OutWorkNo>().Where(a => a.WORKORDERNO == model.workorderNo).First();
|
if (info == null)
|
{
|
//校验任务池是否可以添加
|
foreach (var item in model.data)
|
{
|
res = IsTaskPool(model.sourceSys, item.trayCode, item.sourNo);
|
if (!res.success)
|
{
|
break;
|
}
|
}
|
if (res.success)
|
{
|
db.Insertable(new OutWorkNo { WORKORDERNO = model.workorderNo, STARTTIME = model.startTime, ENDTIME = model.endTime, TYPE = model.type, PRIORITY = model.priority }).ExecuteCommand();
|
foreach (var a in model.data)
|
{
|
var loc = db.Queryable<LocCntrRel>().Where(it => it.S_CNTR_CODE == a.trayCode).First();
|
if (loc != null)
|
{
|
var locationInfo = db.Queryable<Location>().Where(it => it.S_CODE == loc.S_LOC_CODE).First();
|
if (locationInfo != null)
|
{
|
if (endAreaContrlList.Where(it => it.endArea == a.endArea && !it.roadwayList.Contains(locationInfo.N_ROADWAY)).FirstOrDefault() == null)
|
{
|
var peizhiinfo = db.Queryable<PeiZhi>().Where(it => it.AREA == a.endArea).First();
|
if ((peizhiinfo != null && peizhiinfo.LIKUAREACODE == locationInfo.S_AREA_CODE) || peizhiinfo == null)
|
{
|
if (peizhiinfo != null)
|
{
|
//人工
|
var modeInfo = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == a.endArea).First();
|
if (modeInfo != null)
|
{
|
var mode = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == a.endArea && it.N_LOC_MODE == "人工").First();
|
if (mode == null)
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 出库库区为接驳位 人工搬运 当前接驳位库区{a.endArea} 没有配置人工出库";
|
continue;
|
}
|
}
|
}
|
else
|
{
|
var contrlbol = false;
|
var endAreaList = a.endArea.Split(',').ToList();
|
foreach (var its in endAreaList)
|
{
|
//AGV
|
peizhiinfo = db.Queryable<PeiZhi>().Where(it => it.AREACODE == its).First();
|
if (peizhiinfo != null)
|
{
|
var modeInfo = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == peizhiinfo.AREA).First();
|
if (modeInfo != null)
|
{
|
var mode = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == peizhiinfo.AREA && it.N_LOC_MODE == "AGV").First();
|
if (mode == null)
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 出库库区为外部库区 AGV搬运 当前接驳位库区{peizhiinfo.AREA} 没有配置AGV出库";
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
if (!contrlbol)
|
{
|
continue;
|
}
|
}
|
|
|
var endinfo = db.Queryable<Area>().Where(it => it.S_CODE == a.endArea).First();
|
if (endinfo != null)
|
{
|
if (InsertTaskPool(model.sourceSys, a.trayCode, a.sourNo, a.trayType, "出库", model.priority, a.IsLong))
|
{
|
db.Insertable(new OutTask { WORKORDERNO = model.workorderNo, STARTBIT = a.startBit, ENDAREA = a.endArea, ENDBIT = a.endBit, TRAYCODE = a.trayCode }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"终点库区{a.endArea}没有维护";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的库区{locationInfo.S_AREA_CODE} 无法运送到终点库区{a.endArea} 请选择其他出口";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的巷道{locationInfo.N_ROADWAY} 无法运送到终点库区{a.endArea} 请选择其他出口";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的货位 没有找到该货位的数据";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg = "托盘不在立体库内";
|
result.data.Add(a.trayCode);
|
}
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 2;
|
result.errMsg = $"托盘{res.TrayCode} 已被其他系统占用";
|
}
|
|
}
|
else
|
{
|
//校验任务池是否可以添加
|
foreach (var item in model.data)
|
{
|
res = IsTaskPool(model.sourceSys, item.trayCode, item.sourNo);
|
if (!res.success)
|
{
|
break;
|
}
|
}
|
if (res.success)
|
{
|
//db.Insertable(new OutWorkNo { workorderNo = model.workorderNo, startTime = model.startTime, endTime = model.endTime, type = model.type, priority = model.priority }).ExecuteCommand();
|
foreach (var a in model.data)
|
{
|
var loc = db.Queryable<LocCntrRel>().Where(it => it.S_CNTR_CODE == a.trayCode).First();
|
if (loc != null)
|
{
|
var locationInfo = db.Queryable<Location>().Where(it => it.S_CODE == loc.S_LOC_CODE).First();
|
if (locationInfo != null)
|
{
|
if (endAreaContrlList.Where(it => it.endArea == a.endArea && !it.roadwayList.Contains(locationInfo.N_ROADWAY)).FirstOrDefault() == null)
|
{
|
var peizhiinfo = db.Queryable<PeiZhi>().Where(it => it.AREA == a.endArea).First();
|
if ((peizhiinfo != null && peizhiinfo.LIKUAREACODE == locationInfo.S_AREA_CODE) || peizhiinfo == null)
|
{
|
|
if (peizhiinfo != null)
|
{
|
//人工
|
var modeInfo = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == a.endArea).First();
|
if (modeInfo != null)
|
{
|
var mode = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == a.endArea && it.N_LOC_MODE == "人工").First();
|
if (mode == null)
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 出库库区为接驳位 人工搬运 当前接驳位库区{a.endArea} 没有配置人工出库";
|
continue;
|
}
|
}
|
}
|
else
|
{
|
var contrlbol = false;
|
var endAreaList = a.endArea.Split(',').ToList();
|
foreach (var its in endAreaList)
|
{
|
//AGV
|
peizhiinfo = db.Queryable<PeiZhi>().Where(it => it.AREACODE == its).First();
|
if (peizhiinfo != null)
|
{
|
var modeInfo = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == peizhiinfo.AREA).First();
|
if (modeInfo != null)
|
{
|
var mode = db.Queryable<ConnetCotrl>().Where(it => it.S_AREA_CODE == peizhiinfo.AREA && it.N_LOC_MODE == "AGV").First();
|
if (mode == null)
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 出库库区为外部库区 AGV搬运 当前接驳位库区{peizhiinfo.AREA} 没有配置AGV出库";
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
else
|
{
|
contrlbol = true;
|
break;
|
}
|
}
|
if (!contrlbol)
|
{
|
continue;
|
}
|
}
|
|
|
var endinfo = db.Queryable<Area>().Where(it => it.S_CODE == a.endArea).First();
|
if (endinfo != null)
|
{
|
if (InsertTaskPool(model.sourceSys, a.trayCode, a.sourNo, a.trayType, "出库", model.priority, a.IsLong))
|
{
|
db.Insertable(new OutTask { WORKORDERNO = model.workorderNo, STARTBIT = a.startBit, ENDAREA = a.endArea, ENDBIT = a.endBit, TRAYCODE = a.trayCode }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"终点库区{a.endArea}没有维护";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的库区{locationInfo.S_AREA_CODE} 无法运送到终点库区{a.endArea} 请选择其他出口";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的巷道{locationInfo.N_ROADWAY} 无法运送到终点库区{a.endArea} 请选择其他出口";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg += $"托盘{a.trayCode} 绑定的货位 没有找到该货位的数据";
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg = "托盘无库存";
|
result.data.Add(a.trayCode);
|
}
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 2;
|
result.errMsg = $"托盘{res.TrayCode} 已被其他系统占用";
|
}
|
}
|
|
return result;
|
}
|
|
internal static bool InsertTaskPool(string sourceSys, string trayNo, string sourNo, string traytype, string tasktype, int priority, string isLong, string endArea = "")
|
{
|
var result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
if (!string.IsNullOrEmpty(trayNo) && !string.IsNullOrEmpty(sourceSys))
|
{
|
var cntr = db.Queryable<WmsTrayMark>().Where(a => a.S_CNTR_CODE == trayNo).First();
|
if (cntr != null)
|
{
|
LogHelper.Info("托盘标记表中已有该托盘标记 检查来源");
|
if (cntr.S_SRC_SYS == sourceSys)
|
{
|
var task = db.Queryable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == trayNo).First();
|
if (task == null)
|
{
|
var info = new WmsTaskPool { S_CNTR_CODE = trayNo, S_SRC_SYS = sourceSys, S_SRC_NO = sourNo, S_TASK_TYPE = tasktype, S_TRAY_TYPE = traytype, N_PRI = priority, S_IS_LONG = isLong, S_END_AREA = endArea };
|
db.Insertable(info).ExecuteCommand();
|
result = true;
|
}
|
else
|
{
|
result = true;
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("绑定托盘标记 添加任务池");
|
var info = new WmsTrayMark { S_CNTR_CODE = trayNo, S_SRC_SYS = sourceSys };
|
db.Insertable(info).ExecuteCommand();
|
var taskinfo = new WmsTaskPool { S_CNTR_CODE = trayNo, S_SRC_SYS = sourceSys, S_SRC_NO = sourNo, S_TASK_TYPE = tasktype, S_TRAY_TYPE = traytype, N_PRI = priority, S_IS_LONG = isLong, S_END_AREA = endArea };
|
db.Insertable(taskinfo).ExecuteCommand();
|
result = true;
|
}
|
}
|
return result;
|
}
|
public class endAreaContrl
|
{
|
public string endArea { get; set; }
|
public List<int> roadwayList { get; set; } = new List<int>();
|
}
|
|
public class IsTaskPoolModel
|
{
|
public bool success { get; set; }
|
public string TrayCode { get; set; }
|
}
|
|
internal static IsTaskPoolModel IsTaskPool(string sourceSys, string trayNo, string sourNo)
|
{
|
var result = new IsTaskPoolModel { success = true };
|
var db = new SqlHelper<object>().GetInstance();
|
|
if (!string.IsNullOrEmpty(trayNo) && !string.IsNullOrEmpty(sourceSys))
|
{
|
var cntr = db.Queryable<WmsTrayMark>().Where(a => a.S_CNTR_CODE == trayNo).First();
|
if (cntr != null)
|
{
|
if (cntr.S_SRC_SYS != sourceSys)
|
{
|
result.success = false;
|
result.TrayCode = cntr.S_CNTR_CODE;
|
}
|
}
|
}
|
|
return result;
|
}
|
|
|
internal static PlcSendTaskres agvResponse(agvResponsemodel model)
|
{
|
var result = new PlcSendTaskres { requestPk = model.requestPk, code = "0" };
|
var task = WCSHelper.GetTask(model.requestPk);
|
if (task != null)
|
{
|
if (model.isAllow == "1")
|
{
|
//通知车子移动 修改参数(未定)
|
//NDCHelper.ChangeParam(task.S_CODE, 1, 9);
|
NDCApi.ChangeOrderParam(task.S_CODE, 9, "1");
|
}
|
else
|
{
|
//不允许的话 (未定)
|
}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = "该任务编号不存在";
|
}
|
return result;
|
}
|
|
internal static SimpleResultModel TaskPool(TaskPoolModel model)
|
{
|
var result = new SimpleResultModel { success = false };
|
var db = new SqlHelper<object>().GetInstance();
|
if (!string.IsNullOrEmpty(model.trayNo) && !string.IsNullOrEmpty(model.sourceSys))
|
{
|
if (string.IsNullOrEmpty(model.desArea))
|
{
|
model.desArea = Settings.LiKUAreaNo;
|
}
|
var cntr = db.Queryable<WmsTrayMark>().Where(a => a.S_CNTR_CODE == model.trayNo).First();
|
if (cntr != null)
|
{
|
LogHelper.Info("托盘标记表中已有该托盘标记 检查来源");
|
if (cntr.S_SRC_SYS == model.sourceSys)
|
{
|
var task = db.Queryable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == model.trayNo).First();
|
if (task == null)
|
{
|
var info = new WmsTaskPool
|
{
|
S_CNTR_CODE = model.trayNo,
|
S_SRC_SYS = model.sourceSys,
|
S_SRC_NO = model.sourNo,
|
S_TRAY_TYPE = model.trayType,
|
N_PRI = model.priority,
|
S_IS_LONG = model.IsLong,
|
S_END_AREA = model.desArea,
|
N_IS_DOUBLE = model.IsDouble,
|
F_LENGTH = ConvertDoubleToFloatWithTwoDecimals(model.length)
|
};
|
db.Insertable(info).ExecuteCommand();
|
result.success = true;
|
}
|
else
|
{
|
result.errCode = -3;
|
result.errMsg = $"任务池中已存在托盘{task.S_CNTR_CODE} 的任务 来源{task.S_SRC_SYS}";
|
}
|
}
|
else
|
{
|
result.errCode = -2;
|
result.errMsg = $"托盘{cntr.S_CNTR_CODE} 标记为{cntr.S_SRC_SYS} 不予接收任务";
|
}
|
}
|
else
|
{
|
LogHelper.Info("绑定托盘标记 添加任务池");
|
var info = new WmsTrayMark { S_CNTR_CODE = model.trayNo, S_SRC_SYS = model.sourceSys };
|
db.Insertable(info).ExecuteCommand();
|
var taskinfo = new WmsTaskPool
|
{
|
S_CNTR_CODE = model.trayNo,
|
S_SRC_SYS = model.sourceSys,
|
S_SRC_NO = model.sourNo,
|
S_TRAY_TYPE = model.trayType,
|
N_PRI = model.priority,
|
S_IS_LONG = model.IsLong,
|
S_END_AREA = model.desArea,
|
N_IS_DOUBLE = model.IsDouble,
|
F_LENGTH = ConvertDoubleToFloatWithTwoDecimals(model.length)
|
};
|
db.Insertable(taskinfo).ExecuteCommand();
|
result.success = true;
|
}
|
}
|
else
|
{
|
result.errCode = -1;
|
result.errMsg = "托盘编码或来源系统为空";
|
}
|
|
|
return result;
|
}
|
|
internal static SimpleResultModel TrayMark(TrayMarkModel model)
|
{
|
var result = new SimpleResultModel { success = false };
|
var db = new SqlHelper<object>().GetInstance();
|
if (!string.IsNullOrEmpty(model.trayNo) && !string.IsNullOrEmpty(model.sourceSys))
|
{
|
var cntr = db.Queryable<WmsTrayMark>().Where(a => a.S_CNTR_CODE == model.trayNo).First();
|
if (cntr == null)
|
{
|
result.errCode = 1;
|
result.errMsg = $"托盘{model.trayNo} 不存在标记记录 无法清除";
|
}
|
else
|
{
|
if (cntr.S_SRC_SYS == model.sourceSys)
|
{
|
db.Deleteable(cntr).ExecuteCommand();
|
db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == model.trayNo).ExecuteCommand();
|
result.success = true;
|
}
|
else
|
{
|
result.errCode = 2;
|
result.errMsg = $"托盘{cntr.S_CNTR_CODE} 标记为{cntr.S_SRC_SYS} 无法清除";
|
}
|
}
|
//}
|
}
|
else
|
{
|
result.errCode = -1;
|
result.errMsg = "托盘编码或来源系统为空";
|
}
|
|
return result;
|
}
|
|
internal static SimpleResultModel InWorkArea(List<InWorkAreaModel> modelList)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
SimpleResultModel result = new SimpleResultModel { success = true };
|
try
|
{
|
db.BeginTran();
|
foreach (var model in modelList)
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.startBit).First();
|
if (locinfo != null)
|
{
|
var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.trayCode).First();
|
if (trayInfo != null && trayInfo.S_LOC_CODE == model.startBit)
|
{
|
var maxloclist = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locinfo.S_AREA_CODE && a.N_ROW == locinfo.N_ROW && a.N_COL > locinfo.N_COL && a.N_CURRENT_NUM > 0).ToList();
|
foreach (var maxloc in maxloclist)
|
{
|
if (modelList.Where(a => a.startBit == maxloc.S_CODE).FirstOrDefault() == null)
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg = $"起点{locinfo.S_CODE} 被点位{maxloc.S_CODE}堵住 无法搬运";
|
break;
|
}
|
}
|
if (result.success)
|
{
|
if (LocationHelper.CheckLocFree(model.startBit))
|
{
|
//立库区域 计算可用接驳位 当设备校验合格时 计算立库内货位
|
if (InsertTaskPool(model.sourceSys, model.trayCode, model.sourNo, model.trayType, "入库", model.priority, model.IsLong))
|
{
|
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = -1;
|
result.errMsg = $"托盘{model.trayCode} 已被其他系统占用 无法添加任务池";
|
break;
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = -1;
|
result.errMsg = "起点锁定状态异常 不予创建任务";
|
break;
|
}
|
}
|
else
|
{
|
break;
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = -1;
|
result.errMsg = $"托盘{model.trayCode} 没有绑定货位或者绑定的货位与起点货位不同 请检查";
|
break;
|
}
|
}
|
else
|
{
|
result.success = false;
|
result.errCode = 1;
|
result.errMsg = "起点货位信息异常 无法找到起点货位信息";
|
break;
|
}
|
}
|
db.Ado.CommitTran();
|
if (result.success)
|
{
|
//添加数据到中间表
|
foreach (var model in modelList)
|
{
|
var info = new InWorkOrder
|
{
|
SOURCESYS = model.sourceSys,
|
SOURNO = model.sourNo,
|
STARTBIT = model.startBit,
|
ENDAREA = model.endArea,
|
ENDBIT = model.endBit,
|
ISDOUBLE = model.IsDouble,
|
ISLONG = model.IsLong,
|
PRIORITY = model.priority,
|
TRAYCODE = model.trayCode,
|
TRAYTYPE = model.trayType
|
};
|
db.Insertable(info).ExecuteCommand();
|
}
|
}
|
else
|
{
|
//回滚
|
db.Ado.RollbackTran();
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"入库接口异常 异常信息={ex.Message}");
|
db.Ado.RollbackTran();
|
}
|
|
return result;
|
}
|
|
internal static SimpleResultModel BindingAndUnBinding(BindingAndingmodel model)
|
{
|
SimpleResultModel result = new SimpleResultModel { success = false };
|
var db = new SqlHelper<object>().GetInstance();
|
|
if (!string.IsNullOrEmpty(model.locationCode) && model.locationCode.Substring(0, 3) != "K81")
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.locationCode).First();
|
if (locinfo != null)
|
{
|
if (model.type == 1)
|
{
|
//绑定
|
var info = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.locationCode).First();
|
if (info == null)
|
{
|
//插入托盘数据 并修改货位状态
|
LocCntrRel cntr = new LocCntrRel
|
{
|
S_CNTR_CODE = model.trayCode,
|
S_LOC_CODE = model.locationCode
|
};
|
db.Insertable(cntr).ExecuteCommand();
|
locinfo.N_CURRENT_NUM = 1;
|
locinfo.S_LOCK_STATE = "无";
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
|
result.success = true;
|
}
|
else
|
{
|
result.errCode = -1;
|
result.errMsg = $"货位{model.locationCode} 已绑定托盘{info.S_CNTR_CODE}";
|
}
|
}
|
else if (model.type == 2)
|
{
|
//解绑
|
var info = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.locationCode).First();
|
if (info != null)
|
{
|
db.Deleteable(info).ExecuteCommand();
|
locinfo.N_CURRENT_NUM = 0;
|
locinfo.S_LOCK_STATE = "无";
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
|
result.success = true;
|
}
|
else
|
{
|
result.errCode = -2;
|
result.errMsg = $"货位{model.locationCode} 托盘信息异常 该货位上找不到托盘";
|
}
|
}
|
else
|
{
|
result.errCode = 2;
|
result.errMsg = "绑定解绑类型错误 无法判断";
|
}
|
}
|
else
|
{
|
result.errCode = 1;
|
result.errMsg = $"货位{model.locationCode} 异常 找不到该货位信息";
|
}
|
}
|
else if (string.IsNullOrEmpty(model.locationCode) && !string.IsNullOrEmpty(model.areaCode) && model.areaCode.Substring(0, 2) != "ZG")
|
{
|
//1:绑定 2:解绑
|
var type = 0;
|
var locList = new List<Location>();
|
if (model.type == 3)
|
{
|
//排绑定
|
type = 1;
|
locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == model.areaCode && a.N_ROW == int.Parse(model.rowNo)).OrderByDescending(a => a.N_COL).ToList();
|
}
|
else if (model.type == 4)
|
{
|
//排解绑
|
type = 2;
|
locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == model.areaCode && a.N_ROW == int.Parse(model.rowNo)).ToList();
|
}
|
else if (model.type == 5)
|
{
|
//库区绑定
|
type = 1;
|
locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == model.areaCode).OrderByDescending(a => a.N_COL).ToList();
|
}
|
else if (model.type == 6)
|
{
|
//库区解绑
|
type = 2;
|
locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == model.areaCode).ToList();
|
}
|
|
if (locList.Count > 0)
|
{
|
foreach (var it in locList)
|
{
|
if (type == 1 && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无")
|
{
|
db.Deleteable<LocCntrRel>().Where(a => a.S_LOC_CODE == it.S_CODE).ExecuteCommand();
|
//插入托盘数据 并修改货位状态
|
LocCntrRel cntr = new LocCntrRel
|
{
|
S_CNTR_CODE = WMSHelper.GenerateCntrNo(),
|
S_LOC_CODE = it.S_CODE
|
};
|
db.Insertable(cntr).ExecuteCommand();
|
it.N_CURRENT_NUM = 1;
|
it.S_LOCK_STATE = "无";
|
db.Updateable(it).UpdateColumns(a => new { a.N_CURRENT_NUM, a.S_LOCK_STATE }).ExecuteCommand();
|
result.success = true;
|
}
|
else if (type == 2)
|
{
|
db.Deleteable<LocCntrRel>().Where(a => a.S_LOC_CODE == it.S_CODE).ExecuteCommand();
|
it.N_CURRENT_NUM = 0;
|
it.S_LOCK_STATE = "无";
|
db.Updateable(it).UpdateColumns(a => new { a.N_CURRENT_NUM, a.S_LOCK_STATE }).ExecuteCommand();
|
result.success = true;
|
}
|
};
|
}
|
else
|
{
|
LogHelper.Info($"绑定解绑失败 未找到符合条件的货位进行操作");
|
result.errCode = -2;
|
result.errMsg = $"绑定解绑失败 未找到符合条件的货位进行操作";
|
}
|
}
|
else
|
{
|
result.errCode = -1;
|
result.errMsg = "货位所属库区为立库 无法执行此操作";
|
}
|
return result;
|
}
|
|
internal static AGVQueryResult AGVLocationQuery(AGVQuerymodel model)
|
{
|
AGVQueryResult result = new AGVQueryResult { success = false };
|
var db = new SqlHelper<object>().GetInstance();
|
var info = db.Queryable<Location>().Where(a => a.S_CODE == model.strLocation).First();
|
if (info != null)
|
{
|
result.success = true;
|
AGVQueryResult.LocationState res = new AGVQueryResult.LocationState
|
{
|
CN_S_LOCATION_CODE = info.S_CODE,
|
CN_S_LOCATION_STATE = info.S_LOCK_STATE,
|
CN_S_USE_STATE = info.N_CURRENT_NUM == 1 ? "满" : "空"
|
};
|
result.Data.Add(res);
|
}
|
else
|
{
|
result.errCode = -1;
|
result.errMsg = $"货位{model.strLocation} 不存在站点表中";
|
}
|
|
return result;
|
}
|
|
internal static AGVQueryUseResult AGVLocationUseQuery()
|
{
|
AGVQueryUseResult result = new AGVQueryUseResult { success = true };
|
var db = new SqlHelper<object>().GetInstance();
|
result.FullLocation = db.Queryable<Location>()
|
.Where(a => a.N_CURRENT_NUM == 1)
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) })
|
.MergeTable().First()
|
.sum;
|
result.EmptyLocation = db.Queryable<Location>()
|
.Where(a => a.N_CURRENT_NUM == 0)
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) })
|
.MergeTable().First()
|
.sum;
|
result.ExpectInLocation = db.Queryable<Location>()
|
.Where(a => a.N_LOCK_STATE == 1)
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) })
|
.MergeTable().First()
|
.sum;
|
result.ExpectOutLocation = db.Queryable<Location>()
|
.Where(a => a.N_LOCK_STATE == 2)
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) })
|
.MergeTable().First()
|
.sum;
|
result.SumLocation = db.Queryable<Location>()
|
.Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) })
|
.MergeTable()
|
.First()
|
.sum;
|
|
return result;
|
}
|
|
internal static SimpleResultModel JXCancelTask1(CancelTaskmodel model, SimpleResultModel result)
|
{
|
string taskInfo = "";
|
var db = new SqlHelper<object>().GetInstance();
|
//var task = TaskHelper.GetTask(model.TaskNo);
|
var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.TaskNo).First();
|
if (task != null)
|
{
|
if (task.S_B_STATE != "取消" && task.S_B_STATE != "失败" && task.S_B_STATE != "完成")
|
{
|
taskInfo = JsonConvert.SerializeObject(task);
|
string taskType = task.S_B_STATE.Trim();
|
var res = false;
|
//设备任务取消
|
if (task.S_SCHEDULE_TYPE == "AGV")
|
{
|
//已推送但是小车未执行,取消需要通知HOSTTOAGV
|
NDCHelper.Cancel(task.S_CODE.Trim());
|
res = true;
|
}
|
else
|
{
|
//设备任务取消
|
res = TaskProcess.Cancel(task);
|
}
|
result.success = true;
|
result.errMsg = "任务取消已经发送给小车" + $"任务状态:{taskType}";
|
task.N_B_STATE = 4;
|
WCSHelper.UpdateStatus(task, "取消");
|
TaskProcess.OperateStatus(task, 7);
|
}
|
else
|
{
|
result.errCode = 2;
|
result.errMsg = $"任务号:{model.TaskNo} 该任务已结束 不允许取消";
|
}
|
}
|
else
|
{
|
result.errCode = 1;
|
result.errMsg = "任务不存在" + $"任务号:{model.TaskNo}";
|
}
|
LogHelper.Info("JXCancelTask Return:" + JsonConvert.SerializeObject(result) + ",TaskInfo:" + taskInfo, "MoboxTask");
|
return result;
|
}
|
|
|
internal static WeiLiResult ChangeOrderPrioryty(ChangeOrderPriorytyModel model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First();
|
if (task != null)
|
{
|
if (task.N_B_STATE == 0)
|
{
|
//等待直接修改状态为取消
|
WCSHelper.UpdatePrioryty(task, model.priority);
|
result.msg = "修改优先级成功";
|
}
|
else if (task.N_B_STATE != 3 && task.N_B_STATE != 4)
|
{
|
if (task.S_TYPE == "杭奥")
|
{
|
//通知立库修改任务优先级
|
result.msg = "修改优先级成功";
|
}
|
else
|
{
|
//通知杭叉修改优先级
|
NDCHelper.Cancel(task.S_CODE.Trim());
|
result.msg = "修改优先级成功";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务已结束";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务不存在";
|
}
|
return result;
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
internal static SimpleResult PalletSorting(PalletSorting model)
|
{
|
var result = new SimpleResult();
|
//校验入库单数量,不可以超,成功后插入托盘物料表,更新入库单累计数量
|
//也可以直接lua查询入库单数量,做校验
|
var info = WMSHelper.GetPutawayOrderDetail(model.arrival_no, model.item_code);
|
if (info != null)
|
{
|
if (info.F_QTY - info.F_ACC_B_QTY >= model.qty)
|
{
|
// 插入到托盘明细表
|
var cntr = ContainerHelper.GetCntr(model.cntr_code, true);
|
if (cntr != null)
|
{
|
ContainerHelper.BindCntrItem(cntr, model.item_code, info.S_BATCH_NO, model.qty, model.arrival_no);
|
//更新入库单累计绑定数量
|
info.F_ACC_B_QTY += model.qty;
|
WMSHelper.UpdatePutawayOrderDetailQty(info);
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "获取托盘信息失败";
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "累计码盘数量超出入库单数量";
|
}
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"未找到入库单{model.arrival_no}";
|
}
|
|
return result;
|
}
|
|
|
|
|
public class ReceivingNoteSerialNo
|
{
|
public List<serial> data { get; set; } = new List<serial>();
|
public class serial
|
{
|
public string rowID { get; set; }
|
public List<string> serialNo { get; set; } = new List<string>();
|
}
|
}
|
internal static SimpleResult OutboundOrder(OutboundOrder model)
|
{
|
var result = new SimpleResult();
|
//创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中
|
//创建入库单主子表
|
var po = WMSHelper.GetShippingOrder(model.Data.out_no);
|
if (po == null)
|
{
|
po = new ShippingOrder { S_NO = model.Data.out_no, S_BS_TYPE = model.Data.op_type, LINE_AREA = model.Data.line_area };
|
po.Details = new List<ShippingDetail>();
|
if (model.Data.items.Count > 0)
|
{
|
model.Data.items.ForEach(a =>
|
{
|
po.Details.Add(new ShippingDetail
|
{
|
S_SHIPPING_NO = model.Data.out_no,
|
N_ROW_NO = po.Details.Count + 1,
|
S_ITEM_CODE = a.item_code,
|
F_QTY = a.qty,
|
S_BATCH_NO = a.batch_no,
|
});
|
});
|
WMSHelper.CreateShippingOrder(po);
|
}
|
|
}
|
return result;
|
}
|
|
internal static SimpleResult ShippingOrderExecute(ShippingOrderCheck model)
|
{
|
var result = new SimpleResult();
|
//检查库存,更新发货单,生成分拣单,自动合并波次
|
//这个后台做比较麻烦,mobox3库存在内存中,任务完成的时候无法增加,还是用c#直接管内存,计算比较方便
|
WMSHelper.CreateSortingOrder(model.out_nos.Split(',').ToList());
|
return result;
|
}
|
|
/// <summary>
|
/// 后面要把方法放到wmsHelper中
|
/// </summary>
|
/// <param name="models"></param>
|
/// <returns></returns>
|
internal static SimpleResult SortingResultCheck(List<SortingResultCheck> models)
|
{
|
//生成分拣结果,更新分拣明细状态
|
var result = new SimpleResult();
|
WMSHelper.SortingConfrim(models);
|
return result;
|
}
|
|
|
|
/// <summary>
|
/// 后面要把方法放到wmsHelper中
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
internal static SimpleResult Instock(InstockInfo model)
|
{
|
var result = new SimpleResult();
|
//pda入库,目前人工放货在巷道口,扫托盘,后台只能计算当前巷道的终点,单深位立库
|
//1,判断托盘信息,一种是码盘后的,默认enable是N,另一种是分拣回的
|
var cntr = ContainerHelper.GetCntr(model.cntr);
|
if (cntr != null)
|
{
|
var sortingInfo = WMSHelper.GetSortingDetailByCntr(model.cntr);
|
if (cntr.C_ENABLE == "Y" && sortingInfo != null && sortingInfo.Count > 0)
|
{
|
result.resultCode = 2;
|
result.resultMsg = $"托盘{model.cntr}未分拣完成";
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = $"托盘{model.cntr}不存在";
|
}
|
if (result.resultCode == 0)
|
{
|
//获取接驳位所在的巷道, 查找功能区,入库接驳位找逻辑库区(每个巷道一个逻辑库区)
|
var fa = LocationHelper.GetFunctionAreaByCode(model.start, 2, 10);
|
if (fa != null)
|
{
|
//创建入库作业,简单判断一下是否有可入货位,如果不判断,人工货放上去一直不能入,也不知道原因
|
var end = LocationHelper.GetZoneLoc(fa.S_MASTER_CODE);
|
if (end != null)
|
{
|
//判断托盘是否已经生成任务,如果没有则生成
|
var wmsTask = WMSHelper.GetWmsTaskByCntr(model.cntr);
|
if (wmsTask != null)
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{model.start} 托盘{model.cntr}已经创建任务,请勿重复申请";
|
}
|
else
|
{
|
wmsTask = new WMSTask
|
{
|
S_CNTR_CODE = model.cntr,
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_LOC = model.start,
|
S_END_LOC = end.S_LOC_CODE,
|
N_TYPE = 1,
|
S_TYPE = WMSTask.GetTypeStr(1),
|
S_OP_DEF_CODE = "",
|
S_OP_DEF_NAME = "pda入立库"
|
};
|
//if (WMSHelper.CreateWmsTask(wmsTask))
|
//{
|
// LocationHelper.LockLoc(model.start, 1);
|
// result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}";
|
//}
|
}
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{model.start}对应的逻辑库区{fa.S_MASTER_CODE}没有可用货位,请更换巷道";
|
}
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{model.start}没有对应的逻辑库区,请在逻辑库区设置功能区-入库接驳位";
|
}
|
}
|
return result;
|
}
|
|
internal static SimpleResult SortingOrderExecute(SortingOrderCheck model)
|
{
|
var result = new SimpleResult();
|
//分拣单配货执行
|
WMSHelper.CreateSortingOrderDetail(model.s_no);
|
return result;
|
}
|
|
|
internal static SimpleResult UpdatePriority(UpdatePriorityModel model, SimpleResult result)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var Task = db.Queryable<WCSTask>().Where(a => a.S_CODE == model.TaskNo).First();
|
if (Task != null)
|
{
|
if (Task.S_B_STATE == "已推送")
|
{
|
var Url = Settings.ExtendParamSettings.Where(a => a.ExtendNo == "6" && a.Enable == "1").FirstOrDefault();
|
if (Url != null)
|
{
|
var req = new
|
{
|
requestPk = model.TaskNo,
|
trkPrty = model.Priority
|
};
|
var feed = httpHelper.WebPost(Url.ExtendParam + "modifyPriority", JsonConvert.SerializeObject(model));
|
LogHelper.Info($"任务{Task.S_CODE} 调整任务优先级参数={JsonConvert.SerializeObject(model)} 下游反馈={feed}");
|
if (!string.IsNullOrEmpty(feed))
|
{
|
var res = JsonConvert.DeserializeObject<PlcSendTaskres>(feed);
|
result.resultCode = int.Parse(res.code);
|
result.resultMsg = res.msg;
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = $"任务{Task.S_CODE} 任务状态{Task.S_B_STATE} 不为已推送";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"任务号{model.TaskNo} 找不到对应的任务";
|
}
|
|
return result;
|
}
|
|
internal static SimpleResult AddTask(AddTaskModel model, SimpleResult result)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
if (!string.IsNullOrEmpty(model.StartBit))
|
{
|
var lockinfo = db.Queryable<Location>().Where(a => (a.S_CODE == model.StartBit || a.S_CODE == model.EndBit) && a.S_LOCK_STATE != "无").First();
|
if (lockinfo == null)
|
{
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.StartBit).Includes(a => a.LocCntrRel).First();
|
var endinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.EndBit).First();
|
if (model.Roadway > 0)
|
{
|
if (startinfo != null)
|
{
|
var res = false;
|
if (startinfo.N_SIDE == 2)
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_ROW == startinfo.N_ROW && a.N_COL == startinfo.N_COL && a.N_LAYER == startinfo.N_LAYER && a.N_SIDE == 1).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM > 0 || nextloc.S_LOCK_STATE != "无")
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{model.StartBit}不满足生成任务";
|
LogHelper.Info($"起点{model.StartBit}不满足生成任务");
|
}
|
else res = true;
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"找不到起点{model.StartBit}相邻货位信息";
|
LogHelper.Info($"找不到起点{model.StartBit}相邻货位信息");
|
}
|
}
|
else res = true;
|
if (res)
|
{
|
if (startinfo.N_CURRENT_NUM > 0)
|
{
|
if (startinfo.LocCntrRel != null)
|
{
|
string msg = "";
|
var endbit = WMSHelper.GetLiKuLocationIn(Settings.LiKUAreaNo, 0, model.Roadway.ToString(), ref msg, startinfo.S_ITEM_HEIGHT);
|
if (endbit != null)
|
{
|
//IntensiveArea.CreateTransport(startinfo.S_LOC_CODE, endbit.S_LOC_CODE, "移动", startinfo.LocCntrRel.S_CNTR_CODE, "plc", startinfo.LocCntrRel.S_SRC_SYS, "", "", 1, startinfo.LocCntrRel.TrayType);
|
WMSHelper.CreateWmsTask("", startinfo, endbit, startinfo.LocCntrRel.S_CNTR_CODE, "移动", 3, "WCS", 1, startinfo.LocCntrRel.S_SRC_SYS, startinfo.LocCntrRel.TRAYTYPE);
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = $"查询不到巷道{model.Roadway} 可入库货位";
|
LogHelper.Info($"查询不到巷道{model.Roadway} 可入库货位");
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "查询不到起点绑定托盘类型";
|
LogHelper.Info($"查询不到起点绑定托盘类型");
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "起点数量异常 无法生成任务";
|
LogHelper.Info($"起点数量异常 无法生成任务");
|
}
|
}
|
}
|
}
|
else
|
{
|
if (startinfo != null && endinfo != null)
|
{
|
var res = false;
|
if (startinfo.N_ROADWAY != endinfo.N_ROADWAY)
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点和终点不在同一巷道 不满足生成任务";
|
LogHelper.Info($"起点和终点不在同一巷道 不满足生成任务");
|
return result;
|
}
|
if (startinfo.N_SIDE == 2)
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_ROW == startinfo.N_ROW && a.N_COL == startinfo.N_COL && a.N_LAYER == startinfo.N_LAYER && a.N_SIDE == 1).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM > 0 || nextloc.S_LOCK_STATE != "无")
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"起点{model.StartBit}不满足生成任务";
|
LogHelper.Info($"起点{model.StartBit}不满足生成任务");
|
}
|
else res = true;
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"找不到起点{model.StartBit}相邻货位信息";
|
LogHelper.Info($"找不到起点{model.StartBit}相邻货位信息");
|
}
|
}
|
if (endinfo.N_SIDE == 2)
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endinfo.S_AREA_CODE && a.N_ROW == endinfo.N_ROW && a.N_COL == endinfo.N_COL && a.N_LAYER == endinfo.N_LAYER && a.N_SIDE == 1).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM > 0 || nextloc.S_LOCK_STATE != "无")
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"终点{model.EndBit}不满足生成任务";
|
LogHelper.Info($"终点{model.EndBit}不满足生成任务");
|
}
|
else res = true;
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"找不到终点{model.EndBit}相邻货位信息";
|
LogHelper.Info($"找不到终点{model.EndBit}相邻货位信息");
|
}
|
}
|
else res = true;
|
if (res)
|
{
|
if (startinfo.N_CURRENT_NUM > 0)
|
{
|
if (startinfo.LocCntrRel != null)
|
{
|
//IntensiveArea.CreateTransport(startinfo.S_LOC_CODE, endinfo.S_LOC_CODE, "移动", startinfo.LocCntrRel.S_CNTR_CODE, "plc", startinfo.LocCntrRel.S_SRC_SYS, "", "", 1, startinfo.LocCntrRel.TrayType);
|
WMSHelper.CreateWmsTask("", startinfo, endinfo, startinfo.LocCntrRel.S_CNTR_CODE, "移动", 3, "WCS", 1, startinfo.LocCntrRel.S_SRC_SYS, startinfo.LocCntrRel.TRAYTYPE);
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "查询不到起点绑定托盘类型";
|
LogHelper.Info($"查询不到起点绑定托盘类型");
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "起点数量异常 无法生成任务";
|
LogHelper.Info($"起点数量异常 无法生成任务");
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "找不到起点或者终点数据";
|
LogHelper.Info($"找不到起点或者终点数据");
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "起点或终点货位状态异常";
|
LogHelper.Info($"货位{lockinfo.S_CODE}锁状态异常");
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "起点不能为空";
|
LogHelper.Info($"输入的起点不能为空");
|
}
|
return result;
|
}
|
|
|
internal static SimpleResult JXCancelTask(MoboxTaskBase model, SimpleResult result)
|
{
|
string taskInfo = "";
|
var db = new SqlHelper<object>().GetInstance();
|
var task = WCSHelper.GetTask(model.TaskNo);
|
if (task != null)
|
{
|
if (task.S_B_STATE != "完成" && task.S_B_STATE != "取消" && task.S_B_STATE != "失败")
|
{
|
taskInfo = JsonConvert.SerializeObject(task);
|
string taskType = task.S_B_STATE.Trim();
|
var res = false;
|
//设备任务取消
|
TaskProcess.Cancel(task);
|
result.resultMsg = "任务取消已经发送给小车" + $"任务状态:{taskType}";
|
task.N_B_STATE = 4;
|
WCSHelper.UpdateStatus(task, "关闭");
|
TaskProcess.OperateStatus(task, 7);
|
TaskProcess.ThirdReportStatus(task.S_OP_CODE, "", "H", "", task);
|
if (task.S_TYPE == "出库" || task.S_TYPE == "AGV出库")
|
{
|
//删除出库单的托盘和任务池的托盘
|
db.Deleteable<OutTask>().Where(a => a.TRAYCODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<ContainerDest>().Where(a => a.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
}
|
else if (task.S_TYPE == "入库" || task.S_TYPE == "AGV入库")
|
{
|
db.Deleteable<WmsTaskPool>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<ContainerDest>().Where(a => a.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "任务已经结束 不允许关闭";
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "任务不存在" + $"任务号:{model.TaskNo}";
|
}
|
LogHelper.Info("JXCancelTask Return:" + JsonConvert.SerializeObject(result) + ",TaskInfo:" + taskInfo, "MoboxTask");
|
return result;
|
}
|
|
|
|
internal static SimpleResult CheckSortingWholeCntr(CheckSortingWholeCntr model)
|
{
|
var result = new SimpleResult();
|
if (WMSHelper.CheckSortingWholeCntr(model.cntr, model.autoSort == 1))
|
{
|
result.resultCode = 1;
|
result.resultMsg = "整托分拣";
|
}
|
return result;
|
}
|
internal static CodeInfo GetCodeInfo(string code, string org)
|
{
|
//return new CodeInfo { Fitemid_XK=code, FSourceNo="123456"};
|
CodeInfo result = null;
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance(Settings.SqlServer1);
|
var nameP = new SugarParameter("@FBarCode", code);
|
var orgP = new SugarParameter("@Forg", org);
|
//var ageP = new SugarParameter("@age", null, true);//设置为output
|
//var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", nameP, ageP);//返回dt
|
result = db.Ado.UseStoredProcedure().SqlQuery<CodeInfo>("WMS_FBarCode", nameP, orgP).First();//返回List
|
Console.WriteLine($"读存储过程成功,result={result}");
|
}
|
catch (Exception ex)
|
{
|
Console.WriteLine(ex.Message);
|
}
|
return result;
|
}
|
|
internal static SimpleResult PalletSorting1(PalletSorting1 model)
|
{
|
var result = new SimpleResult();
|
//校验入库单数量,不可以超,成功后插入托盘物料表,更新入库单累计数量
|
//也可以直接lua查询入库单数量,做校验
|
//先用bar_code读存储过程获取信息
|
var codeInfo = GetCodeInfo(model.bar_code, model.org);
|
var info = WMSHelper.GetPutawayOrderDetail(model.bar_code);
|
if (info != null)
|
{
|
if (info.F_QTY - info.F_ACC_B_QTY >= model.qty)
|
{
|
// 插入到托盘明细表
|
|
var cntr = ContainerHelper.GetCntr(model.cntr_code, true);
|
if (cntr != null)
|
{
|
ContainerHelper.BindCntrItem(cntr, model.bar_code, info.S_BATCH_NO, model.qty, info.S_BATCH_NO);
|
//更新入库单累计绑定数量
|
info.F_ACC_B_QTY += model.qty;
|
WMSHelper.UpdatePutawayOrderDetailQty(info);
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "获取托盘信息失败";
|
}
|
|
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "累计码盘数量超出入库单数量";
|
}
|
}
|
else
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"未获取到该物料{model.bar_code}的入库单明细信息";
|
}
|
|
return result;
|
}
|
|
|
//public class AddTaskModel
|
//{
|
// public string From { get; set; }
|
// public string To { get; set; }
|
// public string No { get; set; }
|
//}
|
public class TN_LocationModel
|
{
|
public string TN_Location { get; set; }
|
}
|
public class CodeInfo
|
{
|
/// <summary>
|
/// 生产订单内码
|
/// </summary>
|
public string FInterID { get; set; }
|
/// <summary>
|
/// 生产订单编号
|
/// </summary>
|
public string FSourceNo { get; set; }
|
/// <summary>
|
/// 批号
|
/// </summary>
|
public string FGMPBatchNo { get; set; }
|
public string FState { get; set; }
|
/// <summary>
|
/// 物料编码(内码就是编码)
|
/// </summary>
|
public string Fitemid_XK { get; set; }
|
/// <summary>
|
/// 分录id
|
/// </summary>
|
public string Fentryid { get; set; }
|
}
|
public class NoteInfo : CodeInfo
|
{
|
public string WmsBillNo { get; set; }
|
}
|
}
|
}
|