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
{
///
/// api接口辅助类
///
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();
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 model)
{
WeiLiResult result = new WeiLiResult();
var db = new SqlHelper().GetInstance();
if (model.Count > 0)
{
model.ForEach(a =>
{
var info = db.Queryable().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(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().SetColumns(it => new TN_Material() { S_ITEM_NAME = a.itemName }).Where(it => it.S_ITEM_CODE == a.itemCode).ExecuteCommand();
//db.Updateable().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 model)
{
WeiLiResult result = new WeiLiResult();
var db = new SqlHelper().GetInstance();
if (model.Count > 0)
{
model.ForEach(a =>
{
var info = db.Queryable().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(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().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().Where(a => a.S_CODE == model.TaskNo).First();
if (taskinfo == null)
{
var startinfo = db.Queryable().Where(a => a.S_CODE == model.startBit).First();
var endinfo = db.Queryable().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().Where(a => a.S_LOC_CODE == startinfo.S_CODE).First();
LogHelper.Info("查询起点是否绑定托盘");
if (startloccntr == null)
{
LogHelper.Info("起点未绑定托盘 准备绑定托盘");
//绑定起点托盘
LocationHelper.BindingLoc(model.startBit, new List() { 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().GetInstance();
var wmsTask = db.Queryable().Where(a => a.S_CODE == model.OperationNo).First();
if (wmsTask != null)
{
LogHelper.Info($"清除错误作业 解绑托盘 托盘{wmsTask.S_CNTR_CODE}");
db.Deleteable().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand();
db.Deleteable().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand();
var locInfo = db.Queryable().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().GetInstance();
TaskStateresutl result = new TaskStateresutl { success = false, code = 0 };
if (!string.IsNullOrEmpty(model.taskNo))
{
var info = db.Queryable().Where(a => a.S_OP_CODE == model.taskNo).First();
if (info != null)
{
var TaskStates = db.Queryable().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().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().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().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
if (cntrinfo != null)
{
var start = db.Queryable().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().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().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() };
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(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().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
if (cntrinfo != null)
{
var start = db.Queryable().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(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(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().GetInstance();
var OutWork = db.Queryable().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().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().GetInstance();
try
{
if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.isVerify))
{
if (model.isVerify == "Y")
{
var task = db.Queryable().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 AreaQuery()
{
var result = new List();
var db = new SqlHelper().GetInstance();
var list = db.Queryable ().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().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().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().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().Where(a => a.S_CODE == wcsTask.S_START_LOC).First();
}
else
{
var endArea = Setting.ErrorArea;
endLoc = db.Queryable().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().Where(a => a.S_CODE == wcsTask.S_OP_CODE).First();
if (wmsTask != null)
{
var PlcTask = db.Queryable().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().Where(a => a.S_CODE == task.S_OP_CODE).First();
var locinfo = db.Queryable().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().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().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().GetInstance();
var nolist = model.out_no.Split(',').ToList();
nolist.ForEach(a =>
{
var OutboundOrder = db.Queryable().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().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> 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().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().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().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> 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().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().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().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().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().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().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().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().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().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() { model.cntrNo });
var cntrInfo = db.Queryable().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().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().GetInstance();
var exp = Expressionable.Create();
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().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().Where(a => a.S_CNTR_CODE == cntr).First();
if (info != null)
{
var locinfo = db.Queryable().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();
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().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();
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().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().GetInstance();
var cntrlist = db.Queryable().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().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().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().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().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().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
if (locinfo != null)
{
var startLoc = db.Queryable().Where(a => a.S_CODE == locinfo.S_LOC_CODE).First();
if (startLoc != null)
{
var DuiDuoPeiz = db.Queryable().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().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()
.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().Where(it => it.S_LOC_CODE == item.S_CODE).First();
if (locinfo != null)
{
var lociteminfo = db.Queryable().Where(it => it.S_CNTR_CODE == locinfo.S_CNTR_CODE).First();
if (lociteminfo == null)
{
var DuiDuoPeiz = db.Queryable().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().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().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().GetInstance();
//var tasks = db.Queryable().Where(a => a.S_OP_CODE == model.orderNo).ToList();
//if (tasks.Count >= 1)
//{
// //流程任务数量执行超过一条 任务不允许取消
// result.code = 500;
// result.msg = "流程任务执行中途不允许取消";
// return result;
//}
//var task = db.Queryable().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().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().GetInstance();
var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrCode).First();
if (cntrinfo != null)
{
var startinfo = db.Queryable().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().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().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().GetInstance();
var task = db.Queryable().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().GetInstance();
var itemstate = model.qualityState == 0 ? "未质检" : model.qualityState == 1 ? "质检合格" : model.qualityState == 2 ? "质检不合格" : "";
try
{
var exp = Expressionable.Create();
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().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().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().Where(a => a.S_CNTR_CODE == model.cntrCode).First();
var locinfo = db.Queryable().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().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().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().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().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() { 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().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();
if (model.data.Count > 0)
{
foreach (var a in model.data)
{
var item = db.Queryable().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();
if (model.data.Count > 0)
{
foreach (var a in model.data)
{
var item = db.Queryable().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().Where(it => it.S_ASN_NO == model.receivingNoteNo).ExecuteCommand();
db.Insertable(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().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();
if (model.data.Count > 0)
{
foreach (var a in model.data)
{
var item = db.Queryable().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().GetInstance();
try
{
if (!string.IsNullOrEmpty(model.receivingNoteNo))
{
if (model.data.Count > 0)
{
model.data.ForEach(a =>
{
db.Updateable()
.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().GetInstance();
//创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中
//创建入库单主子表
//var po = WMSHelper.GetShippingOrder(model.shippingNoteNo);
try
{
db.BeginTran();
var po = WMSHelper.GetOutboundOrder(model.shippingNoteNo);
if (po == null)
{
Dictionary> OutGroupList = new Dictionary>();
foreach (var a in model.data)
{
var item = db.Queryable().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 { 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 { 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();
item.Value.ForEach(a =>
{
var itemInfo = db.Queryable().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();
//if (model.data.Count > 0)
//{
// foreach (var a in model.data)
// {
// var item = db.Queryable().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().GetInstance();
try
{
if (!string.IsNullOrEmpty(model.cntrNo))
{
var iteminfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
if (iteminfo != null) workNo = iteminfo.S_BS_NO;
var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First();
if (cntrinfo != null)
{
var startinfo = db.Queryable().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().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().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().GetInstance();
var req = new ReceivingNoteSerialNo();
try
{
if (model.isTask == "Y")
{
if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.startLoction))
{
var start = db.Queryable().Where(it => it.S_CODE == model.startLoction).First();
if (start != null && start.N_LOCK_STATE == 0)
{
var cntrinfo = db.Queryable().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();
//通过料框初始化数据 料框号进行匹配终点库区
//创建作业
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().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().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().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 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();
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();
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().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().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();
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().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().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().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(feedback);
// if (weilires.code == 200)
// {
// LogHelper.Info($"接口反馈成功");
// db.Deleteable().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().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() { model.cntrNo });
var cntrInfo = db.Queryable().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().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().Where(a => a.S_CODE == model.endLocation).First();
if (locinfo != null)
{
if (model.needInspect == "Y")
{
//检验区人工入库 绑定托盘 无需绑定物料
var cntrInfo = db.Queryable().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 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();
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();
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().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();
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().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().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().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().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().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(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(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().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().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();
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().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().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().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 data { get; set; } = new List();
public class serial
{
public string rowID { get; set; }
public List serialNo { get; set; } = new List();
}
}
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();
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;
}
///
/// 后面要把方法放到wmsHelper中
///
///
///
internal static SimpleResult SortingResultCheck(List models)
{
//生成分拣结果,更新分拣明细状态
var result = new SimpleResult();
WMSHelper.SortingConfrim(models);
return result;
}
///
/// 后面要把方法放到wmsHelper中
///
///
///
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().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("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
{
///
/// 生产订单内码
///
public string FInterID { get; set; }
///
/// 生产订单编号
///
public string FSourceNo { get; set; }
///
/// 批号
///
public string FGMPBatchNo { get; set; }
public string FState { get; set; }
///
/// 物料编码(内码就是编码)
///
public string Fitemid_XK { get; set; }
///
/// 分录id
///
public string Fentryid { get; set; }
}
public class NoteInfo : CodeInfo
{
public string WmsBillNo { get; set; }
}
}
}