using HH.WCS.Mobox3.WeiLi.device;
|
using HH.WCS.Mobox3.WeiLi.dispatch;
|
using HH.WCS.Mobox3.WeiLi.models;
|
using HH.WCS.Mobox3.WeiLi.process;
|
using HH.WCS.Mobox3.WeiLi.util;
|
using HH.WCS.Mobox3.WeiLi.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.WeiLi.api.ApiModel;
|
using static HH.WCS.Mobox3.WeiLi.api.OtherModel;
|
using static HH.WCS.Mobox3.WeiLi.wms.WMSHelper;
|
|
namespace HH.WCS.Mobox3.WeiLi.api
|
{
|
/// <summary>
|
/// api接口辅助类
|
/// </summary>
|
public class ApiHelper
|
{
|
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 WeiLiResult ItemInfoSync(List<ItemInfoSyncModel> model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
if (model.Count > 0)
|
{
|
model.ForEach(a =>
|
{
|
var info = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (info != null)
|
{
|
info.S_ITEM_NAME = a.itemName;
|
info.S_IS_MANAGE = a.isManage;
|
info.S_IS_MANAGEDATE = a.isManageDate;
|
db.Updateable<TN_Material>(info).UpdateColumns(it => new { it.S_ITEM_NAME, it.S_IS_MANAGE, it.S_IS_MANAGEDATE }).ExecuteCommand();
|
}
|
else
|
{
|
db.Insertable(new TN_Material { S_ITEM_CODE = a.itemCode, S_ITEM_NAME = a.itemName, S_IS_MANAGE = a.isManage, S_IS_MANAGEDATE = a.isManageDate }).ExecuteCommand();
|
}
|
//db.Updateable<TN_Material>().SetColumns(it => new TN_Material() { S_ITEM_NAME = a.itemName }).Where(it => it.S_ITEM_CODE == a.itemCode).ExecuteCommand();
|
//db.Updateable<WHInventory>().SetColumns(it => new WHInventory() { S_ITEM_NAME = a.itemName }).Where(it => it.S_ITEM_CODE == a.itemCode).ExecuteCommand();
|
});
|
}
|
return result;
|
}
|
|
internal static WeiLiResult FiveCodeSync(List<FiveCodeSyncResult> model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
if (model.Count > 0)
|
{
|
model.ForEach(a =>
|
{
|
var info = db.Queryable<FiveCode>().Where(it => it.S_FIVE_CODE == a.fiveCode).First();
|
if (info != null)
|
{
|
info.S_IS_MANAGE = a.isManage;
|
info.S_IS_MANAGEDATE = a.isManageDate;
|
db.Updateable<FiveCode>(info).UpdateColumns(it => new { it.S_IS_MANAGE, it.S_IS_MANAGEDATE }).ExecuteCommand();
|
}
|
else
|
{
|
db.Insertable(new FiveCode { S_FIVE_CODE = a.fiveCode, S_IS_MANAGE = a.isManage, S_IS_MANAGEDATE = a.isManageDate }).ExecuteCommand();
|
}
|
});
|
}
|
return result;
|
}
|
|
internal static WeiLiResult AddTask(AddTaskModel model)
|
{
|
var result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var cntrweight = model.cntrWeight == 1 ? 2 : model.cntrWeight == 2 ? 3 : model.cntrWeight == 3 ? 11 : model.cntrWeight == 4 ? 30 : model.cntrWeight == 5 ? 150 : 0;
|
if (!string.IsNullOrEmpty(model.startBit) && !string.IsNullOrEmpty(model.endBit))
|
{
|
if (!string.IsNullOrEmpty(model.TaskNo))
|
{
|
var taskinfo = db.Queryable<WMSTask>().Where(a => a.S_CODE == model.TaskNo).First();
|
if (taskinfo == null)
|
{
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.startBit).First();
|
var endinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.endBit).First();
|
if (startinfo != null && endinfo != null)
|
{
|
if (startinfo.N_LOCK_STATE != 0 || endinfo.N_LOCK_STATE != 0)
|
{
|
result.code = 500;
|
result.msg = "起点或终点货位锁定状态异常 不予创建任务";
|
return result;
|
}
|
|
var startloccntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startinfo.S_CODE).First();
|
LogHelper.Info("查询起点是否绑定托盘");
|
if (startloccntr == null)
|
{
|
LogHelper.Info("起点未绑定托盘 准备绑定托盘");
|
//绑定起点托盘
|
LocationHelper.BindingLoc(model.startBit, new List<string>() { model.cntrNo });
|
}
|
else if (startloccntr.S_CNTR_CODE != model.cntrNo)
|
{
|
result.code = 500;
|
result.msg = $"起点已绑定托盘{startloccntr.S_CNTR_CODE} 与任务托盘{model.cntrNo} 不符";
|
return result;
|
}
|
|
LogHelper.Info("转运任务 创建作业");
|
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = model.TaskNo,
|
S_START_LOC = startinfo.S_CODE,
|
S_END_LOC = endinfo.S_CODE,
|
S_END_AREA = endinfo.S_AREA_CODE,
|
S_START_AREA = startinfo.S_AREA_CODE,
|
S_START_WH = startinfo.S_WH_CODE,
|
S_END_WH = endinfo.S_WH_CODE,
|
S_TYPE = "转运",
|
N_TYPE = 3,
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = "转运",
|
S_BS_NO = model.workNo,
|
N_PRIORITY = model.priority,
|
N_TRAY_WEIGHT = cntrweight
|
};
|
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
|
|
|
db.Insertable(optask).ExecuteCommand();
|
LocationHelper.LockLoc(startinfo.S_CODE, 2);
|
LocationHelper.LockLoc(endinfo.S_CODE, 1);
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "起点或终点信息有误 查询不到站点信息";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务号重复 请勿重复下发任务";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务号不能为空";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "起点或终点不能为空";
|
}
|
|
return result;
|
}
|
|
internal static SimpleResult ErrorOperation(MoboxOperationBase model)
|
{
|
var result = new SimpleResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var wmsTask = db.Queryable<WMSTask>().Where(a => a.S_CODE == model.OperationNo).First();
|
if (wmsTask != null)
|
{
|
LogHelper.Info($"清除错误作业 解绑托盘 托盘{wmsTask.S_CNTR_CODE}");
|
db.Deleteable<LocCntrRel>().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand();
|
var locInfo = db.Queryable<Location>().Where(a => a.S_CODE == wmsTask.S_START_LOC).First();
|
if (locInfo != null)
|
{
|
LogHelper.Info($"清除错误作业 重置货位状态 货位{locInfo.S_CODE}");
|
locInfo.N_CURRENT_NUM = 0;
|
locInfo.N_LOCK_STATE = 0;
|
locInfo.S_LOCK_STATE = "无";
|
db.Updateable(locInfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand();
|
}
|
}
|
|
return result;
|
}
|
|
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 SimpleResult WeiLiDisbutionIn(WeiLiDisbutionInMolde model)
|
{
|
int Ntype = 0; string Stype = ""; string S_OP_DEF_NAME = "";
|
var result = new SimpleResult { resultCode = 0 };
|
Location end = null;
|
var db = new SqlHelper<object>().GetInstance();
|
if (model.isTask == "Y")
|
{
|
if (string.IsNullOrEmpty(model.endArea) && string.IsNullOrEmpty(model.endLoc))
|
{
|
Ntype = 1;
|
Stype = "入库";
|
S_OP_DEF_NAME = "分拣回";
|
}
|
else
|
{
|
Ntype = 2;
|
Stype = "出库";
|
S_OP_DEF_NAME = "分拣出";
|
}
|
|
var TrayPrefix = model.cntrNo.Substring(0, 2);
|
var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == TrayPrefix).FirstOrDefault();
|
if (endinfo != null)
|
{
|
if (string.IsNullOrEmpty(model.endArea))
|
{
|
model.endArea = endinfo.LiKuCode;
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "终点库区为空 默认回库 找不到托盘前缀对应的回库库区";
|
return result;
|
}
|
|
if (!string.IsNullOrEmpty(model.endLoc))
|
{
|
end = db.Queryable<Location>().Where(a => a.S_CODE == model.endLoc).First();
|
if (end != null)
|
{
|
if (end.N_LOCK_STATE != 0 || end.N_CURRENT_NUM != 0)
|
{
|
result.resultCode = 1;
|
result.resultMsg = "终点货位状态不满足生成任务";
|
return result;
|
}
|
}
|
else
|
{
|
result.resultCode = 1;
|
result.resultMsg = "终点货位信息不存在";
|
return result;
|
}
|
}
|
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrinfo != null)
|
{
|
var start = db.Queryable<Location>().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First();
|
if (start != null)
|
{
|
if (start.N_LOCK_STATE == 0)
|
{
|
var conntinfo = Settings.ConnetAreas.Where(a => a.FullList.Contains(start.S_CODE) || a.EmptyList.Contains(start.S_CODE)).FirstOrDefault();
|
if (conntinfo != null)
|
{
|
var id = DateTime.Now.Ticks.ToString();
|
var reqinfo = db.Queryable<TN_PRICE>().Where(a => a.S_CNTR_CODE == model.cntrNo && a.S_NO == model.workNo).First();
|
if (reqinfo != null)
|
{
|
id = reqinfo.S_REPEAT;
|
}
|
else
|
{
|
reqinfo = new TN_PRICE { S_NO = model.workNo, S_CNTR_CODE = model.cntrNo, S_REPEAT = id };
|
db.Insertable(reqinfo).ExecuteCommand();
|
}
|
if (!string.IsNullOrEmpty(model.endLoc))
|
{
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_WH = start.S_WH_CODE,
|
S_START_LOC = start.S_CODE,
|
S_START_AREA = start.S_AREA_CODE,
|
S_END_LOC = end.S_CODE,
|
S_END_AREA = end.S_AREA_CODE,
|
S_END_WH = end.S_WH_CODE,
|
S_STATION_LOC = conntinfo.Station,
|
N_TYPE = Ntype,
|
S_TYPE = Stype,
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = S_OP_DEF_NAME,
|
S_BS_NO = model.workNo
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
LocationHelper.LockLoc(start.S_CODE, 2);
|
LocationHelper.LockLoc(end.S_CODE, 1);
|
}
|
else
|
{
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_WH = start.S_WH_CODE,
|
S_START_LOC = start.S_CODE,
|
S_START_AREA = start.S_AREA_CODE,
|
S_END_LOC = "",
|
S_END_AREA = model.endArea,
|
S_END_WH = start.S_WH_CODE,
|
S_STATION_LOC = conntinfo.Station,
|
N_TYPE = Ntype,
|
S_TYPE = Stype,
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = S_OP_DEF_NAME,
|
S_BS_NO = model.workNo
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
LocationHelper.LockLoc(start.S_CODE, 2);
|
}
|
}
|
else
|
{
|
result.resultCode = -2;
|
result.resultMsg = $"货位{start.S_CODE} 在接驳库区配置中找不到对应的拣货位信息";
|
}
|
}
|
else
|
{
|
result.resultCode = -3;
|
result.resultMsg = $"货位{start.S_CODE} 当前状态为{start.S_LOCK_STATE} 不予生成任务";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"查询不到托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE}的货位信息";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"查询不到托盘{model.cntrNo} 的绑定货位";
|
}
|
}
|
else
|
{
|
//人工库出库 解绑起点货位
|
var url = Settings.ZTSeverUrl2 + "/business/BU_HX02";
|
|
var id = DateTime.Now.Ticks.ToString();
|
var reqinfo = db.Queryable<TN_PRICE>().Where(a => a.S_CNTR_CODE == model.cntrNo && a.S_NO == model.workNo).First();
|
if (reqinfo != null)
|
{
|
id = reqinfo.S_REPEAT;
|
}
|
else
|
{
|
reqinfo = new TN_PRICE { S_NO = model.workNo, S_CNTR_CODE = model.cntrNo, S_REPEAT = id };
|
db.Insertable(reqinfo).ExecuteCommand();
|
}
|
|
var req = new { shippingNoteNo = model.workNo, cntrNo = "", destLocation = "", repeat = id, data = new List<object>() };
|
model.data.ForEach(it =>
|
{
|
req.data.Add(new
|
{
|
itemCode = it.itemCode,
|
factoryCode = string.IsNullOrEmpty(it.factoryCode) ? "" : it.factoryCode,
|
stockCode = string.IsNullOrEmpty(it.stockLocation) ? "" : it.stockLocation,
|
qty = Convert.ToInt32(it.qty),
|
vendorCode = string.IsNullOrEmpty(it.vendorCode) ? "" : it.vendorCode,
|
batchNo = string.IsNullOrEmpty(it.batchNo) ? "" : it.batchNo,
|
serialNo = string.IsNullOrEmpty(it.serialNo) ? "" : it.serialNo
|
});
|
});
|
LogHelper.Info($"出库完成任务回报 地址{url} 接口参数{JsonConvert.SerializeObject(req)}");
|
var feedback = new HttpHelper().WebPost(url, JsonConvert.SerializeObject(req));
|
if (!string.IsNullOrEmpty(feedback))
|
{
|
var weilires = JsonConvert.DeserializeObject<WeiLiResult>(feedback);
|
if (weilires.code == 200)
|
{
|
LogHelper.Info($"接口反馈成功");
|
}
|
else
|
{
|
LogHelper.Info($"出库完成任务回报 反馈失败 失败原因={weilires.msg}");
|
result.resultCode = -2;
|
result.resultMsg = $"回报中台出库单完成错误 错误信息{weilires.msg}";
|
return result;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库完成任务回报 反馈超时");
|
result.resultCode = -2;
|
result.resultMsg = $"出库完成任务回报 反馈超时";
|
return result;
|
}
|
|
//解绑起点
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrinfo != null)
|
{
|
var start = db.Queryable<Location>().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First();
|
if (start != null)
|
{
|
var deletechange = true;
|
//降量
|
url = Settings.MoboxSeverUrl + "inventory/AddChange";
|
//仓库量表升量
|
var req1 = new AddChangeModel { op_type = 4 };
|
//库区量表升量
|
var req2 = new AddChangeModel { op_type = 7 };
|
model.data.ForEach(a =>
|
{
|
LogHelper.Info($"填充数据");
|
LogHelper.Info($"减仓库量表数据 仓库{start.S_WH_CODE} 物料编码{a.itemCode} 物料名称{a.itemName} 数量{a.qty}");
|
req1.item_info.Add(new AddChangeModel.itemModel
|
{
|
wh_code = start.S_WH_CODE,
|
item_code = a.itemCode,
|
item_name = a.itemName,
|
qty = a.qty
|
});
|
LogHelper.Info($"减库区量表数据 库区{start.S_AREA_CODE} 物料编码{a.itemCode} 物料名称{a.itemName} 数量{a.qty}");
|
req2.item_info.Add(new AddChangeModel.itemModel
|
{
|
area_code = start.S_AREA_CODE,
|
wh_code = start.S_WH_CODE,
|
item_code = a.itemCode,
|
item_name = a.itemName,
|
qty = a.qty
|
});
|
});
|
var reqData = JsonConvert.SerializeObject(req);
|
var AppKey = Settings.AppKey;
|
var AppSecret = Settings.AppSecret;
|
var ReqTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
//var ReqTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime}");
|
var ReqVerify = GetMd5FromString(AppKey + AppSecret + ReqTime);
|
LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime} ReqVerify={ReqVerify} url={url} req={reqData}");
|
var res = new HttpHelper().WebPost(url, reqData, "application/json", AppKey, ReqTime, ReqVerify);
|
if (!string.IsNullOrEmpty(res))
|
{
|
LogHelper.Info($"mobox 仓库降量接口返回 {res}");
|
var moboxres = JsonConvert.DeserializeObject<moboxres>(res);
|
if (moboxres.err_code != 0)
|
{
|
deletechange = false;
|
result.resultCode = -1;
|
result.resultMsg = $"mobox仓库降量失败 失败原因{moboxres.err_msg}";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"mobox 仓库降量接口返回为空");
|
deletechange = false;
|
result.resultCode = -1;
|
result.resultMsg = "mobox 仓库降量接口返回为空";
|
}
|
var reqData2 = JsonConvert.SerializeObject(req2);
|
var ReqTime2 = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
//var ReqTime2 = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2}");
|
var ReqVerify2 = GetMd5FromString(AppKey + AppSecret + ReqTime2);
|
LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2} ReqVerify={ReqVerify2} url={url} req={reqData2}");
|
var res2 = new HttpHelper().WebPost(url, reqData2, "application/json", AppKey, ReqTime2, ReqVerify2);
|
if (!string.IsNullOrEmpty(res2))
|
{
|
LogHelper.Info($"mobox 库区降量接口返回 {res2}");
|
var moboxres = JsonConvert.DeserializeObject<moboxres>(res);
|
if (moboxres.err_code != 0)
|
{
|
deletechange = false;
|
result.resultCode = -1;
|
result.resultMsg = $"mobox库区降量失败 失败原因{moboxres.err_msg}";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"mobox 库区降量接口返回为空");
|
deletechange = false;
|
result.resultCode = -1;
|
result.resultMsg = "mobox库区降量接口返回为空";
|
}
|
if (deletechange)
|
{
|
|
foreach (var item in model.data)
|
{
|
var info = new TN_OnOff_Shelves
|
{
|
S_NO = model.workNo,
|
N_ACTION = 2,
|
S_ACTION = "下架",
|
S_ITEM_CODE = item.itemCode,
|
S_ITEM_NAME = item.itemName,
|
S_LOC_CODE = start.S_CODE,
|
S_AREA_CODE = start.S_AREA_CODE,
|
S_CNTR_CODE = model.cntrNo,
|
S_BATCH_NO = item.batchNo,
|
S_SERIAL_NO = item.serialNo,
|
D_PRD_DATE = "",
|
F_QTY = item.qty
|
};
|
db.Insertable(info).ExecuteCommand();
|
}
|
|
|
|
//修改起点容量
|
start.N_CURRENT_NUM = 0;
|
db.Updateable(start).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
|
db.Deleteable(cntrinfo).ExecuteCommand();
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"查询不到托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE}的货位信息";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"查询不到托盘{model.cntrNo} 的绑定货位";
|
}
|
}
|
|
return result;
|
}
|
|
internal static WeiLiResult CancelOutWork(CancelOutWorkModel model)
|
{
|
var result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var OutWork = db.Queryable<TN_Outbound_Order>().Where(a => a.S_BS_NO == model.OutWorkOrder).First();
|
if (OutWork != null)
|
{
|
if (OutWork.N_B_STATE == 0)
|
{
|
//OutWork.N_B_STATE = 99;
|
//db.Updateable(OutWork).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
|
db.Deleteable(OutWork).ExecuteCommand();
|
db.Deleteable<TN_Outbound_Detail>().Where(it => it.S_DO_NO == OutWork.S_NO).ExecuteCommand();
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"出库单{model.OutWorkOrder} 已执行不允许取消";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"单号{model.OutWorkOrder} 找不到对应的出库单";
|
}
|
return result;
|
}
|
|
internal static SimpleResult WeiLiInstockVerify(WeiLiInstockVerify model)
|
{
|
var result = new SimpleResult();
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.isVerify))
|
{
|
if (model.isVerify == "Y")
|
{
|
var task = db.Queryable<WMSTask>().Where(it => it.S_CNTR_CODE == model.cntrNo && it.N_B_STATE == 5).First();
|
if (task != null)
|
{
|
task.N_B_STATE = 0;
|
WMSHelper.UpdateTaskState(task);
|
result.resultMsg = "入库确认 托盘入立体库";
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = $"确认失败 找不到该托盘对应的作业";
|
}
|
}
|
else
|
{
|
result.resultMsg = "入库确认 托盘不入立体库";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "必填数据不能为空";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"PDA码盘入库确认异常 异常信息={ex.Message}", ex);
|
result.resultCode = 1;
|
result.resultMsg = $"接口异常 异常信息={ex.Message}";
|
}
|
return result;
|
}
|
|
internal static List<AreaQueryResult> AreaQuery()
|
{
|
var result = new List<AreaQueryResult>();
|
var db = new SqlHelper<object>().GetInstance();
|
var list = db.Queryable<Area>().ToList();
|
if (list.Count > 0)
|
{
|
list.ForEach(a =>
|
{
|
result.Add(new AreaQueryResult { areaCode = a.S_CODE, areaName = a.S_NAME, workRegion = a.S_NOTE, workShop = a.S_WORK_SHOP });
|
});
|
}
|
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" || model.noticeType == "ERROR")
|
{
|
//称重
|
if (model.noticeType == "0")
|
{
|
//外形检测成功 修改任务参数
|
var wcsTask = db.Queryable<WCSTask>().Where(it => it.S_CNTR_CODE == model.contNo && it.N_B_STATE == 2 && it.S_SCHEDULE_TYPE == "NDC").First();
|
if (wcsTask != null)
|
{
|
wcsTask.N_ERR = 200;
|
db.Updateable(wcsTask).UpdateColumns(it => new { it.N_ERR }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
//外形检测失败 修改任务参数
|
var wcsTask = db.Queryable<WCSTask>().Where(it => it.S_CNTR_CODE == model.contNo && it.N_B_STATE == 2 && it.S_SCHEDULE_TYPE == "NDC").First();
|
if (wcsTask != null)
|
{
|
Location endLoc = null;
|
var Setting = Settings.ConnetAreas.Where(a => a.InLocList.Contains(wcsTask.S_END_LOC)).FirstOrDefault();
|
if (Setting != null)
|
{
|
if (Settings.DBAreas.Contains(wcsTask.S_START_AREA))
|
{
|
endLoc = db.Queryable<Location>().Where(a => a.S_CODE == wcsTask.S_START_LOC).First();
|
}
|
else
|
{
|
var endArea = Setting.ErrorArea;
|
endLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0).First();
|
}
|
|
if (endLoc != null)
|
{
|
var wmsTask = db.Queryable<WMSTask>().Where(a => a.S_CODE == wcsTask.S_OP_CODE).First();
|
if (wmsTask != null)
|
{
|
var PlcTask = db.Queryable<WCSTask>().Where(it => it.S_CNTR_CODE == model.contNo && (it.N_B_STATE == 2 || it.N_B_STATE == 1) && it.S_SCHEDULE_TYPE == "WCS").First();
|
if (PlcTask != null)
|
{
|
TaskProcess.Cancel(PlcTask);
|
//取消plc任务
|
TaskProcess.OperateStatus(PlcTask, 7);
|
WCSHelper.Fail(PlcTask);
|
}
|
LocationHelper.UnLockLoc(wmsTask.S_END_LOC);
|
LocationHelper.LockLoc(endLoc.S_CODE, 1);
|
LocationHelper.LockLoc(wcsTask.S_END_LOC, 2);
|
wcsTask.S_ERR_LOC = endLoc.S_CODE;
|
wcsTask.N_ERR = 500;
|
db.Updateable(wcsTask).UpdateColumns(it => new { it.N_ERR, it.S_ERR_LOC }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
LogHelper.Info($"外形检测失败 未找到退货终点");
|
}
|
|
|
}
|
}
|
}
|
}
|
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);
|
if (task.S_TYPE == "分拣出")
|
{
|
WCSHelper.UpdateStorStatus(task.S_CNTR_CODE, 3);
|
}
|
break;
|
case "5":
|
//取货无货(释放货位)
|
TaskProcess.OperateStatus(task, 4);
|
break;
|
case "2":
|
if (!WCSHelper.CheckActionRecordExist(task.S_CODE, 5))
|
{
|
TaskProcess.OperateStatus(task, 4);
|
}
|
//完成状态 (出库任务生成第二段agv任务) 解绑起点终点
|
//if (task.S_B_STATE != "取消" && task.S_B_STATE != "完成" && task.S_B_STATE != "关闭" && task.S_B_STATE != "强制完成")
|
//{
|
TaskProcess.OperateStatus(task, 6);
|
if (task.S_OP_NAME =="入库")
|
{
|
WMSHelper.AddChange(task);
|
}
|
if (task.S_OP_NAME == "出库")
|
{
|
WMSHelper.DeleteChange(task);
|
}
|
if (task.S_TYPE == "分拣回")
|
{
|
WMSHelper.PreparationState(task);
|
}
|
//TaskProcess.PlcSencondTask(task);
|
WCSHelper.End(task);
|
WMSHelper.End(task);
|
//}
|
break;
|
case "8":
|
//取货无货(释放货位)
|
quhuowuhuo(db, task);
|
break;
|
case "9":
|
//放货有货 (重分货位)
|
fanghuoyouhuo(db, result, task);
|
break;
|
}
|
WCSHelper.AddActionRecord(task.S_CODE, int.Parse(model.noticeType), "", "");
|
//}
|
}
|
else
|
{
|
result.code = "1";
|
result.msg = "该任务编号不存在";
|
}
|
}
|
return result;
|
}
|
|
private static void fanghuoyouhuo(SqlSugarClient db, PlcSendTaskres result, WCSTask task)
|
{
|
string msg = "";
|
var wmstask = db.Queryable<WMSTask>().Where(a => a.S_CODE == task.S_OP_CODE).First();
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
|
locinfo.N_CURRENT_NUM = 1;
|
locinfo.S_LOCK_STATE = "锁定";
|
locinfo.N_LOCK_STATE = 4;
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand();
|
|
//分配改道货位
|
LogHelper.Info($"查找改道货位 优先查找{locinfo.N_ROADWAY}巷道货位");
|
Location endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, locinfo.N_ROADWAY, locinfo.S_TYPE);
|
if (endbit != null)
|
{
|
LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
//修改任务数据 终点 备注:改位
|
LocationHelper.LockLoc(endbit.S_CODE, 1);
|
wmstask.S_END_LOC = endbit.S_CODE;
|
db.Updateable(wmstask).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
|
task.S_END_LOC = endbit.S_CODE;
|
task.S_NOTE = "改位";
|
db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
var agvBit = db.Queryable<PeiZhi>().Where(it => it.BitCode == endbit.S_CODE).First();
|
if (agvBit != null)
|
{
|
result.new_locate_no = agvBit.PlcLocation;
|
}
|
|
}
|
//else
|
//{
|
// LogHelper.Info($"{locinfo.N_ROADWAY} 巷道找不到可入货位 随机分配货位");
|
// endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, 0, locinfo.S_TYPE);
|
// if (endbit != null)
|
// {
|
// LogHelper.Info($"查找到改道货位为{endbit.S_CODE}");
|
// //修改任务数据 终点 备注:改位
|
// LocationHelper.LockLoc(endbit.S_CODE, 1);
|
// wmstask.S_END_LOC = endbit.S_CODE;
|
// db.Updateable(wmstask).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
|
// task.S_END_LOC = endbit.S_CODE;
|
// task.S_NOTE = "改位";
|
// db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand();
|
//
|
// var agvBit = db.Queryable<PeiZhi>().Where(it => it.BitCode == endbit.S_CODE).First();
|
// if (agvBit != null)
|
// {
|
// result.new_locate_no = agvBit.PlcLocation;
|
// }
|
// }
|
//}
|
}
|
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();
|
}
|
|
|
internal static WeiLiResult InStockApply(InStockApplyModel model)
|
{
|
var result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
if (model.data.Count > 0)
|
{
|
//通过料框初始化数据 料框号进行匹配终点库区
|
//创建作业
|
var endarea = "";
|
var tp = model.cntrNo.Substring(0, 2);
|
if (!string.IsNullOrEmpty(model.startLoction))
|
{
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(it => it.S_CNTR_CODE == model.cntrNo && it.S_LOC_CODE != model.startLoction).First();
|
if (cntrInfo != null)
|
{
|
result.code = 500;
|
result.msg = $"托盘{model.cntrNo} 绑定货位{cntrInfo.S_LOC_CODE} 无法从货位{model.startLoction}生成任务";
|
return result;
|
}
|
var locinfo = db.Queryable<Location>().Where(it => it.S_CODE == model.startLoction).First();
|
if (locinfo != null)
|
{
|
var djinfo = Settings.DJCodes.Where(it => it.DJAreaCode == locinfo.S_AREA_CODE).FirstOrDefault();
|
if (djinfo != null)
|
{
|
if (Settings.DJCodes.Where(it => it.DJAreaCode == locinfo.S_AREA_CODE && it.TrayPrefix == tp).FirstOrDefault() == null)
|
{
|
result.code = 500;
|
result.msg = $"起点与托盘类型不符";
|
return result;
|
}
|
}
|
else
|
{
|
//起点不为检验区
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"起点{model.startLoction} 无对应货位信息";
|
return result;
|
}
|
}
|
|
foreach (var item in model.data)
|
{
|
var OldCntr = db.Queryable<CntrItemRel>().Where(a => a.S_ITEM_CODE == item.itemCode && a.F_QTY > 0).First();
|
if (OldCntr != null)
|
{
|
var oldArea = Settings.LKCodes.Where(a => a.TrayPrefix == OldCntr.S_CNTR_CODE.Substring(0, 2)).FirstOrDefault();
|
var Area = Settings.LKCodes.Where(a => a.TrayPrefix == model.cntrNo.Substring(0, 2)).FirstOrDefault();
|
if (oldArea != null && Area != null && oldArea.LiKuCode != Area.LiKuCode)
|
{
|
var oldTp = OldCntr.S_CNTR_CODE.Substring(0, 2);
|
//var oldTPinfo = Settings.LKCodes.Where(a => a.TrayPrefix == oldTp).FirstOrDefault();
|
LogHelper.Info($"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 与托盘{model.cntrNo}隶属不同库区 请更换托盘");
|
result.code = 500;
|
result.msg = $"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 与托盘{model.cntrNo}隶属不同库区 请更换托盘";
|
return result;
|
}
|
}
|
}
|
|
|
|
var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault();
|
if (endinfo != null)
|
{
|
endarea = endinfo.LiKuCode;
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "无法查询到容器所属终点库区 检查配置";
|
return result;
|
}
|
|
|
|
foreach (var a in model.data)
|
{
|
var itemName = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (itemName == null)
|
{
|
result.code = 500;
|
result.msg = $"物料表中查询不到物料{a.itemCode} 对应的物料名称";
|
return result;
|
}
|
}
|
|
|
|
model.data.ForEach(a =>
|
{
|
LogHelper.Info($"qty={a.qty}");
|
var itemName = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
CntrItemRel item = new CntrItemRel
|
{
|
S_CNTR_CODE = model.cntrNo,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_ITEM_CODE = a.itemCode,
|
S_BATCH_NO = a.batchNo,
|
S_OWNER = a.factoryCode,
|
S_ERP_WH_CODE = a.stockLoc,
|
F_QTY = a.qty,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_SERIAL_NO = a.serialNo,
|
D_PRD_DATE = a.productDate,
|
N_ITEM_STATE = model.qualityState,
|
S_EXT_ATTR2 = a.blockState,
|
S_ITEM_STATE = model.qualityState == 0 ? "未质检" : model.qualityState == 1 ? "质检合格" : model.qualityState == 2 ? "质检不合格" : "",
|
T_MODIFY = DateTime.Now,
|
S_EXT_ATTR3 = model.temporarily
|
};
|
LogHelper.Info($"F_QTY={item.F_QTY}");
|
db.Insertable(item).ExecuteCommand();
|
});
|
|
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.startLoction).First();
|
//终点库区判断 是否为待检区 如果不是根据物料区分去哪个立库
|
//var EndArea = model.needConfirm == "Y" ? Settings.DJCode : Settings.LKCodes[0].LiKuCode;
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_START_AREA = startinfo.S_AREA_CODE,
|
S_START_WH = startinfo.S_WH_CODE,
|
S_END_WH = startinfo.S_WH_CODE,
|
S_CODE = model.orderNo,
|
S_START_LOC = model.startLoction,
|
S_END_LOC = "",
|
S_END_AREA = endarea,
|
S_STATION_LOC = model.station.ToString(),
|
S_TYPE = "入库",
|
N_TYPE = 1,
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = "入库",
|
S_STORE = model.needConfirm
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
if (res)
|
{
|
//LocationHelper.BindingLoc(model.startLoction, new List<string>() { model.cntrNo });
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.startLoction && a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrInfo == null)
|
{
|
db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLoction, S_CNTR_CODE = model.cntrNo }).ExecuteCommand();
|
}
|
LocationHelper.LockLoc(model.startLoction, 2);
|
var cn = db.Queryable<Container>().Where(it => it.S_CODE == model.cntrNo).First();
|
if (cn == null)
|
{
|
var cntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count };
|
db.Insertable(cntr).ExecuteCommand();
|
}
|
else
|
{
|
cn.N_DETAIL_COUNT += model.data.Count;
|
db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
|
}
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "集合数据不能为空";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"入库请求异常 异常信息{ex.Message}", ex);
|
result.code = 500;
|
result.msg = $"入库请求异常 异常信息{ex.Message}";
|
}
|
|
return result;
|
}
|
|
internal static StockQueryRes StockQuery(StockQueryModel model)
|
{
|
StockQueryRes result = new StockQueryRes();
|
LogHelper.Info($"库区查询 物料编码={model.itemCode} 库区={JsonConvert.SerializeObject(model.areaCode)} 料框号={model.cntrNo} 批次号={model.batchNo} 供应商编码={model.vendorCode}");
|
var db = new SqlHelper<object>().GetInstance();
|
var exp = Expressionable.Create<CntrItemRel>();
|
exp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo);
|
exp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode);
|
exp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc);
|
exp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState);
|
exp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState);
|
|
|
try
|
{
|
var itemlist = db.Queryable<CntrItemRel>().Where(exp.ToExpression()).PartitionBy(a => a.S_CNTR_CODE).Take(1).ToList();
|
if (itemlist.Count > 0)
|
{
|
for (int i = 0; i < itemlist.Count; i++)
|
{
|
var cntr = itemlist[i].S_CNTR_CODE;
|
|
var info = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntr).First();
|
if (info != null)
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == info.S_LOC_CODE).First();
|
if (locinfo != null)
|
{
|
if (model.areaCode.Count > 0 && model.areaCode.Contains(locinfo.S_AREA_CODE))
|
{
|
var newexp = Expressionable.Create<CntrItemRel>();
|
newexp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode);
|
newexp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo);
|
newexp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo);
|
newexp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode);
|
newexp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc);
|
newexp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState);
|
newexp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState);
|
newexp.And(a => a.S_CNTR_CODE == cntr);
|
|
//添加
|
var data = new StockQueryResult
|
{
|
areaCode = locinfo.S_AREA_CODE,
|
location = locinfo.S_CODE,
|
cntrCode = cntr
|
};
|
var item = db.Queryable<CntrItemRel>().Where(newexp.ToExpression()).ToList();
|
if (item.Count > 0)
|
{
|
item.ForEach(a =>
|
{
|
data.data.Add(new StockQueryResult.StockQueryData
|
{
|
batchNo = a.S_BATCH_NO,
|
itemCode = a.S_ITEM_CODE,
|
serialNo = a.S_SERIAL_NO,
|
stockLocation = a.S_ERP_WH_CODE,
|
factoryCode = a.S_OWNER,
|
qty = a.F_QTY,
|
productDate = a.D_PRD_DATE,
|
vendorCode = a.S_SUPPLIER_NO,
|
qualityState = a.N_ITEM_STATE,
|
blockState = a.S_EXT_ATTR2
|
});
|
});
|
}
|
result.data.Add(data);
|
}
|
else if (model.areaCode.Count == 0)
|
{
|
var newexp = Expressionable.Create<CntrItemRel>();
|
newexp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode);
|
newexp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo);
|
newexp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo);
|
newexp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode);
|
newexp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc);
|
newexp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState);
|
newexp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState);
|
newexp.And(a => a.S_CNTR_CODE == cntr);
|
|
//添加
|
var data = new StockQueryResult
|
{
|
areaCode = locinfo.S_AREA_CODE,
|
location = locinfo.S_CODE,
|
cntrCode = cntr
|
};
|
var item = db.Queryable<CntrItemRel>().Where(newexp.ToExpression()).ToList();
|
if (item.Count > 0)
|
{
|
item.ForEach(a =>
|
{
|
data.data.Add(new StockQueryResult.StockQueryData
|
{
|
batchNo = a.S_BATCH_NO,
|
itemCode = a.S_ITEM_CODE,
|
serialNo = a.S_SERIAL_NO,
|
stockLocation = a.S_ERP_WH_CODE,
|
factoryCode = a.S_OWNER,
|
qty = a.F_QTY,
|
productDate = a.D_PRD_DATE,
|
vendorCode = a.S_SUPPLIER_NO,
|
qualityState = a.N_ITEM_STATE,
|
blockState = a.S_EXT_ATTR2
|
});
|
});
|
}
|
//else LogHelper.Info($"查询不到托盘{cntr}的库存信息 查询条件{JsonConvert.SerializeObject(newexp.ToExpression())}");
|
result.data.Add(data);
|
}
|
}
|
}
|
}
|
}
|
//else
|
//{
|
// result.code = 1;
|
//}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"库存查询接口异常 异常信息={ex.Message}", ex);
|
result.code = 2;
|
}
|
|
return result;
|
}
|
|
internal static ReserveStockQueryRes ReserveStockQuery(ReserveStockQueryModel model)
|
{
|
ReserveStockQueryRes result = new ReserveStockQueryRes();
|
var db = new SqlHelper<object>().GetInstance();
|
var cntrlist = db.Queryable<CntrItemRel>().Where(a => a.S_BS_NO == model.outStockOrderNo && a.S_EXT_ATTR1 == "Y").PartitionBy(a => a.S_CNTR_CODE).Take(1).ToList();
|
//var cntrlist = db.Queryable<CntrItemRel>().Where(a => a.S_BS_NO == outStockOrderNo).ToList();
|
if (cntrlist.Count > 0)
|
{
|
LogHelper.Info($"查询到出库单号{model.outStockOrderNo} 对应的托盘数据{cntrlist.Count}条");
|
cntrlist.ForEach(it =>
|
{
|
var cntrCode = it.S_CNTR_CODE;
|
var locinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == cntrCode).First();
|
if (locinfo != null)
|
{
|
ReserveStockQueryResult info = new ReserveStockQueryResult
|
{
|
outStockOrderNo = model.outStockOrderNo,
|
cntrCode = cntrCode,
|
location = locinfo.S_LOC_CODE,
|
state = 1
|
};
|
var itemlist = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrCode).ToList();
|
if (itemlist.Count > 0)
|
{
|
itemlist.ForEach(item =>
|
{
|
info.data.Add(new ReserveStockQueryResult.ReserveStockQueryData
|
{
|
serialNo = string.IsNullOrEmpty(item.S_SERIAL_NO) ? "" : item.S_SERIAL_NO,
|
stockLocation = string.IsNullOrEmpty(item.S_ERP_WH_CODE) ? "" : item.S_ERP_WH_CODE,
|
batchNo = string.IsNullOrEmpty(item.S_BATCH_NO) ? "" : item.S_BATCH_NO,
|
factoryCode = string.IsNullOrEmpty(item.S_OWNER) ? "" : item.S_OWNER,
|
itemCode = item.S_ITEM_CODE,
|
vendorCode = string.IsNullOrEmpty(item.S_SUPPLIER_NO) ? "" : item.S_SUPPLIER_NO,
|
qty = item.F_QTY,
|
rowNo = item.N_BS_ROW_NO
|
});
|
});
|
}
|
result.data.Add(info);
|
}
|
else
|
{
|
LogHelper.Info($"未查询到托盘{it.S_CNTR_CODE} 对应的绑定货位");
|
result.code = 500;
|
}
|
});
|
}
|
else
|
{
|
LogHelper.Info($"未查询到出库单号{model.outStockOrderNo} 对应的托盘数据");
|
result.code = 500;
|
}
|
|
|
return result;
|
}
|
|
internal static WeiLiResult EmptyOutStockApply(EmptyOutStockApplyModel model)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
WeiLiResult result = new WeiLiResult();
|
string endarea = "";
|
string startloc = ""; string startarea = ""; string cntrNo = ""; string startWh = "";
|
try
|
{
|
var cntrSpecification = model.cntrSpecification == 1 ? "高货位" : model.cntrSpecification == 2 ? "低货位" : "";
|
var cntrType = model.cntrType == 1 ? "2T" : model.cntrType == 2 ? "3T" : model.cntrType == 3 ? "11T" : "";
|
var startareainfo = Settings.LKCodes.Where(a => a.AreaType == cntrType).FirstOrDefault();
|
if (startareainfo != null)
|
{
|
startarea = startareainfo.LiKuCode;
|
if (!string.IsNullOrEmpty(model.cntrNo))
|
{
|
var locinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (locinfo != null)
|
{
|
var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == locinfo.S_LOC_CODE).First();
|
if (startLoc != null)
|
{
|
var DuiDuoPeiz = db.Queryable<DuiDuoPeiz>().Where(it => it.S_AREA_CODE == startLoc.S_AREA_CODE && it.N_LANE == startLoc.N_ROADWAY && it.N_STATE == 1).First();
|
if (DuiDuoPeiz != null)
|
{
|
//获取起点信息
|
var lociteminfo = db.Queryable<CntrItemRel>().Where(it => it.S_CNTR_CODE == locinfo.S_CNTR_CODE).First();
|
if (lociteminfo == null)
|
{
|
startloc = locinfo.S_LOC_CODE;
|
cntrNo = locinfo.S_CNTR_CODE;
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "该托盘不是空框";
|
return result;
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"货位{locinfo.S_LOC_CODE} 当前巷道堆垛机异常";
|
return result;
|
}
|
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"系统不存在绑定托盘货位{locinfo.S_LOC_CODE}";
|
return result;
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "系统中找不到该托盘绑定记录";
|
return result;
|
}
|
}
|
else
|
{
|
//算取起点货位
|
var startloclist = db.Queryable<Location>()
|
.Where(a => a.S_AREA_CODE == startarea && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0)
|
.ToList();
|
if (startloclist.Count > 0)
|
{
|
foreach (var item in startloclist)
|
{
|
var locinfo = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == item.S_CODE).First();
|
if (locinfo != null)
|
{
|
var lociteminfo = db.Queryable<CntrItemRel>().Where(it => it.S_CNTR_CODE == locinfo.S_CNTR_CODE).First();
|
if (lociteminfo == null)
|
{
|
var DuiDuoPeiz = db.Queryable<DuiDuoPeiz>().Where(it => it.S_AREA_CODE == item.S_AREA_CODE && it.N_LANE == item.N_ROADWAY && it.N_STATE == 1).First();
|
if (DuiDuoPeiz != null)
|
{
|
if (!string.IsNullOrEmpty(cntrSpecification))
|
{
|
if (cntrSpecification == item.S_TYPE)
|
{
|
startloc = locinfo.S_LOC_CODE;
|
startWh = item.S_WH_CODE;
|
cntrNo = locinfo.S_CNTR_CODE;
|
break;
|
}
|
}
|
else
|
{
|
startloc = locinfo.S_LOC_CODE;
|
startWh = item.S_WH_CODE;
|
cntrNo = locinfo.S_CNTR_CODE;
|
break;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"空框出库 库区{item.S_AREA_CODE} 巷道{item.N_ROADWAY} 堆垛机状态异常");
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
if (string.IsNullOrEmpty(startloc))
|
{
|
result.code = 500;
|
result.msg = $"库区中找不到可用空托";
|
return result;
|
}
|
else
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == startloc).First();
|
if (locinfo.S_AREA_CODE != startarea)
|
{
|
result.code = 500;
|
result.msg = "托盘起点与库区不符";
|
return result;
|
}
|
}
|
|
if (!string.IsNullOrEmpty(model.destLocation))
|
{
|
//判断终点库区是否为空
|
var end = db.Queryable<Location>().Where(a => a.S_CODE == model.destLocation).First();
|
if (end != null && end.N_LOCK_STATE != 0)
|
{
|
result.code = 500;
|
result.msg = "指定终点货位锁状态异常";
|
return result;
|
}
|
else if (end == null)
|
{
|
result.code = 500;
|
result.msg = $"终点{model.destLocation} 找不到对应的货位信息";
|
return result;
|
}
|
if (string.IsNullOrEmpty(model.destArea))
|
{
|
endarea = end.S_AREA_CODE;
|
}
|
else endarea = model.destArea;
|
}
|
|
if (string.IsNullOrEmpty(endarea)) endarea = model.destArea;
|
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = model.orderNo,
|
S_START_WH = startWh,
|
S_START_AREA = startarea,
|
S_START_LOC = startloc,
|
S_END_LOC = model.destLocation,
|
S_END_AREA = endarea,
|
S_END_WH = startWh,
|
S_STATION_LOC = model.station.ToString(),
|
S_TYPE = "出库",
|
N_TYPE = 2,
|
N_B_STATE = 0,
|
S_CNTR_CODE = cntrNo,
|
S_OP_DEF_NAME = "空框出库"
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
LocationHelper.LockLoc(startloc, 2);
|
if (!string.IsNullOrEmpty(model.destLocation)) LocationHelper.LockLoc(model.destLocation, 1);
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"找不到库区类型{model.cntrType} 对应的起点库区";
|
}
|
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"空框出库接口异常 异常信息={ex.Message}", ex);
|
result.code = 500;
|
result.msg = $"空框出库接口异常 异常信息={ex.Message}";
|
}
|
|
return result;
|
}
|
|
internal static WeiLiResult CancelOrder(CancelOrderModel1 model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
//var tasks = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.orderNo).ToList();
|
//if (tasks.Count >= 1)
|
//{
|
// //流程任务数量执行超过一条 任务不允许取消
|
// result.code = 500;
|
// result.msg = "流程任务执行中途不允许取消";
|
// return result;
|
//}
|
//var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First();
|
//if (task != null)
|
//{
|
// if (WCSHelper.CheckActionRecordExist(task.S_CODE, 4))
|
// {
|
// result.code = 500;
|
// result.msg = "任务已取货完成 不允许取消";
|
// return result;
|
// }
|
// if (task.N_B_STATE == 0)
|
// {
|
// //等待直接修改状态为取消
|
// WCSHelper.UpdateStatus(model.orderNo, 5);
|
// //result.msg = "任务等待,直接取消";
|
// }
|
// else if (task.N_B_STATE != 3 && task.N_B_STATE != 4)
|
// {
|
// if (task.S_TYPE == "杭奥")
|
// {
|
// //通知立库取消任务
|
// }
|
// else
|
// {
|
// //已推送但是没有完成或者取消,通知hosttoagv
|
// NDCHelper.Cancel(task.S_CODE.Trim());
|
// //result.msg = "任务取消已经发送给小车";
|
// }
|
// }
|
// else
|
// {
|
// result.code = 500;
|
// result.msg = "任务已结束";
|
// }
|
//}
|
//else
|
//{
|
// result.code = 500;
|
// result.msg = "任务不存在";
|
//}
|
|
var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First();
|
if (task != null)
|
{
|
var wmsTask = WMSHelper.GetWmsTask(task.S_OP_CODE);
|
if (wmsTask != null)
|
{
|
if (task.N_B_STATE == 0)
|
{
|
//等待直接修改状态为取消
|
WCSHelper.UpdateStatus(task.S_CODE, 4);
|
wmsTask.N_B_STATE = 6;
|
WMSHelper.UpdateTaskState(wmsTask);
|
LocationHelper.UnLockLoc(task.S_START_LOC);
|
LocationHelper.UnLockLoc(task.S_END_LOC);
|
LocationHelper.UnLockLoc(wmsTask.S_END_LOC);
|
|
result.msg = "任务等待,直接取消";
|
}
|
else if (task.N_B_STATE != 3 && task.N_B_STATE != 4)
|
{
|
if (task.S_SCHEDULE_TYPE == "NDC")
|
{
|
//已推送但是没有完成或者取消,通知hosttoagv
|
NDCApi.CancelOrder(task.S_CODE.Trim());
|
}
|
else
|
{
|
TaskProcess.Cancel(task);
|
TaskProcess.OperateStatus(task, 7);
|
WCSHelper.Fail(task);
|
WMSHelper.Fail(task);
|
}
|
|
result.msg = "任务取消已经发送给小车";
|
}
|
else
|
{
|
result.msg = "任务已结束";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务所处的作业不存在";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "任务不存在";
|
}
|
|
return result;
|
}
|
|
internal static WeiLiResult OutStcokApply(OutStcokApplyModel model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
string endarea = "";
|
var db = new SqlHelper<object>().GetInstance();
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrCode).First();
|
if (cntrinfo != null)
|
{
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First();
|
if (startinfo != null && startinfo.N_LOCK_STATE == 0)
|
{
|
var IsLiKu = Settings.LKCodes.Where(a => a.LiKuCode == startinfo.S_AREA_CODE).FirstOrDefault() != null;
|
if (IsLiKu)
|
{
|
var DuiDuoPeiz = db.Queryable<DuiDuoPeiz>().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_LANE == startinfo.N_ROADWAY && a.N_STATE == 1).First();
|
if (DuiDuoPeiz != null)
|
{
|
if (!string.IsNullOrEmpty(model.destLocation))
|
{
|
//判断终点库区是否为空
|
var end = db.Queryable<Location>().Where(a => a.S_CODE == model.destLocation).First();
|
if (end != null && end.N_LOCK_STATE != 0)
|
{
|
result.code = 500;
|
result.msg = "指定终点货位锁状态异常";
|
return result;
|
}
|
else if (end == null)
|
{
|
result.code = 500;
|
result.msg = $"终点{model.destLocation} 找不到对应的货位信息";
|
return result;
|
}
|
|
|
if (string.IsNullOrEmpty(model.destLocation))
|
{
|
endarea = end.S_AREA_CODE;
|
}
|
else endarea = model.destArea;
|
}
|
if (string.IsNullOrEmpty(endarea)) endarea = model.destArea;
|
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = model.orderNo,
|
S_START_LOC = startinfo.S_CODE,
|
S_START_AREA = startinfo.S_AREA_CODE,
|
S_START_WH = startinfo.S_WH_CODE,
|
S_END_LOC = model.destLocation,
|
S_END_AREA = endarea,
|
S_END_WH = startinfo.S_WH_CODE,
|
S_STATION_LOC = model.station.ToString(),
|
N_TYPE = 2,
|
S_TYPE = "出库",
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrCode,
|
S_OP_DEF_NAME = "出库",
|
S_BS_NO = model.orderNo
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
LocationHelper.LockLoc(startinfo.S_CODE, 2);
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"库区{startinfo.S_AREA_CODE} 巷道{startinfo.N_ROADWAY} 所属堆垛机异常 无法出库";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库 托盘{model.cntrCode} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库");
|
result.code = 500;
|
result.msg = $"出库 托盘{model.cntrCode} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库";
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "起点货位状态异常";
|
LogHelper.Info($"起点货位锁定状态异常");
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"托盘{model.cntrCode} 找不到绑定关系";
|
}
|
|
|
|
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 WeiLiResult itemQualityStateUpdate(itemQualityStateUpdateModel model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var itemstate = model.qualityState == 0 ? "未质检" : model.qualityState == 1 ? "质检合格" : model.qualityState == 2 ? "质检不合格" : "";
|
|
try
|
{
|
var exp = Expressionable.Create<CntrItemRel>();
|
exp.And(a => a.S_ITEM_CODE == model.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo);
|
exp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode);
|
//exp.AndIF(!string.IsNullOrEmpty(model.stockLocation), a => a.S_ERP_WH_CODE == model.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(model.factoryCode), a => a.S_OWNER == model.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(model.serialNo), a => a.S_SERIAL_NO == model.serialNo);
|
|
var itemlist = db.Queryable<CntrItemRel>().Where(exp.ToExpression()).ToList();
|
if (itemlist.Count > 0)
|
{
|
if (!string.IsNullOrEmpty(itemstate))
|
{
|
itemlist.ForEach(a =>
|
{
|
a.N_ITEM_STATE = model.qualityState;
|
a.S_ITEM_STATE = itemstate;
|
db.Updateable(a).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
|
});
|
}
|
|
string baockstate = model.blockState == 1 ? "Y" : model.blockState == 0 ? "N" : "";
|
if (!string.IsNullOrEmpty(baockstate))
|
{
|
itemlist.ForEach(a =>
|
{
|
a.S_EXT_ATTR2 = baockstate;
|
db.Updateable(a).UpdateColumns(it => new { it.S_EXT_ATTR2 }).ExecuteCommand();
|
});
|
}
|
|
if (!string.IsNullOrEmpty(model.stockLocation))
|
{
|
itemlist.ForEach(a =>
|
{
|
a.S_ERP_WH_CODE = model.stockLocation;
|
db.Updateable(a).UpdateColumns(it => new { it.S_ERP_WH_CODE }).ExecuteCommand();
|
});
|
}
|
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "当前容器货品明细中 未找到符合条件的明细 无法更新";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"质量更新接口异常 异常信息={ex.Message}", ex);
|
result.code = 500;
|
result.msg = $"接口异常 异常信息{ex.Message}";
|
}
|
|
return result;
|
}
|
|
internal static WeiLiResult EmptyInstockApply(EmptyInstockApplyModel model)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
string endarea = "";
|
WeiLiResult result = new WeiLiResult();
|
try
|
{
|
if (!string.IsNullOrEmpty(model.orderNo) && !string.IsNullOrEmpty(model.startLocation) && !string.IsNullOrEmpty(model.cntrCode))
|
{
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrCode).First();
|
var locinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.startLocation).First();
|
if (locinfo != null && locinfo.S_CNTR_CODE != model.cntrCode)
|
{
|
result.code = 500;
|
result.msg = $"起点{model.startLocation} 已绑定托盘{locinfo.S_CNTR_CODE} 无法绑定托盘{model.cntrCode}";
|
return result;
|
}
|
if (cntrinfo != null && cntrinfo.S_LOC_CODE != model.startLocation)
|
{
|
result.code = 500;
|
result.msg = $"托盘{model.cntrCode} 已绑定货位{cntrinfo.S_LOC_CODE} 无法绑定起点{model.startLocation}";
|
return result;
|
}
|
|
|
var tp = model.cntrCode.Substring(0, 2);
|
var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault();
|
if (endinfo != null)
|
{
|
endarea = endinfo.LiKuCode;
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "无法查询到容器所属终点库区 检查配置";
|
return result;
|
}
|
|
|
|
if (!string.IsNullOrEmpty(model.destLocation))
|
{
|
//判断终点库区是否为空
|
var end = db.Queryable<Location>().Where(a => a.S_CODE == model.destLocation).First();
|
if (end != null && end.N_LOCK_STATE != 0)
|
{
|
result.code = 500;
|
result.msg = "指定终点货位锁状态异常";
|
return result;
|
}
|
else if (end != null && end.S_AREA_CODE == endarea)
|
{
|
result.code = 500;
|
result.msg = "终点与托盘冲突";
|
return result;
|
}
|
else if (end == null)
|
{
|
result.code = 500;
|
result.msg = $"终点{model.destLocation} 找不到对应的货位信息";
|
return result;
|
}
|
}
|
if (!string.IsNullOrEmpty(model.destArea) && model.destArea != endarea)
|
{
|
result.code = 500;
|
result.msg = "终点库区与托盘冲突";
|
return result;
|
}
|
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.startLocation).First();
|
if (startinfo != null && startinfo.N_LOCK_STATE != 0)
|
{
|
result.code = 500;
|
result.msg = $"起点{model.startLocation} 货位状态不为空闲 不允许创建任务";
|
return result;
|
}
|
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = model.orderNo,
|
S_START_AREA = startinfo.S_AREA_CODE,
|
S_START_WH = startinfo.S_WH_CODE,
|
S_START_LOC = model.startLocation,
|
S_END_LOC = model.destLocation,
|
S_END_AREA = endarea,
|
S_END_WH = startinfo.S_WH_CODE,
|
S_STATION_LOC = model.station.ToString(),
|
N_TYPE = 1,
|
S_TYPE = "入库",
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrCode,
|
S_OP_DEF_NAME = "空框入库"
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
if (res)
|
{
|
var cn = db.Queryable<Container>().Where(it => it.S_CODE == model.cntrCode).First();
|
if (cn == null)
|
{
|
var cntr = new Container { S_CODE = model.cntrCode, N_DETAIL_COUNT = 0 };
|
db.Insertable(cntr).ExecuteCommand();
|
}
|
else
|
{
|
cn.N_DETAIL_COUNT = 0;
|
db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
|
}
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.startLocation && a.S_CNTR_CODE == model.cntrCode).First();
|
if (cntrInfo == null)
|
{
|
db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLocation, S_CNTR_CODE = model.cntrCode }).ExecuteCommand();
|
}
|
} //LocationHelper.BindingLoc(model.startLocation, new List<string>() { model.cntrCode });
|
LocationHelper.LockLoc(model.startLocation, 2);
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"数据校验不能为空字符串";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"空框入库接口异常 异常信息={ex.Message}", ex);
|
result.code = 500;
|
result.msg = $"空框入库接口异常 异常信息={ex.Message}";
|
}
|
return result;
|
}
|
|
internal static WeiLiResult ReceivingNote(ReceivingNoteModel model)
|
{
|
var result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
//创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中
|
//创建入库单主子表
|
var po = WMSHelper.GetASNOrder(model.receivingNoteNo);
|
if (po == null)
|
{
|
po = new TN_ASN_Order
|
{
|
S_NO = model.receivingNoteNo,
|
S_SUPPLIER_NO = model.vendorCode,
|
S_SUPPLIER_NAME = model.vendorName,
|
S_ASN_ID = model.receivingNoteID
|
};
|
po.Details = new List<TN_ASN_Detail>();
|
if (model.data.Count > 0)
|
{
|
foreach (var a in model.data)
|
{
|
var item = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (item == null)
|
{
|
result.code = 500;
|
result.msg = $"行ID{a.rowID} 物料{a.itemCode}物料主数据不存在该物料";
|
return result;
|
}
|
po.Details.Add(new TN_ASN_Detail
|
{
|
S_ASN_NO = model.receivingNoteNo,
|
S_ITEM_CODE = a.itemCode,
|
F_QTY = a.qty,
|
F_ACC_R_QTY = a.qty,
|
S_BS_ROW_NO = a.rowID,
|
S_FAC_CODE = a.factoryCode,
|
S_ITEM_LOC = a.stockLocation,
|
S_BATCH_NO = a.batchNo,
|
N_IS_FLAG = a.qualityInspectionFlag
|
});
|
};
|
WMSHelper.CreateASNOrder(po);
|
}
|
}
|
else if (po != null && po.N_B_STATE == 0)
|
{
|
var Details = new List<TN_ASN_Detail>();
|
if (model.data.Count > 0)
|
{
|
foreach (var a in model.data)
|
{
|
var item = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (item == null)
|
{
|
result.code = 500;
|
result.msg = $"行ID{a.rowID} 物料{a.itemCode}物料主数据不存在该物料";
|
return result;
|
}
|
Details.Add(new TN_ASN_Detail
|
{
|
S_ASN_NO = model.receivingNoteNo,
|
S_ITEM_CODE = a.itemCode,
|
F_QTY = a.qty,
|
F_ACC_R_QTY = a.qty,
|
S_BS_ROW_NO = a.rowID,
|
S_FAC_CODE = a.factoryCode,
|
S_ITEM_LOC = a.stockLocation,
|
S_BATCH_NO = a.batchNo,
|
N_IS_FLAG = a.qualityInspectionFlag
|
});
|
};
|
}
|
po.S_SUPPLIER_NO = model.vendorCode;
|
po.S_SUPPLIER_NAME = model.vendorName;
|
po.S_ASN_ID = model.receivingNoteID;
|
db.Updateable(po).UpdateColumns(it => new { it.S_SUPPLIER_NO, it.S_SUPPLIER_NAME, it.S_ASN_ID }).ExecuteCommand();
|
if (Details.Count > 0)
|
{
|
db.Deleteable<TN_ASN_Detail>().Where(it => it.S_ASN_NO == model.receivingNoteNo).ExecuteCommand();
|
db.Insertable<TN_ASN_Detail>(Details).ExecuteCommand();
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "内向交货单状态异常 无法修改数据";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"内向交货单接收异常 异常信息={ex.Message}", ex);
|
result.code = 500;
|
result.msg = "接口异常";
|
}
|
|
return result;
|
}
|
|
internal static WeiLiResult ManualStockIn(ManualStockInModel model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var po = WMSHelper.GetASNOrder(model.taskNo);
|
if (po == null)
|
{
|
po = new TN_ASN_Order { S_NO = model.taskNo, S_BS_TYPE = "人工库入库" };
|
po.Details = new List<TN_ASN_Detail>();
|
if (model.data.Count > 0)
|
{
|
foreach (var a in model.data)
|
{
|
var item = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (item == null)
|
{
|
result.code = 500;
|
result.msg = $"物料{a.itemCode}物料主数据不存在该物料";
|
return result;
|
}
|
po.Details.Add(new TN_ASN_Detail
|
{
|
S_ASN_NO = model.taskNo,
|
S_ITEM_CODE = a.itemCode,
|
S_ITEM_NAME = item.S_ITEM_NAME,
|
F_QTY = a.qty,
|
S_BATCH_NO = a.batchNo,
|
S_FAC_CODE = a.factoryCode,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_ITEM_LOC = a.stockCode,
|
N_ITEM_STATE = a.qualityState,
|
S_SERIAL_NO = a.serialNo
|
});
|
}
|
//WMSHelper.CreateShippingOrder(po);
|
WMSHelper.CreateASNOrder(po);
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "已有相同发货单号的发货单存在";
|
return result;
|
}
|
return result;
|
}
|
|
internal static WeiLiResult ReceivingNoteBatchUpdate(ReceivingNoteBatchUpdateModel model)
|
{
|
WeiLiResult result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
if (!string.IsNullOrEmpty(model.receivingNoteNo))
|
{
|
if (model.data.Count > 0)
|
{
|
model.data.ForEach(a =>
|
{
|
db.Updateable<TN_ASN_Detail>()
|
.SetColumns(it => new TN_ASN_Detail() { S_BATCH_NO = a.sapBatchNo })
|
.Where(it => it.S_ASN_NO == model.receivingNoteNo && it.S_BS_ROW_NO == a.receivingNoteRowNo)
|
.ExecuteCommand();
|
});
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "交货单单号不能为空";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"更新交货单批次信息异常 异常信息={ex.Message}", ex);
|
}
|
return result;
|
}
|
|
internal static WeiLiResult ShippingNote(ShippingNoteModel model)
|
{
|
var result = new WeiLiResult();
|
var db = new SqlHelper<object>().GetInstance();
|
//创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中
|
//创建入库单主子表
|
//var po = WMSHelper.GetShippingOrder(model.shippingNoteNo);
|
try
|
{
|
db.BeginTran();
|
var po = WMSHelper.GetOutboundOrder(model.shippingNoteNo);
|
if (po == null)
|
{
|
Dictionary<string, List<ShippingNoteModel.Shippingcomp>> OutGroupList = new Dictionary<string, List<ShippingNoteModel.Shippingcomp>>();
|
foreach (var a in model.data)
|
{
|
var item = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (item == null)
|
{
|
result.code = 500;
|
result.msg = $"物料{a.itemCode}物料主数据不存在该物料";
|
return result;
|
}
|
else
|
{
|
if (model.bussType == 6)
|
{
|
//人工库出库 默认库区
|
if (OutGroupList.Keys.Contains("RGK"))
|
{
|
OutGroupList["RGK"].Add(a);
|
}
|
else
|
{
|
OutGroupList.Add("RGK", new List<ShippingNoteModel.Shippingcomp> { a });
|
}
|
}
|
else
|
{
|
if (!string.IsNullOrEmpty(item.S_AREA_CODE))
|
{
|
if (OutGroupList.Keys.Contains(item.S_AREA_CODE))
|
{
|
OutGroupList[item.S_AREA_CODE].Add(a);
|
}
|
else
|
{
|
OutGroupList.Add(item.S_AREA_CODE, new List<ShippingNoteModel.Shippingcomp> { a });
|
}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = $"物料{a.itemCode} 在物料主数据中未找到所属库区";
|
return result;
|
}
|
}
|
}
|
}
|
|
|
foreach (var item in OutGroupList)
|
{
|
po = new TN_Outbound_Order { S_NO = WMSHelper.GenerateShippNo(), S_OUT_TYPE = Gettype(model.bussType), S_END_AREA = model.destArea, S_BS_NO = model.shippingNoteNo, S_OUT_TO = model.station.ToString(), S_END_LOC = model.destLocation, S_STOCK_UP = model.Ispreparation, S_AREA_CODE = item.Key };
|
po.Details = new List<TN_Outbound_Detail>();
|
item.Value.ForEach(a =>
|
{
|
var itemInfo = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
po.Details.Add(new TN_Outbound_Detail
|
{
|
S_DO_NO = po.S_NO,
|
S_AREA_CODE = model.destArea,
|
N_ROW_NO = a.rowNo,
|
S_ITEM_CODE = a.itemCode,
|
S_ITEM_NAME = itemInfo.S_ITEM_NAME,
|
F_QTY = a.qty,
|
S_BATCH_NO = a.batchNo,
|
S_OWNER = a.factoryCode,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_ERP_WH_CODE = a.stockLocation,
|
//N_ITEM_STATE = a.qualityState,
|
S_SERIAL_NO = a.serialNo
|
});
|
});
|
WMSHelper.CreateOutboundOrder(po);
|
}
|
|
|
//po = new TN_Outbound_Order { S_NO = model.shippingNoteNo, S_OUT_TYPE = Gettype(model.bussType), S_AREA_CODE = model.destArea, S_BS_NO = model.shippingNoteNo, S_OUT_TO = model.station.ToString(), S_END_LOC = model.destLocation };
|
//po.Details = new List<TN_Outbound_Detail>();
|
//if (model.data.Count > 0)
|
//{
|
// foreach (var a in model.data)
|
// {
|
// var item = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
// if (item == null)
|
// {
|
// result.code = 500;
|
// result.msg = $"物料{a.itemCode}物料主数据不存在该物料";
|
// return result;
|
// }
|
// po.Details.Add(new TN_Outbound_Detail
|
// {
|
// S_DO_NO = model.shippingNoteNo,
|
// S_AREA_CODE = model.destArea,
|
// N_ROW_NO = a.rowNo,
|
// S_ITEM_CODE = a.itemCode,
|
// S_ITEM_NAME = item.S_ITEM_NAME,
|
// F_QTY = a.qty,
|
// S_BATCH_NO = a.batchNo,
|
// S_OWNER = a.factoryCode,
|
// S_SUPPLIER_NO = a.vendorCode,
|
// S_ERP_WH_CODE = a.stockLocation,
|
// //N_ITEM_STATE = a.qualityState,
|
// S_SERIAL_NO = a.serialNo
|
// });
|
// }
|
// //WMSHelper.CreateShippingOrder(po);
|
// WMSHelper.CreateOutboundOrder(po);
|
//}
|
}
|
else
|
{
|
result.code = 500;
|
result.msg = "已有相同发货单号的发货单存在";
|
return result;
|
}
|
db.Ado.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"发货单接口异常 异常信息={ex.Message}", ex);
|
result.code = 500;
|
result.msg = $"发货单接口异常 异常信息={ex.Message}";
|
db.Ado.RollbackTran();
|
}
|
return result;
|
}
|
|
private static string Gettype(int bussType)
|
{
|
var result = "";
|
switch (bussType)
|
{
|
case 1:
|
result = "质检出库";
|
break;
|
case 2:
|
result = "普通出库";
|
break;
|
case 3:
|
result = "备料出库";
|
break;
|
case 4:
|
result = "不合格品出库";
|
break;
|
case 5:
|
result = "冻结出库";
|
break;
|
case 6:
|
result = "人工库出库";
|
break;
|
}
|
|
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;
|
}
|
|
internal static SimpleResult WeiLiOutstock(WeiLiOutstockInfo model)
|
{
|
var result = new SimpleResult();
|
string workNo = "";
|
string endarea = "";
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
if (!string.IsNullOrEmpty(model.cntrNo))
|
{
|
var iteminfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (iteminfo != null) workNo = iteminfo.S_BS_NO;
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrinfo != null)
|
{
|
var startinfo = db.Queryable<Location>().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First();
|
if (startinfo != null)
|
{
|
var IsLiKu = Settings.LKCodes.Where(a => a.LiKuCode == startinfo.S_AREA_CODE).FirstOrDefault() != null;
|
if (IsLiKu)
|
{
|
var DuiDuoPeiz = db.Queryable<DuiDuoPeiz>().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_LANE == startinfo.N_ROADWAY && a.N_STATE == 1).First();
|
if (DuiDuoPeiz != null)
|
{
|
if (!string.IsNullOrEmpty(model.endBit))
|
{
|
//判断终点库区是否为空
|
var end = db.Queryable<Location>().Where(a => a.S_CODE == model.endBit).First();
|
if (end != null && end.N_LOCK_STATE != 0)
|
{
|
result.resultCode = 3;
|
result.resultMsg = "指定终点货位锁状态异常";
|
return result;
|
}
|
else if (end == null)
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"终点{model.endBit} 找不到对应的货位信息";
|
return result;
|
}
|
|
|
if (string.IsNullOrEmpty(model.endBit))
|
{
|
endarea = end.S_AREA_CODE;
|
}
|
else endarea = model.endArea;
|
}
|
if (string.IsNullOrEmpty(endarea)) endarea = model.endArea;
|
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_WH = startinfo.S_WH_CODE,
|
S_START_LOC = startinfo.S_CODE,
|
S_START_AREA = startinfo.S_AREA_CODE,
|
S_END_LOC = model.endBit,
|
S_END_AREA = endarea,
|
S_END_WH = startinfo.S_WH_CODE,
|
S_STATION_LOC = model.station.ToString(),
|
N_TYPE = 2,
|
S_TYPE = "出库",
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = "指引出库",
|
S_BS_NO = workNo
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
LocationHelper.LockLoc(startinfo.S_CODE, 2);
|
}
|
else
|
{
|
LogHelper.Info($"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 巷道{startinfo.N_ROADWAY} 堆垛机状态异常");
|
result.resultCode = -3;
|
result.resultMsg = $"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 巷道{startinfo.N_ROADWAY} 堆垛机状态异常";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库");
|
result.resultCode = -3;
|
result.resultMsg = $"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"指引出库 查询不到托盘{model.cntrNo}绑定货位{cntrinfo.S_LOC_CODE}的货位信息");
|
result.resultCode = -2;
|
result.resultMsg = $"指引出库 查询不到托盘{model.cntrNo}绑定货位{cntrinfo.S_LOC_CODE}的货位信息";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"指引出库 找不到托盘{model.cntrNo}的绑定信息");
|
result.resultCode = -1;
|
result.resultMsg = $"指引出库 找不到托盘{model.cntrNo}的绑定信息";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"指引出库 输入托盘号不能为空");
|
result.resultCode = 2;
|
result.resultMsg = $"指引出库 输入托盘号不能为空";
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"指引出库接口异常 异常信息{ex.Message}", ex);
|
result.resultCode = 1;
|
result.resultMsg = $"指引出库接口异常 异常信息{ex.Message}";
|
}
|
return result;
|
}
|
|
internal static SimpleResult WeiLiInstock(WeiLiInstockInfo model)
|
{
|
var result = new SimpleResult();
|
var db = new SqlHelper<object>().GetInstance();
|
var req = new ReceivingNoteSerialNo();
|
try
|
{
|
if (model.isTask == "Y")
|
{
|
if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.startLoction))
|
{
|
var start = db.Queryable<Location>().Where(it => it.S_CODE == model.startLoction).First();
|
if (start != null && start.N_LOCK_STATE == 0)
|
{
|
var cntrinfo = db.Queryable<LocCntrRel>().Where(it => it.S_CNTR_CODE == model.cntrNo && it.S_LOC_CODE != model.startLoction).First();
|
if (cntrinfo != null)
|
{
|
result.resultCode = 1;
|
result.resultMsg = $"托盘{model.cntrNo} 已绑定货位{cntrinfo.S_LOC_CODE} 无法从{model.startLoction}生成任务";
|
return result;
|
}
|
|
|
if (model.data.Count > 0)
|
{
|
db.BeginTran();
|
var inworklist = new List<string>();
|
//通过料框初始化数据 料框号进行匹配终点库区
|
//创建作业
|
var bol = false;
|
foreach (var item in model.data)
|
{
|
if (!string.IsNullOrEmpty(item.itemCode) && item.itemCode.Length >= 5)
|
{
|
var fivecode = item.itemCode.Substring(0, 5);
|
var fiveinfo = db.Queryable<FiveCode>().Where(a => a.S_FIVE_CODE == fivecode).First();
|
if (fiveinfo != null)
|
{
|
if (fiveinfo.S_IS_MANAGE == "Y" && string.IsNullOrEmpty(item.serialNo))
|
{
|
bol = true;
|
result.resultCode = 1;
|
result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启五位码管理 唯一码不能为空";
|
}
|
if (fiveinfo.S_IS_MANAGEDATE == "Y" && string.IsNullOrEmpty(item.productDate))
|
{
|
bol = true;
|
result.resultCode = 1;
|
result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启生产日期管理 生产日期不能为空";
|
}
|
}
|
var iteminfo = db.Queryable<TN_Material>().Where(a => a.S_ITEM_CODE == item.itemCode).First();
|
if (iteminfo != null)
|
{
|
if (iteminfo.S_IS_MANAGE == "Y" && string.IsNullOrEmpty(item.serialNo))
|
{
|
bol = true;
|
result.resultCode = 1;
|
result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启唯一码管理 唯一码不能为空";
|
}
|
if (iteminfo.S_IS_MANAGEDATE == "Y" && string.IsNullOrEmpty(item.productDate))
|
{
|
bol = true;
|
result.resultCode = 1;
|
result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启生产日期管理 生产日期不能为空";
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "物料编码不能为空 并且长度必须大于5位";
|
return result;
|
}
|
}
|
if (bol) return result;
|
|
//判断托盘物料 同一种物料只能入一种库区
|
foreach (var item in model.data)
|
{
|
var OldCntr = db.Queryable<CntrItemRel>().Where(a => a.S_ITEM_CODE == item.itemCode && a.F_QTY > 0).First();
|
if (OldCntr != null)
|
{
|
var oldArea = Settings.LKCodes.Where(a => a.TrayPrefix == OldCntr.S_CNTR_CODE.Substring(0, 2)).FirstOrDefault();
|
var Area = Settings.LKCodes.Where(a => a.TrayPrefix == model.cntrNo.Substring(0, 2)).FirstOrDefault();
|
if (oldArea != null && Area != null && oldArea.LiKuCode != Area.LiKuCode)
|
{
|
LogHelper.Info($"托盘前缀{oldArea.TrayPrefix} 隶属库区{oldArea.LiKuCode} 托盘前缀{Area.TrayPrefix} 隶属库区{Area.LiKuCode}");
|
var oldTp = OldCntr.S_CNTR_CODE.Substring(0, 2);
|
var oldTPinfo = Settings.LKCodes.Where(a => a.TrayPrefix == oldTp).FirstOrDefault();
|
LogHelper.Info($"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 存放在{oldTPinfo.AreaType}库区 与托盘{model.cntrNo}隶属不同库区 请更换托盘");
|
result.resultCode = -1;
|
result.resultMsg = $"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 存放在{oldTPinfo.AreaType}库区 与托盘{model.cntrNo}隶属不同库区 请更换托盘";
|
return result;
|
}
|
}
|
}
|
|
|
|
List<WeiLiInstockInfo.WeiLiInstockcomple> newList = model.data.Select(item => new WeiLiInstockInfo.WeiLiInstockcomple
|
{
|
serialNo = item.serialNo,
|
stockLocation = item.stockLocation,
|
batchNo = item.batchNo,
|
factoryCode = item.factoryCode,
|
inWorkNo = item.inWorkNo,
|
itemCode = item.itemCode,
|
productDate = item.productDate,
|
qty = item.qty,
|
qualityInspectionFlag = item.qualityInspectionFlag,
|
rowID = item.rowID,
|
vendorCode = item.vendorCode
|
}).ToList();
|
var itemlist = new List<WeiLiInstockInfo.WeiLiInstockcomple>();
|
foreach (var item in newList)
|
{
|
var rowID = item.rowID;
|
var qty = item.qty;
|
var iteminfo = itemlist.Where(a => a.rowID == rowID).FirstOrDefault();
|
if (iteminfo == null)
|
{
|
//添加数据
|
itemlist.Add(item);
|
}
|
else
|
{
|
//修改数量
|
iteminfo.qty = iteminfo.qty + qty;
|
}
|
LogHelper.Info($"拆分数据{JsonConvert.SerializeObject(itemlist)} 原数据{JsonConvert.SerializeObject(model.data)}");
|
}
|
|
foreach (var item in itemlist)
|
{
|
var exp = Expressionable.Create<TN_Inbound_Detail>();
|
exp.And(it => it.S_IO_NO == item.inWorkNo);
|
exp.And(it => it.N_BS_ROW_NO == item.rowID);
|
exp.And(it => it.S_ITEM_CODE == item.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode);
|
LogHelper.Info($"S_IO_NO={item.inWorkNo} and N_BS_ROW_NO={item.rowID} and S_ITEM_CODE={item.itemCode} and S_BATCH_NO={item.batchNo} and S_ERP_WH_CODE={item.stockLocation} and S_OWNER={item.factoryCode} and S_SUPPLIER_NO={item.vendorCode} qty={item.qty}");
|
var InWorkOrder = db.Queryable<TN_Inbound_Detail>().Where(exp.ToExpression()).First();
|
if (InWorkOrder != null)
|
{
|
if (InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY < item.qty)
|
{
|
result.resultCode = 4;
|
result.resultMsg = $"入库单明细 余量为{InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY} 码盘数量为{item.qty} 不得超出入库单余量";
|
return result;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细");
|
result.resultCode = 3;
|
result.resultMsg = $"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细";
|
return result;
|
}
|
}
|
|
var endarea = "";
|
var tp = model.cntrNo.Substring(0, 2);
|
|
if (!string.IsNullOrEmpty(model.needInspect))
|
{
|
if (model.needInspect == "Y")
|
{
|
var endinfo = Settings.DJCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault();
|
if (endinfo != null)
|
{
|
endarea = endinfo.DJAreaCode;
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "无法查询到容器所属终点库区 检查配置";
|
return result;
|
}
|
}
|
else
|
{
|
var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault();
|
if (endinfo != null)
|
{
|
endarea = endinfo.LiKuCode;
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "无法查询到容器所属终点库区 检查配置";
|
return result;
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = 2;
|
result.resultMsg = "无法确定托盘去向 是否去检验区";
|
return result;
|
}
|
var loccntr = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == model.startLoction).First();
|
if (loccntr == null)
|
{
|
foreach (var item in model.data)
|
{
|
if (!string.IsNullOrEmpty(item.serialNo))
|
{
|
db.Insertable(new TN_WeiLi_SerialNo { InWork = item.inWorkNo, SerialNo = item.serialNo, RowId = item.rowID }).ExecuteCommand();
|
}
|
//升量
|
var exp = Expressionable.Create<TN_Inbound_Detail>();
|
exp.And(it => it.S_IO_NO == item.inWorkNo);
|
exp.And(it => it.N_BS_ROW_NO == item.rowID);
|
exp.And(it => it.S_ITEM_CODE == item.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode);
|
var InWorkOrder = db.Queryable<TN_Inbound_Detail>().Where(exp.ToExpression()).First();
|
InWorkOrder.F_ACC_B_QTY += item.qty;
|
db.Updateable(InWorkOrder).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
|
var inwork = db.Queryable<TN_Inbound_Detail>().Where(it => it.S_IO_NO == item.inWorkNo && it.F_QTY > it.F_ACC_B_QTY).First();
|
if (inwork == null)
|
{
|
if (!inworklist.Contains(item.inWorkNo))
|
{
|
inworklist.Add(item.inWorkNo);
|
}
|
}
|
}
|
|
//if (Settings.ZTenable == 1)
|
//{
|
// LogHelper.Info("2222222222222");
|
// if (inworklist.Count > 0)
|
// {
|
// LogHelper.Info("2222222222222");
|
//
|
// foreach (var item in inworklist)
|
// {
|
// LogHelper.Info("2222222222222");
|
//
|
// var seriallist = db.Queryable<TN_WeiLi_SerialNo>().Where(it => it.InWork == item).ToList();
|
// if (seriallist.Count > 0)
|
// {
|
// LogHelper.Info("44444444444444");
|
// seriallist.ForEach(a =>
|
// {
|
// var serinfo = req.data.Where(it => it.rowID == a.RowId).FirstOrDefault();
|
// if (serinfo == null)
|
// {
|
// LogHelper.Info("55555555555555");
|
// var se = new ReceivingNoteSerialNo.serial();
|
// se.rowID = a.RowId;
|
// se.serialNo.Add(a.SerialNo);
|
// req.data.Add(se);
|
// }
|
// else
|
// {
|
// req.data[req.data.FindIndex(x => x.Equals(serinfo))].serialNo.Add(a.SerialNo);
|
// }
|
// });
|
// }
|
// if (req.data.Count > 0)
|
// {
|
// LogHelper.Info("3333333333333333");
|
// //回传唯一码列表
|
// var url = Settings.ZTSeverUrl + "ReceivingNoteSerialNo";
|
// LogHelper.Info($"唯一码回传接口 地址{url} 接口参数{JsonConvert.SerializeObject(req)}");
|
// var feedback = new HttpHelper().WebPost(url, JsonConvert.SerializeObject(req));
|
// LogHelper.Info($"唯一码回传接口 地址{url} 接口参数{JsonConvert.SerializeObject(req)} 返回参数{feedback}");
|
// if (!string.IsNullOrEmpty(feedback))
|
// {
|
// var weilires = JsonConvert.DeserializeObject<WeiLiResult>(feedback);
|
// if (weilires.code == 200)
|
// {
|
// LogHelper.Info($"接口反馈成功");
|
// db.Deleteable<TN_WeiLi_SerialNo>().Where(it => it.InWork == item).ExecuteCommand();
|
// }
|
// else
|
// {
|
// db.Ado.RollbackTran();
|
// result.resultCode = 5;
|
// result.resultMsg = $"唯一码回传接口反馈失败 失败原因{weilires.msg}";
|
// return result;
|
// }
|
// }
|
// else
|
// {
|
// db.Ado.RollbackTran();
|
// result.resultCode = 5;
|
// result.resultMsg = "唯一码回传接口超时";
|
// return result;
|
// }
|
// }
|
// }
|
// }
|
//}
|
model.data.ForEach(a =>
|
{
|
LogHelper.Info($"添加容器货品明细 行ID{a.rowID}");
|
var itemName = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
CntrItemRel item = new CntrItemRel
|
{
|
S_CNTR_CODE = model.cntrNo,
|
S_WU = a.rowID,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_ITEM_CODE = a.itemCode,
|
S_BATCH_NO = a.batchNo,
|
S_OWNER = a.factoryCode,
|
S_ERP_WH_CODE = a.stockLocation,
|
F_QTY = a.qty,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_SERIAL_NO = a.serialNo,
|
D_PRD_DATE = a.productDate,
|
N_ITEM_STATE = a.qualityInspectionFlag,
|
S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "",
|
T_MODIFY = DateTime.Now
|
};
|
db.Insertable(item).ExecuteCommand();
|
LogHelper.Info($"添加容器货品明细 数据={JsonConvert.SerializeObject(item)}");
|
});
|
}
|
else if (loccntr.S_CNTR_CODE != model.cntrNo)
|
{
|
result.resultCode = 3;
|
result.resultMsg = $"货位{model.startLoction} 已绑定{loccntr.S_CNTR_CODE} 不能绑定{model.cntrNo}";
|
return result;
|
}
|
|
|
|
//终点库区判断 是否为待检区 如果不是根据物料区分去哪个立库
|
//var EndArea = model.needConfirm == "Y" ? Settings.DJCode : Settings.LKCodes[0].LiKuCode;
|
//创建作业
|
var optask = new WMSTask
|
{
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_WH = start.S_WH_CODE,
|
S_START_AREA = start.S_AREA_CODE,
|
S_START_LOC = model.startLoction,
|
S_END_LOC = "",
|
S_END_AREA = endarea,
|
S_END_WH = start.S_WH_CODE,
|
S_STATION_LOC = model.station.ToString(),
|
S_TYPE = "入库",
|
N_TYPE = 1,
|
N_B_STATE = 0,
|
S_CNTR_CODE = model.cntrNo,
|
S_OP_DEF_NAME = "码盘入库"
|
};
|
var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault();
|
if (note != null)
|
{
|
optask.S_NOTE = note.TaskType;
|
}
|
var res = db.Insertable(optask).ExecuteCommand() > 0;
|
if (res)
|
{
|
//LocationHelper.BindingLoc(model.startLoction, new List<string>() { model.cntrNo });
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.startLoction && a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrInfo == null)
|
{
|
db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLoction, S_CNTR_CODE = model.cntrNo }).ExecuteCommand();
|
}
|
LocationHelper.LockLoc(model.startLoction, 2);
|
var cn = db.Queryable<Container>().Where(it => it.S_CODE == model.cntrNo).First();
|
if (cn == null)
|
{
|
var cntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count };
|
db.Insertable(cntr).ExecuteCommand();
|
}
|
else
|
{
|
cn.N_DETAIL_COUNT += model.data.Count;
|
db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
|
}
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "集合数据不能为空";
|
}
|
}
|
else
|
{
|
result.resultCode = -2;
|
result.resultMsg = "起点货位信息有误 或起点货位状态不为空闲";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = "入库料框号和起点货位不能为空";
|
}
|
}
|
else
|
{
|
var addchangeres = true;
|
//人工库入库
|
if (!string.IsNullOrEmpty(model.endLocation) && !string.IsNullOrEmpty(model.cntrNo))
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == model.endLocation).First();
|
if (locinfo != null)
|
{
|
if (model.needInspect == "Y")
|
{
|
//检验区人工入库 绑定托盘 无需绑定物料
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.endLocation && a.S_CNTR_CODE == model.cntrNo).First();
|
if (cntrInfo == null)
|
{
|
db.Insertable(new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo }).ExecuteCommand();
|
}
|
//LocCntrRel loc = new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo };
|
//var locbol=db.Insertable(loc).ExecuteCommand()>0;
|
LogHelper.Info($"绑定货位容器 货位{model.endLocation} 容器{model.cntrNo}");
|
List<WeiLiInstockInfo.WeiLiInstockcomple> newList = model.data.Select(item => new WeiLiInstockInfo.WeiLiInstockcomple
|
{
|
serialNo = item.serialNo,
|
stockLocation = item.stockLocation,
|
batchNo = item.batchNo,
|
factoryCode = item.factoryCode,
|
inWorkNo = item.inWorkNo,
|
itemCode = item.itemCode,
|
productDate = item.productDate,
|
qty = item.qty,
|
qualityInspectionFlag = item.qualityInspectionFlag,
|
rowID = item.rowID,
|
vendorCode = item.vendorCode
|
}).ToList();
|
var itemlist = new List<WeiLiInstockInfo.WeiLiInstockcomple>();
|
foreach (var item in newList)
|
{
|
var rowID = item.rowID;
|
var qty = item.qty;
|
var iteminfo = itemlist.Where(a => a.rowID == rowID).FirstOrDefault();
|
if (iteminfo == null)
|
{
|
//添加数据
|
itemlist.Add(item);
|
}
|
else
|
{
|
//修改数量
|
iteminfo.qty = iteminfo.qty + qty;
|
}
|
LogHelper.Info($"拆分数据{JsonConvert.SerializeObject(itemlist)} 原数据{JsonConvert.SerializeObject(model.data)}");
|
}
|
|
foreach (var item in itemlist)
|
{
|
var exp = Expressionable.Create<TN_Inbound_Detail>();
|
exp.And(it => it.S_IO_NO == item.inWorkNo);
|
exp.And(it => it.N_BS_ROW_NO == item.rowID);
|
exp.And(it => it.S_ITEM_CODE == item.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode);
|
LogHelper.Info($"S_IO_NO={item.inWorkNo} and N_BS_ROW_NO={item.rowID} and S_ITEM_CODE={item.itemCode} and S_BATCH_NO={item.batchNo} and S_ERP_WH_CODE={item.stockLocation} and S_OWNER={item.factoryCode} and S_SUPPLIER_NO={item.vendorCode} qty={item.qty}");
|
var InWorkOrder = db.Queryable<TN_Inbound_Detail>().Where(exp.ToExpression()).First();
|
if (InWorkOrder != null)
|
{
|
if (InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY < item.qty)
|
{
|
result.resultCode = 4;
|
result.resultMsg = $"入库单明细 余量为{InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY} 码盘数量为{item.qty} 不得超出入库单余量";
|
return result;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细");
|
result.resultCode = 3;
|
result.resultMsg = $"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细";
|
return result;
|
}
|
}
|
|
foreach (var item in model.data)
|
{
|
//升量
|
var exp = Expressionable.Create<TN_Inbound_Detail>();
|
exp.And(it => it.S_IO_NO == item.inWorkNo);
|
exp.And(it => it.N_BS_ROW_NO == item.rowID);
|
exp.And(it => it.S_ITEM_CODE == item.itemCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode);
|
var InWorkOrder = db.Queryable<TN_Inbound_Detail>().Where(exp.ToExpression()).First();
|
if (InWorkOrder != null)
|
{
|
InWorkOrder.F_ACC_B_QTY += item.qty;
|
db.Updateable(InWorkOrder).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
|
}
|
else
|
{
|
LogHelper.Info($"找不到对应的入库单明细 行ID{item.rowID}");
|
}
|
|
}
|
|
model.data.ForEach(a =>
|
{
|
LogHelper.Info($"添加容器货品明细 行ID{a.rowID}");
|
var itemName = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
CntrItemRel item = new CntrItemRel
|
{
|
S_CNTR_CODE = model.cntrNo,
|
S_WU = a.rowID,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_ITEM_CODE = a.itemCode,
|
S_BATCH_NO = a.batchNo,
|
S_OWNER = a.factoryCode,
|
S_ERP_WH_CODE = a.stockLocation,
|
F_QTY = a.qty,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_SERIAL_NO = a.serialNo,
|
D_PRD_DATE = a.productDate,
|
N_ITEM_STATE = a.qualityInspectionFlag,
|
S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "",
|
T_MODIFY = DateTime.Now
|
};
|
db.Insertable(item).ExecuteCommand();
|
});
|
WMSHelper.receiveUnloadConfirm(model.cntrNo, model.endLocation);
|
TaskProcess.InspectionAreaStockUpdate(model.cntrNo, model.endLocation);
|
locinfo.N_CURRENT_NUM = 1;
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
|
var cn = db.Queryable<Container>().Where(it => it.S_CODE == model.cntrNo).First();
|
if (cn == null)
|
{
|
var newcntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count };
|
db.Insertable(newcntr).ExecuteCommand();
|
}
|
else
|
{
|
cn.N_DETAIL_COUNT += model.data.Count;
|
db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
|
}
|
db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == model.cntrNo).ExecuteCommand();
|
}
|
else
|
{
|
var url = Settings.MoboxSeverUrl + "inventory/AddChange";
|
//仓库量表升量
|
var req1 = new AddChangeModel { op_type = 5 };
|
//库区量表升量
|
var req2 = new AddChangeModel { op_type = 6 };
|
foreach (var a in model.data)
|
{
|
var iteminfo = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
if (iteminfo != null)
|
{
|
LogHelper.Info($"填充数据");
|
LogHelper.Info($"添加仓库量表数据 仓库{locinfo.S_WH_CODE} 物料编码{a.itemCode} 物料名称{iteminfo.S_ITEM_NAME} 数量{a.qty}");
|
req1.item_info.Add(new AddChangeModel.itemModel
|
{
|
wh_code = locinfo.S_WH_CODE,
|
item_code = a.itemCode,
|
item_name = iteminfo.S_ITEM_NAME,
|
qty = a.qty
|
});
|
LogHelper.Info($"添加库区量表数据 库区{locinfo.S_AREA_CODE} 物料编码{a.itemCode} 物料名称{iteminfo.S_ITEM_NAME} 数量{a.qty}");
|
req2.item_info.Add(new AddChangeModel.itemModel
|
{
|
wh_code = locinfo.S_WH_CODE,
|
area_code = locinfo.S_AREA_CODE,
|
item_code = a.itemCode,
|
item_name = iteminfo.S_ITEM_NAME,
|
qty = a.qty
|
});
|
}
|
else
|
{
|
LogHelper.Info($"物料表中不包含物料编码{a.itemCode} 无法升量");
|
result.resultCode = 2;
|
result.resultMsg = $"物料表中不包含物料编码{a.itemCode} 无法升量";
|
return result;
|
}
|
};
|
var reqData = JsonConvert.SerializeObject(req1);
|
var AppKey = Settings.AppKey;
|
var AppSecret = Settings.AppSecret;
|
var ReqTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
//var ReqTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime}");
|
var ReqVerify = GetMd5FromString(AppKey + AppSecret + ReqTime);
|
LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime} ReqVerify={ReqVerify} url={url} req={reqData}");
|
var res = new HttpHelper().WebPost(url, reqData, "application/json", AppKey, ReqTime, ReqVerify);
|
if (!string.IsNullOrEmpty(res))
|
{
|
LogHelper.Info($"mobox 仓库升量接口返回 {res}");
|
var moboxres = JsonConvert.DeserializeObject<moboxres>(res);
|
if (moboxres.err_code != 0)
|
{
|
addchangeres = false;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"mobox 仓库升量接口返回为空");
|
addchangeres = false;
|
}
|
var reqData2 = JsonConvert.SerializeObject(req2);
|
var ReqTime2 = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
|
//var ReqTime2 = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2}");
|
var ReqVerify2 = GetMd5FromString(AppKey + AppSecret + ReqTime2);
|
LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2} ReqVerify={ReqVerify2} url={url} req={reqData2}");
|
var res2 = new HttpHelper().WebPost(url, reqData2, "application/json", AppKey, ReqTime2, ReqVerify2);
|
if (!string.IsNullOrEmpty(res2))
|
{
|
LogHelper.Info($"mobox 库区升量接口返回 {res2}");
|
var moboxres = JsonConvert.DeserializeObject<moboxres>(res);
|
if (moboxres.err_code != 0)
|
{
|
addchangeres = false;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"mobox 库区升量接口返回为空");
|
addchangeres = false;
|
}
|
var workNo = "";
|
if (addchangeres)
|
{
|
//添加上下架记录
|
foreach (var item in model.data)
|
{
|
|
}
|
|
var cntr = "";
|
var loc = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.endLocation).First();
|
if (loc != null)
|
{
|
cntr = loc.S_CNTR_CODE;
|
}
|
else
|
{
|
cntr = model.cntrNo;
|
}
|
//绑定托盘
|
if (cntr == model.cntrNo)
|
{
|
//添加物料明细
|
model.data.ForEach(a =>
|
{
|
workNo = a.inWorkNo;
|
var itemName = db.Queryable<TN_Material>().Where(it => it.S_ITEM_CODE == a.itemCode).First();
|
CntrItemRel item = new CntrItemRel
|
{
|
S_CNTR_CODE = cntr,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_ITEM_CODE = a.itemCode,
|
S_BATCH_NO = a.batchNo,
|
S_OWNER = a.factoryCode,
|
S_ERP_WH_CODE = a.stockLocation,
|
F_QTY = a.qty,
|
S_SUPPLIER_NO = a.vendorCode,
|
S_SERIAL_NO = a.serialNo,
|
D_PRD_DATE = a.productDate,
|
N_ITEM_STATE = a.qualityInspectionFlag,
|
S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "",
|
T_MODIFY = DateTime.Now
|
};
|
|
var info = new TN_OnOff_Shelves
|
{
|
S_NO = a.inWorkNo,
|
N_ACTION = 1,
|
S_ACTION = "上架",
|
S_ITEM_CODE = a.itemCode,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_LOC_CODE = model.endLocation,
|
S_AREA_CODE = locinfo.S_AREA_CODE,
|
S_CNTR_CODE = model.cntrNo,
|
S_BATCH_NO = a.batchNo,
|
S_SERIAL_NO = a.serialNo,
|
D_PRD_DATE = a.productDate,
|
F_QTY = a.qty
|
};
|
db.Insertable(info).ExecuteCommand();
|
|
db.Insertable(item).ExecuteCommand();
|
});
|
}
|
else
|
{
|
//合并物料
|
model.data.ForEach(it =>
|
{
|
var exp = Expressionable.Create<CntrItemRel>();
|
exp.And(a => a.S_ITEM_CODE == it.itemCode);
|
exp.And(a => a.S_CNTR_CODE == cntr);
|
exp.And(a => a.N_ITEM_STATE == it.qualityInspectionFlag);
|
exp.AndIF(!string.IsNullOrEmpty(it.batchNo), a => a.S_BATCH_NO == it.batchNo);
|
exp.AndIF(!string.IsNullOrEmpty(it.vendorCode), a => a.S_SUPPLIER_NO == it.vendorCode);
|
exp.AndIF(!string.IsNullOrEmpty(it.stockLocation), a => a.S_ERP_WH_CODE == it.stockLocation);
|
exp.AndIF(!string.IsNullOrEmpty(it.factoryCode), a => a.S_OWNER == it.factoryCode);
|
exp.AndIF(!string.IsNullOrEmpty(it.serialNo), a => a.S_SERIAL_NO == it.serialNo);
|
|
var item = db.Queryable<CntrItemRel>().Where(exp.ToExpression()).First();
|
if (item != null)
|
{
|
workNo = it.inWorkNo;
|
//修改数量
|
item.F_QTY = item.F_QTY + it.qty;
|
db.Updateable(item).UpdateColumns(k => new { k.F_QTY }).ExecuteCommand();
|
}
|
else
|
{
|
workNo = it.inWorkNo;
|
var itemName = db.Queryable<TN_Material>().Where(k => k.S_ITEM_CODE == it.itemCode).First();
|
item = new CntrItemRel
|
{
|
S_CNTR_CODE = cntr,
|
S_ITEM_NAME = itemName.S_ITEM_NAME,
|
S_ITEM_CODE = it.itemCode,
|
S_BATCH_NO = it.batchNo,
|
S_OWNER = it.factoryCode,
|
S_ERP_WH_CODE = it.stockLocation,
|
F_QTY = it.qty,
|
S_SUPPLIER_NO = it.vendorCode,
|
S_SERIAL_NO = it.serialNo,
|
D_PRD_DATE = it.productDate,
|
N_ITEM_STATE = it.qualityInspectionFlag,
|
S_ITEM_STATE = it.qualityInspectionFlag == 0 ? "未质检" : it.qualityInspectionFlag == 1 ? "质检合格" : it.qualityInspectionFlag == 2 ? "质检不合格" : "",
|
T_MODIFY = DateTime.Now
|
};
|
db.Insertable(item).ExecuteCommand();
|
}
|
});
|
|
}
|
|
|
if (loc == null)
|
{
|
LocCntrRel newloc = new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo };
|
db.Insertable(newloc).ExecuteCommand();
|
}
|
|
|
locinfo.N_CURRENT_NUM = 1;
|
db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
|
var cn = db.Queryable<Container>().Where(it => it.S_CODE == cntr).First();
|
if (cn == null)
|
{
|
var newcntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count };
|
db.Insertable(newcntr).ExecuteCommand();
|
}
|
else
|
{
|
cn.N_DETAIL_COUNT += model.data.Count;
|
db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
|
}
|
|
WCSTask task = new WCSTask { S_OP_CODE = workNo, S_CNTR_CODE = "", S_END_LOC = model.endLocation };
|
WMSHelper.OpState(task);
|
}
|
else
|
{
|
LogHelper.Info($"人工库升量失败");
|
result.resultCode = -1;
|
result.resultMsg = "人工库入库升量失败";
|
}
|
}
|
|
}
|
else
|
{
|
LogHelper.Info($"人工入库终点不存在");
|
result.resultCode = 1;
|
result.resultMsg = "人工入库终点不存在";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"人工库入库托盘和终点不能为空");
|
result.resultCode = 1;
|
result.resultMsg = "人工库入库托盘和终点不能为空";
|
}
|
}
|
|
db.Ado.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"码盘入库接口异常 异常信息={ex.Message}", ex);
|
result.resultCode = 3;
|
result.resultMsg = $"码盘入库接口异常 异常信息={ex.Message}";
|
db.Ado.RollbackTran();
|
}
|
|
|
|
|
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>();
|
}
|
}
|
|
|
private static string WeiLiGetType(string tasktype)
|
{
|
var result = "";
|
|
switch (tasktype)
|
{
|
case "1":
|
result = "码盘入库";
|
break;
|
case "2":
|
result = "备料入库";
|
break;
|
case "3":
|
result = "分拣回";
|
break;
|
}
|
|
return result;
|
}
|
|
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 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; }
|
}
|
}
|
}
|