using HH.Redis.ReisModel;
|
using HH.WMS.BLL.Algorithm;
|
using HH.WMS.BLL.Basic;
|
using HH.WMS.BLL.External;
|
using HH.WMS.BLL.Interface;
|
using HH.WMS.BLL.SysMgr;
|
using HH.WMS.Common;
|
using HH.WMS.Common.Algorithm;
|
using HH.WMS.Common.External;
|
using HH.WMS.Common.Para;
|
using HH.WMS.DAL;
|
using HH.WMS.DAL.Algorithm;
|
using HH.WMS.DAL.Basic;
|
using HH.WMS.DAL.InStock;
|
using HH.WMS.DAL.OutStock;
|
using HH.WMS.DAL.SysMgr;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Common;
|
using HH.WMS.Entitys.Entitys;
|
using HH.WMS.Entitys.External;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
|
namespace HH.WMS.BLL.InStock
|
{
|
public class TN_WM_B_TRAY_LOCATIONBLL : DapperBaseBLL
|
{
|
#region GET
|
|
public TN_WM_B_TRAY_LOCATIONEntity GetByLocationCode(string locationCode)
|
{
|
return BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = locationCode });
|
}
|
|
#endregion
|
|
#region DELETE
|
|
public OperateResult Delete(string trayCode, string locationCode, IDbTransaction trans = null, LogPara logPara = null)
|
{
|
//解绑托盘与货位的关系
|
if (logPara != null)
|
Log.Detail(logPara, "解绑任务的托盘" + trayCode + "和货位" + locationCode + "关联!");
|
|
return CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new
|
{
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_LOCATION_CODE = locationCode
|
}, trans);
|
}
|
|
#endregion
|
#region 可用货位查询
|
|
public List<AgvLocationQuery> GetAGVLocationStatus(string stockCode, string strLocation)
|
{
|
return CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetAGVLocationStatus(stockCode, strLocation);
|
}
|
|
#endregion
|
|
#region 根据货位找托盘及其物料
|
/// <summary>
|
/// 根据货位获取货位上托盘物料信息
|
/// </summary>
|
/// <param name="CN_S_LOCATION_CODE">货位编码</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-13</History>
|
public DataTable GetTrayByLocationCode(string CN_S_LOCATION_CODE)
|
{
|
return CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetTrayByLocationCode(CN_S_LOCATION_CODE);
|
}
|
#endregion
|
|
#region 物料上架
|
/// <summary>
|
/// 物料上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-14</History>
|
//拼接托盘物料关联主子表
|
private List<TN_WM_B_TRAY_ITEM_MSTEntity> TrayItemMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
private List<TN_WM_B_TRAY_ITEM_MSTEntity> TrayItemUpdateMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
private List<TN_WM_B_TRAY_ITEM_DTLEntity> TrayItemDtllst = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
public OperateResult SaveLocationPalletRelation(ItemOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
Log.Info("===>进入物料上架接口:SaveLocationPalletRelation", "");
|
Log.Info("===>传递参数", JsonConvert.SerializeObject(entity));
|
|
if (entity != null && entity.row.Count > 0)
|
entity.row.ForEach(x =>
|
{
|
if (string.IsNullOrEmpty(x.CN_S_ITEM_STATE))
|
x.CN_S_ITEM_STATE = "合格";
|
});
|
|
string deviceNo = entity.CN_S_DEVICE_NO;
|
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
List<TN_WM_B_TRAY_INFOEntity> trayInfoList = new List<TN_WM_B_TRAY_INFOEntity>();
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
AutoBomLocationEntity location = BLLCreator.Create<TN_AB_STOCK_LOCATIONBLL>().GetLocationModel(locationCode);
|
if (location == null && !string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("未在Mongo货位表中找到货位 " + locationCode + " 的实体!");
|
}
|
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationByTray = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
Log.Info("===>查找托盘是否在库:", trayLocationByTray.Count.ToString());
|
if (trayLocationByTray.Any())
|
{
|
//托盘在库-补料上架
|
Log.Info("===>托盘在库-补料上架:====>", "");
|
DoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity);
|
}
|
else
|
{
|
//托盘不在库,但是有明细-补料,整托上架
|
if (entity.row.Any())
|
{
|
Log.Info("===>托盘不在库,但是有明细-补料,整托上架:====>", "");
|
DoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity);
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
#endregion
|
}
|
else
|
{
|
//前台没传明细,则整托上架
|
Log.Info("===>托盘不在库,也没有明细,整托上架:====>", "");
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
#endregion
|
}
|
}
|
}
|
else
|
{
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationByLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetList(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (!trayLocationByLocation.Any())//货位上没有托盘,生成虚拟托盘-补料上架
|
{
|
#region 生成虚拟托盘实体
|
TN_WM_B_TRAY_INFOEntity trayInfo = new TN_WM_B_TRAY_INFOEntity();
|
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + userEntity.CN_S_ORG_GUID + "\",\"orgFlag\":\"" + userEntity.CN_S_ORGFLAG + "\"}";
|
string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(trayNo))
|
{
|
return OperateResult.Error("生成虚拟托盘编码失败!");
|
}
|
trayInfo.CN_S_TRAY_CODE = trayNo;
|
trayInfo.CN_S_TRAY_TYPE = Constants.VirtualTray;
|
trayInfo.CN_S_TRAY_CODE_EXT = "";
|
trayInfo.CN_S_SPEC = "";
|
trayInfo.CN_S_SORTING_CODE = "";
|
trayInfo.CN_S_STATE = "使用中";
|
trayInfo.CN_S_USE_STATE = "满";
|
trayInfo.CN_N_COLUMN_NUM = 1;
|
trayInfo.CN_F_GROSSWEIGHT = 0;
|
trayInfo.CN_F_LOADBEARING = 0;
|
trayInfo.CN_F_WEIGHT = 0;
|
trayInfo.CN_N_LATTICE_NUM = 1;
|
trayInfo.CN_N_ROW_NUM = 1;
|
trayInfo.CN_S_COLLECT_CODE = "";
|
trayInfo.CN_S_COLLECT_LOCATION = "";
|
trayInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
trayInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
trayInfo.CN_T_CREATE = DateTime.Now;
|
trayInfo.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
trayInfo.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
trayInfo.CN_T_MODIFY = DateTime.Now;
|
trayInfo.CN_S_DESC = "物料上架生成虚拟托盘";
|
|
trayInfoList.Add(trayInfo);
|
#endregion
|
|
Log.Info("===>没传托盘,货位上也没有托盘,生成虚拟托盘-补料上架:====>", "");
|
DoFindTrayItemList(trayNo, entity, userEntity);
|
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayNo,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
Log.Info("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst));
|
#endregion
|
}
|
}
|
|
//库区量表实体
|
List<TN_WM_B_AREA_QTYEntity> AreaQtyList = new List<TN_WM_B_AREA_QTYEntity>();
|
//降收货区库区量
|
List<AutoBomStockAreaEntity> shouHuoLocation = new List<AutoBomStockAreaEntity>();
|
|
decimal weight = 0; //汇总本次上架物料总重量
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
var shLocation = CreateDAL<TN_WMS_AREADAL>().GetSHLocationArea("收货区");
|
|
if (!shLocation.Any())
|
{
|
return OperateResult.Error("未在Mongo库区表中找到收货区实体!");
|
}
|
//收货区
|
shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE });
|
|
var itemCode = "";//存在问题的物料编码
|
foreach (var item in entity.row)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE);
|
if (itemenity == null)
|
{
|
return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!");
|
}
|
#region 影响库区量表数据
|
TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity();
|
AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString();
|
AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER;
|
AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE;
|
AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME;
|
AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE;
|
AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO;
|
AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT;
|
AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL;
|
AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO;
|
AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH;
|
AreaQtyEntity.CN_S_STOCK_AREA = location.CN_S_AREA_CODE;
|
AreaQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE;
|
AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString());
|
AreaQtyEntity.CN_F_ALLOC_QTY = 0;
|
AreaQtyEntity.CN_F_PLANNED_QTY = 0;
|
AreaQtyEntity.CN_S_NOTE = "";
|
AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"'
|
and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"'
|
and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"'
|
and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' ";
|
AreaQtyList.Add(AreaQtyEntity);
|
|
Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList));
|
#endregion
|
|
#region 汇总本次上架物料总重量
|
////获取物料重量
|
//var fTw = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE).CN_F_TW;
|
//string DataType = ConfigurationManager.ConnectionStrings["DataType"].ToString();
|
//if (fTw == 0 && DataType == "JXXWMS")
|
//{
|
// itemCode = item.CN_S_ITEM_CODE;
|
// break;
|
//}
|
////更新托盘实际重量
|
//weight = weight + (fTw) * item.CN_F_QUANTITY;
|
#endregion
|
}
|
|
if (!string.IsNullOrEmpty(itemCode))
|
{
|
return OperateResult.Error("未在Mongo物料表中找到物料 " + itemCode + " 的重量!");
|
}
|
}
|
else
|
{
|
//生成入库任务号
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.TaskNo_In + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
|
string opNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
|
if (string.IsNullOrEmpty(opNo))
|
{
|
return OperateResult.Error("入库任务号生成失败!");
|
}
|
|
|
//undo
|
|
//……
|
//……
|
//……
|
|
//自动的情况下,需要生成入库任务 ,规划路线,调用AMS指令
|
}
|
|
#region 拼接入库上架记录实体
|
var increaseEntity = CreateDAL<DapperDAL<TN_WM_INCREASE_INVENTORY_MSTEntity>>().GetSingleEntity(new { CN_S_LOT_NO = entity.row[0].CN_S_LOT_NO });
|
if (increaseEntity == null)
|
{
|
return OperateResult.Error("根据批次号未获取到入库单实体!");
|
}
|
List<TN_WM_UP_HISTORYEntity> upHistoryList = new List<TN_WM_UP_HISTORYEntity>();
|
|
if (TrayItemMstlst.Any())
|
{
|
var entity1 = (from left in TrayItemMstlst
|
join right in TrayItemDtllst on left.CN_GUID equals right.CN_PARENT_GUID
|
select new TN_WM_UP_HISTORYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_LOCATION_CODE = location.CN_S_LOCATION_CODE,
|
CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = left.CN_S_TRAY_GRID,
|
CN_S_OWNER = left.CN_S_OWNER,
|
CN_S_ITEM_CODE = left.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = left.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = left.CN_S_FIGURE_NO,
|
CN_S_MODEL = left.CN_S_MODEL,
|
CN_S_ITEM_STATE = left.CN_S_ITEM_STATE,
|
CN_F_QUANTITY = right.CN_F_QUANTITY,
|
CN_S_MEASURE_UNIT = left.CN_S_MEASURE_UNIT,
|
CN_S_LOT_NO = right.CN_S_LOT_NO,
|
CN_S_PACKING_UNIT = right.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = right.CN_F_PACKING_QTY,
|
CN_S_PRODUCTION_BATCH = right.CN_S_PRODUCTION_BATCH,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "入库单",
|
CN_S_FROM_NO = increaseEntity.CN_S_OP_NO,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE
|
}).ToList();
|
upHistoryList.AddRange(entity1);
|
}
|
|
if (TrayItemUpdateMstlst.Any())
|
{
|
var entity2 = (from left in TrayItemUpdateMstlst
|
join right in TrayItemDtllst on left.CN_GUID equals right.CN_PARENT_GUID
|
select new TN_WM_UP_HISTORYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_LOCATION_CODE = location.CN_S_LOCATION_CODE,
|
CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = left.CN_S_TRAY_GRID,
|
CN_S_OWNER = left.CN_S_OWNER,
|
CN_S_ITEM_CODE = left.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = left.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = left.CN_S_FIGURE_NO,
|
CN_S_MODEL = left.CN_S_MODEL,
|
CN_S_ITEM_STATE = left.CN_S_ITEM_STATE,
|
CN_F_QUANTITY = right.CN_F_QUANTITY,
|
CN_S_MEASURE_UNIT = left.CN_S_MEASURE_UNIT,
|
CN_S_LOT_NO = right.CN_S_LOT_NO,
|
CN_S_PACKING_UNIT = right.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = right.CN_F_PACKING_QTY,
|
CN_S_PRODUCTION_BATCH = right.CN_S_PRODUCTION_BATCH,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "入库单",
|
CN_S_FROM_NO = increaseEntity.CN_S_OP_NO,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE
|
}).ToList();
|
upHistoryList.AddRange(entity2);
|
}
|
Log.Info("===>upHistoryList", JsonConvert.SerializeObject(upHistoryList));
|
|
#endregion
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
if (trayInfoList.Any())
|
{
|
//新增容器信息表(虚拟托盘)
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().AddRange(trayInfoList, trans);
|
Log.Info("===>新增容器信息表-虚拟托盘", "");
|
}
|
if (TrayLocationlst.Any())
|
{
|
//新增托盘货位关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(TrayLocationlst, trans);
|
Log.Info("===>新增托盘货位关联", "");
|
}
|
|
if (TrayItemMstlst.Any())
|
{
|
//新增托盘物料关联主表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(TrayItemMstlst, trans);
|
Log.Info("===>新增托盘物料关联主表", "");
|
}
|
|
if (TrayItemUpdateMstlst.Any())
|
{
|
//更新托盘物料关联主表
|
var aa = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMstQty(TrayItemUpdateMstlst, trans);
|
Log.Info("===>更新托盘物料关联主表", "");
|
Log.Info("===>影响行数", aa.AffectedRows.ToString());
|
}
|
|
if (TrayItemDtllst.Any())
|
{
|
for (int i = 0; i < TrayItemDtllst.Count; i++)
|
{
|
var aa = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateByCondition(TrayItemDtllst[i], trans);// new { CN_F_QUANTITY = TrayItemDtllst[i].CN_F_QUANTITY }, new { CN_PARENT_GUID = TrayItemDtllst[i].CN_PARENT_GUID, CN_S_UNIQUE_CODE = TrayItemDtllst[i].CN_S_UNIQUE_CODE, CN_S_LOT_NO = TrayItemDtllst[i].CN_S_LOT_NO, CN_S_SERIAL_NO = TrayItemDtllst[i].CN_S_SERIAL_NO, CN_S_PACKING_UNIT = TrayItemDtllst[i].CN_S_PACKING_UNIT, CN_F_PACKING_QTY = TrayItemDtllst[i].CN_F_PACKING_QTY, CN_F_PURCHASE_PRICE = TrayItemDtllst[i].CN_F_PURCHASE_PRICE, CN_F_RETAIL_PRICE = TrayItemDtllst[i].CN_F_RETAIL_PRICE, CN_T_PRODUCTION = TrayItemDtllst[i].CN_T_PRODUCTION, CN_T_EXPIRATION = TrayItemDtllst[i].CN_T_EXPIRATION, CN_S_PRODUCTION_BATCH = TrayItemDtllst[i].CN_S_PRODUCTION_BATCH }, trans);
|
|
Log.Info("===>影响行数", aa.AffectedRows.ToString());
|
if (aa.AffectedRows == 0)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Add(TrayItemDtllst[i], trans);
|
Log.Info("===>新增托盘物料关联子表", "");
|
}
|
}
|
}
|
|
//根据单号和物料编码更新累积上架数
|
CreateDAL<TN_WM_INCREASE_INVENTORYDAL>().updateUpselefQty(entity.row, trans);
|
Log.Info("===>根据单号和物料编码更新累积上架数", "");
|
|
//根据单号和物料编码更新累积码盘数
|
CreateDAL<TN_WM_INCREASE_INVENTORYDAL>().updateOntrayQty(entity.row, trans);
|
Log.Info("===>根据单号和物料编码更新累积码盘数", "");
|
|
//更新托盘实际重量
|
CreateDAL<TN_WM_B_TRAY_INFODAL>().updateTrayCodeWeight(trayCode, weight, trans);
|
Log.Info("===>更新托盘实际重量", "");
|
|
//人工上架情况
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
//影响库区量表
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(AreaQtyList, trans);
|
Log.Info("===>影响库区量表", "");
|
//降收货区库区量
|
AreaQtyList.ForEach(x =>
|
{
|
x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE;
|
});
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(AreaQtyList, trans);
|
Log.Info("===>降收货区库区量", "");
|
//更新货位扩展表状态
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans);
|
Log.Info("===>更新货位扩展表状态", "");
|
}
|
else
|
{
|
//生成入库任务
|
|
//调用方法,下达AMS指令
|
}
|
|
//新增入库记录
|
if (upHistoryList.Any())
|
{
|
//新增入库记录
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHistoryList, trans);
|
Log.Info("===>新增入库记录", JsonConvert.SerializeObject(upHistoryList));
|
}
|
});
|
|
return operateResult;
|
}
|
|
/// <summary>
|
/// 拼接托盘物料关联关系
|
/// </summary>
|
/// <param name="trayCode"容器编码></param>
|
/// <param name="entity">数据实体</param>
|
/// <param name="userEntity">用户实体</param>
|
private void DoFindTrayItemList(string trayCode, ItemOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
Log.Info("===>开始拼接托盘物料关联:", trayCode);
|
var Group_List = entity.row.GroupBy(x => new
|
{
|
x.CN_S_TRAY_CODE,
|
x.CN_S_TRAY_GRID,
|
x.CN_S_ITEM_CODE,
|
x.CN_S_ITEM_STATE,
|
x.CN_S_LOT_NO,
|
x.CN_S_OWNER
|
}).Select(g => new ItemRow
|
{
|
CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(),
|
CN_S_TRAY_GRID = string.IsNullOrEmpty(g.FirstOrDefault().CN_S_TRAY_GRID.Trim()) ? "1" : g.FirstOrDefault().CN_S_TRAY_GRID.Trim(),
|
CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(),
|
CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(),
|
CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO.Trim(),
|
CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(),
|
CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY)
|
}).ToList();
|
|
|
Log.Info("===>Group_List:", JsonConvert.SerializeObject(Group_List));
|
for (int i = 0; i < Group_List.Count; i++)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString());
|
|
Log.Info("===>itemenity:", JsonConvert.SerializeObject(itemenity));
|
//拼接托盘物料关联主表实体
|
var mstGuid = Guid.NewGuid().ToString().ToUpper();
|
var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(),
|
CN_S_OWNER = Group_List[i].CN_S_OWNER.ToString(),
|
CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(),
|
CN_S_LOT_NO = Group_List[i].CN_S_LOT_NO.ToString(),
|
CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO,
|
CN_S_MODEL = itemenity.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT,
|
CN_S_ITEM_STATE = Group_List[i].CN_S_ITEM_STATE.ToString(),
|
CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString())
|
};
|
Log.Info("===>trayItemMstEntity:", JsonConvert.SerializeObject(trayItemMstEntity));
|
|
//判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行
|
var result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().CheckExists(trayItemMstEntity);
|
var parentGuid = "";
|
if (result.Any())
|
{
|
trayItemMstEntity.CN_GUID = result[0].CN_GUID;
|
TrayItemUpdateMstlst.Add(trayItemMstEntity);
|
parentGuid = result[0].CN_GUID;
|
}
|
else
|
{
|
TrayItemMstlst.Add(trayItemMstEntity);
|
parentGuid = trayItemMstEntity.CN_GUID;
|
}
|
|
Log.Info("===>parentGuid:", parentGuid);
|
Log.Info("===>TrayItemMstlst:", JsonConvert.SerializeObject(TrayItemMstlst));
|
|
var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_LOT_NO.Trim() == Group_List[i].CN_S_LOT_NO.Trim()
|
&& o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
|
|
Log.Info("===>dtl_List:", JsonConvert.SerializeObject(dtl_List));
|
for (int j = 0; j < dtl_List.Count; j++)
|
{
|
TrayItemDtllst.Add(new TN_WM_B_TRAY_ITEM_DTLEntity
|
{
|
CN_GUID = Guid.NewGuid().ToString().ToUpper(),
|
CN_PARENT_GUID = parentGuid,
|
CN_S_UNIQUE_CODE = "",// entity.row[i].CN_S_UNIQUE_CODE.ToString(),
|
CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString(),
|
CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(),
|
CN_S_PACKING_UNIT = dtl_List[j].CN_S_PACKING_UNIT.ToString(),
|
CN_F_PACKING_QTY = Convert.ToDecimal(dtl_List[j].CN_F_PACKING_QTY),
|
CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY),
|
CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(),
|
CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(),
|
CN_F_PURCHASE_PRICE = dtl_List[j].CN_F_PURCHASE_PRICE,
|
CN_F_RETAIL_PRICE = dtl_List[j].CN_F_RETAIL_PRICE,
|
CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION,
|
CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION,
|
CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(),
|
CN_S_NOTE = "",
|
CN_S_EXT1 = "",
|
CN_S_EXT2 = "",
|
CN_S_EXT3 = "",
|
CN_S_EXT4 = "",
|
CN_S_EXT5 = "",
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now
|
});
|
|
Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst));
|
}
|
}
|
}
|
|
#endregion
|
|
#region 还料上架
|
/// <summary>
|
/// 还料上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-14</History>
|
//拼接还料托盘物料关联主子表
|
private List<TN_WM_B_TRAY_ITEM_MSTEntity> HLTrayItemMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
private List<TN_WM_B_TRAY_ITEM_MSTEntity> HLTrayItemNewOwnerMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
private List<TN_WM_B_TRAY_ITEM_DTLEntity> HLTrayItemDtllst = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
|
public OperateResult HLSaveLocationPalletRelation(string itemBackNo, ItemOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
Log.Info("===>进入还料上架接口:HLSaveLocationPalletRelation", "");
|
Log.Info("===>传递参数", JsonConvert.SerializeObject(entity));
|
|
if (entity != null && entity.row.Count > 0)
|
entity.row.ForEach(x =>
|
{
|
if (string.IsNullOrEmpty(x.CN_S_ITEM_STATE))
|
x.CN_S_ITEM_STATE = "合格";
|
});
|
|
string deviceNo = entity.CN_S_DEVICE_NO;
|
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
List<TN_WM_B_TRAY_INFOEntity> trayInfoList = new List<TN_WM_B_TRAY_INFOEntity>();
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
AutoBomLocationEntity location = BLLCreator.Create<TN_AB_STOCK_LOCATIONBLL>().GetLocationModel(locationCode);
|
if (location == null)
|
{
|
return OperateResult.Error("未在Mongo货位表中找到货位 " + locationCode + " 的实体!");
|
}
|
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationByTray = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
Log.Info("===>查找托盘是否在库:", trayLocationByTray.Count.ToString());
|
if (trayLocationByTray.Any())
|
{
|
//托盘在库-补料上架
|
Log.Info("===>托盘在库-补料上架:====>", "");
|
HLDoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity);
|
}
|
else
|
{
|
//托盘不在库,但是有明细-补料,整托上架
|
if (entity.row.Any())
|
{
|
Log.Info("===>托盘不在库,但是有明细-补料,整托上架:====>", "");
|
HLDoFindTrayItemList(entity.CN_S_TRAY_CODE, entity, userEntity);
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
#endregion
|
}
|
else
|
{
|
//前台没传明细,则整托上架
|
Log.Info("===>托盘不在库,也没有明细,整托上架:====>", "");
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
#endregion
|
}
|
}
|
}
|
else
|
{
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationByLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetList(new { CN_S_LOCATION_CODE = locationCode });
|
|
if (!trayLocationByLocation.Any())//货位上没有托盘,生成虚拟托盘-补料上架
|
{
|
#region 生成虚拟托盘实体
|
TN_WM_B_TRAY_INFOEntity trayInfo = new TN_WM_B_TRAY_INFOEntity();
|
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + userEntity.CN_S_ORG_GUID + "\",\"orgFlag\":\"" + userEntity.CN_S_ORGFLAG + "\"}";
|
string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(trayNo))
|
{
|
return OperateResult.Error("生成虚拟托盘编码失败!");
|
}
|
trayInfo.CN_S_TRAY_CODE = trayNo;
|
trayInfo.CN_S_TRAY_TYPE = Constants.VirtualTray;
|
trayInfo.CN_S_TRAY_CODE_EXT = "";
|
trayInfo.CN_S_SPEC = "";
|
trayInfo.CN_S_SORTING_CODE = "";
|
trayInfo.CN_S_STATE = "使用中";
|
trayInfo.CN_S_USE_STATE = "满";
|
trayInfo.CN_N_COLUMN_NUM = 1;
|
trayInfo.CN_F_GROSSWEIGHT = 0;
|
trayInfo.CN_F_LOADBEARING = 0;
|
trayInfo.CN_F_WEIGHT = 0;
|
trayInfo.CN_N_LATTICE_NUM = 1;
|
trayInfo.CN_N_ROW_NUM = 1;
|
trayInfo.CN_S_COLLECT_CODE = "";
|
trayInfo.CN_S_COLLECT_LOCATION = "";
|
trayInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
trayInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
trayInfo.CN_T_CREATE = DateTime.Now;
|
trayInfo.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
trayInfo.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
trayInfo.CN_T_MODIFY = DateTime.Now;
|
trayInfo.CN_S_DESC = "物料上架生成虚拟托盘";
|
|
trayInfoList.Add(trayInfo);
|
#endregion
|
|
Log.Info("===>没传托盘,货位上也没有托盘,生成虚拟托盘-补料上架:====>", "");
|
HLDoFindTrayItemList(trayNo, entity, userEntity);
|
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayNo,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
Log.Info("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst));
|
#endregion
|
}
|
}
|
|
//量表实体
|
List<TN_WM_B_STOCK_QTYEntity> StockQtyList = new List<TN_WM_B_STOCK_QTYEntity>();
|
List<TN_WM_B_AREA_QTYEntity> AreaQtyList = new List<TN_WM_B_AREA_QTYEntity>();
|
|
decimal weight = 0; //汇总本次上架物料总重量
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
var itemCode = "";//存在问题的物料编码
|
foreach (var item in entity.row)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE);
|
if (itemenity == null)
|
{
|
return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!");
|
}
|
#region 影响仓库量表数据
|
TN_WM_B_STOCK_QTYEntity StockQtyEntity = new TN_WM_B_STOCK_QTYEntity();
|
StockQtyEntity.CN_GUID = System.Guid.NewGuid().ToString();
|
StockQtyEntity.CN_S_OWNER = item.CN_S_OWNER;
|
StockQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE;
|
StockQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME;
|
StockQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE;
|
StockQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO;
|
|
StockQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT;
|
StockQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL;
|
StockQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO;
|
|
StockQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH;
|
StockQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE;
|
StockQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString());
|
StockQtyEntity.CN_F_ALLOC_QTY = 0;
|
StockQtyEntity.CN_F_PLANNED_QTY = 0;
|
StockQtyEntity.CN_S_NOTE = "";
|
StockQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"'
|
and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"'
|
and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"'
|
and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' ";
|
StockQtyList.Add(StockQtyEntity);
|
|
Log.Info("===>拼接仓库量表", JsonConvert.SerializeObject(StockQtyList));
|
#endregion
|
|
#region 影响库区量表数据
|
TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity();
|
AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString();
|
AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER;
|
AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE;
|
AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME;
|
AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE;
|
AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO;
|
|
AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT;
|
AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL;
|
AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO;
|
|
AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH;
|
AreaQtyEntity.CN_S_STOCK_AREA = location.CN_S_AREA_CODE;
|
AreaQtyEntity.CN_S_STOCK_CODE = location.CN_S_STOCK_CODE;
|
AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString());
|
AreaQtyEntity.CN_F_ALLOC_QTY = 0;
|
AreaQtyEntity.CN_F_PLANNED_QTY = 0;
|
AreaQtyEntity.CN_S_NOTE = "";
|
AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + location.CN_S_STOCK_CODE + @"'
|
and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"'
|
and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"'
|
and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' ";
|
AreaQtyList.Add(AreaQtyEntity);
|
|
Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList));
|
#endregion
|
|
#region 汇总本次上架物料总重量
|
////获取物料重量
|
//var fTw = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE).CN_F_TW;
|
//if (fTw == 0)
|
//{
|
// itemCode = item.CN_S_ITEM_CODE;
|
// break;
|
//}
|
////更新托盘实际重量
|
//weight = weight + (fTw) * item.CN_F_QUANTITY;
|
#endregion
|
}
|
|
if (!string.IsNullOrEmpty(itemCode))
|
{
|
return OperateResult.Error("未在Mongo物料表中找到物料 " + itemCode + " 的重量!");
|
}
|
}
|
else
|
{
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.Rule_TaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
|
string opNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
|
//undo
|
|
//……
|
//……
|
//……
|
|
//自动的情况下,需要规划路线,生成入库任务
|
}
|
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> oldOwnerTrayItemList = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
if (HLTrayItemMstlst.Any())
|
{
|
oldOwnerTrayItemList = ReduceOwnerRelMstQty(HLTrayItemMstlst);
|
Log.Info("===>旧货主", JsonConvert.SerializeObject(oldOwnerTrayItemList));
|
}
|
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> trayItemAddMstList = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> trayItemModMstList = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> trayItemAddDtlList = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> trayItemModDtlList = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
|
|
if (HLTrayItemNewOwnerMstlst.Any())
|
{
|
//拼接托盘物料关联主子表更新和新增实体
|
|
foreach (var item in HLTrayItemNewOwnerMstlst)
|
{
|
string oldP = item.CN_GUID;
|
//
|
var entityExist = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetSingleEntity(new
|
{
|
CN_S_OWNER = item.CN_S_OWNER,
|
CN_S_ITEM_CODE = item.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = item.CN_S_ITEM_STATE,
|
CN_S_TRAY_CODE = item.CN_S_TRAY_CODE
|
});
|
|
if (entityExist != null)
|
{
|
var trayItemModMst = item;
|
trayItemModMst.CN_GUID = entityExist.CN_GUID;
|
trayItemModMstList.Add(trayItemModMst);
|
|
var modDtlList = HLTrayItemDtllst.Where(x => x.CN_PARENT_GUID == oldP).ToList();
|
|
foreach (var itemDtl in modDtlList)
|
{
|
var trayItemModDtl = itemDtl;
|
trayItemModDtl.CN_PARENT_GUID = item.CN_GUID;
|
trayItemModDtlList.Add(trayItemModDtl);
|
}
|
}
|
else
|
{
|
trayItemAddMstList.Add(item);
|
var modDtlList = HLTrayItemDtllst.Where(x => x.CN_PARENT_GUID == oldP).ToList();
|
trayItemAddDtlList.AddRange(modDtlList);
|
}
|
}
|
}
|
// return OperateResult.Error("bug!");
|
|
#region 拼接还料上架记录实体
|
|
var increaseEntity = CreateDAL<DapperDAL<TN_WM_INCREASE_INVENTORY_MSTEntity>>().GetSingleEntity(new { CN_S_LOT_NO = entity.row[0].CN_S_LOT_NO });
|
if (increaseEntity == null)
|
{
|
return OperateResult.Error("根据批次号未获取到入库单实体!");
|
}
|
Log.Info("===>开始还料上架记录:====>", JsonConvert.SerializeObject(increaseEntity));
|
List<TN_WM_UP_HISTORYEntity> upHistoryList = new List<TN_WM_UP_HISTORYEntity>();
|
|
if (HLTrayItemMstlst.Any())
|
{
|
Log.Info("===>开始还料上架记录1-A:====>", JsonConvert.SerializeObject(HLTrayItemMstlst));
|
Log.Info("===>开始还料上架记录1-B:====>", JsonConvert.SerializeObject(HLTrayItemDtllst));
|
var entity1 = (from left in HLTrayItemMstlst
|
join right in HLTrayItemDtllst on left.CN_GUID equals right.CN_PARENT_GUID
|
select new TN_WM_UP_HISTORYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_LOCATION_CODE = location.CN_S_LOCATION_CODE,
|
CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = left.CN_S_TRAY_GRID,
|
CN_S_OWNER = left.CN_S_OWNER,
|
CN_S_ITEM_CODE = left.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = left.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = left.CN_S_FIGURE_NO,
|
CN_S_MODEL = left.CN_S_MODEL,
|
CN_S_ITEM_STATE = left.CN_S_ITEM_STATE,
|
CN_F_QUANTITY = right.CN_F_QUANTITY,
|
CN_S_MEASURE_UNIT = left.CN_S_MEASURE_UNIT,
|
CN_S_LOT_NO = right.CN_S_LOT_NO,
|
CN_S_PACKING_UNIT = right.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = right.CN_F_PACKING_QTY,
|
CN_S_PRODUCTION_BATCH = right.CN_S_PRODUCTION_BATCH,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "还料上架",
|
CN_S_FROM_NO = itemBackNo,
|
CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = location.CN_S_AREA_CODE
|
}).ToList();
|
Log.Info("===>开始还料上架记录2:====>", JsonConvert.SerializeObject(entity1));
|
upHistoryList.AddRange(entity1);
|
}
|
|
//Log.Info("===>开始还料上架记录3:====>", JsonConvert.SerializeObject(TrayItemUpdateMstlst));
|
//if (HLTrayItemUpdateMstlst.Any())
|
//{
|
// var entity2 = (from left in TrayItemUpdateMstlst
|
// join right in TrayItemDtllst on left.CN_GUID equals right.CN_PARENT_GUID
|
// select new TN_WM_UP_HISTORYEntity
|
// {
|
// CN_GUID = System.Guid.NewGuid().ToString(),
|
// CN_S_LOCATION_CODE = location.CN_S_LOCATION_CODE,
|
// CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
// CN_S_TRAY_GRID = left.CN_S_TRAY_GRID,
|
// CN_S_OWNER = left.CN_S_OWNER,
|
// CN_S_ITEM_CODE = left.CN_S_ITEM_CODE,
|
// CN_S_ITEM_NAME = left.CN_S_ITEM_NAME,
|
// CN_S_FIGURE_NO = left.CN_S_FIGURE_NO,
|
// CN_S_MODEL = left.CN_S_MODEL,
|
// CN_S_ITEM_STATE = left.CN_S_ITEM_STATE,
|
// CN_F_QUANTITY = right.CN_F_QUANTITY,
|
// CN_S_MEASURE_UNIT = left.CN_S_MEASURE_UNIT,
|
// CN_S_LOT_NO = right.CN_S_LOT_NO,
|
// CN_S_PACKING_UNIT = right.CN_S_PACKING_UNIT,
|
// CN_F_PACKING_QTY = right.CN_F_PACKING_QTY,
|
// CN_S_PRODUCTION_BATCH = right.CN_S_PRODUCTION_BATCH,
|
// CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
// CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
// CN_T_CREATE = DateTime.Now,
|
// CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
// CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
// CN_T_MODIFY = DateTime.Now,
|
// CN_S_OP_FROM = "入库单",
|
// CN_S_FROM_NO = increaseEntity.CN_S_OP_NO,
|
// CN_S_STOCK_CODE = location.CN_S_STOCK_CODE,
|
// CN_S_STOCK_AREA = location.CN_S_AREA_CODE
|
// }).ToList();
|
// Log.Info("===>开始还料上架记录4:====>", JsonConvert.SerializeObject(entity2));
|
// upHistoryList.AddRange(entity2);
|
//}
|
Log.Info("===>upHistoryList", JsonConvert.SerializeObject(upHistoryList));
|
|
#endregion
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
if (trayInfoList.Any())
|
{
|
//新增容器信息表(虚拟托盘)
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_INFOEntity>>().AddRange(trayInfoList, trans);
|
Log.Info("===>新增容器信息表-虚拟托盘", "");
|
}
|
if (TrayLocationlst.Any())
|
{
|
//新增托盘货位关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(TrayLocationlst, trans);
|
Log.Info("===>新增托盘货位关联", "");
|
}
|
|
if (HLTrayItemMstlst.Any())
|
{
|
//下降托盘物料数据量
|
var bb = CreateDAL<TN_WM_SORTING_LISTDAL>().DropTrayItemQty(oldOwnerTrayItemList, null, trans);
|
|
Log.Info("===>降旧货主所在托盘物料关联主表,影响行数", bb.AffectedRows.ToString());
|
}
|
|
if (HLTrayItemNewOwnerMstlst.Any())
|
{
|
//影响托盘物料关联主子表
|
if (trayItemAddMstList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(trayItemAddMstList, trans);
|
}
|
if (trayItemModMstList.Any())
|
{
|
CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMstQty(trayItemModMstList, trans);
|
}
|
|
if (trayItemAddDtlList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(trayItemAddDtlList, trans);
|
}
|
if (trayItemModDtlList.Any())
|
{
|
for (int i = 0; i < trayItemModDtlList.Count; i++)
|
{
|
var aa = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateByCondition(trayItemModDtlList[i], trans);//
|
|
Log.Info("===>影响行数", aa.AffectedRows.ToString());
|
if (aa.AffectedRows == 0)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Add(trayItemModDtlList[i], trans);
|
Log.Info("===>新增托盘物料关联子表", "");
|
}
|
}
|
}
|
}
|
|
//根据单号和物料编码更新累积码盘数
|
CreateDAL<TN_WM_INCREASE_INVENTORYDAL>().updateOntrayQty(entity.row, trans);
|
Log.Info("===>根据单号和物料编码更新累积码盘数", "");
|
|
//更新托盘实际重量
|
CreateDAL<TN_WM_B_TRAY_INFODAL>().updateTrayCodeWeight(trayCode, weight, trans);
|
Log.Info("===>更新托盘实际重量", "");
|
|
//更新还料单已完成
|
if (!string.IsNullOrEmpty(itemBackNo))
|
{
|
CreateDAL<DapperDAL<TN_WM_ITEMBACK_MSTEntity>>().Update(new { CN_S_STATE = Constants.State_Completed }, new { CN_S_OP_NO = itemBackNo }, trans);
|
|
Log.Info("===>更新还料单已完成", "");
|
}
|
|
//人工上架情况
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
//降货主所在仓库量
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceOwnerStockQty(StockQtyList, trans);
|
Log.Info("===>降货主所在仓库量", "");
|
|
//影响仓库量表-默认货主
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddStockQty(StockQtyList, trans, true);
|
Log.Info("===>影响仓库量表-默认货主", "");
|
|
|
//降货主所在库区量
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceOwnerAreaQty(AreaQtyList, trans);
|
Log.Info("===>降货主所在库区量", "");
|
|
//影响库区量表-默认货主
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(AreaQtyList, trans, true);
|
Log.Info("===>影响库区量表-默认货主", "");
|
|
//更新货位扩展表状态
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans);
|
Log.Info("===>更新货位扩展表状态", "");
|
}
|
else
|
{
|
//生成入库任务
|
|
//调用方法,下达AMS指令
|
}
|
//新增入库记录
|
if (upHistoryList.Any())
|
{
|
//新增入库记录
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHistoryList, trans);
|
Log.Info("===>新增入库记录", "");
|
}
|
// throw new Exception("fanhui");
|
});
|
|
return operateResult;
|
}
|
|
private List<TN_WM_B_TRAY_ITEM_MSTEntity> ReduceOwnerRelMstQty(List<TN_WM_B_TRAY_ITEM_MSTEntity> HLTrayItemMstlst)
|
{
|
//批分
|
var trayItemMstList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new
|
{
|
CN_S_OWNER = HLTrayItemMstlst.Select(x => x.CN_S_OWNER).ToList(),
|
CN_S_ITEM_CODE = HLTrayItemMstlst.Select(x => x.CN_S_ITEM_CODE).ToList()
|
});
|
|
foreach (var trayItemMst in trayItemMstList)
|
{
|
trayItemMst.TrayItemDtlList = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
var currentResult = HLTrayItemMstlst.Where(x => x.CN_S_ITEM_CODE == trayItemMst.CN_S_ITEM_CODE && x.CN_S_OWNER == trayItemMst.CN_S_OWNER).ToList();
|
decimal qty = currentResult.Sum(y => y.CN_F_QUANTITY);
|
if (trayItemMst.CN_F_QUANTITY >= qty)
|
{
|
trayItemMst.CN_F_QUANTITY -= qty;
|
|
trayItemMst.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new
|
{
|
CN_PARENT_GUID = trayItemMst.CN_GUID
|
}).OrderBy(x => x.CN_S_LOT_NO).ToList();
|
|
//空的生产批次放后面
|
currentResult = currentResult.Select(x => new
|
{
|
index = string.IsNullOrEmpty(x.CN_S_PRODUCTION_BATCH) ? 0 : 1,
|
x
|
}).OrderByDescending(y => y.index).ThenBy(z => z.x.CN_S_PRODUCTION_BATCH).Select(m => m.x).ToList();
|
//算法策略
|
List<string> lstStrate = BLLCreator.Create<TN_WM_B_STRATEGYBLL>().GetStrateListByAreaOrStock("", "", Constants.Out)
|
.OrderByDescending(a => a.CN_N_PRIORITY).Select(o => o.CN_S_CODE).ToList();
|
|
foreach (string stegy in lstStrate)
|
{
|
//逐个策略进行计算
|
switch (stegy)
|
{
|
case "FirstInFirstOut":
|
trayItemMst.TrayItemDtlList = trayItemMst.TrayItemDtlList.OrderBy(o => o.CN_S_LOT_NO).ToList();
|
break;
|
case "FirstWarrantFirstOut":
|
trayItemMst.TrayItemDtlList = trayItemMst.TrayItemDtlList.Select(x => new
|
{
|
index = string.IsNullOrEmpty(x.CN_S_PRODUCTION_BATCH) ? 0 : 1,
|
x
|
}).OrderByDescending(y => y.index).ThenBy(z => z.x.CN_S_PRODUCTION_BATCH).Select(m => m.x).ToList();
|
break;
|
}
|
}
|
foreach (var cs in currentResult)
|
{
|
var csQty = cs.CN_F_QUANTITY;
|
|
foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
|
{
|
if (csQty == 0) break;
|
if (trayItemDtl.CN_F_QUANTITY == 0) continue;
|
if (((string.IsNullOrEmpty(cs.CN_S_PACKING_UNIT) && string
|
.IsNullOrEmpty(trayItemDtl.CN_S_PACKING_UNIT)) || cs.CN_S_PACKING_UNIT
|
.Equals(trayItemDtl.CN_S_PACKING_UNIT)) &&
|
(string.IsNullOrEmpty(cs.CN_S_PRODUCTION_BATCH) || cs.CN_S_PRODUCTION_BATCH
|
.Equals(trayItemDtl.CN_S_PRODUCTION_BATCH)) &&
|
(string.IsNullOrEmpty(cs.CN_S_LOT_NO) || cs.CN_S_LOT_NO
|
.Equals(trayItemDtl.CN_S_LOT_NO)))
|
{
|
if (trayItemDtl.CN_F_QUANTITY >= csQty)
|
{
|
trayItemDtl.CN_F_QUANTITY -= csQty;
|
csQty = 0;
|
}
|
else
|
{
|
csQty -= trayItemDtl.CN_F_QUANTITY;
|
trayItemDtl.CN_F_QUANTITY = 0;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
return trayItemMstList;
|
}
|
|
/// <summary>
|
/// 拼接托盘物料关联关系-还料(货主默认)
|
/// </summary>
|
/// <param name="trayCode"容器编码></param>
|
/// <param name="entity">数据实体</param>
|
/// <param name="userEntity">用户实体</param>
|
private void HLDoFindTrayItemList(string trayCode, ItemOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
Log.Info("===>开始拼接托盘物料关联:", trayCode);
|
var Group_List = entity.row.GroupBy(x => new
|
{
|
x.CN_S_TRAY_CODE,
|
x.CN_S_LOT_NO,
|
x.CN_S_TRAY_GRID,
|
x.CN_S_ITEM_CODE,
|
x.CN_S_ITEM_STATE,
|
x.CN_S_OWNER
|
}).Select(g => new ItemRow
|
{
|
CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(),
|
CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(),
|
CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO.Trim(),
|
CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(),
|
CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(),
|
CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(),
|
CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY)
|
}).ToList();
|
|
|
Log.Info("===>Group_List:", JsonConvert.SerializeObject(Group_List));
|
for (int i = 0; i < Group_List.Count; i++)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString());
|
|
Log.Info("===>itemenity:", JsonConvert.SerializeObject(itemenity));
|
//拼接托盘物料关联主表实体
|
var mstGuid = Guid.NewGuid().ToString().ToUpper();
|
var HLtrayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(),
|
CN_S_OWNER = Group_List[i].CN_S_OWNER.ToString(),
|
CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(),
|
CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO,
|
CN_S_MODEL = itemenity.CN_S_MODEL,
|
CN_S_ITEM_STATE = Group_List[i].CN_S_ITEM_STATE.ToString(),
|
CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT,
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString())
|
};
|
var newEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = string.IsNullOrEmpty(Group_List[i].CN_S_TRAY_GRID.ToString()) ? "1" : Group_List[i].CN_S_TRAY_GRID.ToString(),
|
CN_S_OWNER = Constants.DefaultOwner,
|
CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(),
|
CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO,
|
CN_S_MODEL = itemenity.CN_S_MODEL,
|
CN_S_ITEM_STATE = Group_List[i].CN_S_ITEM_STATE.ToString(),
|
CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT,
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
//sqlwhere = " where CN_S_ITEM_CODE='" + Group_List[i].CN_S_ITEM_CODE + "' AND ISNULL(b.CN_S_LOT_NO,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_LOT_NO) ? "" : Group_List[i].CN_S_LOT_NO) + "' AND a.CN_S_OWNER='" + Group_List[i].CN_S_OWNER + "' AND ISNULL(b.CN_S_SERIAL_NO,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_SERIAL_NO) ? "" : Group_List[i].CN_S_SERIAL_NO) + "' AND ISNULL(b.CN_S_UNIQUE_CODE,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_UNIQUE_CODE) ? "" : Group_List[i].CN_S_UNIQUE_CODE) + "' AND ISNULL(CN_S_PACKING_UNIT,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_PACKING_UNIT) ? "" : Group_List[i].CN_S_PACKING_UNIT) + "' AND ISNULL(CN_F_PACKING_QTY,'0')='" + Group_List[i].CN_F_PACKING_QTY + "' AND ISNULL(CN_F_PURCHASE_PRICE,'0')='" + Group_List[i].CN_F_PURCHASE_PRICE + "' AND ISNULL(CN_F_RETAIL_PRICE,'0')='" + Group_List[i].CN_F_RETAIL_PRICE + "' AND ISNULL(CN_S_PRODUCTION_BATCH,'')='" + (string.IsNullOrEmpty(Group_List[i].CN_S_PRODUCTION_BATCH) ? "" : Group_List[i].CN_S_PRODUCTION_BATCH) + "'"
|
|
};
|
Log.Info("===>HLtrayItemMstEntity:", JsonConvert.SerializeObject(HLtrayItemMstEntity));
|
HLTrayItemMstlst.Add(HLtrayItemMstEntity);
|
Log.Info("===>HLTrayItemMstlst:", JsonConvert.SerializeObject(HLTrayItemMstlst));
|
|
HLTrayItemNewOwnerMstlst.Add(newEntity);
|
|
//var dtl_List = entity.row.Where(o => o.CN_S_TRAY_CODE.Trim() == Group_List[i].CN_S_TRAY_CODE.Trim()
|
// && o.CN_S_TRAY_GRID.Trim() == Group_List[i].CN_S_TRAY_GRID.Trim() && o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim()
|
// && o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
|
|
var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_LOT_NO == Group_List[i].CN_S_LOT_NO
|
&& o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
|
|
Log.Info("===>dtl_List:", JsonConvert.SerializeObject(dtl_List));
|
for (int j = 0; j < dtl_List.Count; j++)
|
{
|
HLTrayItemDtllst.Add(new TN_WM_B_TRAY_ITEM_DTLEntity
|
{
|
CN_GUID = Guid.NewGuid().ToString().ToUpper(),
|
CN_PARENT_GUID = mstGuid,
|
CN_S_UNIQUE_CODE = "",// entity.row[i].CN_S_UNIQUE_CODE.ToString(),
|
CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO == null ? "" : dtl_List[j].CN_S_LOT_NO.ToString(),
|
CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(),
|
CN_S_PACKING_UNIT = dtl_List[j].CN_S_PACKING_UNIT.ToString(),
|
CN_F_PACKING_QTY = Convert.ToDecimal(dtl_List[j].CN_F_PACKING_QTY),
|
CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY),
|
CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(),
|
CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(),
|
CN_F_PURCHASE_PRICE = dtl_List[j].CN_F_PURCHASE_PRICE,
|
CN_F_RETAIL_PRICE = dtl_List[j].CN_F_RETAIL_PRICE,
|
CN_T_PRODUCTION = string.IsNullOrEmpty(dtl_List[j].CN_T_PRODUCTION.ToString()) ? Convert.ToDateTime("1970-01-01") : Convert.ToDateTime(dtl_List[j].CN_T_PRODUCTION),
|
CN_T_EXPIRATION = string.IsNullOrEmpty(dtl_List[j].CN_T_EXPIRATION.ToString()) ? Convert.ToDateTime("1970-01-01") : Convert.ToDateTime(dtl_List[j].CN_T_EXPIRATION),
|
CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(),
|
CN_S_NOTE = "",
|
CN_S_EXT1 = "",
|
CN_S_EXT2 = "",
|
CN_S_EXT3 = "",
|
CN_S_EXT4 = "",
|
CN_S_EXT5 = "",
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now
|
});
|
|
Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(HLTrayItemDtllst));
|
}
|
}
|
}
|
|
#endregion
|
|
#region 整托上架
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult ZTSaveLocationPalletRelation(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
try
|
{
|
Log.Info("===>进入整托上架接口:ZTSaveLocationPalletRelation", "");
|
string deviceNo = entity.CN_S_DEVICE_NO;
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
|
string trayCode = entity.CN_S_TRAY_CODE;
|
Log.Info("===>传递数据", JsonConvert.SerializeObject(entity));
|
|
if (string.IsNullOrEmpty(locationCode) && !string.IsNullOrEmpty(endAreaCode))
|
{
|
string locationWhere = " where CN_S_AREA_CODE='" + endAreaCode + "' and CN_S_LOCATION_STATE='" + Constants.Location_State_Normal + "' and CN_S_USE_STATE='" + Constants.Use_State_Empty + "' ";
|
Log.Info("===>获取目的库区正常货位", locationWhere);
|
List<TN_WM_LOCATION_EXTEntity> locationList = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetModel(locationWhere);
|
|
if (locationList.Any())
|
{
|
locationCode = locationList[0].CN_S_LOCATION_CODE;
|
Log.Info("===>获取目的库区正常货位结果", locationCode);
|
}
|
else
|
{
|
return OperateResult.Error("目的库区 " + endAreaCode + " 无正常可用货位!");
|
}
|
}
|
|
|
List<TN_WM_LOCATION_EXTEntity> locationModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
Log.Info("===>获取货位实体", JsonConvert.SerializeObject(locationModel));
|
if (locationModel.Any())
|
{
|
if (locationModel[0].CN_S_LOCATION_STATE.Trim() != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error("货位被占用!");
|
}
|
|
//库区量表实体
|
List<TN_WM_B_AREA_QTYEntity> AreaQtyList = new List<TN_WM_B_AREA_QTYEntity>();
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
#region 拼接库区量表数据
|
|
List<TrayItemMstAndDtlEntity> trayItem = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().TrayItemMstAndDtl(trayCode);
|
|
Log.Info("===>TrayItemMstAndDtlEntity", JsonConvert.SerializeObject(trayItem));
|
|
if (trayItem.Any())
|
{
|
Group_List = trayItem.GroupBy(x => new
|
{
|
x.CN_S_TRAY_CODE,
|
x.CN_S_TRAY_GRID,
|
x.CN_S_ITEM_CODE,
|
x.CN_S_ITEM_NAME,
|
x.CN_S_PRODUCTION_BATCH,
|
x.CN_S_OWNER,
|
x.CN_S_ITEM_STATE,
|
x.CN_S_LOT_NO
|
}).Select(g => new TrayItemMstAndDtlEntity
|
{
|
CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID,
|
CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME,
|
CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH,
|
CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER,
|
CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE,
|
CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO,
|
CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY)
|
}).ToList();
|
|
Log.Info("===>Group_List", JsonConvert.SerializeObject(trayItem));
|
|
foreach (var item in Group_List)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE);
|
if (itemenity == null)
|
{
|
return OperateResult.Error("未获取到物料 " + item.CN_S_ITEM_CODE + " 的实体!");
|
}
|
|
TN_WM_B_AREA_QTYEntity AreaQtyEntity = new TN_WM_B_AREA_QTYEntity();
|
AreaQtyEntity.CN_GUID = System.Guid.NewGuid().ToString();
|
AreaQtyEntity.CN_S_OWNER = item.CN_S_OWNER;
|
AreaQtyEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE;
|
AreaQtyEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME;
|
AreaQtyEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE;
|
AreaQtyEntity.CN_S_LOT_NO = item.CN_S_LOT_NO;
|
|
AreaQtyEntity.CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT;
|
AreaQtyEntity.CN_S_MODEL = itemenity.CN_S_MODEL;
|
AreaQtyEntity.CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO;
|
|
AreaQtyEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH;
|
AreaQtyEntity.CN_S_STOCK_AREA = locationModel[0].CN_S_AREA_CODE;
|
AreaQtyEntity.CN_S_STOCK_CODE = locationModel[0].CN_S_STOCK_CODE;
|
AreaQtyEntity.CN_F_QUANTITY = decimal.Parse(item.CN_F_QUANTITY.ToString());
|
AreaQtyEntity.CN_F_ALLOC_QTY = 0;
|
AreaQtyEntity.CN_F_PLANNED_QTY = 0;
|
AreaQtyEntity.CN_S_NOTE = "";
|
AreaQtyEntity.CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString();
|
AreaQtyEntity.SqlWhere = " Where CN_S_STOCK_CODE='" + locationModel[0].CN_S_STOCK_CODE.Trim() + @"'
|
and CN_S_ITEM_CODE='" + item.CN_S_ITEM_CODE + @"' and CN_S_STOCK_AREA='" + AreaQtyEntity.CN_S_STOCK_AREA + @"'
|
and CN_S_ITEM_STATE='" + item.CN_S_ITEM_STATE + @"'
|
and CN_S_LOT_NO='" + item.CN_S_LOT_NO + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_PRODUCTION_BATCH='" + item.CN_S_PRODUCTION_BATCH + @"' and CN_S_OWNER='" + item.CN_S_OWNER + @"' ";
|
AreaQtyList.Add(AreaQtyEntity);
|
}
|
Log.Info("===>拼接库区量表", JsonConvert.SerializeObject(AreaQtyList));
|
}
|
#endregion
|
|
#region 拼接托盘货位关联表
|
TrayLocationlst.Add(new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_N_INDEX = 1,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_STOCK_AREA = locationModel[0].CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = locationModel[0].CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
Log.Info("===>拼接托盘货位关联表", JsonConvert.SerializeObject(TrayLocationlst));
|
#endregion
|
}
|
else
|
{
|
TN_WM_LOCATION_EXTEntity startModel = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = deviceNo });
|
if (startModel == null || string.IsNullOrEmpty(startModel.CN_S_LOCATION_CODE))
|
{
|
return OperateResult.Error(deviceNo + " 不存在!");
|
}
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.TaskNo_In + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("入库任务号生成失败!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = "上架";
|
taskEntity.CN_S_FROM_OP = "入库";
|
taskEntity.CN_S_STOCK_CODE = startModel.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startModel.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = locationModel[0].CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationModel[0].CN_S_LOCATION_CODE;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
taskEntityList.Add(taskEntity);
|
}
|
|
|
//策略配置:上架是否直接生成入库单
|
string UpshelfWithIncrease = GetStrategy(locationModel[0].CN_S_STOCK_CODE, StrategyKey.UpshelfWithIncrease);
|
|
//降收货区库区量
|
List<AutoBomStockAreaEntity> shouHuoLocation = new List<AutoBomStockAreaEntity>();
|
|
#region 拼接收货区实体
|
var shLocation = CreateDAL<TN_WMS_AREADAL>().GetSHLocationArea("收货区");
|
if (shLocation == null)
|
{
|
return OperateResult.Error("未在Mongo库区表中找到收货区实体!");
|
}
|
//收货区
|
shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE });
|
|
Log.Info("===>获取收货区实体", JsonConvert.SerializeObject(shouHuoLocation));
|
#endregion
|
|
//上架是否生成入库单 快速入库 不需要收货区
|
TN_WM_LOT_INFOEntity lotInfo = new TN_WM_LOT_INFOEntity();
|
TN_WM_INCREASE_INVENTORY_MSTEntity inMstEntity = new TN_WM_INCREASE_INVENTORY_MSTEntity();
|
if (UpshelfWithIncrease == "Y")
|
{
|
|
#region 拼接批次信息
|
string postDataLot = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.BatchNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string lotCode = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postDataLot);
|
if (string.IsNullOrEmpty(lotCode))
|
{
|
return OperateResult.Error("生成批次号失败!");
|
}
|
|
lotInfo.CN_GUID = System.Guid.NewGuid().ToString().ToUpper();
|
lotInfo.CN_S_LOT_CODE = lotCode;
|
lotInfo.CN_S_VENDOR_NO = "";
|
lotInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
lotInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
lotInfo.CN_T_CREATE = DateTime.Now;
|
#endregion
|
|
#region 生成入库单主表
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_In + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string inOpNo = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postData);
|
//生成入库单号
|
if (string.IsNullOrEmpty(inOpNo))
|
{
|
return OperateResult.Error("生成入库单号失败!");
|
}
|
inMstEntity.CN_GUID = System.Guid.NewGuid().ToString().ToUpper();
|
inMstEntity.CN_S_OP_NO = inOpNo;
|
inMstEntity.CN_T_OPERATE = DateTime.Now;
|
inMstEntity.CN_T_MODIFY = DateTime.Now;
|
inMstEntity.CN_T_CREATE = DateTime.Now;
|
inMstEntity.CN_S_VENDOR_NO = "";
|
inMstEntity.CN_S_VENDOR_NAME = "";
|
inMstEntity.CN_S_STOCK_CODE = locationModel[0].CN_S_STOCK_CODE;
|
inMstEntity.CN_S_STATE = Constants.State_New;
|
inMstEntity.CN_S_OWNER = Constants.DefaultOwner;
|
inMstEntity.CN_S_OPERATOR = userEntity.CN_S_NAME;
|
inMstEntity.CN_S_OP_TYPE = Constants.DefaultOpType;
|
inMstEntity.CN_S_OP_FROM = "";
|
inMstEntity.CN_S_FROM_NO = "";
|
inMstEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
inMstEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
inMstEntity.CN_S_LOT_NO = lotCode;
|
inMstEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
inMstEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
inMstEntity.CN_S_NOTE = "码盘自动生成";
|
#endregion
|
|
#region 生成入库单子表
|
List<TN_WM_INCREASE_INVENTORY_DTLEntity> dtlEntityList = new List<TN_WM_INCREASE_INVENTORY_DTLEntity>();
|
var rowNo = 1;
|
foreach (var item in Group_List)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(item.CN_S_ITEM_CODE);
|
|
TN_WM_INCREASE_INVENTORY_DTLEntity dtlEntity = new TN_WM_INCREASE_INVENTORY_DTLEntity();
|
dtlEntity.CN_GUID = System.Guid.NewGuid().ToString().ToUpper();
|
//dtlEntity.CN_T_PRODUCTION = item.CN_T_PRODUCTION;
|
dtlEntity.CN_T_MODIFY = DateTime.Now;
|
dtlEntity.CN_T_CREATE = DateTime.Now;
|
//dtlEntity.CN_T_EXPIRATION = item.CN_T_EXPIRATION;
|
dtlEntity.CN_S_STATE = Constants.State_New;
|
dtlEntity.CN_S_SERIAL_NO = item.CN_S_SERIAL_NO;
|
dtlEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH;
|
dtlEntity.CN_S_OP_NO = inOpNo;
|
dtlEntity.CN_S_MSTGUID = inMstEntity.CN_GUID;
|
dtlEntity.CN_S_SERIAL_NO = "";
|
dtlEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
dtlEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
dtlEntity.CN_S_MODEL = item.CN_S_MODEL;
|
dtlEntity.CN_S_MEASURE_UNIT = item.CN_S_MEASURE_UNIT;
|
dtlEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE;
|
dtlEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME;
|
dtlEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE;
|
dtlEntity.CN_S_FIGURE_NO = item.CN_S_FIGURE_NO;
|
dtlEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
dtlEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
dtlEntity.CN_S_ARRIVAL_QTY = item.CN_F_QUANTITY == null ? "" : item.CN_F_QUANTITY.ToString();
|
dtlEntity.CN_N_ROW_NO = rowNo;
|
dtlEntity.CN_F_WARRNTY_PARTS = itemenity.CN_F_WARRNTY_PARTS;
|
dtlEntity.CN_F_UPSHELF_QTY = 0;
|
dtlEntity.CN_F_QUANTITY = item.CN_F_QUANTITY == null ? 0 : Convert.ToDecimal(item.CN_F_QUANTITY.ToString());
|
dtlEntity.CN_F_PRINTING_QTY = 0;
|
dtlEntity.CN_F_PLAN_PRICE = 0;
|
dtlEntity.CN_F_PLAN_MONEY = 0;
|
dtlEntity.CN_F_ALLOT_QTY = 0;
|
dtlEntity.CN_F_ADD_ONTRAY_QTY = 0;
|
dtlEntity.CN_S_NOTE = "码盘自动生成";
|
//dtlEntity.CN_F_ACTUAL_PRICE = item.CN_F_PURCHASE_PRICE;
|
//dtlEntity.CN_F_ACTUAL_MONEY = (item.CN_F_PURCHASE_PRICE == null ? 0 : item.CN_F_PURCHASE_PRICE) * item.CN_F_QUANTITY == null ? 0 : Convert.ToDecimal(item.CN_F_QUANTITY.ToString());
|
dtlEntity.CN_C_IS_SCRAP = Constants.N;
|
dtlEntity.CN_C_IS_BALANCE = Constants.N;
|
|
dtlEntityList.Add(dtlEntity);
|
rowNo++;
|
}
|
|
inMstEntity.DTLEntity = dtlEntityList;
|
#endregion
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
if (!string.IsNullOrEmpty(inMstEntity.CN_S_OP_NO))
|
{
|
//新增入库单主表
|
CreateDAL<DapperDAL<TN_WM_INCREASE_INVENTORY_MSTEntity>>().Add(inMstEntity, trans);
|
//新增入库单子表
|
CreateDAL<DapperDAL<TN_WM_INCREASE_INVENTORY_DTLEntity>>().AddRange(inMstEntity.DTLEntity, trans);
|
}
|
|
//新增批次信息表
|
if (!string.IsNullOrEmpty(lotInfo.CN_S_LOT_CODE))
|
{
|
CreateDAL<DapperDAL<TN_WM_LOT_INFOEntity>>().Add(lotInfo, trans);
|
}
|
|
//整托-自动上架情况下
|
if (!string.IsNullOrEmpty(deviceNo))
|
{
|
//下推任务给AMS
|
foreach (var taskEntity in taskEntityList)
|
{
|
OperateResult re = new OtherSysApi().SendAmsTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
Log.Info("===>ZT-DoTransaction1", "");
|
//锁定目的位置货位-预入库锁定
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_LOCATION_STATE = Constants.Location_State_InLock, CN_S_TASK_NO = taskEntity.CN_S_TASK_NO },
|
new { CN_S_LOCATION_CODE = taskEntity.CN_S_END_BIT }, trans);
|
Log.Info("===>ZT-DoTransaction2", taskEntity.CN_S_END_BIT + "$" + Constants.Location_State_InLock);
|
//锁定起始位置货位-预出库锁定
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = taskEntity.CN_S_TASK_NO },
|
new { CN_S_LOCATION_CODE = taskEntity.CN_S_START_BIT }, trans);
|
Log.Info("===>ZT-DoTransaction2-1", taskEntity.CN_S_START_BIT + "$" + Constants.Location_State_OutLock);
|
//锁定起始位置货位-预出库锁定
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock },
|
new { CN_S_LOCATION_CODE = taskEntity.CN_S_START_BIT }, trans);
|
Log.Info("===>ZT-DoTransaction2-1", taskEntity.CN_S_START_BIT + "$" + Constants.Location_State_OutLock);
|
}
|
//新增入库任务
|
if (taskEntityList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().AddRange(taskEntityList, trans);
|
}
|
Log.Info("===>ZT-DoTransaction3", "");
|
}
|
|
//整托-人工上架情况下
|
if (string.IsNullOrEmpty(deviceNo))
|
{
|
if (TrayLocationlst.Any())
|
{
|
//新增托盘货位关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(TrayLocationlst, trans);
|
Log.Info("===>新增托盘货位关联", "");
|
}
|
|
//根据批次和物料编码更新累积上架数
|
if (Group_List.Any())
|
{
|
CreateDAL<TN_WM_INCREASE_INVENTORYDAL>().UpdateUpselefQtyByLot(Group_List, trans);
|
Log.Info("===>根据单号和物料编码更新累积上架数", "");
|
}
|
|
//影响库区量表
|
if (AreaQtyList.Any() && UpshelfWithIncrease == "N")
|
{
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(AreaQtyList, trans);
|
Log.Info("===>影响库区量表", "");
|
}
|
//降收货区库区量
|
if (AreaQtyList.Any())
|
{
|
AreaQtyList.ForEach(x =>
|
{
|
x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE;
|
});
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(AreaQtyList, trans);
|
Log.Info("===>降收货区库区量", "");
|
}
|
//更新货位扩展表状态
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(locationCode, Constants.Location_State_Normal, Constants.Use_State_NoFull, "", trans);
|
Log.Info("===>更新货位扩展表状态", "");
|
|
CreateDAL<TN_WM_UP_HISTORYDAL>().UpdateLocation(trayCode, locationModel, trans);
|
Log.Info("===>更新入库记录", trayCode + "****" + JsonConvert.SerializeObject(locationModel));
|
|
}
|
});
|
return operateResult;
|
}
|
else
|
{
|
return OperateResult.Error("货位不存在!");
|
}
|
|
}
|
catch (Exception ex)
|
{
|
Log.Info("===>Exception", ex.ToString());
|
return OperateResult.Error(ex.ToString());
|
}
|
|
}
|
#endregion
|
|
#region 获取货位列表
|
/// <summary>
|
/// 根据托盘编码获取托盘货位关联列表
|
/// </summary>
|
/// <param name="trayCode"></param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-16</History>
|
public List<TN_WM_B_TRAY_LOCATIONEntity> GetListByTrayCode(string trayCode)
|
{
|
return CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
}
|
#endregion
|
|
#region 获取货位列表
|
/// <summary>
|
/// 根据托盘编码获取托盘货位关联列表
|
/// </summary>
|
/// <param name="trayCode"></param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-11-16</History>
|
public List<TN_WM_B_TRAY_LOCATIONEntity> GetListByLocationCode(string locationCode)
|
{
|
return CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
}
|
#endregion
|
|
#region 根据货位获取托盘信息
|
/// <summary>
|
/// 根据货位获取托盘信息
|
/// </summary>
|
/// <param name="lstQueryUpdate"></param>
|
/// <param name="trans"></param>
|
/// <returns></returns>
|
/// <History>[HANHE(lt)] CREATED BY 2018-12-5</History>
|
public List<TN_WM_B_TRAY_ITEM_MSTEntity> GetTrayLocation(string sqlwhere)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> list = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().GetTrayLocation(sqlwhere);
|
foreach (var entity in list)
|
{
|
AutoBomItemEntity ItemEntity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(entity.CN_S_ITEM_CODE);
|
entity.CN_C_IS_SN = ItemEntity == null ? "" : ItemEntity.CN_C_IS_SN;
|
entity.AuxiliaryUnitList = ItemEntity == null ? null : ItemEntity.AuxiliaryUnitList;
|
}
|
return list;
|
}
|
|
public List<TN_WM_B_TRAY_ITEM_MSTEntity> GetTrayLocationAndNullLocation(string sqlwhere)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> list = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().GetTrayLocationAndNullLocation(sqlwhere);
|
foreach (var entity in list)
|
{
|
AutoBomItemEntity ItemEntity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(entity.CN_S_ITEM_CODE);
|
entity.CN_C_IS_SN = ItemEntity == null ? "" : ItemEntity.CN_C_IS_SN;
|
entity.AuxiliaryUnitList = ItemEntity == null ? null : ItemEntity.AuxiliaryUnitList;
|
}
|
return list;
|
}
|
#endregion
|
|
#region 修改货位
|
/// <summary>
|
/// 修改货位
|
/// </summary>
|
/// <returns></returns>
|
/// <history>[HANHE(lt)] CREATED BY 2018-12-5</history>
|
public SqlExecuteResult UpdateLocation(string startLoca, string endLoca)
|
{
|
SqlExecuteResult result = new SqlExecuteResult();
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateLocation(startLoca, endLoca, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
|
result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateLocationExt(startLoca, endLoca, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
return result;
|
});
|
}
|
#endregion
|
|
#region 根据托盘,返回托盘所在货位信息
|
/// <summary>
|
/// 根据托盘,返回托盘所在货位信息
|
/// </summary>
|
/// <param name="trayCode"></param>
|
/// <returns></returns>
|
public DataTable GetLocationByTrayCode(string trayCode, string locationCode)
|
{
|
DataTable dt = new DataTable();
|
if (!string.IsNullOrEmpty(trayCode))
|
return CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetDataTable(new { CN_S_TRAY_CODE = trayCode });
|
|
if (!string.IsNullOrEmpty(locationCode))
|
return CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetDataTable(new { CN_S_LOCATION_CODE = locationCode });
|
return dt;
|
}
|
#endregion
|
|
#region (PDA接口)物料上架获取建议货位
|
/// <summary>
|
/// 物料上架获取建议货位
|
/// </summary>
|
/// <param name="itemCode">物料编码</param>
|
/// <param name="areaCode">库区编码</param>
|
/// <param name="quantity">上架数量</param>
|
/// <param name="lotCode">批次编码</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-03-20</History>
|
public OperateResult ItemGetLocationCode(string itemCode, string areaCode, int quantity, string lotCode)
|
{
|
List<itemInClass> itemlist = new List<itemInClass>();
|
|
itemlist.Add(new itemInClass() { itemCode = itemCode, itemQty = quantity, lotNo = lotCode });
|
|
var Fae = new FeedAlgorEntity()
|
{
|
FeedType = (FeedGoodType)Enum.Parse(typeof(FeedGoodType), "None", false),
|
lstDevice = null,
|
stockArea = areaCode,
|
trayQty = quantity,
|
lstItem = itemlist,
|
lockLocation = false//是否需要锁定货位
|
};
|
|
OutFeedResultEntity result = BLLCreator.Create<Feed_AlgorBLL>().Feed(Fae);
|
|
return OperateResult.Succeed("", result);
|
|
}
|
#endregion
|
|
#region (PDA接口)整托获取建议货位
|
/// <summary>
|
/// 整托获取建议货位
|
/// </summary>
|
/// <param name="trayCode">物料编码</param>
|
/// <param name="platformArea">库区编码</param>
|
/// <param name="stockArea">上架数量</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-03-20</History>
|
public OperateResult ZTGetLocationCode(string trayCode, string platformArea, string stockArea)
|
{
|
OperateResult opResult = new OperateResult();
|
return opResult;
|
|
}
|
#endregion
|
|
#region (PDA接口)根据货位编码获取货位上托盘信息
|
/// <summary>
|
/// (PDA接口)根据货位编码获取货位上托盘信息
|
/// </summary>
|
/// <param name="locationCode">货位编码</param>
|
/// <returns></returns>
|
/// <history>[HanHe(xdl)] CREATED 2019/03/20</history>
|
public List<TN_WM_B_TRAY_LOCATIONEntity> GetDetailByLocationCode(string locationCode)
|
{
|
List<TN_WM_B_TRAY_LOCATIONEntity> list = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetList(new { CN_S_LOCATION_CODE = locationCode });
|
return list;
|
}
|
#endregion
|
|
#region (PDA接口)呼叫不满托盘出库
|
/// <summary>
|
/// 呼叫不满托盘出库
|
/// </summary>
|
/// <param name="specificationList">物料编码</param>
|
/// <param name="trayQuantity">库区编码</param>
|
/// <param name="endLocationCode">目的位置</param>
|
/// <param name="startAreaCode">起始库区</param>
|
/// <param name="useEntity">实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-03-20</History>
|
public OperateResult CallNoFullPallet(string itemCode, string trayQuantity, string endLocationCode, string startAreaCode, RedisUserEntity useEntity)
|
{
|
//调用算法返回能用托盘
|
List<itemInClass> itemlist = new List<itemInClass>();
|
|
itemlist.Add(new itemInClass() { itemCode = itemCode, lotNo = "" });
|
FeedAlgorEntity feedParam = new FeedAlgorEntity()
|
{
|
FeedType = FeedGoodType.FridTrayFirst,
|
stockArea = startAreaCode,
|
lstItem = itemlist,
|
lockLocation = false
|
};
|
Log.Info("算法传参:", JsonConvert.SerializeObject(feedParam));
|
|
OutFeedResultEntity feedAlloc = BLLCreator.Create<Feed_AlgorBLL>().Feed(feedParam);
|
|
Log.Info("算法返回:", JsonConvert.SerializeObject(feedAlloc));
|
|
if (!feedAlloc.Success)
|
return OperateResult.Error("算法异常:" + feedAlloc.Msg);
|
|
//拼接任务实体集合
|
List<TN_WM_TASKEntity> taskList = new List<TN_WM_TASKEntity>();
|
foreach (FeedItemEntity m in feedAlloc.lstFeedItem)
|
{
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.TaskNo_Out + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
Log.Info("===>出库任务号生成失败!", "");
|
return null;
|
}
|
|
TN_WM_B_TRAY_LOCATIONEntity trayLocationRel = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_TRAY_CODE = m.trayCode });
|
|
TN_WM_LOCATION_EXTEntity locationModel = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = endLocationCode });
|
if (locationModel == null)
|
{
|
Log.Info("===>目的位置实体解析失败!", "");
|
return null;
|
}
|
|
taskList.Add(new TN_WM_TASKEntity()
|
{
|
CN_S_TASK_NO = taskNo,
|
CN_N_PRIORITY = 1,
|
CN_S_TASK_TYPE = "呼叫出库",
|
CN_S_FROM_OP = "出库",
|
CN_S_STOCK_CODE = trayLocationRel.CN_S_STOCK_CODE,
|
CN_S_START_AREA = trayLocationRel.CN_S_STOCK_AREA,
|
CN_S_START_BIT = trayLocationRel.CN_S_LOCATION_CODE,
|
CN_S_END_AREA = locationModel.CN_S_AREA_CODE,//分拣台所在库区
|
CN_S_END_BIT = locationModel.CN_S_LOCATION_CODE,//分拣台所在位置
|
CN_S_STATE = Constants.TaskState_NoExecuted,
|
CN_S_TRAY_CODE = m.trayCode,
|
CN_S_CREATOR = useEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = useEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = useEntity.CN_S_LOGIN,
|
CN_S_MODIFY_BY = useEntity.CN_S_NAME,
|
CN_T_MODIFY = DateTime.Now
|
});
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//生成出库任务
|
if (taskList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().AddRange(taskList, trans);
|
}
|
Log.Info("===>DoTransaction2", "");
|
|
foreach (var item in taskList)
|
{
|
//下推任务给AMS
|
OperateResult re = new OtherSysApi().SendAmsTask(item);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
Log.Info("===>DoTransaction3", item.CN_S_TASK_NO);
|
|
//锁定出库起始货位
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = item.CN_S_TASK_NO },
|
new { CN_S_LOCATION_CODE = item.CN_S_START_BIT }, trans);
|
}
|
Log.Info("===>DoTransaction4", "");
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 托盘指引出库
|
/// <summary>
|
/// 托盘指引出库 锁定货位\写入托盘预分配表\生成入库任务\下推给AMS
|
/// </summary>
|
/// <param name="lstAllocQuery">托盘预分配表</param>
|
/// <param name="taskList">出库任务</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-03-26</History>
|
public OperateResult CommitUpGuide(List<TN_WM_TRAY_ALLOCEntity> lstAllocQuery, List<TN_WM_TASKEntity> taskList)
|
{
|
List<string> trays = lstAllocQuery.GroupBy(x => x.CN_S_TRAY_CODE).Select(x => x.Key).ToList();
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//写入托盘预分配表
|
if (lstAllocQuery.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_TRAY_ALLOCEntity>>().AddRange(lstAllocQuery, trans);
|
}
|
Log.Info("===>DoTransaction1", "");
|
|
//生成出库任务
|
if (taskList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().AddRange(taskList, trans);
|
}
|
Log.Info("===>DoTransaction2", "");
|
|
foreach (var item in taskList)
|
{
|
//下推任务给AMS
|
OperateResult re = new OtherSysApi().SendAmsTask(item);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
Log.Info("===>DoTransaction3", item.CN_S_TASK_NO);
|
|
//锁定出库起始货位
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_LOCATION_STATE = Constants.Location_State_OutLock, CN_S_TASK_NO = item.CN_S_TASK_NO },
|
new { CN_S_LOCATION_CODE = item.CN_S_START_BIT }, trans);
|
}
|
Log.Info("===>DoTransaction4", "");
|
|
});
|
//把指引容器返回到前台,供等待容器使用
|
if (operateResult.Success)
|
{
|
operateResult.Data = trays;
|
}
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)托盘货位绑定
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckLocationYS(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
//检查该托盘是否绑定了其他货位
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
//检查该货位外层是否有阻挡
|
if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR))
|
{
|
var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR);
|
var locations = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR);
|
if (locations.Count() > 0)
|
{
|
foreach (var location in locations)
|
{
|
|
if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常"))
|
{
|
return OperateResult.Error(string.Format("当前货位的外层货位{0}被占用,请先处理外层货位!", location.CN_S_LOCATION_CODE));
|
}
|
}
|
}
|
}
|
return OperateResult.Succeed("");
|
}
|
#endregion
|
|
|
#region (PDA接口)托盘货位绑定
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckCallLocationYS(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_S_AREA_CLASS != "线边区")
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("该货位{0}不属于线边区,不允许叫料!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
//检查该托盘是否绑定了其他货位
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
//检查该货位外层是否有阻挡
|
if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR))
|
{
|
var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR);
|
var locations = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR);
|
if (locations.Count() > 0)
|
{
|
foreach (var location in locations)
|
{
|
|
if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常"))
|
{
|
return OperateResult.Error(string.Format("当前货位的外层货位{0}状态为{1},存储状态为{2},导致当前货位不可用!", location.CN_S_LOCATION_CODE, location.CN_S_LOCATION_STATE, location.CN_S_USE_STATE));
|
}
|
}
|
}
|
}
|
return OperateResult.Succeed("");
|
}
|
#endregion
|
|
#region (PDA接口)检查入库起点是否可用
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckInStockLocation(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count > 0)
|
{
|
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstMst = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + lstStartTray[0].CN_S_TRAY_CODE + "'");
|
if (lstMst.Count == 0)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}绑定的托盘没有物料信息,不允许入库!", locationCode));
|
}
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
//检查该货位外层是否有阻挡
|
if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR))
|
{
|
var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR);
|
var locations = BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR);
|
if (locations.Count() > 0)
|
{
|
foreach (var location in locations)
|
{
|
|
if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常"))
|
{
|
return OperateResult.Error(string.Format("当前货位的外层货位{0}被占用,请先处理外层货位!", location.CN_S_LOCATION_CODE));
|
}
|
}
|
}
|
}
|
|
return OperateResult.Succeed("", strTrayCode);
|
}
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckInStockTray(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstMst = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + trayCode + "'");
|
if (lstMst.Count == 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘{0}没有物料信息,不允许入库!", trayCode));
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
if (lstStartTray.Count > 0)
|
{
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE));
|
}
|
|
return OperateResult.Succeed("", lstStartTray[0].CN_S_LOCATION_CODE);
|
}
|
else
|
{
|
return OperateResult.Succeed("", "");
|
}
|
}
|
#endregion
|
|
#region (PDA接口)检查码盘起点是否可用
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckMpLocation(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count > 0)
|
{
|
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复码盘!", lstInTask[0].CN_S_TASK_NO));
|
}
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许在该位置码盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(strTrayCode);
|
return OperateResult.Succeed(strTrayCode, dt);
|
}
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckMpTray(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许码盘!", lstInTask[0].CN_S_TASK_NO));
|
}
|
if (lstStartTray.Count > 0)
|
{
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许在该货位码盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(trayCode);
|
return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt);
|
}
|
else
|
{
|
DataTable dt = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetTrayDetail(trayCode);
|
return OperateResult.Succeed("", dt);
|
}
|
}
|
#endregion
|
|
#region (PDA接口)托盘货位绑定
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
List<TN_WM_B_STOCK_QTYEntity> addStockQty = new List<TN_WM_B_STOCK_QTYEntity>();
|
List<TN_WM_B_AREA_QTYEntity> addAreaQty = new List<TN_WM_B_AREA_QTYEntity>();
|
#region 检查托盘与货位是否满足绑定条件
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检查该托盘是否绑定了其他货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
|
}
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
|
#endregion
|
//拼接托盘货位实体
|
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
};
|
|
trayLocationList.Add(trayLocation);
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接上架记录表
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = 0,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = dltEntity.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = mstEntity.CN_S_MODEL,
|
CN_S_MODIFY = userEntity.CN_S_NAME,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_S_OWNER = mstEntity.CN_S_OWNER,
|
CN_S_PACKING_UNIT = "",
|
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
|
CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "PDA绑定上架",
|
});
|
#endregion
|
}
|
}
|
|
#region 仓库量表
|
addStockQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
};
|
}).ToList();
|
#endregion
|
#region 库区量表
|
addAreaQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
}
|
}
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//写入托盘货位关联表
|
if (trayLocationList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(trayLocationList, trans);
|
}
|
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态及货位状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
}
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
//更新仓库量表
|
if (addStockQty.Any())
|
BLLCreator.Create<TN_WM_B_STOCK_QTYBLL>().AddList(addStockQty, trans);
|
//CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddList(addStockQty, trans);
|
//更新库区量表
|
if (addAreaQty.Any())
|
BLLCreator.Create<TN_WM_B_AREA_QTYBLL>().AddList(addAreaQty, trans);
|
//CreateDAL<TN_WM_B_AREA_QTYDAL>().AddList(addAreaQty, trans);
|
}
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)托盘货位解绑
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult DeleteTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
OperateResult operateResult = new OperateResult();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = new List<TN_WM_B_STOCK_QTYEntity>();
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = new List<TN_WM_B_AREA_QTYEntity>();
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString());
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
|
down.CN_S_TRAY_CODE = trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
}
|
}
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
}
|
|
}
|
|
});
|
return operateResult;
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(locationCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = locationCode;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
}
|
}
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
|
});
|
|
}
|
return operateResult;
|
|
|
}
|
#endregion
|
|
#region(PDA接口)托盘货位绑定带码盘
|
/// <summary>
|
/// 加生成任务接口模拟AMS接口调用出入库,
|
/// </summary>
|
/// <param name="entity"></param>
|
/// <param name="userEntity"></param>
|
/// <returns></returns>
|
public OperateResult LoadAndUnload(HH.WMS.Entitys.Basic.LocationTrayItmRelEntity entity, RedisUserEntity userEntity)
|
{
|
OperateResult result = new OperateResult();
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
|
if (entity.type == 1)
|
{
|
#region 绑定
|
#region 检验货位是否可用
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(entity.location);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(entity.location);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location));
|
}
|
#endregion
|
|
#region 检验托盘是否可用
|
if (!string.IsNullOrEmpty(entity.trayCode))
|
{
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(entity.trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检查该托盘是否绑定了其他货位
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(entity.trayCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
|
}
|
|
}
|
else
|
{
|
var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}";
|
entity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(entity.trayCode))
|
{
|
return OperateResult.Error("获取Autobom托盘号异常,请检查是否配置虚拟托盘生成规则");
|
}
|
}
|
#endregion
|
|
#region 拼接处理数据
|
//拼接托盘物料关联主子表
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> TrayItemMstlst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> TrayItemDtllst = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
var Group_List = entity.itemData.GroupBy(x => new
|
{
|
x.itemCode,
|
x.itemState,
|
x.owner
|
}).Select(g => new TrayItemRow
|
{
|
CN_S_TRAY_CODE = entity.trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_S_ITEM_CODE = g.FirstOrDefault().itemCode.Trim(),
|
CN_S_ITEM_STATE = g.FirstOrDefault().itemState.Trim(),
|
CN_S_OWNER = g.FirstOrDefault().owner.Trim(),
|
CN_F_QUANTITY = g.Sum(p => p.qty)
|
}).ToList();
|
|
for (int i = 0; i < Group_List.Count; i++)
|
{
|
AutoBomItemEntity itemenity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString());
|
//拼接托盘物料关联主表实体
|
#region 拼接托盘物料关联主表实体
|
var mstGuid = Guid.NewGuid().ToString().ToUpper();
|
var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = mstGuid,
|
CN_S_TRAY_CODE = entity.trayCode,
|
CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(),
|
CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(),
|
CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(),
|
CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO,
|
CN_S_MODEL = itemenity.CN_S_MODEL,
|
CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(),
|
CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT,
|
CN_F_ALLOC_QTY = 0,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()),
|
};
|
#endregion
|
#region 拼接托盘物料关联子表实体
|
|
TrayItemMstlst.Add(trayItemMstEntity);
|
var parentGuid = trayItemMstEntity.CN_GUID;
|
|
var dtl_List = entity.itemData.Where(o => o.owner.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.itemCode.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList();
|
|
|
|
for (int j = 0; j < dtl_List.Count; j++)
|
{
|
var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity();
|
dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper();
|
dtlentity.CN_PARENT_GUID = parentGuid;
|
dtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString();
|
dtlentity.CN_S_LOT_NO = dtl_List[j].lotNo.ToString();
|
dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].qty);
|
dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].batchNo.ToString();
|
dtlentity.CN_S_NOTE = "";
|
dtlentity.CN_S_EXT1 = "";
|
dtlentity.CN_S_EXT2 = "";
|
dtlentity.CN_S_EXT3 = "";
|
dtlentity.CN_S_EXT4 = "";
|
dtlentity.CN_S_EXT5 = "";
|
dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
dtlentity.CN_T_CREATE = DateTime.Now;
|
dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
dtlentity.CN_T_MODIFY = DateTime.Now;
|
TrayItemDtllst.Add(dtlentity);
|
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = 0,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_S_FIGURE_NO = trayItemMstEntity.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = trayItemMstEntity.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = dtlentity.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = trayItemMstEntity.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = trayItemMstEntity.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = entity.location,
|
CN_S_LOT_NO = dtlentity.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = trayItemMstEntity.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = trayItemMstEntity.CN_S_MODEL,
|
CN_S_MODIFY = userEntity.CN_S_NAME,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_S_OWNER = trayItemMstEntity.CN_S_OWNER,
|
CN_S_PACKING_UNIT = "",
|
CN_S_PRODUCTION_BATCH = dtlentity.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = entity.trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "PDA绑定上架",
|
CN_S_EXT1 = ""
|
});
|
}
|
#endregion
|
|
|
}
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = entity.location;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = entity.trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
down.CN_S_EXT1 = "";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
|
|
#region 仓库量表
|
List<TN_WM_B_STOCK_QTYEntity> addStockQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
};
|
}).ToList();
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
List<TN_WM_B_AREA_QTYEntity> addAreaQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
|
//拼接托盘货位实体
|
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
CN_S_TRAY_CODE = entity.trayCode,
|
CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = entity.location,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
};
|
#endregion
|
|
|
|
result = UseTransaction(trans =>
|
{
|
#region 事务
|
|
//删除原托盘中绑定的物料
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
|
//删除子表
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
|
}
|
if (TrayItemMstlst.Any())
|
{
|
//新增托盘物料关联主表
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(TrayItemMstlst, trans);
|
}
|
if (TrayItemDtllst.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(TrayItemDtllst, trans);
|
}
|
|
|
//Log.Info("LoadAndUnload", "7");
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Add(trayLocation, trans);
|
|
|
//更新货位贮存状态及货位状态
|
result = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (result.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (addStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddStockQty(addStockQty, trans);
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (addAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(addAreaQty, trans);
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
#endregion
|
});
|
#endregion
|
}
|
else if (entity.type == 2)
|
{
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(entity.trayCode))
|
{
|
#region 根据托盘解除绑定
|
#region 判断托盘货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(entity.trayCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前托盘没有绑定货位,不需要绑定!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString());
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = entity.trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = entity.trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
down.CN_S_EXT1 = "";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
result = UseTransaction(trans =>
|
{
|
string waitlocationCode = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
|
|
//删除托盘物料关联
|
//删除原托盘中绑定的物料
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans);
|
//删除子表
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
|
}
|
|
//更新货位贮存状态
|
result = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
if (result.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
|
});
|
return result;
|
#endregion
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(entity.location))
|
{
|
#region 根据货位解除绑定
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(entity.location);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", entity.location));
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(entity.location);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location));
|
}
|
#endregion
|
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = entity.location;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
down.CN_S_EXT1 = "";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
result = UseTransaction(trans =>
|
{
|
# region 执行事务
|
string waitlocationCode = entity.location;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = entity.location }, trans);
|
|
//删除托盘物料关联
|
//删除原托盘中绑定的物料
|
result = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }, trans);
|
//删除子表
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST)
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans);
|
}
|
//更新货位贮存状态
|
result = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
if (result.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
#endregion
|
|
});
|
return result;
|
#endregion
|
}
|
}
|
return result;
|
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托上架(自动)
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
//调用算法计算终点货位
|
|
//调用入库算法,获取空货位
|
InAlgorEnitty iAe = new InAlgorEnitty()
|
{
|
stockAreaCode = entity.CN_S_END_AREA_CODE,
|
logicCode = "",
|
locationQty = 1,
|
trayCode = trayCode,
|
itemCode = "",
|
lockLocation = false//是否需要锁定货位
|
};
|
iAe.lstDevice = null;
|
InResultEntity irEresult = BLLCreator.Create<In_AlgorBLL>().In(iAe);
|
|
|
|
if (!irEresult.Success)
|
{
|
return OperateResult.Error(irEresult.Msg);//货位获取失败!
|
}
|
else
|
{
|
locationCode = irEresult.lstLocation[0].locationCode.ToString();
|
}
|
}
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
if (startlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!");
|
}
|
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托上架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
|
OperateResult re = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托上架(移库)
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTShelfMoveStock(ref MoveStockJobPara moveStockJobPara, TrayOnShelfEntity entity, RedisUserEntity userEntity, LogPara logPara)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
var parentGuid = moveStockJobPara.MoveStockMst.CN_GUID;
|
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
//调用算法计算终点货位
|
|
//调用入库算法,获取空货位
|
InAlgorEnitty iAe = new InAlgorEnitty()
|
{
|
stockAreaCode = entity.CN_S_END_AREA_CODE,
|
logicCode = "",
|
locationQty = 1,
|
trayCode = trayCode,
|
itemCode = "",
|
lockLocation = false//是否需要锁定货位
|
};
|
iAe.lstDevice = null;
|
InResultEntity irEresult = BLLCreator.Create<In_AlgorBLL>().In(iAe);
|
|
if (!irEresult.Success)
|
{
|
return OperateResult.Error(irEresult.Msg);//货位获取失败!
|
}
|
else
|
{
|
locationCode = irEresult.lstLocation[0].ToString();
|
}
|
}
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
if (startlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!");
|
}
|
if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
//锁定起点货位
|
BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = deviceNo });
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
//if (!re.Success)
|
//{
|
// throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
//}
|
OperateResult re = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, "", "", taskNo, trans);
|
|
//if (operateResult.AffectedRows == 0)
|
//{
|
// throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
//}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
|
//var qty = DALCreator.Create<TN_WM_B_TRAY_ITEM_RELDAL>().GetItemQtyByTrayCode(trayCode, logPara);
|
//BLLCreator.Create<MoveStockTaskBLL>().AddDtl(parentGuid, taskNo, "移库", qty, null);
|
});
|
|
if (operateResult.Success)
|
{
|
moveStockJobPara.OkTasks.Add(new OkTask
|
{
|
taskNo = taskEntity.CN_S_TASK_NO,
|
startBit = taskEntity.CN_S_START_BIT,
|
endBit = taskEntity.CN_S_END_BIT,
|
priority = Convert.ToInt32(taskEntity.CN_N_PRIORITY),
|
trayCode = taskEntity.CN_S_TRAY_CODE,
|
startStock = taskEntity.CN_S_STOCK_CODE
|
});
|
}
|
return operateResult;
|
}
|
#endregion
|
|
#region(PDA接口)简易版整托下架(自动)
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTDownShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//分拣台
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", locationCode));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", deviceNo));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托下架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = locationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = deviceNo;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托上架(手动)
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult SimZTShelfManual(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
#region 检查托盘与货位是否满足绑定条件
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//检查该托盘是否绑定了其他货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复上架!", lstEntity[0].CN_S_LOCATION_CODE));
|
}
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复上架!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
#endregion
|
//拼接托盘货位实体
|
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
};
|
trayLocationList.Add(trayLocation);
|
//策略配置:库存是否启用收货区
|
List<AutoBomStockAreaEntity> shouHuoLocation = new List<AutoBomStockAreaEntity>();
|
string AreaQtyReceiveGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood);
|
if (AreaQtyReceiveGood.Equals("Y"))
|
{
|
var shLocation = CreateDAL<TN_WMS_AREADAL>().GetSHLocationArea("收货区");
|
if (shLocation == null)
|
{
|
return OperateResult.Error("未在Mongo库区表中找到收货区实体!");
|
}
|
//收货区
|
shouHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE });
|
}
|
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接上架记录表
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = 0,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = dltEntity.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = mstEntity.CN_S_MODEL,
|
CN_S_MODIFY = userEntity.CN_S_NAME,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_S_OWNER = mstEntity.CN_S_OWNER,
|
CN_S_PACKING_UNIT = "",
|
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "PDA上架入库",
|
});
|
#endregion
|
}
|
}
|
|
#region 仓库量表
|
List<TN_WM_B_STOCK_QTYEntity> addStockQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
};
|
}).ToList();
|
#endregion
|
#region 库区量表
|
List<TN_WM_B_AREA_QTYEntity> addAreaQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//写入托盘货位关联表
|
if (trayLocationList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(trayLocationList, trans);
|
}
|
|
|
//更新货位贮存状态及货位状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
if (AreaQtyReceiveGood.Equals("Y"))
|
{
|
//更新仓库量表
|
if (addStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddStockQty(addStockQty, trans);
|
}
|
//更新库区量表
|
if (addAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(addAreaQty, trans);
|
}
|
|
}
|
if (AreaQtyReceiveGood.Equals("Y"))
|
{
|
#region 拼接收货区实体
|
//降收货区库区量
|
|
//降收货区库区量
|
if (addAreaQty.Any())
|
{
|
addAreaQty.ForEach(x =>
|
{
|
x.CN_S_STOCK_AREA = shouHuoLocation[0].CN_S_AREA_CODE;
|
});
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(addAreaQty, trans);
|
Log.Info("===>降收货区库区量", "");
|
}
|
Log.Info("===>获取收货区实体", JsonConvert.SerializeObject(shouHuoLocation));
|
#endregion
|
}
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托下架(手动)
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult SimZTDownShelfManual(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
OperateResult operateResult = new OperateResult();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前托盘没有绑定货位,不允许出库!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置出库!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置出库!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString());
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA下架出库";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
|
//策略配置:库存是否启用收货区
|
List<AutoBomStockAreaEntity> faHuoLocation = new List<AutoBomStockAreaEntity>();
|
string AreaQtyDeliverGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood);
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
var shLocation = CreateDAL<TN_WMS_AREADAL>().GetSHLocationArea("发货区");
|
if (shLocation == null)
|
{
|
return OperateResult.Error("未在Mongo库区表中找到发货区实体!");
|
}
|
//收货区
|
faHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE });
|
}
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
|
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
}
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
#region 拼接收货区实体
|
|
//降收货区库区量
|
if (reduceAreaQty.Any())
|
{
|
reduceAreaQty.ForEach(x =>
|
{
|
x.CN_S_STOCK_AREA = faHuoLocation[0].CN_S_AREA_CODE;
|
});
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
Log.Info("===>降发货区库区量", "");
|
}
|
Log.Info("===>降发货区库区量", JsonConvert.SerializeObject(faHuoLocation));
|
#endregion
|
}
|
|
});
|
return operateResult;
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(locationCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前货位没有绑定托盘,不允许出库!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT未查询到该货位{0}!", locationCode));
|
}
|
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置出库!", locationCode, GetModel[0].CN_S_USE_STATE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置出库!", locationCode, GetModel[0].CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY;
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = locationCode;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA下架出库";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
//策略配置:库存是否启用收货区
|
List<AutoBomStockAreaEntity> faHuoLocation = new List<AutoBomStockAreaEntity>();
|
string AreaQtyDeliverGood = GetStrategy(areaModel.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood);
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
var shLocation = CreateDAL<TN_WMS_AREADAL>().GetSHLocationArea("发货区");
|
if (shLocation == null)
|
{
|
return OperateResult.Error("未在Mongo库区表中找到发货区实体!");
|
}
|
//收货区
|
faHuoLocation.Add(new AutoBomStockAreaEntity() { CN_S_AREA_CODE = shLocation[0].CN_S_AREA_CODE });
|
}
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
|
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
}
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
if (AreaQtyDeliverGood.Equals("Y"))
|
{
|
#region 拼接收货区实体
|
|
//降收货区库区量
|
if (reduceAreaQty.Any())
|
{
|
reduceAreaQty.ForEach(x =>
|
{
|
x.CN_S_STOCK_AREA = faHuoLocation[0].CN_S_AREA_CODE;
|
});
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
Log.Info("===>降发货区库区量", "");
|
}
|
Log.Info("===>降发货区库区量", JsonConvert.SerializeObject(faHuoLocation));
|
#endregion
|
}
|
|
});
|
|
}
|
return operateResult;
|
|
|
}
|
#endregion
|
|
#region (PDA接口)简易版整托上架(自动) 宇寿
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTShelfAutoYS(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
//调用算法计算终点货位
|
//调用入库算法,获取空货位
|
List<areaPriorClass> lstTmpArea = new List<areaPriorClass>();
|
lstTmpArea.Add(new areaPriorClass { areaCode = endAreaCode, Prior = 1 });
|
|
InAssignEntity iAe = new InAssignEntity()
|
{
|
lstAreaPrior = lstTmpArea,
|
logicAreaCode = "",
|
objectCode = trayCode,
|
projectCode = "ys001",
|
lockLocation = false,//是否需要锁定货位
|
needCalLock = false
|
};
|
iAe.lstDevice = null;
|
InAssignResultEntity irEresult = BLLCreator.Create<In_AlgorBLL>().InAssign(iAe);
|
if (!irEresult.Success)
|
{
|
return OperateResult.Error(irEresult.Msg);//货位获取失败!
|
}
|
else
|
{
|
locationCode = irEresult.locationCode.ToString();
|
}
|
}
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
if (startlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!");
|
}
|
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置入库任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托上架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = deviceNo;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = locationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
//存放入库类型 正常入库 其他入库
|
taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
|
OperateResult re = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception("SendAmsCreateTask异常:" + re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region(PDA接口)简易版整托下架(自动)宇寿
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTDownShelfAutoYS(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string deviceNo = entity.CN_S_DEVICE_NO;//起点
|
string locationCode = entity.CN_S_LOCATION_CODE;
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", locationCode));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(deviceNo);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", deviceNo));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(deviceNo);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = "整托下架";
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = locationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = deviceNo;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//锁定起始位置货位-预出库锁定
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
|
}
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region(PDA接口)简易版整托下架(叫料)宇寿
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTDownShelfCallMaterialYS(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string endLocationCode = entity.CN_S_DEVICE_NO;//终点
|
string startLocationCode = entity.CN_S_LOCATION_CODE;//起点
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'");
|
|
//if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
//{
|
// //锁定起点货位
|
// BLLCreator.Create<DapperBLL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = startLocationCode });
|
//}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(startLocationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(startLocationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + endLocationCode + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(endLocationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(endLocationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = startLocationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = endLocationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
//存放出库类型 正常出库 其他出库
|
taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//更新起点任务号
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, "", "", "", taskNo, trans);
|
//if (operateResult.AffectedRows == 0)
|
//{
|
// throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
//}
|
//BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
}
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region (PDA接口)托盘货位绑定 宇寿
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult AddTrayLocationRelationYS(string trayCode, string locationCode, string inStockType, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) || string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
#region 检查托盘与货位是否满足绑定条件
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationList = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检查该托盘是否绑定了其他货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE));
|
}
|
lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE));
|
}
|
if (areaModel.CN_S_AREA_CLASS == "中间库")
|
{
|
//检查中间库托盘中的物料种类是否大于1
|
int goodType = BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().GetGoodTypeInTray(trayCode);
|
if (goodType > 1)
|
{
|
return OperateResult.Error(string.Format("在中间库中绑定托盘{0}的物料种类不能大于1!", trayCode));
|
}
|
}
|
#endregion
|
//拼接托盘货位实体
|
TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = locationCode,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
};
|
trayLocationList.Add(trayLocation);
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接上架记录表
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = 0,
|
CN_S_CREATOR = userEntity.CN_S_LOGIN,
|
CN_S_CREATOR_BY = userEntity.CN_S_NAME,
|
//宇寿项目存放工单号
|
CN_S_FIGURE_NO = dltEntity.CN_S_EXT1,
|
CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO),
|
CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = locationCode,
|
//宇寿项目存放指令批号
|
CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : dltEntity.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = mstEntity.CN_S_MODEL,
|
CN_S_MODIFY = userEntity.CN_S_NAME,
|
CN_S_MODIFY_BY = userEntity.CN_S_NAME,
|
CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER,
|
CN_S_PACKING_UNIT = "",
|
CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : dltEntity.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE,
|
CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = trayCode,
|
CN_S_TRAY_GRID = "1",
|
CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE,
|
//宇寿存储入库类型 正常入库 其他入库
|
CN_S_EXT2 = "",
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "PDA绑定上架",
|
});
|
#endregion
|
}
|
}
|
|
#region 仓库量表
|
List<TN_WM_B_STOCK_QTYEntity> addStockQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
};
|
}).ToList();
|
#endregion
|
#region 库区量表
|
List<TN_WM_B_AREA_QTYEntity> addAreaQty = upHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//写入托盘货位关联表
|
if (trayLocationList.Any())
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().AddRange(trayLocationList, trans);
|
}
|
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态及货位状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
}
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//上架记录
|
if (upHis.Any())
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
//更新仓库量表
|
if (addStockQty.Any())
|
BLLCreator.Create<TN_WM_B_STOCK_QTYBLL>().AddList(addStockQty, trans);
|
//CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddList(addStockQty, trans);
|
//更新库区量表
|
if (addAreaQty.Any())
|
BLLCreator.Create<TN_WM_B_AREA_QTYBLL>().AddList(addAreaQty, trans);
|
//CreateDAL<TN_WM_B_AREA_QTYDAL>().AddList(addAreaQty, trans);
|
}
|
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
|
|
#region (PDA接口) 托盘货位解绑 宇寿
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult DeleteTrayLocationRelationYS(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode)
|
{
|
if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("参数不全!");
|
}
|
OperateResult operateResult = new OperateResult();
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
//根据托盘码删除
|
if (!string.IsNullOrEmpty(trayCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断托盘是否绑定货位
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString());
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString()));
|
}
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO);
|
down.CN_F_PACKING_QTY = 0;
|
//宇寿项目存放指令批号
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : dltEntity.CN_S_LOT_NO;
|
//宇寿项目存放工单号
|
down.CN_S_FIGURE_NO = dltEntity.CN_S_EXT1;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString();
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = trayCode;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE;
|
//宇寿存储入库类型 正常入库 其他入库
|
down.CN_S_EXT2 = "";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据托盘删除关联
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans);
|
if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
|
}
|
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
}
|
|
}
|
|
});
|
return operateResult;
|
}
|
//根据货位码删除
|
if (!string.IsNullOrEmpty(locationCode))
|
{
|
#region 判断托盘与货位是否满足解绑条件
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEntity = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
if (lstEntity.Count == 0)
|
{
|
return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!");
|
}
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode));
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
#endregion
|
//获取原托盘中的数据
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> lstOriginalMST = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE });
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> lstOriginalDTL = new List<TN_WM_B_TRAY_ITEM_DTLEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST)
|
{
|
lstOriginalDTL = BLLCreator.Create<DapperBLL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID });
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL)
|
{
|
#region 拼接下架记录表
|
TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity();
|
down.CN_GUID = Guid.NewGuid().ToString();
|
down.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
down.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
down.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
down.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
down.CN_F_PACKING_QTY = 0;
|
down.CN_F_QUANTITY = Decimal.Parse(dltEntity.CN_S_SERIAL_NO);
|
down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : mstEntity.CN_S_LOT_NO;
|
down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO;
|
down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE;
|
down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME;
|
down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE;
|
down.CN_S_LOCATION_CODE = locationCode;
|
down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT;
|
down.CN_S_MODEL = mstEntity.CN_S_MODEL;
|
down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER;
|
down.CN_S_PACKING_UNIT = "";
|
down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH;
|
down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE;
|
down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE;
|
down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE;
|
down.CN_S_TRAY_GRID = "1";
|
down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now;
|
down.CN_S_OP_FROM = "PDA解绑下架";
|
downHis.Add(down);
|
#endregion
|
}
|
}
|
#region 仓库量表
|
|
|
List<TN_WM_B_STOCK_QTYEntity> reduceStockQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
|
#endregion
|
#region 库区量表
|
|
List<TN_WM_B_AREA_QTYEntity> reduceAreaQty = downHis.GroupBy(x => new
|
{
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
}).Select(y =>
|
{
|
return new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY),
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
CN_S_MODEL = y.Key.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO,
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE
|
};
|
}).ToList();
|
#endregion
|
operateResult = UseTransaction(trans =>
|
{
|
string waitlocationCode = locationCode;
|
//根据货位删除关联
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans);
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新货位贮存状态
|
operateResult = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(
|
new { CN_S_USE_STATE = Constants.Use_State_Empty, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now },
|
new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans);
|
}
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
//下架记录
|
if (downHis.Any())
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (areaModel.CN_C_IS_INVENTORY != null)
|
{
|
if (areaModel.CN_C_IS_INVENTORY == "Y")
|
{
|
//更新仓库量表
|
if (reduceStockQty.Any())
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().ReduceStockQty(reduceStockQty, trans);
|
//更新库区量表
|
if (reduceAreaQty.Any())
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(reduceAreaQty, trans);
|
}
|
|
}
|
|
});
|
|
}
|
return operateResult;
|
|
|
}
|
#endregion
|
|
#region 空托回库检测货位码和托盘码
|
/// <summary>
|
/// 空托回库检测货位码和托盘码
|
/// </summary>
|
/// <param name="locationCode"></param>
|
/// <returns></returns>
|
public OperateResult CheckInStockLocationEmpty(string locationCode)
|
{
|
if (string.IsNullOrEmpty(locationCode))
|
{
|
return OperateResult.Error("请传入货位号参数!");
|
}
|
string strTrayCode = "";
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(locationCode);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前货位状态为{0},不允许从空托回库!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(locationCode);
|
//if (lstStartTray.Count == 0)
|
//{
|
// return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
//}
|
if (lstStartTray.Count > 0)
|
{
|
strTrayCode = lstStartTray[0].CN_S_TRAY_CODE;
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
//检测该托盘码上是否有物料
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> ITEMMSTLIST = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE });
|
if (ITEMMSTLIST.Any())
|
{
|
return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME));
|
}
|
}
|
else
|
{
|
//货位存储状态:非空
|
if (GetModel[0].CN_S_USE_STATE == Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("当前货位存储状态为{0},无法绑定空托盘回库!", GetModel[0].CN_S_USE_STATE));
|
}
|
}
|
return OperateResult.Succeed("", strTrayCode);
|
}
|
#endregion
|
|
#region 空托回库检测托盘码
|
/// <summary>
|
/// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中
|
/// </summary>
|
/// <param name="trayCode">托盘编码</param>
|
/// <param name="locationCode">货位编码</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2019-04-17</History>
|
public OperateResult CheckInTrayCode(string trayCode)
|
{
|
if (string.IsNullOrEmpty(trayCode))
|
{
|
return OperateResult.Error("请传入托盘号参数!");
|
}
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByTrayCode(trayCode);
|
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(trayCode);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO));
|
}
|
if (lstStartTray.Count > 0)
|
{
|
List<TN_WM_LOCATION_EXTEntity> GetModel = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'");
|
if (GetModel.Count == 0)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!");
|
}
|
AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity();
|
areaModel = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE);
|
if (areaModel == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该托盘绑定的货位信息!", lstStartTray[0].CN_S_LOCATION_CODE));
|
}
|
//货位状态:正常
|
if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许空托回库!", GetModel[0].CN_S_LOCATION_STATE));
|
}
|
//检测该托盘码上是否有物料
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> ITEMMSTLIST = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = trayCode });
|
if (ITEMMSTLIST.Any())
|
{
|
return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME));
|
}
|
////货位存储状态:非空
|
//if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full)
|
//{
|
// return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE));
|
//}
|
return OperateResult.Succeed("", lstStartTray[0].CN_S_LOCATION_CODE);
|
}
|
else
|
{
|
return OperateResult.Succeed("", "");
|
}
|
}
|
#endregion
|
|
#region(PDA接口)简易版整托下架(叫料)
|
/// <summary>
|
/// 整托执行上架
|
/// </summary>
|
/// <param name="json">Json集合</param>
|
/// <param name="userEntity">用户实体</param>
|
/// <returns></returns>
|
/// <History>[HANHE(XDL)] CREATED BY 2018-12-12</History>
|
public OperateResult SimZTDownShelfCallMaterial(TrayOnShelfEntity entity, RedisUserEntity userEntity)
|
{
|
string endLocationCode = entity.CN_S_DEVICE_NO;//终点
|
string startLocationCode = entity.CN_S_LOCATION_CODE;//起点
|
string endAreaCode = entity.CN_S_END_AREA_CODE;
|
string trayCode = entity.CN_S_TRAY_CODE;
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstStartTray = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
#region 货位逻辑判断检测
|
TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'");
|
|
if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity startArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(startLocationCode);
|
if (startArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode));
|
}
|
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full)
|
{
|
return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE));
|
|
}
|
//判断货位是否绑定托盘 根据项目需要也可不检查该策略
|
lstStartTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(startLocationCode);
|
if (lstStartTray.Count == 0)
|
{
|
return OperateResult.Error("在该起点位置上未绑定托盘物料信息!");
|
}
|
}
|
//检查该托盘是否在(未执行或执行中的)任务中
|
List<TN_WM_TASKEntity> lstInTask = CreateDAL<TN_WM_TASKDAL>().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE);
|
if (lstInTask.Count > 0)
|
{
|
return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO));
|
}
|
|
TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().GetExtModel(" where CN_S_LOCATION_CODE='" + endLocationCode + "'");
|
if (endlocation == null)
|
{
|
return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!");
|
}
|
if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal)
|
{
|
return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE));
|
}
|
AutoBomStockAreaEntity endArea = CreateDAL<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(endLocationCode);
|
if (endArea == null)
|
{
|
//非法的目的货位
|
return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode));
|
}
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty)
|
{
|
return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE));
|
}
|
|
//判断货位是否绑定托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> lstEndTray = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetListByLocationCode(endLocationCode);
|
if (lstEndTray.Count > 0)
|
{
|
return OperateResult.Error("该终点位置上已绑定其他托盘物料信息!");
|
}
|
#endregion
|
|
List<TN_WM_B_TRAY_LOCATIONEntity> TrayLocationlst = new List<TN_WM_B_TRAY_LOCATIONEntity>();
|
List<TrayItemMstAndDtlEntity> Group_List = new List<TrayItemMstAndDtlEntity>();
|
//生成入库任务
|
List<TN_WM_TASKEntity> taskEntityList = new List<TN_WM_TASKEntity>();
|
//生成入库任务
|
TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity();
|
string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}";
|
string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
if (string.IsNullOrEmpty(taskNo))
|
{
|
return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!");
|
}
|
taskEntity.CN_S_TASK_NO = taskNo;
|
taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_FROM_OP = entity.CN_S_TASK_TYPE;
|
taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE;
|
taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_START_BIT = startLocationCode;
|
taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE;
|
taskEntity.CN_S_END_BIT = endLocationCode;
|
taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted;
|
taskEntity.CN_S_TRAY_CODE = trayCode;
|
taskEntity.CN_S_PROJECT_CODE = entity.projectCode;
|
taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE;
|
taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE;
|
taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY;
|
taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY;
|
taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_CREATE = DateTime.Now;
|
taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN;
|
taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME;
|
taskEntity.CN_T_MODIFY = DateTime.Now;
|
//存放出库类型 正常出库 其他出库
|
taskEntity.CN_S_EXT1 = entity.IN_STOCK_TYPE;
|
taskEntityList.Add(taskEntity);
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Add(taskEntity, trans);
|
//更新起点任务号
|
if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans);
|
}
|
//锁定目的位置货位-预入库锁定
|
if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y"))
|
{
|
operateResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans);
|
if (operateResult.AffectedRows == 0)
|
{
|
throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化");
|
}
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(taskEntity.CN_S_END_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans);
|
}
|
OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity);
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
});
|
return operateResult;
|
}
|
#endregion
|
|
public OperateResult Add(TN_WM_B_TRAY_LOCATIONEntity trayLocation, IDbTransaction trans, LogPara logPara = null)
|
{
|
if (logPara != null) Log.Detail(logPara, LogDescribe.Content(trayLocation));
|
return DALCreator.Create<TN_WM_B_TRAY_LOCATIONDAL>().Add(trayLocation, trans);
|
}
|
}
|
}
|