using HH.WMS.BLL.Basic;
using HH.WMS.BLL.InStock;
using HH.WMS.BLL.Interface;
using HH.WMS.BLL.SysMgr;
using HH.WMS.Common;
using HH.WMS.Common.External;
using HH.WMS.Common.Response;
using HH.WMS.DAL;
using HH.WMS.DAL.Algorithm;
using HH.WMS.DAL.Basic;
using HH.WMS.DAL.SysMgr;
using HH.WMS.DAL.Tzlj;
using HH.WMS.Entitys;
using HH.WMS.Entitys.Basic;
using HH.WMS.Entitys.Entitys;
using HH.WMS.Entitys.External;
using HH.WMS.Entitys.Tzlj;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HH.WMS.BLL.External
{
///
/// 泰州隆基
///
public class WmsApiForHsBLL : WmsApiBaseBLL
{
#region InWorkArea
public override ExecuteInWorkAreaPara InWorkAreaHandlePara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara)
{
//任务号 考虑是否重复?
if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo))
{
var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
executeInWorkAreaPara.InWorkAreaEntity.taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo))
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM入库任务号异常,请检查是否维护生成规则!");
return executeInWorkAreaPara;
}
}
//托盘码
if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode))
{
var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
executeInWorkAreaPara.InWorkAreaEntity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode))
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("生成虚拟托盘号异常,请检查是否维护生成规则!");
return executeInWorkAreaPara;
}
}
//判断起点是否为单拖下线料口,如果是就要判断是否需要叠托(隆基特有业务)
string singleBit = string.Empty;
try
{
singleBit = System.Configuration.ConfigurationManager.AppSettings["singleBit"].ToString();
}
catch (Exception ep)
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("异常:获取webconfig中singleBit配置异常!" + ep.Message);
return executeInWorkAreaPara;
}
if (string.IsNullOrEmpty(singleBit))
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请在webconfig中配置输送线单托下线位置!");
return executeInWorkAreaPara;
}
List lstSingleBit = new List(singleBit.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries));
if (lstSingleBit.Contains(executeInWorkAreaPara.InWorkAreaEntity.startBit))
{
if (executeInWorkAreaPara.InWorkAreaEntity.data == null)
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("单拖下线点请传物料信息!");
return executeInWorkAreaPara;
}
//判断是否满足叠托规则,满足则直接搬运至某个点,不满足搬运至高架库
List trayLocation = new List();
var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara);
if (workAreaProList.Any())
{
executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList;
}
string areaCode = string.Empty;
if (executeInWorkAreaPara.WorkAreaProEntitys.Count > 0)
{
areaCode = executeInWorkAreaPara.WorkAreaProEntitys[0].CN_S_END_AREA_CODE;
}
else
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请配置单拖下线点到高架库的作业流程!");
return executeInWorkAreaPara;
}
if (executeInWorkAreaPara.InWorkAreaEntity.data[0].POType == "A" || executeInWorkAreaPara.InWorkAreaEntity.data[0].POType == "D")
{
//分布式订单需要增加判断色系是否一致
var item = executeInWorkAreaPara.InWorkAreaEntity.data[0];
trayLocation = CreateDAL().GetNeedDoubleTray(areaCode, item.CustomerName, item.Power, item.CurrentLevel, item.Level, item.Color, item.POType,item.moduleType);
}
else
{
var item = executeInWorkAreaPara.InWorkAreaEntity.data[0];
trayLocation = CreateDAL().GetNeedDoubleTray(areaCode, item.CustomerName, item.Power, item.CurrentLevel, item.Level, "", item.POType, item.moduleType);
}
Log.Detail(logPara, "判断是否满足叠托规则-trayLocation!" + JsonConvert.SerializeObject(trayLocation));
if (trayLocation.Count > 0)
{
//下达从高架库到双托上料口的任务
List outWorkAreaDouble = new List();
var doubleOut = new OutWorkAreaEntity
{
IsTransport = "N",
startBit = trayLocation[0].CN_S_LOCATION_CODE,
endBit = executeInWorkAreaPara.InWorkAreaEntity.endBit,
projectCode = "tzlj",
trayCode = trayLocation[0].CN_S_TRAY_CODE,
needCreateAMSTask = "Y"
};
outWorkAreaDouble.Add(doubleOut);
var logPara1 = LogType.LogPara("高架库双托出库");
var result = BLLCreator.Create().OutWorkArea(outWorkAreaDouble, logPara1);
if (!result.success)
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("从高架库位置:" + trayLocation[0].CN_S_LOCATION_CODE + "下达双托出库任务失败,具体原因为:" + result.errMsg);
return executeInWorkAreaPara;
}
StringBuilder sbRemark = new StringBuilder();
var item = executeInWorkAreaPara.InWorkAreaEntity.data[0];
//查询托盘产品关联信息子表
sbRemark.Append(item.CustomerName);
sbRemark.Append(",");
sbRemark.Append(item.Power);
sbRemark.Append(",");
sbRemark.Append(item.CurrentLevel);
sbRemark.Append(",");
sbRemark.Append(item.Level);
sbRemark.Append(",");
sbRemark.Append(item.POType);
sbRemark.Append(",");
sbRemark.Append(item.Color);
sbRemark.Append(",");
sbRemark.Append(item.itemModel);
executeInWorkAreaPara.InWorkAreaEntity.remark = sbRemark.ToString();
//将data设置为null 防止托盘物料关联表产生垃圾数据
executeInWorkAreaPara.InWorkAreaEntity.data = null;
}
else
{
//标记需要绑定托盘
executeInWorkAreaPara.InWorkAreaEntity.remark = "Y";
executeInWorkAreaPara.InWorkAreaEntity.endBit = "";
}
}
if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.endBit))
{
executeInWorkAreaPara.EndLocationEntity = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.endBit);
if (executeInWorkAreaPara.EndLocationEntity != null)
{
executeInWorkAreaPara.EndStockAreaEntity = DALCreator.Create().GetStockAreaEntity(executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE);
if (executeInWorkAreaPara.EndStockAreaEntity == null)
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + ",库区:" + executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE + "未找到库区信息!");
return executeInWorkAreaPara;
}
}
else
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "未找到货位信息!");
return executeInWorkAreaPara;
}
// 检查货位状态 管控数量时使用
if (executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y"))
{
executeInWorkAreaPara.EndLocationExt = BLLCreator.Create().GetModel(" where CN_S_LOCATION_CODE = '" + executeInWorkAreaPara.InWorkAreaEntity.endBit.Trim() + "'").FirstOrDefault();
if (!executeInWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE.Equals("正常"))
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位状态为" + executeInWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE + ",货位不可用!");
return executeInWorkAreaPara;
}
if (!executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE.Equals("空"))
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位存储状态为" + executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE + ",货位不可用!");
return executeInWorkAreaPara;
}
//}
//锁定终点货位
OperateResult lockResult = BLLCreator.Create().UpdateState(executeInWorkAreaPara.InWorkAreaEntity.endBit, "预入库锁定", "正常");
if (lockResult.Success && lockResult.AffectedRows > 0)
{
AutoBomLocationEntity locationModel = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.endBit);
//添加货位状态变化
BLLCreator.Create().AddStateChange(executeInWorkAreaPara.InWorkAreaEntity.endBit, "正常", "预入库锁定", "入库并且转运需要锁定终点货位防止其他资源竞争", executeInWorkAreaPara.InWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
executeInWorkAreaPara.RollbackLocations.Add(executeInWorkAreaPara.InWorkAreaEntity.endBit);
}
else
{
if (!lockResult.Success)
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "失败!详细原因为:" + lockResult.Msg);
}
else
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "失败!详细原因为:SqlExecuteResult影响行数为0");
}
return executeInWorkAreaPara;
}
}
}
return executeInWorkAreaPara;
}
public override ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara)
{
//获取作业区列表
var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara);
if (workAreaProList.Any())
{
if (executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A1") >= 0 || executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A3") >= 0)
{
executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "A1A3").OrderBy(a => a.CN_N_PRIORITY).ToList();
}
else if (executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A2") >= 0 || executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A4") >= 0)
{
executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "A2A4").OrderBy(a => a.CN_N_PRIORITY).ToList();
}
else
{
executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.OrderBy(a => a.CN_N_PRIORITY).ToList();
}
}
else
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到该起点库区到终点库区的作业流转流程!");
return executeInWorkAreaPara;
}
return executeInWorkAreaPara;
}
public override ExecuteInWorkAreaPara InWorkAreaProcedure(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara)
{
var result = UseTransaction(trans =>
{
InWorkAreaProcedureFunc(executeInWorkAreaPara, trans, logPara);
if (executeInWorkAreaPara.InWorkAreaEntity.needCreateAMSTask == "Y")
{
OperateResult re = new OtherSysApi().SendAmsCreateTaskLJ(executeInWorkAreaPara.TransportEntity);
if (!re.Success)
{
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
}
}
});
if (result.Success)
{
executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask()
{
index = executeInWorkAreaPara.index,
taskNo = executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO,
startStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE,
startArea = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA,
startBit = executeInWorkAreaPara.TransportEntity.CN_S_START_BIT,
endStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE,
endArea = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA,
endBit = executeInWorkAreaPara.TransportEntity.CN_S_END_BIT,
priority = executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY,
trayCode = executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE,
startAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE,
endAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE
});
}
else
{
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + result.Msg);
}
return executeInWorkAreaPara;
}
public override void InWorkAreaProcedureFunc(ExecuteInWorkAreaPara executeInWorkAreaPara, IDbTransaction trans, LogPara logPara)
{
Log.Detail(logPara, "入库执行存储过程!");
#region 废弃代码
//if (executeInWorkAreaPara.mesStackTrayItemDto != null)
//{
// //删除托盘产品关联
// CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans);
// var trayItemMstGuid = Guid.NewGuid().ToString();
// var transResult = CreateDAL().AddMst(new TN_WM_B_TRAY_ITEM_MSTEntity
// {
// CN_GUID = trayItemMstGuid,
// CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode,
// CN_S_ITEM_CODE = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_CODE,
// CN_S_ITEM_NAME = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_NAME,
// CN_S_ITEM_STATE = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_STATE,
// CN_F_QUANTITY = 1,
// CN_S_MEASURE_UNIT = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_MEASURE_UNIT,
// CN_F_ALLOC_QTY = 0,
// CN_S_MODEL = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_MODEL,
// CN_S_FIGURE_NO = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_FIGURE_NO,
// CN_S_TRAY_GRID = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_TRAY_GRID,
// CN_S_OWNER = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_OWNER,
// }, trans);
// if (!transResult.Success)
// {
// trans.Rollback();
// return;
// }
// //添加托盘物料关联子表
// var curResult = CreateDAL().AddDtl(new List()
// {
// new TN_WM_B_TRAY_ITEM_DTLEntity{
// CN_PARENT_GUID = trayItemMstGuid,
// CN_S_LOT_NO = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_LOT_NO,
// CN_S_UNIQUE_CODE = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_UNIQUE_CODE,
// CN_S_PACKING_UNIT = "",
// CN_F_PACKING_QTY = 1,
// CN_F_QUANTITY = 1,
// CN_T_PRODUCTION = DateTime.Now,
// CN_S_CREATOR = "hh",
// CN_S_CREATOR_BY = "",
// CN_T_CREATE = DateTime.Now,
// CN_GUID = Guid.NewGuid().ToString(),
// sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' ",
// CN_S_SERIAL_NO = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_SERIAL_NO,
// CN_S_PRODUCTION_BATCH = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_PRODUCTION_BATCH,
// CN_S_EXT1 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT1,
// CN_S_EXT2 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT2,
// CN_S_EXT3 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT3
// }
// }, trans);
// transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message };
// if (!transResult.Success)
// {
// trans.Rollback();
// return;
// }
//}
#endregion
if (executeInWorkAreaPara.InWorkAreaEntity.data != null)
{
if (executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0)
{
//删除托盘产品关联
CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans);
foreach (var item in executeInWorkAreaPara.InWorkAreaEntity.data)
{
var trayItemMstGuid = Guid.NewGuid().ToString();
//添加托盘物料关联主表
Log.Detail(logPara, "executeInWorkAreaPara.InWorkAreaEntity.data:" + JsonConvert.SerializeObject(item));
//string measuerUnit = item.l + "," + item.width + "," + item.height + "," + item.packInQty;
if (item.itemModel == null)
{
item.itemModel = "";
}
var transResult = CreateDAL().AddMst(new TN_WM_B_TRAY_ITEM_MSTEntity
{
CN_GUID = trayItemMstGuid,
CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode,
//客户名称
CN_S_ITEM_CODE = item.CustomerName,
//色系
CN_S_ITEM_NAME = item.Color,
//订单类型
CN_S_ITEM_STATE = item.POType,
//电流档
CN_S_OWNER = item.CurrentLevel,
//组件等级
CN_S_FIGURE_NO = item.Level,
CN_F_QUANTITY = item.qty,
CN_F_ALLOC_QTY = item.qty,
//标称功率
CN_S_MODEL = item.Power,
//存放长度、宽度、高度、数量拼接起来的4个字段
CN_S_MEASURE_UNIT = item.itemModel
}, trans);
if (!transResult.Success)
{
trans.Rollback();
return;
}
//添加托盘物料关联子表
var curResult = CreateDAL().AddDtl(new List()
{
new TN_WM_B_TRAY_ITEM_DTLEntity{
CN_PARENT_GUID = trayItemMstGuid,
CN_S_LOT_NO = item.lotNo,
CN_S_UNIQUE_CODE = item.uniqueCode,
CN_S_PACKING_UNIT = item.itemPackUnit,
CN_F_PACKING_QTY = item.qty,
CN_F_QUANTITY = item.qty,
CN_T_PRODUCTION = item.productionDate,
CN_S_CREATOR = "hh",
CN_S_CREATOR_BY = "",
CN_T_CREATE = DateTime.Now,
CN_GUID = Guid.NewGuid().ToString(),
sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' "
}
}, trans);
//Log.Detail(logPara, "curResult:" + JsonConvert.SerializeObject(curResult));
transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message };
if (!transResult.Success)
{
trans.Rollback();
return;
}
}
}
}
var transport = executeInWorkAreaPara.TransportEntity;
//创建任务
var operateResult = BLLCreator.Create>().Add(new TN_WM_TASKEntity
{
CN_S_TASK_NO = transport.CN_S_TASK_NO,
CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE,
CN_S_START_BIT = transport.CN_S_START_BIT,
CN_S_END_BIT = transport.CN_S_END_BIT,
//CN_S_PRO_CODE = transport.CN_S_PRO_CODE,
CN_S_STATE = transport.CN_S_STATE,
CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO,
CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO,
CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE,
CN_S_START_AREA = transport.CN_S_START_AREA,
CN_S_END_AREA = transport.CN_S_END_AREA,
CN_N_PRIORITY = transport.CN_N_PRIORITY,
CN_S_CREATOR = transport.CN_S_CREATOR,
CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY,
CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE),
CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY),
CN_S_REMARK = transport.CN_S_REMARK,
//CN_C_IS_AUTO = transport.CN_C_IS_AUTO,
CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE,
CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY,
CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY,
CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV,
CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV,
CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE,
CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE,
CN_S_EXT2 = transport.CN_S_REMARK,
CN_S_FROM_OP = "入库/转运"
//CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode
}, trans);
//更新结束点的任务号
if (executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_END_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans);
}
//if (executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("立库")){}
//更新起点的任务号
if (executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY.Equals("Y")) //&& executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y")
{
CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans);
}
}
#endregion
#region ExecuteState
public ExternalResponse OutWorkAreaLj(List outWorkAreaList, LogPara logPara)
{
Log.Detail(logPara, "OutWorkArea接口请求参数-隆基:" + JsonConvert.SerializeObject(outWorkAreaList));
var response = new ExternalResponse();
if (outWorkAreaList == null) return new ExternalResponse { success = false, errMsg = "参数不正确" };
for (var i = 0; i < outWorkAreaList.Count; i++)
{
if (string.IsNullOrEmpty(outWorkAreaList[i].sysName))
{
outWorkAreaList[i].sysName = "AMS";
}
Log.Detail(logPara, "循环OutWorkArea接口请求参数-隆基:准备进入OutWorkAreaLj方法");
var result = OutWorkAreaLj(outWorkAreaList[i], logPara);
if (result.BasisResponse.Success)
{
response.success = true;
response.okList.Add(result.TaskExecuteState.okTask);
}
else
{
response.failList.Add(new TaskExecuteState().Error(i, result.BasisResponse.Message).FailTask);
if (result.RollLocations.Count > 0)
{
foreach (string sLocation in result.RollLocations)
{
BLLCreator.Create().UpdateState(sLocation, Constants.Location_State_Normal, "");
AutoBomLocationEntity locationModel = CreateDAL().GetModel(sLocation);
BLLCreator.Create().AddStateChange(sLocation, "", "正常", "出库请求失败回滚过程中锁定的货位", outWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
}
}
}
}
var curResult = response.failList.Any() ? response.Error(null, string.Empty, outWorkAreaList) : response.Ok(null, outWorkAreaList);
Log.Detail(logPara, "OutWorkArea接口返回参数:" + curResult);
return curResult;
}
public ExecuteOutWorkAreaPara OutWorkAreaLj(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara)
{
Log.Detail(logPara, "进入隆基OutWorkArea方法");
var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity };
try
{
if (!OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
if (!OutWorkAreaHandlePara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
//算法计算货位
if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit))
{
OutWorkAreaCalculateLoaction(ref executeOutWorkAreaPara, logPara);//new ExternalOutWorkAreaBLL().CalculateLoaction(executeOutWorkAreaPara);
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
if (!executeOutWorkAreaPara.TransportList.Any())
{
OutWorkAreaOutAss(ref executeOutWorkAreaPara, logPara);
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
}
}
else
{
//创建转运任务
var entity = new TN_WM_TRANSPORT_TASKEntity
{
CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo,
CN_S_CIR_OBJ = "托盘",
CN_S_CIR_OBJ_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode,
CN_S_START_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.startBit,
CN_S_START_AREA = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE,
CN_S_STATE = Constants.TaskStateList[0],
CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority,
CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea,
CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit,
CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock,
CN_S_TASK_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库",
CN_S_QTY_INDEX = "1",
CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY,
CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE,
CN_C_START_IS_CONTROL_QTY = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY,
CN_S_START_AREA_TYPE = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE,
CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY,
CN_S_START_CONTROL_INV = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY,
CN_S_REMARK = executeOutWorkAreaPara.OutWorkAreaEntity.remark
};
executeOutWorkAreaPara.TransportList.Add(entity);
}
if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit))
{
if (!InWorkAreaOutAss(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
}
UseTransaction(trans =>
{
OutWorkAreaCreateTask(ref executeOutWorkAreaPara, logPara);
OutWorkAreaProcedure(ref executeOutWorkAreaPara, logPara);
if (executeOutWorkAreaPara.OutWorkAreaEntity.needCreateAMSTask == "Y")
{
OperateResult re = new OtherSysApi().SendAmsCreateTaskLJ(executeOutWorkAreaPara.TransportList[0]);
if (!re.Success)
{
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
}
}
});
}
catch (Exception ex)
{
executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("OutWorkAreaLj 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace));
}
return executeOutWorkAreaPara;
}
public override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara)
{
// var isControlStockQty = executeStatePara.trayItemMsts.Count > 0;
var isControlStockQty = false;
Log.Detail(logPara, "isControlStockQty: " + isControlStockQty);
#region 组合量表参数
//获取上架量=总量-分配量
//var trayInventory = CreateDAL().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE);
var addAreaQty = new List();
var addStockQty = new List();
if (isControlStockQty)
{
foreach (var trayItemMst in executeStatePara.trayItemMsts)
{
foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
{
addAreaQty.Add(new TN_WM_B_AREA_QTYEntity()
{
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
CN_S_OWNER = trayItemMst.CN_S_OWNER,
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH,
CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO,
CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//.CN_S_WEIGHT,//重量 Convert.ToDecimal(trayItemMst.CN_F_INQTY),//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY,
CN_S_MODEL = trayItemMst.CN_S_MODEL,
CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT,
CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1
});
addStockQty.Add(new TN_WM_B_STOCK_QTYEntity()
{
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME,
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
CN_S_OWNER = trayItemMst.CN_S_OWNER,
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH,
CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO,
CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//CN_S_WEIGHT,//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY,
CN_S_MODEL = trayItemMst.CN_S_MODEL,
CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1,
CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT
});
}
}
Log.Detail(logPara, LogDescribe.Content(addAreaQty));
Log.Detail(logPara, LogDescribe.Content(addStockQty));
}
#endregion
return UseTransaction(trans =>
{
//更新任务状态
CreateDAL>().Update(new
{
CN_S_MODIFY = "",
CN_S_MODIFY_BY = "",
CN_T_END = DateTime.Now,
CN_T_MODIFY = DateTime.Now,
CN_S_STATE = executeStatePara.taskState
}, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans);
Log.Detail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.CN_S_TASK_NO + "状态为:" + executeStatePara.taskState);
#region 入库 + 转运
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
{
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
if (executeStatePara.startTrayLocation != null)
{
//解绑托盘与货位的关系
CreateDAL>().Delete(new
{
executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
}, trans);
Log.Detail(logPara, "解绑任务的托盘和起点货位关联!");
#region 下架记录
CompleteTaskDownHistory(executeStatePara, logPara, trans);
#endregion
}
if (executeStatePara.endTrayLocation == null)
{
//添加托盘货位
if (executeStatePara.transportTask.CN_S_EXT2 != "N")
{
CreateDAL>().Add(trayLocation, trans);
Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation));
}
CompleteTaskUpHistory(executeStatePara, logPara, trans);
//终点
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
//起点
if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
{
// BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, Constants.Location_State_Normal, Constants.Location_State_OutLock, trans);
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
Log.Detail(logPara, "更新预出库锁定的货位状态为正常,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 出库
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库"))
{
if (executeStatePara.startTrayLocation != null)
{
BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara);
BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara);
//if (isControlStockQty)
//{
// #region 添加下架记录,降库存
// CompleteTaskDownHistory(executeStatePara, logPara, trans);
// if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
// {
// BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara);
// if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
// BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara);
// }
// #endregion
//}
CompleteTaskDownHistory(executeStatePara, logPara, trans);
if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara);
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 上架
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架"))
{
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
if (executeStatePara.endTrayLocation == null)
{
//添加托盘货位
var addResult = BLLCreator.Create().Add(trayLocation, trans, logPara);
Log.Detail(logPara, "添加托盘货位结果:" + JsonConvert.SerializeObject(addResult));
//CreateDAL>().Add(trayLocation, trans);
if (isControlStockQty)
{
//获取配置是否启用收货区
var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood);
#region 添加上架记录,升库存
CompleteTaskUpHistory(executeStatePara, logPara, trans);
if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV))
{
trans.Rollback();
return;
}
//启用收货区
if (strategyValue.Equals(Constants.Y))
{
Log.Detail(logPara, "启用收货区!");
//降低起始库区(收货区)库存
CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y"))
{
//增加结束库区量
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
}
}
else
{
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y"))
{
//按未入库量增加结束库区量
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
{
//升仓库库存
CreateDAL().AddStockQty(addStockQty, trans);
Log.Detail(logPara, "增加仓库量表完成!");
}
}
}
#endregion
}
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
////更新终点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans);
//Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
//解绑托盘与货位的关系
CreateDAL>().Delete(new
{
executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
}, trans);
Log.Detail(logPara, "解绑任务的托盘和起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "关联!");
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
////更新起点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT });
//Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 下架/叫料
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料"))
{
if (executeStatePara.startTrayLocation != null)
{
BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara);
if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("N"))
{
BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara);
}
if (isControlStockQty)
{
#region 添加下架记录,降库存
CompleteTaskDownHistory(executeStatePara, logPara, trans);
//获取配置是否启用收货区
var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood);
if (strategyValue.Equals(Constants.Y))
{
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
{
CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
}
//增加终点库区(收货区)库存
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
}
else
{
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
{
BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara);
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara);
}
}
#endregion
}
if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara);
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
//添加托盘货位
CreateDAL>().Add(trayLocation, trans);
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
////更新终点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT });
//Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 空托入(上架)
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入"))
{
Log.Detail(logPara, "开始执行空托入!");
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
Log.Detail(logPara, "endTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.endTrayLocation));
if (executeStatePara.endTrayLocation == null)
{
//添加托盘货位
CreateDAL>().Add(trayLocation, trans);
if (isControlStockQty)
{
//获取配置是否启用收货区
var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood);
#region 添加上架记录,升库存
CompleteTaskUpHistory(executeStatePara, logPara, trans);
if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV))
{
trans.Rollback();
return;
}
//启用收货区
if (strategyValue.Equals(Constants.Y))
{
Log.Detail(logPara, "启用收货区!");
//降低起始库区(收货区)库存
CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y"))
{
//增加结束库区量
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
}
}
else
{
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y"))
{
//按未入库量增加结束库区量
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
{
//升仓库库存
CreateDAL().AddStockQty(addStockQty, trans);
Log.Detail(logPara, "增加仓库量表完成!");
}
}
}
#endregion
}
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
////更新终点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT });
//Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
//解绑托盘与货位的关系
CreateDAL>().Delete(new
{
executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
}, trans);
Log.Detail(logPara, "解绑任务的托盘和起点货位关联!");
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
////更新起点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT });
//Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 空托出(下架)
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出"))
{
Log.Detail(logPara, "开始执行空托出!");
Log.Detail(logPara, "startTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.startTrayLocation));
if (executeStatePara.startTrayLocation != null)
{
//解绑托盘与货位的关系
CreateDAL>().Delete(new
{
executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
}, trans);
Log.Detail(logPara, "解绑任务的托盘和起点货位关联!");
////删除托盘产品关联
//CreateDAL().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ");
//Log.Detail(logPara, "删除当前任务的托盘物料关联!");
if (isControlStockQty)
{
#region 添加下架记录,降库存
CompleteTaskDownHistory(executeStatePara, logPara, trans);
//获取配置是否启用收货区
var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood);
if (strategyValue.Equals(Constants.Y))
{
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
{
CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
}
//增加终点库区(收货区)库存
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
}
else
{
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
{
CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
{
//降低仓库库存
CreateDAL().ReduceStockQty(addStockQty, trans);
Log.Detail(logPara, "降低仓库量表完成!");
}
}
}
#endregion
}
if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起始货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
////更新起点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT });
//Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
////添加托盘货位
//CreateDAL>().Add(trayLocation, trans);
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "空", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
////更新终点货位的任务号
//CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT });
//Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!");
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
#region 移库
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库"))
{
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
{
CN_GUID = Guid.NewGuid().ToString(),
CN_N_INDEX = 1,
CN_S_CREATOR = "",
CN_S_CREATOR_BY = "",
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_T_CREATE = DateTime.Now
};
if (executeStatePara.startTrayLocation != null)
{
//解绑托盘与货位的关系
CreateDAL>().Delete(new
{
executeStatePara.transportTask.CN_S_TRAY_CODE,
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
}, trans);
Log.Detail(logPara, "解绑任务的托盘和起点货位关联!");
}
if (executeStatePara.endTrayLocation == null)
{
//添加托盘货位
CreateDAL>().Add(trayLocation, trans);
Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation));
if (isControlStockQty)
{
#region 下架记录
CompleteTaskDownHistory(executeStatePara, logPara, trans);
#endregion
#region 上架记录
CompleteTaskUpHistory(executeStatePara, logPara, trans);
if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV))
{
Log.Detail(logPara, "终点库区" + executeStatePara.transportTask.CN_S_END_AREA + "不管控库存!executeStatePara.transportTask.CN_S_END_CONTROL_INV:" + executeStatePara.transportTask.CN_S_END_CONTROL_INV);
trans.Rollback();
return;
}
#endregion
#region 库存
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) //降低起点库存
{
CreateDAL().ReduceAreaQtyAndAllocQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
}
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) //增加终点库存
{
//按未入库量增加结束库区量
CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
}
#endregion
}
//终点
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
}
//起点
if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
{
CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
//货位状态变化
BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
}
}
}
#endregion
});
}
public override void CompleteTaskDownHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans)
{
var downHis = new List();
foreach (var trayItemMst in executeStatePara.trayItemMsts)
{
downHis.Add(new TN_WM_DOWN_HISTORYEntity
{
CN_GUID = Guid.NewGuid().ToString(),
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT,
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE,
CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID,
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME,
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO,
CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,//CN_S_WEIGHT,//.CN_F_QUANTITY,
CN_S_MODEL = trayItemMst.CN_S_MODEL,
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA,
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
CN_T_CREATE = DateTime.Now,
CN_T_MODIFY = DateTime.Now,
CN_S_OWNER = "",
CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT,
CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR,
CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY,
CN_S_MODIFY = "",
CN_S_MODIFY_BY = "",
CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE,
CN_S_EXT1 = trayItemMst.CN_S_UNIQUE_CODE,
CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1,
CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO,
CN_S_FIGURE_NO = trayItemMst.CN_S_FIGURE_NO
});
}
//下架记录
if (downHis.Any())
{
CreateDAL>().AddRange(downHis, trans);
Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis));
}
}
#endregion
public override ExecuteOutWorkAreaPara OutWorkArea(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara)
{
var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity };
try
{
if (!OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
if (!OutWorkAreaHandlePara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
//算法计算货位
if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit))
{
OutWorkAreaCalculateLoaction(ref executeOutWorkAreaPara, logPara);
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
if (!executeOutWorkAreaPara.TransportList.Any())
{
OutWorkAreaOutAss(ref executeOutWorkAreaPara, logPara);
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
}
}
else
{
//创建转运任务
var entity = new TN_WM_TRANSPORT_TASKEntity
{
CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo,
CN_S_CIR_OBJ = "托盘",
CN_S_CIR_OBJ_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode,
CN_S_START_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.startBit,
CN_S_START_AREA = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE,
CN_S_STATE = Constants.TaskStateList[0],
CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority,
CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea,
CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit,
CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture),
CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock,
CN_S_TASK_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库",
CN_S_QTY_INDEX = "1",
CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY,
CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE,
CN_C_START_IS_CONTROL_QTY = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY,
CN_S_START_AREA_TYPE = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE,
CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY,
CN_S_START_CONTROL_INV = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY
};
executeOutWorkAreaPara.TransportList.Add(entity);
}
if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit))
{
if (!InWorkAreaOutAss(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara;
}
UseTransaction(trans =>
{
OutWorkAreaCreateTask(ref executeOutWorkAreaPara, logPara);
OutWorkAreaProcedure(ref executeOutWorkAreaPara, logPara);
if (executeOutWorkAreaPara.OutWorkAreaEntity.needCreateAMSTask == "Y")
{
OperateResult re = new OtherSysApi().SendAmsCreateTaskLJ(executeOutWorkAreaPara.TransportList[0]);
if (!re.Success)
{
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
}
}
});
}
catch (Exception ex)
{
executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("OutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace));
}
return executeOutWorkAreaPara;
}
public override string InWorkArea(List inWorkAreaEntitys)
{
var logPara = LogType.LogPara("入作业区");
Log.Detail(logPara, "InWorkArea接口请求参数:" + JsonConvert.SerializeObject(inWorkAreaEntitys));
foreach (var item in inWorkAreaEntitys)
{
Log.Info("InWorkArea", "start");
if (string.IsNullOrEmpty(item.trayCode))
{
Log.Info("InWorkArea", "托盘为空取起点货位托盘");
if (!string.IsNullOrEmpty(item.startBit))
{
var trayLocation = CreateDapperDAL().GetSingleEntity(new
{
CN_S_LOCATION_CODE = item.startBit
});
if (trayLocation != null)
item.trayCode = trayLocation.CN_S_TRAY_CODE;
Log.Info("InWorkArea item.trayCode", item.trayCode);
}
}
}
var result = JsonConvert.SerializeObject(InWorkArea(inWorkAreaEntitys, logPara));
Log.Detail(logPara, "InWorkArea接口返回结果:" + result);
return result;
}
}
}