using HH.Redis.ReisModel;
|
using HH.WMS.BLL.Algorithm;
|
using HH.WMS.BLL.Basic;
|
using HH.WMS.BLL.SysMgr;
|
using HH.WMS.Common;
|
using HH.WMS.Common.Algorithm;
|
using HH.WMS.Common.Algorithm.Out;
|
using HH.WMS.DAL;
|
using HH.WMS.DAL.Algorithm;
|
using HH.WMS.DAL.Basic;
|
using HH.WMS.DAL.Check;
|
using HH.WMS.DAL.Common;
|
using HH.WMS.DAL.InStock;
|
using HH.WMS.DAL.MoveStock;
|
using HH.WMS.DAL.OutStock;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Algorithm;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Common;
|
using HH.WMS.Entitys.Entitys;
|
using HH.WMS.Entitys.MoveStock;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Linq;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HH.WMS.BLL.MoveStock
|
{
|
public class TN_WM_MOVE_MSTBLL : DapperBaseBLL
|
{
|
#region 获取分页列表
|
/// <summary>
|
/// 获取分页列表
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public DataTable GetDataTable(dynamic obj)
|
{
|
DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().GetDataTable(obj);
|
Dictionary<string, string> stockDic = new Dictionary<string, string>();
|
Dictionary<string, string> areaDic = new Dictionary<string, string>();
|
dt.Columns.Add("CN_S_STOCK_NAME");
|
dt.Columns.Add("CN_S_START_AREA_NAME");
|
dt.Columns.Add("CN_S_END_AREA_NAME");
|
for (int i = 0; i < dt.Rows.Count; i++)
|
{
|
if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) //获取仓库名称
|
{
|
if (!stockDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_CODE"].ToString()))
|
{
|
TN_AB_STOCKEntity stockentity = CreateDAL<TN_WM_MONGODAL>().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString());//获取仓库名称
|
if (stockentity != null)
|
{
|
dt.Rows[i]["CN_S_STOCK_NAME"] = stockentity.CN_S_STOCK_NAME;
|
stockDic.Add(dt.Rows[i]["CN_S_STOCK_CODE"].ToString(), stockentity.CN_S_STOCK_NAME);
|
}
|
}
|
else
|
{
|
dt.Rows[i]["CN_S_STOCK_NAME"] = stockDic[dt.Rows[i]["CN_S_STOCK_CODE"].ToString()];
|
}
|
}
|
if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_START_AREA"].ToString()))//获取起始库区名称
|
{
|
if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_START_AREA"].ToString()))
|
{
|
AutoBomStockAreaEntity areaentity = CreateDAL<TN_WMS_AREADAL>().GetModel(dt.Rows[i]["CN_S_START_AREA"].ToString());//获取库区名称
|
if (areaentity != null)
|
{
|
dt.Rows[i]["CN_S_START_AREA_NAME"] = areaentity.CN_S_AREA_NAME;
|
areaDic.Add(dt.Rows[i]["CN_S_START_AREA"].ToString(), areaentity.CN_S_AREA_NAME);
|
}
|
}
|
else
|
{
|
dt.Rows[i]["CN_S_START_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_START_AREA"].ToString()];
|
}
|
}
|
if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_END_AREA"].ToString()))//获取库区名称
|
{
|
if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_END_AREA"].ToString()))
|
{
|
AutoBomStockAreaEntity areaentity = CreateDAL<TN_WMS_AREADAL>().GetModel(dt.Rows[i]["CN_S_END_AREA"].ToString());//获取库区名称
|
if (areaentity != null)
|
{
|
dt.Rows[i]["CN_S_END_AREA_NAME"] = areaentity.CN_S_AREA_NAME;
|
areaDic.Add(dt.Rows[i]["CN_S_END_AREA"].ToString(), areaentity.CN_S_AREA_NAME);
|
}
|
}
|
else
|
{
|
dt.Rows[i]["CN_S_END_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_END_AREA"].ToString()];
|
}
|
}
|
}
|
return dt;
|
}
|
|
/// <summary>
|
/// 获取分页列表
|
/// </summary>
|
/// <param name="obj"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public DataTable GetDataTable(string sqlWhere, string OrdeBy, int pageSize, int pageIndex)
|
{
|
return CreateDAL<TN_WM_MOVE_MSTDAL>().GetDataTable(sqlWhere, OrdeBy, pageSize, pageIndex);
|
}
|
#endregion
|
|
#region 新增
|
/// <summary>
|
/// 增加一条数据
|
/// </summary>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public SqlExecuteResult Add(TN_WM_MOVE_MSTEntity entity)
|
{
|
return CreateDAL<TN_WM_MOVE_MSTDAL>().Add(entity, null);
|
}
|
#endregion
|
|
#region 修改
|
/// <summary>
|
/// 更新一条数据
|
/// </summary>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public SqlExecuteResult Update(TN_WM_MOVE_MSTEntity entity)
|
{
|
return CreateDAL<TN_WM_MOVE_MSTDAL>().Update(entity, null);
|
}
|
|
#endregion
|
|
#region 删除
|
/// <summary>
|
/// 删除一条数据
|
/// </summary>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public SqlExecuteResult Delete(string sqlwhere)
|
{
|
return CreateDAL<TN_WM_MOVE_MSTDAL>().Delete(sqlwhere, null);
|
}
|
#endregion
|
|
#region 查询移库业务主表
|
/// <summary>
|
/// 查询移库业务主表
|
/// </summary>
|
/// <param name="sqlwhere">查询条件</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/6</history>
|
public DataTable Getentity(string sqlwhere)
|
{
|
DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().Getentity(sqlwhere);
|
return dt;
|
}
|
#endregion
|
|
#region 获取货位物料信息
|
/// <summary>
|
/// 获取货位物料信息
|
/// </summary>
|
/// <param name="sqlwhere">查询条件</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/11</history>
|
public DataTable GetTrayLocation(dynamic obj)
|
{
|
DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().GetTrayLocation(obj);
|
|
Dictionary<string, string> stockDic = new Dictionary<string, string>();
|
Dictionary<string, string> areaDic = new Dictionary<string, string>();
|
dt.Columns.Add("CN_S_STOCK_NAME");
|
dt.Columns.Add("CN_S_AREA_NAME");
|
for (int i = 0; i < dt.Rows.Count; i++)
|
{
|
if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_CODE"].ToString())) //获取仓库名称
|
{
|
if (!stockDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_CODE"].ToString()))
|
{
|
TN_AB_STOCKEntity stockentity = CreateDAL<TN_WM_MONGODAL>().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString().Trim());//获取仓库名称
|
if (stockentity != null)
|
{
|
dt.Rows[i]["CN_S_STOCK_NAME"] = stockentity.CN_S_STOCK_NAME;
|
stockDic.Add(dt.Rows[i]["CN_S_STOCK_CODE"].ToString(), stockentity.CN_S_STOCK_NAME);
|
}
|
}
|
else
|
{
|
dt.Rows[i]["CN_S_STOCK_NAME"] = stockDic[dt.Rows[i]["CN_S_STOCK_CODE"].ToString()];
|
}
|
}
|
if (!string.IsNullOrEmpty(dt.Rows[i]["CN_S_STOCK_AREA"].ToString()))//获取库区名称
|
{
|
if (!areaDic.ContainsKey(dt.Rows[i]["CN_S_STOCK_AREA"].ToString()))
|
{
|
AutoBomStockAreaEntity areaentity = CreateDAL<TN_WMS_AREADAL>().GetModel(dt.Rows[i]["CN_S_STOCK_AREA"].ToString().Trim());//获取库区名称
|
if (areaentity != null)
|
{
|
dt.Rows[i]["CN_S_AREA_NAME"] = areaentity.CN_S_AREA_NAME;
|
areaDic.Add(dt.Rows[i]["CN_S_STOCK_AREA"].ToString(), areaentity.CN_S_AREA_NAME);
|
}
|
}
|
else
|
{
|
dt.Rows[i]["CN_S_AREA_NAME"] = areaDic[dt.Rows[i]["CN_S_STOCK_AREA"].ToString()];
|
}
|
}
|
}
|
|
return dt;
|
}
|
#endregion
|
|
#region 新增
|
/// <summary>
|
/// 新增
|
/// </summary>
|
/// <param name="obj">json实体类</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/13</history>
|
public SqlExecuteResult Add(JObject obj)
|
{
|
SqlExecuteResult result = new SqlExecuteResult();
|
TN_WM_MOVE_MSTEntity entitymst = JsonConvert.DeserializeObject<TN_WM_MOVE_MSTEntity>(obj.Value<object>("mst").ToString());
|
List<TN_WM_MOVE_DTLEntity> listdtl = JsonConvert.DeserializeObject<List<TN_WM_MOVE_DTLEntity>>(obj.Value<object>("dtl").ToString());
|
string itemcode = "";
|
listdtl.ForEach(f => itemcode += f.CN_S_ITEM_CODE + "','");
|
itemcode = itemcode.Substring(0, itemcode.Length - 3);
|
DataTable dt = CreateDAL<TN_WM_MOVE_DTLDAL>().getInfo(" CN_S_ITEM_CODE in ('" + itemcode + "') AND CN_S_OP_NO IN (SELECT CN_S_OP_NO FROM dbo.TN_WM_MOVE_MST WHERE CN_S_STATE='新建')");
|
int i = 1;
|
//判断是否存在数据
|
foreach (TN_WM_MOVE_DTLEntity entity in listdtl)
|
{
|
|
var moveCount = dt.AsEnumerable().Where(w => w.Field<string>("CN_S_ITEM_CODE") == entity.CN_S_ITEM_CODE && w.Field<string>("CN_S_ITEM_STATE") == entity.CN_S_ITEM_STATE && w.Field<string>("CN_S_LOT_CODE") == entity.CN_S_LOT_CODE && w.Field<string>("CN_S_MODEL") == entity.CN_S_MODEL && w.Field<string>("CN_S_FIGURE_NO") == entity.CN_S_FIGURE_NO && w.Field<string>("CN_S_MEASURE_UNIT") == entity.CN_S_MEASURE_UNIT && w.Field<string>("CN_S_PRODUCTION_BATCH") == entity.CN_S_PRODUCTION_BATCH).Count();
|
if (moveCount > 0)
|
{
|
return new SqlExecuteResult() { Exception = new Exception(" 物料[" + entity.CN_S_ITEM_NAME + "]移库数据已存在") };
|
break;
|
}
|
i++;
|
}
|
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
result = CreateDAL<TN_WM_MOVE_MSTDAL>().Add(entitymst, trans);//新增移库主表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
|
CreateDAL<TN_WM_MOVE_DTLDAL>().Addlist(listdtl, entitymst.CN_S_OP_NO, trans);//新增子表
|
return result;
|
});
|
}
|
#endregion
|
|
#region 删除移库
|
/// <summary>
|
/// 删除移库
|
/// </summary>
|
/// <param name="CN_S_OP_NO">移库单号</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/18</history>
|
public SqlExecuteResult DeleteStockMove(string CN_S_OP_NO)
|
{
|
SqlExecuteResult result = new SqlExecuteResult();
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
result = CreateDAL<TN_WM_MOVE_MSTDAL>().Delete("where CN_S_OP_NO in ('" + CN_S_OP_NO + "')", trans);//删除移库主表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
result = CreateDAL<TN_WM_MOVE_DTLDAL>().Delete("where CN_S_OP_NO in ('" + CN_S_OP_NO + "')", trans);//删除移库子表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
return result;
|
});
|
}
|
#endregion
|
|
#region 提交
|
/// <summary>
|
///提交
|
/// </summary>
|
/// <param name="entity"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/8/24</history>
|
public SqlExecuteResult Submits(string opNo, string type)
|
{
|
SqlExecuteResult result = new SqlExecuteResult();
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
string[] opNoarr = opNo.Split(',');
|
string[] typearr = type.Split(',');
|
var checkNo = "";
|
for (int i = 0; i < opNoarr.Length; i++)
|
{
|
List<TN_WM_B_MOVE_RESULTEntity> GetTrayitemByOpno = CreateDAL<TN_WM_B_MOVE_RESULTDAL>().GetTrayitemByOpno("where c.CN_S_OP_NO='" + opNoarr[i] + "'", typearr[i]);
|
result = CreateDAL<TN_WM_B_MOVE_RESULTDAL>().Addlist(GetTrayitemByOpno, trans);//子表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
checkNo += opNoarr[i] + "','";
|
}
|
|
result = CreateDAL<TN_WM_MOVE_MSTDAL>().UpdateStateByNo(checkNo.Substring(0, checkNo.Length - 3), "已提交", trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
return result;
|
});
|
}
|
/// <summary>
|
///提交
|
/// </summary>
|
/// <param name="entity"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/8/24</history>
|
public OperateResult Submit(JObject obj)
|
{
|
var OrgFlag = obj.Value<string>("OrgFlag");
|
var OrgCode = obj.Value<string>("OrgCode");
|
var CN_S_CREATOR = obj.Value<string>("CN_S_CREATOR");
|
var CN_S_CREATOR_BY = obj.Value<string>("CN_S_CREATOR_BY");
|
|
var opNo = obj.Value<string>("opNo").Replace(",", "','");
|
//查询货位托盘物料
|
//List<TN_WM_B_MOVE_RESULTEntity> GetTrayitemlist = CreateDAL<TN_WM_B_MOVE_RESULTDAL>().GetTrayitemByOpno("where c.CN_S_OP_NO in ('" + opNo + "')AND b.CN_S_LOCATION_CODE<>'CK001_ZCW01'", "物料盘点");
|
//AND a.CN_F_PACKING_QTY>0
|
List<TN_WM_B_MOVE_RESULTEntity> GetTrayitemlist = new List<TN_WM_B_MOVE_RESULTEntity>();
|
DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().GetMstJoinDtl(" where a.CN_S_OP_NO ='" + opNo + "'");
|
|
List<TN_WM_B_MOVE_RESULTEntity> MoveResult =
|
dt.AsEnumerable().GroupBy(p => new
|
{
|
CN_S_STOCK_CODE = p.Field<string>("CN_S_STOCK_CODE"),
|
CN_S_ITEM_CODE = p.Field<string>("CN_S_ITEM_CODE"),
|
CN_S_ITEM_STATE = p.Field<string>("CN_S_ITEM_STATE"),
|
CN_S_OWNER = p.Field<string>("CN_S_OWNER"),
|
CN_S_LOT_CODE = p.Field<string>("CN_S_LOT_CODE"),
|
CN_S_PRODUCTION_BATCH = p.Field<string>("CN_S_PRODUCTION_BATCH")
|
})
|
.Select(x => new TN_WM_B_MOVE_RESULTEntity()
|
{
|
CN_S_ITEM_CODE = x.Key.CN_S_ITEM_CODE,
|
CN_S_LOT_CODE = x.Key.CN_S_LOT_CODE,
|
CN_S_ITEM_STATE = x.Key.CN_S_ITEM_STATE,
|
CN_S_OWNER = x.Key.CN_S_OWNER,
|
CN_S_STOCK_CODE = x.Key.CN_S_STOCK_CODE,
|
CN_F_QUANTITY = x.Sum(y => y.Field<decimal>("CN_F_QUANTITY")),
|
CN_F_QUANTITY_STOCK = x.FirstOrDefault().Field<decimal>("CN_F_QUANTITY_STOCK")
|
}).ToList();
|
List<TN_WM_B_MOVE_RESULTEntity> RainStockQuantity = MoveResult.Where(w => w.CN_F_QUANTITY > w.CN_F_QUANTITY_STOCK).ToList();
|
if (RainStockQuantity.Any())
|
{
|
return OperateResult.Error("物料编码:【" + RainStockQuantity[0].CN_S_ITEM_CODE + "】库存已被占用!");
|
}
|
|
|
#region 获取对应库区数量
|
List<itemQueryClass> itemQuerys =
|
MoveResult.Select(x => new itemQueryClass()
|
{
|
itemCode = x.CN_S_ITEM_CODE,
|
batchCode = x.CN_S_LOT_CODE,
|
itemState = x.CN_S_ITEM_STATE,
|
ownerName = x.CN_S_OWNER,
|
stockCode = x.CN_S_STOCK_CODE,
|
itemQty = x.CN_F_QUANTITY,
|
}).ToList();
|
|
var allArea = BLLCreator.Create<TN_AB_B_STOCK_AREABLL>().GetArea(4, dt.Rows[0]["CN_S_STOCK_CODE"].ToString());
|
List<areaPriorClass> lstAreaPriors = allArea.Select(p => new areaPriorClass()
|
{
|
areaCode = p.CN_S_AREA_CODE,
|
Prior = p.CN_N_PRIORITY
|
}).ToList();
|
//调用出库算法
|
var algorResultEntity = BLLCreator.Create<Out_AlgorBLL>().OutArea(itemQuerys, lstAreaPriors);
|
|
if (!algorResultEntity.Success)
|
return OperateResult.Error(algorResultEntity.Msg);
|
//算法结果
|
List<OutAreaResultEntity> algorResult = algorResultEntity.itemOutAreaResult;
|
//移出库区
|
List<TN_WM_B_MOVE_RESULTEntity> GetMoveArealist = new List<TN_WM_B_MOVE_RESULTEntity>();
|
//循环算法返回物料
|
foreach (OutAreaResultEntity algor in algorResult)
|
{
|
|
foreach (itemOutClass lis in algor.lstItem)
|
{
|
TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity();
|
//moveentity.CN_S_OP_NO = opNo;
|
moveentity.CN_S_OWNER = algor.ownerName;
|
moveentity.CN_S_ITEM_STATE = algor.itemState;
|
|
moveentity.CN_S_LOT_CODE = algor.batchCode;
|
//moveentity.CN_F_OUT_QUANTITY=
|
//moveentity.CN_F_IN_QUANTITY=""
|
//moveentity.CN_S_TRAY_CODE="";
|
//moveentity.CN_S_START_BIT = "";
|
//moveentity.CN_S_END_BIT = "";
|
moveentity.CN_S_NOTE = "";
|
moveentity.CN_S_STOCK_CODE = algor.stockCode;
|
moveentity.CN_S_PRODUCTION_BATCH = algor.prodBatchCode;
|
moveentity.CN_S_AREA_CODE = algor.areaCode;
|
//AutoBomItemEntity ItemEntity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(lis.itemCode);
|
//if (ItemEntity != null)
|
//{
|
// return new SqlExecuteResult { Exception = new Exception("暂无此物料信息!") };
|
//}
|
|
moveentity.CN_S_ITEM_CODE = lis.itemCode;
|
//moveentity.CN_S_ITEM_NAME=ItemEntity.CN_S_ITEM_NAME;
|
//moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT;
|
//moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL;
|
//moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO;
|
moveentity.CN_F_QUANTITY = lis.itemQty;
|
GetMoveArealist.Add(moveentity);
|
|
}
|
|
}
|
#endregion
|
|
|
|
|
#region 计算出托盘增加分配量
|
|
//初始化调用算法数据(暂缺少生产批次)
|
List<itemQueryClass> algorItems = GetMoveArealist.GroupBy(x => new
|
{
|
x.CN_S_STOCK_CODE,
|
x.CN_S_AREA_CODE,
|
x.CN_S_ITEM_CODE,
|
x.CN_S_ITEM_STATE,
|
x.CN_S_OWNER,
|
x.CN_S_LOT_CODE,
|
x.CN_S_PRODUCTION_BATCH
|
}).Select(y => new itemQueryClass()
|
{
|
stockCode = y.Key.CN_S_STOCK_CODE,
|
areaCode = y.Key.CN_S_AREA_CODE,
|
itemCode = y.Key.CN_S_ITEM_CODE,
|
batchCode = y.Key.CN_S_LOT_CODE,
|
itemState = y.Key.CN_S_ITEM_STATE,
|
ownerName = y.Key.CN_S_OWNER,
|
itemQty = y.Sum(s => s.CN_F_QUANTITY)
|
}).ToList();
|
|
var lstAreaPrior = algorItems.Select(x => new areaPriorClass()
|
{
|
areaCode = x.areaCode,
|
Prior = 1
|
}).ToList();
|
|
OutResultEntityNew outResult = BLLCreator.Create<Out_AlgorBLL>().OutNew(new OutAlgorEnitty()
|
{
|
lstDevice = new List<Device>(),
|
lstAreaPrior = lstAreaPrior,
|
lstQueryItem = algorItems,
|
lockLocation = false
|
});
|
|
if (!outResult.Success)
|
return OperateResult.Error(outResult.Msg);
|
|
if (outResult.lstItemNotEnough.Any())
|
{
|
return OperateResult.Error("物料:" + string.Join(";", outResult.lstItemNotEnough.Select(x => x.itemCode)) + "库存不足,请先完成来料区的上架");
|
}
|
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> trayItemMstList = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
|
foreach (trayOutItem outitem in outResult.itemLocations)
|
{
|
AutoBomItemEntity ItemEntity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(outitem.itemCode);
|
|
if (ItemEntity == null)
|
{
|
return OperateResult.Error("暂无此物料信息!");
|
}
|
var i = 1;
|
//组织移库单数据
|
TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity();
|
TN_WM_B_TRAY_ITEM_MSTEntity trayItemMst = new TN_WM_B_TRAY_ITEM_MSTEntity();
|
moveentity.CN_S_OP_NO = opNo;
|
moveentity.CN_S_OWNER = outitem.ownerName;
|
moveentity.CN_S_ITEM_STATE = outitem.itemState;
|
moveentity.CN_S_LOT_CODE = outitem.batchCode;
|
moveentity.CN_S_NOTE = "";
|
|
moveentity.CN_S_STOCK_CODE = dt.Rows[0]["CN_S_STOCK_CODE"].ToString();
|
moveentity.CN_S_PRODUCTION_BATCH = outitem.prodBatchCode == null ? "" : outitem.prodBatchCode;
|
//List<string> locaExtlistw = locaExtlist.Where(w => w.CN_S_LOCATION_CODE.Trim() == lis.locationCode).Select(s => s.CN_S_AREA_CODE).ToList();
|
//moveentity.CN_S_AREA_CODE = locaExtlistw[0].Trim();
|
moveentity.CN_S_AREA_CODE = outitem.areaCode;
|
moveentity.CN_S_ITEM_CODE = outitem.itemCode;
|
moveentity.CN_S_ITEM_NAME = ItemEntity.CN_S_ITEM_NAME;
|
moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT;
|
moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL;
|
moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO;
|
moveentity.CN_F_QUANTITY = outitem.itemQty;
|
moveentity.CN_F_OUT_QUANTITY = outitem.itemQty;
|
moveentity.CN_F_IN_QUANTITY = outitem.itemQty;
|
moveentity.CN_S_TRAY_CODE = outitem.trayCode;
|
moveentity.CN_S_START_BIT = outitem.locationCode;
|
moveentity.CN_S_TRAY_GRID = outitem.trayGrid;
|
List<string> endbit = dt.AsEnumerable().Where(w => w.Field<string>("CN_S_ITEM_CODE") == outitem.itemCode && w.Field<string>("CN_S_MEASURE_UNIT") == ItemEntity.CN_S_MEASURE_UNIT && w.Field<string>("CN_S_MODEL") == ItemEntity.CN_S_MODEL && w.Field<string>("CN_S_ITEM_STATE") == outitem.itemState && w.Field<string>("CN_S_FIGURE_NO") == ItemEntity.CN_S_FIGURE_NO).Select(s => s.Field<string>("CN_S_END_BIT")).ToList();
|
//&& w.Field<string>("CN_S_LOT_CODE") == outitem.batchCode
|
|
moveentity.CN_S_END_BIT = endbit.Any() ? endbit[0].Trim() : "";
|
|
trayItemMst.sqlwhere = " where CN_S_TRAY_CODE='" + moveentity.CN_S_TRAY_CODE + "' AND CN_S_TRAY_GRID='" + moveentity.CN_S_TRAY_GRID + "' AND CN_S_OWNER='" + moveentity.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + moveentity.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + moveentity.CN_S_FIGURE_NO + "' AND CN_S_MODEL='" + moveentity.CN_S_MODEL + "' AND CN_S_ITEM_STATE='" + moveentity.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT='" + moveentity.CN_S_MEASURE_UNIT + "'";
|
|
trayItemMst.CN_F_ALLOC_QTY = outitem.itemQty;
|
GetTrayitemlist.Add(moveentity);
|
trayItemMstList.Add(trayItemMst);//托盘主表信息
|
}
|
|
|
#region OUT算法注释
|
//List<OutResultEntity> ire = BLLCreator.Create<Out_AlgorBLL>().Out(new OutAlgorEnitty()
|
//{
|
// lstDevice = new List<Device>(),
|
// lstAreaPrior = lstAreaPrior,
|
// lstQueryItem = algorItems,
|
// lockLocation = false
|
//});
|
//if (ire.Exists(x => (x.itemLocations == null || !x.itemLocations.Any())))
|
// return new SqlExecuteResult { Exception = new Exception("库存不足!") };
|
//foreach (var _ire in ire)
|
// if (!_ire.Success)
|
// {
|
// return new SqlExecuteResult { Exception = new Exception(_ire.Msg) };
|
// }
|
// else
|
// {
|
// //List<string> locationlist = _ire.itemLocations.Select(s => s.locationCode).ToList();
|
// //var locations = string.Join("','", locationlist);
|
// //List<TN_WM_LOCATION_EXTEntity> locaExtlist = CreateDAL<TN_WM_LOCATION_EXTDAL>().GetModel(" where CN_S_LOCATION_CODE in ('" + locations + "')");
|
// var i = 1;
|
// //组织移库单数据
|
// foreach (itemTrayLocation lis in _ire.itemLocations)
|
// {
|
// TN_WM_B_MOVE_RESULTEntity moveentity = new TN_WM_B_MOVE_RESULTEntity();
|
// moveentity.CN_S_OP_NO = opNo;
|
// moveentity.CN_S_OWNER = _ire.ownerName;
|
// moveentity.CN_S_ITEM_STATE = _ire.itemState;
|
|
// moveentity.CN_S_LOT_CODE = _ire.batchCode;
|
// moveentity.CN_S_NOTE = "";
|
// moveentity.CN_S_STOCK_CODE = dt.Rows[0]["CN_S_STOCK_CODE"].ToString();
|
// moveentity.CN_S_PRODUCTION_BATCH = _ire.prodBatchCode == null ? "" : _ire.prodBatchCode;
|
// AutoBomItemEntity ItemEntity = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(_ire.itemCode);
|
// if (ItemEntity == null)
|
// {
|
// return new SqlExecuteResult { Exception = new Exception("暂无此物料信息!") };
|
// }
|
// //List<string> locaExtlistw = locaExtlist.Where(w => w.CN_S_LOCATION_CODE.Trim() == lis.locationCode).Select(s => s.CN_S_AREA_CODE).ToList();
|
// //moveentity.CN_S_AREA_CODE = locaExtlistw[0].Trim();
|
// moveentity.CN_S_AREA_CODE = _ire.areaCode;
|
// moveentity.CN_S_ITEM_CODE = _ire.itemCode;
|
// moveentity.CN_S_ITEM_NAME = ItemEntity.CN_S_ITEM_NAME;
|
// moveentity.CN_S_MEASURE_UNIT = ItemEntity.CN_S_MEASURE_UNIT;
|
// moveentity.CN_S_MODEL = ItemEntity.CN_S_MODEL;
|
// moveentity.CN_S_FIGURE_NO = ItemEntity.CN_S_FIGURE_NO;
|
// moveentity.CN_F_QUANTITY = lis.itemQty;
|
// moveentity.CN_F_OUT_QUANTITY = lis.itemQty;
|
// moveentity.CN_F_IN_QUANTITY = lis.itemQty;
|
// moveentity.CN_S_TRAY_CODE = lis.trayCode;
|
// moveentity.CN_S_START_BIT = lis.locationCode;
|
// List<string> endbit = dt.AsEnumerable().Where(w => w.Field<string>("CN_S_ITEM_CODE") == _ire.itemCode && w.Field<string>("CN_S_MEASURE_UNIT") == ItemEntity.CN_S_MEASURE_UNIT && w.Field<string>("CN_S_MODEL") == ItemEntity.CN_S_MODEL && w.Field<string>("CN_S_ITEM_STATE") == _ire.itemState && w.Field<string>("CN_S_FIGURE_NO") == ItemEntity.CN_S_FIGURE_NO && w.Field<string>("CN_S_LOT_CODE") == _ire.batchCode).Select(s => s.Field<string>("CN_S_END_BIT")).ToList();
|
|
// moveentity.CN_S_END_BIT = endbit[0].Trim();
|
// GetTrayitemlist.Add(moveentity);
|
// }
|
|
// itemtrayloacationlist.AddRange(_ire.itemLocations);//最近实体集合
|
// }
|
//if (!ire.Any())
|
// return new SqlExecuteResult { Exception = new Exception("未找到合适的出库货位!") };
|
//#endregion
|
|
//if (algorResult == null)
|
// return new SqlExecuteResult { Exception = new Exception("未找到合适的出库库区") };
|
|
#endregion
|
|
#endregion
|
|
#region 库区量表
|
List<TN_WM_B_AREA_QTYEntity> areaQtyList = GetTrayitemlist.GroupBy(x => new { x.CN_S_OWNER, x.CN_S_ITEM_CODE, x.CN_S_LOT_CODE, x.CN_S_ITEM_NAME, x.CN_S_ITEM_STATE, x.CN_S_STOCK_CODE, x.CN_S_AREA_CODE, x.CN_S_PRODUCTION_BATCH }).Select(y => new TN_WM_B_AREA_QTYEntity
|
{
|
CN_S_OWNER = y.Key.CN_S_OWNER,
|
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_CODE,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = y.Key.CN_S_AREA_CODE,
|
CN_F_ALLOC_QTY = y.Sum(s => s.CN_F_OUT_QUANTITY),
|
SqlWhere = " Where CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + @"'
|
and CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + @"'
|
and CN_S_ITEM_STATE='" + y.Key.CN_S_ITEM_STATE + @"'
|
and CN_S_LOT_NO='" + y.Key.CN_S_LOT_CODE + "' and CN_S_OWNER='" + y.Key.CN_S_OWNER + "' and CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "' "
|
}).ToList();
|
|
|
#endregion
|
|
#region 仓库库存锁定明细表
|
//List<TN_WM_B_OUTLOCKING_DTLEntity> outlockDtlEntityList = new List<TN_WM_B_OUTLOCKING_DTLEntity>();
|
|
//var stockitem = "";
|
//areaQtyList.ForEach(f => stockitem += f.CN_S_ITEM_CODE + "','");
|
//stockitem = stockitem.Substring(0, stockitem.Length - 3);
|
|
////出库库区资产锁定
|
//List<TN_WM_B_OUTLOCKING_DTLEntity> outlockingArea = GetTrayitemlist.GroupBy(x => new { x.CN_S_OP_NO, x.CN_S_OWNER, x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_ITEM_STATE, x.CN_S_LOT_CODE, x.CN_S_STOCK_CODE, x.CN_S_START_AREA }).Select(y => new TN_WM_B_OUTLOCKING_DTLEntity
|
//{
|
|
// CN_GUID = System.Guid.NewGuid().ToString().ToUpper(),
|
// CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
// CN_S_OWNER = y.Key.CN_S_OWNER,
|
// 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_CODE,
|
// CN_F_QUANTITY = y.Sum(s => s.CN_F_OUT_QUANTITY),
|
// CN_T_LOCK = DateTime.Now,
|
// CN_F_SUM_USE = 0,
|
// CN_T_USE = DateTime.Now,
|
// CN_F_SUM_CANCEL = 0,
|
// CN_S_STATE = Constants.State_Executing,
|
// //CN_S_TABLE_ID = stockQtyWhere[0].CN_GUID,
|
// CN_S_TABLE_TYPE = "2",
|
// CN_T_CANCEL = Convert.ToDateTime("1900-01-01"),
|
// CN_S_OP_FROM = "移库单",
|
// CN_S_FROM_NO = y.Key.CN_S_OP_NO,
|
// CN_S_STOCK_AREA = y.Key.CN_S_START_AREA
|
//}).ToList();
|
|
////查询对应的库区 仓库量表
|
//List<TN_WM_B_AREA_QTYEntity> areaQtyList1 = CreateDAL<TN_WM_B_AREA_QTYDAL>().GetArea(" CN_S_ITEM_CODE in ('" + stockitem + "')");
|
//foreach (TN_WM_B_OUTLOCKING_DTLEntity areaQty in outlockingArea)
|
//{
|
// List<TN_WM_B_AREA_QTYEntity> areaQtyWhere = areaQtyList1.Where(w => w.CN_S_OWNER == areaQty.CN_S_OWNER && w.CN_S_ITEM_CODE == areaQty.CN_S_ITEM_CODE && w.CN_S_ITEM_STATE == areaQty.CN_S_ITEM_STATE && w.CN_S_LOT_NO == areaQty.CN_S_LOT_NO && w.CN_S_STOCK_CODE == areaQty.CN_S_STOCK_CODE && w.CN_S_STOCK_AREA == areaQty.CN_S_STOCK_AREA).ToList();
|
// if (!areaQtyWhere.Any())
|
// {
|
// return new SqlExecuteResult() { Exception = new Exception("仓库没有此物料") };
|
// }
|
// areaQty.CN_S_TABLE_ID = areaQtyWhere[0].CN_GUID;
|
//}
|
//////仓库和库区合并list
|
////outlockDtlEntityList = outlockingStock.Union(outlockingArea).ToList();
|
//outlockDtlEntityList = outlockingArea;
|
#endregion
|
|
#region 分拣单
|
//分拣单主表
|
List<TN_WM_SORTING_LISTEntity> sortingList = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_STOCK_CODE, g.CN_S_AREA_CODE }).Select(s => new TN_WM_SORTING_LISTEntity
|
{
|
CN_S_FROM_NO = s.Key.CN_S_OP_NO,
|
CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = s.Key.CN_S_AREA_CODE
|
}).ToList();
|
var so = 1;
|
//分拣单子表
|
//g.CN_S_STOCK_CODE, g.CN_S_START_AREA
|
List<TN_WM_SORTING_DTLEntity> sortingDtl = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_ITEM_CODE, g.CN_S_ITEM_NAME, g.CN_S_OWNER, g.CN_S_ITEM_STATE, g.CN_S_MODEL, g.CN_S_FIGURE_NO, g.CN_S_MEASURE_UNIT, g.CN_S_PRODUCTION_BATCH, CN_S_LOT_CODE = g.CN_S_LOT_CODE, g.CN_S_AREA_CODE }).Select(s => new TN_WM_SORTING_DTLEntity
|
{
|
AreaCode = s.Key.CN_S_AREA_CODE,
|
opNo = s.Key.CN_S_OP_NO,//区别移库单
|
//CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE,
|
//CN_S_STOCK_AREA = s.Key.CN_S_START_AREA,
|
CN_N_ROW_NO = so++,
|
CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME,
|
CN_F_QUANTITY = s.Sum(n => n.CN_F_OUT_QUANTITY),
|
CN_S_STATE = Constants.Sorting_Stay,
|
CN_S_OWNER = s.Key.CN_S_OWNER,
|
CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = s.Key.CN_S_LOT_CODE,
|
CN_S_MODEL = s.Key.CN_S_MODEL,
|
CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO,
|
CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH
|
}).ToList();
|
|
so = 1;
|
//分拣单明细
|
List<TN_WM_SORTING_LOCATIONEntity> sortingLocation = GetTrayitemlist.GroupBy(g => new { g.CN_S_OP_NO, g.CN_S_STOCK_CODE, g.CN_S_AREA_CODE, g.CN_S_ITEM_CODE, g.CN_S_ITEM_NAME, g.CN_S_START_BIT, g.CN_S_TRAY_CODE, g.CN_S_OWNER, g.CN_S_ITEM_STATE, g.CN_S_MODEL, g.CN_S_FIGURE_NO, g.CN_S_MEASURE_UNIT, g.CN_S_PRODUCTION_BATCH, CN_S_LOT_CODE = g.CN_S_LOT_CODE }).Select(s => new TN_WM_SORTING_LOCATIONEntity
|
{
|
AreaCode = s.Key.CN_S_AREA_CODE,
|
opNo = s.Key.CN_S_OP_NO,//区别移库单
|
CN_N_ROW_NO = so++,
|
CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME,
|
CN_F_QUANTITY = s.Sum(n => n.CN_F_OUT_QUANTITY),
|
CN_S_LOCATION_CODE = s.Key.CN_S_START_BIT,
|
CN_S_TRAY_CODE = s.Key.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = "1",
|
CN_S_STATE = Constants.Sorting_Stay,
|
CN_S_OWNER = s.Key.CN_S_OWNER,
|
CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = s.Key.CN_S_LOT_CODE,
|
CN_S_MODEL = s.Key.CN_S_MODEL,
|
CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO,
|
CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT,
|
CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH
|
}).ToList();
|
|
string postDatas = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.SortingGroup + "\",\"orgId\":\"" + OrgCode + "\",\"orgFlag\":\"" + OrgFlag + "\"}";
|
string sortingGroup = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postDatas);
|
DateTime time = DateTime.Now;
|
foreach (TN_WM_SORTING_LISTEntity solist in sortingList)
|
{
|
string postDataso = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.SortingNo + "\",\"orgId\":\"" + OrgCode + "\",\"orgFlag\":\"" + OrgFlag + "\"}";
|
string sortingNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postDataso);
|
solist.CN_GUID = Guid.NewGuid().ToString();
|
solist.CN_S_SORTING_NO = sortingNo;
|
solist.CN_S_OP_FROM = "移库单";//业务来源
|
//solist.CN_S_FROM_NO = fromNo,//来源单号
|
solist.CN_T_OPERATE = time.ToString();
|
//solist.CN_S_STOCK_CODE = m.stockCode,//仓库号
|
//solist.CN_S_STOCK_AREA = m.areaCode,//库区
|
solist.CN_S_STATE = Constants.Sorting_Stay;
|
solist.CN_S_SEEDING_MODE = "先拣后播";//分拨模式
|
solist.CN_S_GROUP = sortingGroup;
|
solist.CN_S_CREATOR = CN_S_CREATOR;
|
solist.CN_S_CREATOR_BY = CN_S_CREATOR_BY;
|
solist.CN_T_CREATE = time;
|
solist.CN_S_MODIFY = CN_S_CREATOR;
|
solist.CN_S_MODIFY_BY = CN_S_CREATOR_BY;
|
solist.CN_T_MODIFY = time;
|
solist.CN_N_PRINT_COUNT = 0;
|
solist.CN_N_SORTING_BOX_NUM = 0;
|
string stock = solist.CN_S_STOCK_CODE;
|
//List<AutoBomStockAreaEntity> whereArea = Arealist.Where(w => w.CN_S_STOCK_CODE == solist.CN_S_STOCK_CODE && w.CN_S_AREA_CODE == solist.CN_S_STOCK_AREA).ToList();
|
//if (whereArea[0].CN_S_AREA_CLASS.Contains("大件区"))
|
//{
|
solist.CN_C_BIG = "Y";
|
//}
|
//else
|
//{
|
// solist.CN_C_BIG = "N";
|
//}
|
//子表分拣单号
|
sortingDtl.Where(w => w.opNo == solist.CN_S_FROM_NO && w.AreaCode == solist.CN_S_STOCK_AREA).ToList().ForEach(f => f.CN_S_SORTING_NO = sortingNo);
|
//明细表分拣单号
|
sortingLocation.Where(w => w.opNo == solist.CN_S_FROM_NO && w.AreaCode == solist.CN_S_STOCK_AREA).ToList().ForEach(f => f.CN_S_SORTING_NO = sortingNo);
|
|
solist.CN_S_ORDER_NO = ""; //出库订单
|
}
|
|
#endregion
|
|
//#region 货位锁定
|
////货位锁定
|
//List<string> locationlist = GetTrayitemlist.GroupBy(x => x.CN_S_START_BIT).Select(o => o.Key).ToList();
|
//#endregion
|
//string locationCode = string.Join("','", locationlist);
|
|
|
OperateResult operateResult = UseTransaction(trans =>
|
{
|
//新增明细表
|
CreateDAL<DapperDAL<TN_WM_B_MOVE_RESULTEntity>>().AddRange(GetTrayitemlist, trans);
|
|
CreateDAL<TN_WM_MOVE_MSTDAL>().UpdateMoveMstStateByNo(opNo, "已提交", trans);
|
|
//result = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationState(locationCode, "预出库锁定", trans);
|
//if (!result.Success)
|
//{
|
// DAOManager.RollbackTransaction(trans);
|
// return result;
|
//}
|
|
////修改仓库分配量
|
//result = CreateDAL<TN_WM_B_STOCK_QTYDAL>().UpdateStockListAllocBysqlwhere(stockQtyList, trans);
|
//if (!result.Success)
|
//{
|
// DAOManager.RollbackTransaction(trans);
|
// return result;
|
//}
|
//修改库区分配
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().UpdateAreaListAllocBysqlwhere(areaQtyList, trans);
|
|
//// 影响锁定详细表
|
//if (outlockDtlEntityList.Any())
|
//{
|
// result = CreateDAL<TN_WM_B_OUTLOCKING_DTLDAL>().AddList(outlockDtlEntityList, trans);
|
// if (!result.Success)
|
// {
|
// DAOManager.RollbackTransaction(trans);
|
// return result;
|
// }
|
//}
|
CreateDAL<DapperDAL<TN_WM_SORTING_LISTEntity>>().AddRange(sortingList, trans);
|
|
CreateDAL<DapperDAL<TN_WM_SORTING_DTLEntity>>().AddRange(sortingDtl, trans);
|
|
CreateDAL<DapperDAL<TN_WM_SORTING_LOCATIONEntity>>().AddRange(sortingLocation, trans);
|
|
//上升码盘分配量
|
CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMstAllocQty(trayItemMstList, trans);
|
|
});
|
return operateResult;
|
}
|
#endregion
|
|
#region 查询移库主表
|
/// <summary>
|
/// 查询移库主表
|
/// </summary>
|
/// <param name="sqlwhere">查询条件</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/19</history>
|
public DataTable GetMst(string sqlwhere)
|
{
|
DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().Getentity(sqlwhere);
|
dt.Columns.Add("CN_S_STOCK_NAME");
|
dt.Columns.Add("CN_S_START_AREA_NAME");
|
dt.Columns.Add("CN_S_END_AREA_NAME");
|
for (int i = 0; i < dt.Rows.Count; i++)
|
{
|
TN_AB_STOCKEntity Stockentity = CreateDAL<TN_WM_MONGODAL>().GetStockentity("CN_S_STOCK_CODE", dt.Rows[i]["CN_S_STOCK_CODE"].ToString());
|
AutoBomStockAreaEntity StockArea = CreateDAL<TN_WM_MONGODAL>().GetStockArea("CN_S_AREA_CODE", dt.Rows[i]["CN_S_START_AREA"].ToString());
|
AutoBomStockAreaEntity StockAreas = CreateDAL<TN_WM_MONGODAL>().GetStockArea("CN_S_AREA_CODE", dt.Rows[i]["CN_S_END_AREA"].ToString());
|
dt.Rows[i]["CN_S_STOCK_NAME"] = Stockentity == null ? "" : Stockentity.CN_S_STOCK_NAME;
|
dt.Rows[i]["CN_S_START_AREA_NAME"] = StockArea == null ? "" : StockArea.CN_S_AREA_NAME;
|
dt.Rows[i]["CN_S_END_AREA_NAME"] = StockAreas == null ? "" : StockAreas.CN_S_AREA_NAME;
|
}
|
return dt;
|
}
|
#endregion
|
|
#region 修改
|
/// <summary>
|
/// 修改
|
/// </summary>
|
/// <param name="obj">json实体类</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/9/19</history>
|
public SqlExecuteResult MoveUpdate(JObject obj)
|
{
|
SqlExecuteResult result = new SqlExecuteResult();
|
TN_WM_MOVE_MSTEntity entitymst = JsonConvert.DeserializeObject<TN_WM_MOVE_MSTEntity>(obj.Value<object>("mst").ToString());
|
List<TN_WM_MOVE_DTLEntity> listdtl = JsonConvert.DeserializeObject<List<TN_WM_MOVE_DTLEntity>>(obj.Value<object>("dtl").ToString());
|
|
string itemcode = "";
|
listdtl.ForEach(f => itemcode += f.CN_S_ITEM_CODE + "','");
|
itemcode = itemcode.Substring(0, itemcode.Length - 3);
|
DataTable dt = CreateDAL<TN_WM_MOVE_DTLDAL>().getInfo(" CN_S_ITEM_CODE in ('" + itemcode + "') AND CN_S_OP_NO IN (SELECT CN_S_OP_NO FROM dbo.TN_WM_MOVE_MST WHERE CN_S_STATE='新建' AND CN_S_OP_NO !='" + entitymst.CN_S_OP_NO + "')");
|
int i = 1;
|
foreach (TN_WM_MOVE_DTLEntity entity in listdtl)
|
{
|
|
var moveCount = dt.AsEnumerable().Where(w => w.Field<string>("CN_S_ITEM_CODE") == entity.CN_S_ITEM_CODE && w.Field<string>("CN_S_ITEM_STATE") == entity.CN_S_ITEM_STATE && w.Field<string>("CN_S_LOT_CODE") == entity.CN_S_LOT_CODE && w.Field<string>("CN_S_MODEL") == entity.CN_S_MODEL && w.Field<string>("CN_S_FIGURE_NO") == entity.CN_S_FIGURE_NO && w.Field<string>("CN_S_MEASURE_UNIT") == entity.CN_S_MEASURE_UNIT && w.Field<string>("CN_S_PRODUCTION_BATCH") == entity.CN_S_PRODUCTION_BATCH).Count();
|
if (moveCount > 0)
|
{
|
return new SqlExecuteResult() { Exception = new Exception(" 物料[" + entity.CN_S_ITEM_NAME + "]移库数据已存在") };
|
break;
|
}
|
i++;
|
}
|
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
result = CreateDAL<TN_WM_MOVE_MSTDAL>().UpdateDtl(entitymst, trans);//新增移库主表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
result = CreateDAL<TN_WM_MOVE_DTLDAL>().Delete("where CN_S_OP_NO='" + entitymst.CN_S_OP_NO + "'", trans);//删除
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
CreateDAL<TN_WM_MOVE_DTLDAL>().Addlist(listdtl, entitymst.CN_S_OP_NO, trans);//新增子表
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
return result;
|
});
|
}
|
#endregion
|
|
#region 移库分拣完成 OLD
|
/// <summary>
|
///移库分拣完成
|
/// </summary>
|
/// <param name="opNo">移库单号</param>
|
/// <returns></returns>
|
/// <history>[HanHe(lt)] CREATED 2018/12/20</history>
|
public SqlExecuteResult MoveSortingComplete(string opNo, string userId, string userName, string orgId, string orgFlag)
|
{
|
//DataTable dt = CreateDAL<TN_WM_MOVE_MSTDAL>().GetMstResult(" WHERE a.CN_S_OP_NO='" + opNo + "'");
|
//获取分拣单
|
List<TN_WM_SORTING_RESULTEntity> sorting = CreateDAL<TN_WM_MOVE_MSTDAL>().GetSortingResult(" WHERE c.CN_S_OP_NO='" + opNo + "'");
|
|
//获取虚拟库区
|
List<TN_WM_B_TRAY_LOCATIONEntity> locationExtlist = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetlistXnAreaCode("XNWXK");
|
|
#region 仓库库区量表
|
//库区
|
List<TN_WM_B_AREA_QTYEntity> arealist = sorting.GroupBy(x => new { CN_S_OWNER = x.CN_S_OWNER, 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_LOT_NO = x.CN_S_LOT_NO, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_STOCK_AREA = x.CN_S_END_AREA, startArea = x.CN_S_AREA_CODE, endArea = x.CN_S_END_AREA, endBit = x.CN_S_END_BIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => new TN_WM_B_AREA_QTYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
//CN_S_OWNER=y.Key.CN_S_OWNER,
|
CN_S_OWNER = y.Key.endBit,//用于新增
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
startArea = y.Key.startArea,
|
endArea = y.Key.endArea,
|
endBit = y.Key.endBit,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_F_QUANTITY = y.Sum(s => s.CN_F_QUANTITY),
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
SqlWhere = " CN_S_OWNER='" + y.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'",
|
SqlWhere1 = " CN_S_OWNER='" + y.Key.endBit + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'"
|
}).ToList();
|
|
//仓库
|
List<TN_WM_B_STOCK_QTYEntity> stocklist = sorting.GroupBy(x => new { CN_S_OWNER = x.CN_S_OWNER, 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, startArea = x.CN_S_AREA_CODE, endArea = x.CN_S_END_AREA, endBit = x.CN_S_END_BIT, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = x.CN_S_LOT_NO, }).Select(y => new TN_WM_B_STOCK_QTYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
//CN_S_OWNER=y.Key.CN_S_OWNER,
|
CN_S_OWNER = y.Key.endBit,//用于新增
|
CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME,
|
CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE,
|
startArea = y.Key.startArea,
|
endArea = y.Key.endArea,
|
endBit = y.Key.endBit,
|
CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE,
|
CN_S_LOT_NO = y.Key.CN_S_LOT_NO,
|
//CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA,
|
CN_F_QUANTITY = y.Sum(s => s.CN_F_QUANTITY),
|
CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH,
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
SqlWhere = " CN_S_OWNER='" + y.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'",
|
SqlWhere1 = " CN_S_OWNER='" + y.Key.endBit + "' AND CN_S_ITEM_CODE='" + y.Key.CN_S_ITEM_CODE + "' AND CN_S_ITEM_NAME='" + y.Key.CN_S_ITEM_NAME + "' AND CN_S_LOT_NO='" + y.Key.CN_S_LOT_NO + "' AND CN_S_STOCK_CODE='" + y.Key.CN_S_STOCK_CODE + "' AND CN_S_PRODUCTION_BATCH='" + y.Key.CN_S_PRODUCTION_BATCH + "'"
|
}).ToList();
|
|
#endregion
|
|
#region 码盘主子表
|
//生成托盘编码
|
string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + orgId + "\",\"orgFlag\":\"" + orgFlag + "\"}";
|
//string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);
|
|
//获取码盘主表
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> itemMstList = sorting.GroupBy(g => new { CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_GRID = g.CN_S_TRAY_GRID, CN_S_OWNER = g.CN_S_OWNER, CN_S_ITEM_CODE = g.CN_S_ITEM_CODE, CN_S_ITEM_NAME = g.CN_S_ITEM_NAME, CN_S_FIGURE_NO = g.CN_S_FIGURE_NO, CN_S_MODEL = g.CN_S_MODEL, CN_S_ITEM_STATE = g.CN_S_ITEM_STATE, CN_S_MEASURE_UNIT = g.CN_S_MEASURE_UNIT, endBit = g.CN_S_END_BIT, CN_S_AREA_CODE = g.CN_S_AREA_CODE, CN_S_END_AREA = g.CN_S_END_AREA, CN_S_STOCK_CODE = g.CN_S_STOCK_CODE }).Select(s => new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_S_STOCK_CODE = s.Key.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = s.Key.CN_S_AREA_CODE,
|
CN_S_END_AREA = s.Key.CN_S_END_AREA,
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_TRAY_CODE_OLD = s.Key.CN_S_TRAY_CODE,//查询出来的托盘用于托盘判断
|
//CN_S_TRAY_CODE = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData),//新增托盘编码 托盘与容器表 容器表保持一致
|
CN_S_TRAY_GRID = s.Key.CN_S_TRAY_GRID,
|
CN_S_OWNER = s.Key.endBit,
|
CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = s.Key.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = s.Key.CN_S_FIGURE_NO,
|
CN_S_MODEL = s.Key.CN_S_MODEL,
|
CN_S_ITEM_STATE = s.Key.CN_S_ITEM_STATE,
|
CN_F_QUANTITY = s.Sum(u => u.CN_F_QUANTITY),
|
CN_S_MEASURE_UNIT = s.Key.CN_S_MEASURE_UNIT,
|
CN_S_IN_AREA_CODE = "",
|
CN_F_INQTY = s.Sum(u => u.CN_F_QUANTITY),
|
CN_F_ALLOC_QTY = 0,
|
sqlwhere = "where CN_S_TRAY_CODE='" + s.Key.CN_S_TRAY_CODE + "' AND CN_S_OWNER='" + s.Key.CN_S_OWNER + "' AND CN_S_ITEM_CODE='" + s.Key.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + s.Key.CN_S_FIGURE_NO + "' AND CN_S_MODEL= '" + s.Key.CN_S_MODEL + "' AND CN_S_ITEM_STATE= '" + s.Key.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT= '" + s.Key.CN_S_MEASURE_UNIT + "'",
|
//CN_S_TRAY_CODE='" + s.Key.CN_S_TRAY_CODE + "'
|
sqlwhere1 = " where CN_S_OWNER='" + s.Key.endBit + "' AND CN_S_ITEM_CODE='" + s.Key.CN_S_ITEM_CODE + "' AND CN_S_FIGURE_NO='" + s.Key.CN_S_FIGURE_NO + "' AND CN_S_MODEL= '" + s.Key.CN_S_MODEL + "' AND CN_S_ITEM_STATE= '" + s.Key.CN_S_ITEM_STATE + "' AND CN_S_MEASURE_UNIT= '" + s.Key.CN_S_MEASURE_UNIT + "'",
|
CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(),
|
|
}).ToList();
|
List<string> endBitlist = itemMstList.GroupBy(x => x.CN_S_OWNER).Select(s => s.Key).ToList();
|
|
//找到对应重复的目的货位
|
foreach (var endBit in endBitlist)
|
{
|
//同一个目的货位 相同编码判断
|
string newtray = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData);//新增托盘编码 托盘与容器表 容器表保持一致
|
itemMstList.Where(w => w.CN_S_OWNER == endBit).Select(c => { c.CN_S_TRAY_CODE = newtray; return c; }).ToList();
|
}
|
|
|
//获取码盘子表
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> itemDtlList = sorting.GroupBy(g => new { CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_GRID = g.CN_S_TRAY_GRID, CN_S_ITEM_CODE = g.CN_S_ITEM_CODE, CN_S_UNIQUE_CODE = g.CN_S_PACKING_CODE, CN_S_SERIAL_NO = g.CN_S_SERIAL_NO, CN_S_PACKING_UNIT = g.CN_S_PACKING_UNIT, CN_F_PACKING_QTY = g.CN_F_PACKING_QTY, CN_S_PRODUCTION_BATCH = g.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = g.CN_S_LOT_NO }).Select(s => new TN_WM_B_TRAY_ITEM_DTLEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_UNIQUE_CODE = s.Key.CN_S_UNIQUE_CODE,
|
CN_S_LOT_NO = s.Key.CN_S_LOT_NO,
|
CN_S_SERIAL_NO = s.Key.CN_S_SERIAL_NO,
|
CN_S_ITEM_CODE = s.Key.CN_S_ITEM_CODE,
|
CN_S_PACKING_UNIT = s.Key.CN_S_PACKING_UNIT == null ? "" : s.Key.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = s.Key.CN_F_PACKING_QTY,
|
CN_F_QUANTITY = s.Sum(u => u.CN_F_QUANTITY),
|
CN_S_VENDOR_NO = "",
|
CN_S_VENDOR_NAME = "",
|
CN_F_PURCHASE_PRICE = 0,
|
CN_F_RETAIL_PRICE = 0,
|
CN_T_PRODUCTION = DateTime.Now,
|
CN_T_EXPIRATION = DateTime.Now,
|
CN_S_CREATOR = userId,
|
CN_S_CREATOR_BY = userName,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userId,
|
CN_S_MODIFY_BY = userName,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_PRODUCTION_BATCH = s.Key.CN_S_PRODUCTION_BATCH,
|
sqlwhere = " where CN_S_UNIQUE_CODE='" + s.Key.CN_S_UNIQUE_CODE + "' AND CN_S_LOT_NO='" + s.Key.CN_S_LOT_NO + "' AND CN_S_PACKING_UNIT='" + s.Key.CN_S_PACKING_UNIT + "' AND CN_F_PACKING_QTY='" + s.Key.CN_F_PACKING_QTY + "' AND CN_S_PRODUCTION_BATCH='" + s.Key.CN_S_PRODUCTION_BATCH + "'",
|
}).ToList();
|
|
|
////分拣结果的托盘物料关联数据
|
//List<TN_WM_B_TRAY_ITEM_MSTEntity> trayItemList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new
|
//{
|
// CN_S_TRAY_CODE = locationExtlist.Select(x => x.CN_S_TRAY_CODE).ToList(),
|
//});
|
|
//循环主表 更新关联主键 CN_PARENT_GUID
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity mst in itemMstList)
|
{
|
List<TN_WM_B_TRAY_ITEM_DTLEntity> trayDtllist = itemDtlList.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE).ToList();
|
|
//判断是有虚拟对应的货位托盘
|
List<TN_WM_B_TRAY_LOCATIONEntity> locationExtlists = locationExtlist.Where(x => x.CN_S_STOCK_CODE == mst.CN_S_STOCK_CODE && x.CN_S_STOCK_AREA == mst.CN_S_END_AREA && x.CN_S_LOCATION_CODE == mst.CN_S_OWNER).ToList();
|
if (locationExtlists.Any())
|
{
|
mst.CN_S_TRAY_CODE = locationExtlists[0].CN_S_TRAY_CODE;
|
mst.CN_GUID = locationExtlists.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE && x.CN_S_TRAY_CODE == locationExtlists[0].CN_S_TRAY_CODE).ToList().Any() ? locationExtlists.Where(x => x.CN_S_ITEM_CODE == mst.CN_S_ITEM_CODE && x.CN_S_TRAY_CODE == locationExtlists[0].CN_S_TRAY_CODE).ToList()[0].CN_GUID : mst.CN_GUID;
|
}
|
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity dtl in trayDtllist)
|
{
|
dtl.CN_PARENT_GUID = mst.CN_GUID;
|
dtl.sqlwhere = dtl.sqlwhere + " AND CN_PARENT_GUID IN (select CN_GUID FROM dbo.TN_WM_B_TRAY_ITEM_MST " + mst.sqlwhere1 + ")";
|
}
|
}
|
#endregion
|
|
#region 货位与托盘表
|
|
//组织货位拓展表 数据来自与码盘主表
|
List<TN_WM_B_TRAY_LOCATIONEntity> traylocationlist = itemMstList.GroupBy(g => new { CN_S_STOCK_CODE = g.CN_S_STOCK_CODE, CN_S_STOCK_AREA = g.CN_S_END_AREA, CN_S_LOCATION_CODE = g.CN_S_OWNER, CN_S_TRAY_CODE = g.CN_S_TRAY_CODE, CN_S_TRAY_CODE_OLD = g.CN_S_TRAY_CODE_OLD }).Select(x => new TN_WM_B_TRAY_LOCATIONEntity
|
{
|
CN_S_TRAY_CODE = x.Key.CN_S_TRAY_CODE,
|
CN_S_TRAY_CODE_OLD = x.Key.CN_S_TRAY_CODE_OLD,
|
CN_S_STOCK_CODE = x.Key.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = x.Key.CN_S_STOCK_AREA,
|
CN_S_LOCATION_CODE = x.Key.CN_S_LOCATION_CODE,
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = userId,
|
CN_S_CREATOR_BY = userName,
|
CN_T_CREATE = DateTime.Now,
|
sqlWhere = @" Where CN_S_STOCK_CODE='" + x.Key.CN_S_STOCK_CODE + "'and CN_S_STOCK_AREA='" + x.Key.CN_S_STOCK_AREA + "' and CN_S_LOCATION_CODE='" + x.Key.CN_S_LOCATION_CODE + "'"
|
}).ToList();
|
#endregion
|
|
#region 容器表
|
//组织容器表
|
List<TN_WM_B_TRAY_INFOEntity> trayInfoList = traylocationlist.GroupBy(g => g.CN_S_TRAY_CODE).Select(x => new TN_WM_B_TRAY_INFOEntity
|
{
|
CN_S_TRAY_CODE = x.Key,
|
CN_S_TRAY_CODE_EXT = "",
|
CN_S_TRAY_TYPE = "虚拟托盘",
|
CN_S_TRAY_DIMENSION = "",
|
CN_S_TRAY_COLOR = "",
|
CN_S_DESC = "移库生成虚拟托盘",
|
CN_S_STATE = "使用中",
|
CN_S_SPEC = "",
|
CN_S_SORTING_CODE = "",
|
CN_S_COLLECT_CODE = "",
|
CN_S_COLLECT_LOCATION = "",
|
CN_N_LATTICE_NUM = 1,
|
CN_S_USE_STATE = "不满",
|
CN_N_ROW_NUM = 1,
|
CN_N_COLUMN_NUM = 1,
|
CN_F_LOADBEARING = 0,
|
CN_F_GROSSWEIGHT = 0,
|
CN_F_WEIGHT = 0,
|
CN_S_CREATOR = userId,
|
CN_S_CREATOR_BY = userName,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userId,
|
CN_S_MODIFY_BY = userName,
|
CN_T_MODIFY = DateTime.Now,
|
//sqlWhere = " where CN_S_TRAY_CODE='"+x.CN_S_TRAY_CODE_OLD+"'"
|
}).ToList();
|
|
//判断是否是新增托盘
|
foreach (TN_WM_B_TRAY_INFOEntity trayInfo in trayInfoList)
|
{
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> trayItemMst = itemMstList.Where(x => x.CN_S_TRAY_CODE == trayInfo.CN_S_TRAY_CODE).ToList();
|
if (trayItemMst.Any())
|
{
|
trayInfo.sqlWhere = trayItemMst[0].sqlwhere1;
|
}
|
}
|
#endregion
|
|
#region 上架
|
List<TN_WM_UP_HISTORYEntity> upHistoryList = new List<TN_WM_UP_HISTORYEntity>();
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity right in itemDtlList)
|
{
|
TN_WM_B_TRAY_ITEM_MSTEntity left = itemMstList.Find(x => x.CN_S_ITEM_CODE == right.CN_S_ITEM_CODE);
|
upHistoryList.Add(new TN_WM_UP_HISTORYEntity
|
{
|
CN_GUID = System.Guid.NewGuid().ToString(),
|
CN_S_LOCATION_CODE = left.CN_S_OWNER,
|
CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = "1",
|
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 = userId,
|
CN_S_CREATOR_BY = userName,
|
CN_T_CREATE = DateTime.Now,
|
CN_S_MODIFY = userId,
|
CN_S_MODIFY_BY = userName,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_OP_FROM = "移库单",
|
CN_S_FROM_NO = opNo,
|
CN_S_STOCK_CODE = left.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = left.CN_S_END_AREA
|
});
|
}
|
|
//if (itemMstList.Any())
|
//{
|
// var entity1 = (from left in itemMstList
|
// join right in itemDtlList 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 = left.CN_S_OWNER,
|
// CN_S_TRAY_CODE = left.CN_S_TRAY_CODE,
|
// CN_S_TRAY_GRID = "1",
|
// 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 = left.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 = userId,
|
// CN_S_CREATOR_BY = userName,
|
// CN_T_CREATE = DateTime.Now,
|
// CN_S_MODIFY = userId,
|
// CN_S_MODIFY_BY = userName,
|
// CN_T_MODIFY = DateTime.Now,
|
// CN_S_OP_FROM = "移库单",
|
// CN_S_FROM_NO = opNo,
|
// CN_S_STOCK_CODE = left.CN_S_STOCK_CODE,
|
// CN_S_STOCK_AREA = left.CN_S_END_AREA
|
// }).ToList();
|
// upHistoryList.AddRange(entity1);
|
//}
|
#endregion 托盘上架
|
|
SqlExecuteResult result = new SqlExecuteResult();
|
return DAOManager.ExecuteTransaction(trans =>
|
{
|
result = CreateDAL<TN_WM_B_AREA_QTYDAL>().MoveInfoUpdateAreaQty(arealist, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
|
//新增容器表
|
CreateDAL<TN_WM_B_TRAY_INFODAL>().Add(trayInfoList, trans);
|
|
result = CreateDAL<TN_WM_B_STOCK_QTYDAL>().MoveInfoUpdateStockQty(stocklist, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
|
//新增码盘主表判断
|
result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateMst(itemMstList, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
//新增码盘子表判断
|
result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().UpdateDtl(itemDtlList, trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
//新增货位拓展表
|
CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().addlist(traylocationlist, trans);
|
|
|
////删除为0码盘数据
|
//result = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().DeleteMstDtl(trans);
|
//if (!result.Success)
|
//{
|
// DAOManager.RollbackTransaction(trans);
|
// return result;
|
//}
|
|
//新增入库记录
|
if (upHistoryList.Any())
|
{
|
//新增入库记录
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHistoryList, trans);
|
}
|
|
result = CreateDAL<TN_WM_MOVE_MSTDAL>().UpdateStateByNo(opNo, "完成", trans);
|
if (!result.Success)
|
{
|
DAOManager.RollbackTransaction(trans);
|
return result;
|
}
|
|
return result;
|
});
|
}
|
#endregion
|
|
#region 快速移库
|
/// <summary>
|
///快速移库
|
/// </summary>
|
/// <param name="opNo">移库单号</param>
|
/// <returns></returns>
|
/// <history>[HanHe(dbs)] CREATED 2019/4/2</history>
|
public OperateResult PartMoveStock(JObject obj, RedisUserEntity user)
|
{
|
List<TN_WM_B_MOVE_RESULTEntity> moveResultList = JsonConvert.DeserializeObject<List<TN_WM_B_MOVE_RESULTEntity>>(obj["list"].ToString());
|
string moveStockType = obj["moveStockType"].ToString() == "" ? "1" : obj["moveStockType"].ToString();//移库类型 1整托移库 2部分移库
|
|
string startBit = obj["CN_S_START_BIT"].ToString();
|
string endBit = obj["CN_S_END_BIT"].ToString();
|
//获取货位与托盘关联数据
|
List<TN_WM_B_TRAY_LOCATIONEntity> trayLocationlists = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().GetTrayLocationBylocationCode(endBit);
|
|
string startTrayCode = obj["CN_S_TRAY_CODE"].ToString();//移动的托盘
|
string endTrayCode = trayLocationlists.Any() ? trayLocationlists[0].CN_S_TRAY_CODE : "";
|
|
if (moveStockType == "2")
|
{
|
if (string.IsNullOrEmpty(moveResultList[0].CN_S_TRAY_CODE))
|
moveResultList.ForEach(x => { x.CN_S_TRAY_CODE = startTrayCode; x.CN_S_TRAY_GRID = "1"; });
|
}
|
|
#region 判断起点终点货位状态
|
if (string.IsNullOrEmpty(startBit))
|
{
|
return OperateResult.Error("移库起点货位不存在!");
|
}
|
else if (string.IsNullOrEmpty(endBit))
|
{
|
return OperateResult.Error("移库终点货位不存在!");
|
}
|
TN_WM_LOCATION_EXTEntity startMode = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = startBit });
|
TN_WM_LOCATION_EXTEntity endMode = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = endBit });
|
if (startMode == null || !startMode.CN_S_LOCATION_STATE.Trim().Equals(Constants.Location_State_Normal))
|
{
|
return OperateResult.Error("请检查起点货位状态!");
|
}
|
if (endMode == null || !endMode.CN_S_LOCATION_STATE.Trim().Equals(Constants.Location_State_Normal))
|
{
|
return OperateResult.Error("请检查终点货位状态!");
|
}
|
#endregion
|
|
#region 获取起点托盘绑定物料信息
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> resouceTrayItems = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = startTrayCode });
|
resouceTrayItems.ForEach(x =>
|
{
|
x.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = x.CN_GUID });
|
});
|
#endregion
|
|
//记录托盘减少量
|
List<string> reduceMstGuid = new List<string>();//记录哪些是完全移除的物料;
|
List<string> reduceDtlGuid = new List<string>();//记录哪些是完全移除的物料;
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
|
OperateResult or = ReduceTrayMst(moveStockType == "1", resouceTrayItems, moveResultList, out reduceMstGuid, out reduceDtlGuid, out reduceTrayMst, user);
|
if (or.Status != ResultStatus.Success)
|
return or;
|
|
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
downHis = BuildDownHis(reduceTrayMst, user);
|
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
upHis = BuildUpHis(reduceTrayMst, user);
|
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> tagTrayItems = null;
|
List<string> addMstGuid = new List<string>();//记录哪些是完全新增的物料;
|
string virTrayCode = "";//虚拟托盘号
|
TN_WM_B_TRAY_LOCATIONEntity trayLocationRel = new TN_WM_B_TRAY_LOCATIONEntity();
|
|
if (!string.IsNullOrEmpty(endTrayCode))
|
{
|
#region 移动到非空货位,获取非空货位的物料,组织容器增加的物料
|
or = BuildAddTrayMst(endTrayCode, reduceTrayMst, out tagTrayItems, out addMstGuid);
|
if (or.Status != ResultStatus.Success)
|
return or;
|
#endregion
|
}
|
else
|
{
|
#region 创建虚拟托盘
|
or = BLLCreator.Create<TN_WM_B_TRAY_INFOBLL>().CreateVirtualTray(user);
|
if (or.Status != ResultStatus.Success)
|
return or;
|
virTrayCode = or.Data.ToString();
|
|
trayLocationRel = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = user.CN_S_LOGIN,
|
CN_S_CREATOR_BY = user.CN_S_NAME,
|
CN_S_STOCK_CODE = endMode.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = endMode.CN_S_AREA_CODE,
|
CN_S_LOCATION_CODE = endBit,
|
CN_S_TRAY_CODE = virTrayCode,
|
CN_T_CREATE = DateTime.Now
|
};
|
#endregion
|
}
|
|
return UseTransaction(trans =>
|
{
|
CreateDAL<DapperDAL<TN_WM_UP_HISTORYEntity>>().AddRange(upHis, trans);
|
CreateDAL<DapperDAL<TN_WM_DOWN_HISTORYEntity>>().AddRange(downHis, trans);
|
|
if (moveStockType == "1" && string.IsNullOrEmpty(endTrayCode))
|
{
|
#region 整托移库到空货位
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_USE_STATE = Constants.Use_State_NoFull }, new { CN_S_LOCATION_CODE = endBit }, trans);
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = startBit }, trans);
|
//移动托盘到新的货位
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Update(new { CN_S_LOCATION_CODE = endBit }, new { CN_S_TRAY_CODE = startTrayCode }, trans);
|
#endregion
|
}
|
else if (moveStockType == "1" && !string.IsNullOrEmpty(endTrayCode))
|
{
|
#region 整托移库到非空货位
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = startBit }, trans);
|
//删除起点货位与托盘的关系
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new { CN_S_LOCATION_CODE = startBit }, trans);
|
//删除起点托盘与物料的关系
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_S_TRAY_CODE = startTrayCode }, trans);
|
|
AddTrayItem(tagTrayItems, addMstGuid, trans);
|
#endregion
|
}
|
else if (moveStockType != "1" && string.IsNullOrEmpty(endTrayCode))
|
{
|
#region 部分移库到空货位上
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_USE_STATE = Constants.Use_State_NoFull }, new { CN_S_LOCATION_CODE = trayLocationRel.CN_S_LOCATION_CODE }, trans);
|
|
ReduceTrayItem(reduceTrayMst, reduceMstGuid, reduceDtlGuid, trans);
|
#region 增加空位的记录
|
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Add(trayLocationRel, trans);
|
|
reduceTrayMst.ForEach(x =>
|
{
|
x.CN_GUID = Guid.NewGuid().ToString();
|
x.CN_S_TRAY_CODE = virTrayCode;
|
x.TrayItemDtlList.ForEach(y =>
|
{
|
y.CN_GUID = Guid.NewGuid().ToString();
|
y.CN_PARENT_GUID = x.CN_GUID;
|
});
|
});
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().AddRange(reduceTrayMst, trans);
|
reduceTrayMst.ForEach(x =>
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().AddRange(x.TrayItemDtlList, trans);
|
});
|
#endregion
|
#endregion
|
}
|
else if (moveStockType != "1" && !string.IsNullOrEmpty(endTrayCode))
|
{
|
#region 部分移库到非空货位上
|
ReduceTrayItem(reduceTrayMst, reduceMstGuid, reduceDtlGuid, trans);
|
|
AddTrayItem(tagTrayItems, addMstGuid, trans);
|
#endregion
|
}
|
});
|
}
|
|
private List<TN_WM_UP_HISTORYEntity> BuildUpHis(List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst, RedisUserEntity user)
|
{
|
List<TN_WM_UP_HISTORYEntity> upHis = new List<TN_WM_UP_HISTORYEntity>();
|
reduceTrayMst.ForEach(x =>
|
{
|
upHis.Add(new TN_WM_UP_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = x.CN_F_PACKING_QTY,
|
CN_S_CREATOR = user.CN_S_LOGIN,
|
CN_S_CREATOR_BY = user.CN_S_NAME,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = x.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = x.CN_S_LOCATION_CODE,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MODIFY = user.CN_S_NAME,
|
CN_S_MODIFY_BY = user.CN_S_NAME,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = x.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = x.CN_S_TRAY_GRID,
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
});
|
});
|
return upHis;
|
}
|
|
private List<TN_WM_DOWN_HISTORYEntity> BuildDownHis(List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst, RedisUserEntity user)
|
{
|
List<TN_WM_DOWN_HISTORYEntity> downHis = new List<TN_WM_DOWN_HISTORYEntity>();
|
reduceTrayMst.ForEach(x =>
|
{
|
downHis.Add(new TN_WM_DOWN_HISTORYEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_F_PACKING_QTY = x.CN_F_PACKING_QTY,
|
CN_S_CREATOR = user.CN_S_LOGIN,
|
CN_S_CREATOR_BY = user.CN_S_NAME,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_F_QUANTITY = x.CN_F_QUANTITY,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_LOCATION_CODE = x.CN_S_LOCATION_CODE,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_MODIFY = user.CN_S_NAME,
|
CN_S_MODIFY_BY = user.CN_S_NAME,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH,
|
CN_S_STOCK_AREA = x.CN_S_STOCK_AREA,
|
CN_S_STOCK_CODE = x.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = x.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = x.CN_S_TRAY_GRID,
|
CN_T_CREATE = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
});
|
});
|
return downHis;
|
}
|
|
#region 组织下架记录
|
|
#endregion
|
|
#region 移动到非空货位,获取非空货位的物料,组织容器增加的物料
|
/// <summary>
|
/// 移动到非空货位,获取非空货位的物料,组织容器增加的物料
|
/// </summary>
|
/// <param name="endTrayCode"></param>
|
/// <param name="reduceTrayMst">减少的物料信息</param>
|
/// <param name="tagTrayItems"></param>
|
/// <param name="addMstGuid"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(dbs)] CREATED 2019/4/2</history>
|
private OperateResult BuildAddTrayMst(string endTrayCode, List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst, out List<TN_WM_B_TRAY_ITEM_MSTEntity> addMst, out List<string> addMstGuid)
|
{
|
addMstGuid = new List<string>();
|
addMst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
|
List<TN_WM_B_TRAY_ITEM_MSTEntity> tagTrayItems = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { CN_S_TRAY_CODE = endTrayCode });
|
tagTrayItems.ForEach(x =>
|
{
|
x.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = x.CN_GUID });
|
});
|
|
foreach (TN_WM_B_TRAY_ITEM_MSTEntity y in reduceTrayMst)
|
{
|
TN_WM_B_TRAY_ITEM_MSTEntity x = tagTrayItems.Find(k => k.CN_S_ITEM_CODE.Equals(y.CN_S_ITEM_CODE));
|
|
if (x != null)
|
{
|
x.CN_F_QUANTITY += y.CN_F_QUANTITY;
|
|
foreach (TN_WM_B_TRAY_ITEM_DTLEntity o in y.TrayItemDtlList)
|
{
|
TN_WM_B_TRAY_ITEM_DTLEntity d = x.TrayItemDtlList.Find(p => p.CN_F_PACKING_QTY == o.CN_F_PACKING_QTY && p.CN_S_PACKING_UNIT.Equals(o.CN_S_PACKING_UNIT)
|
&& p.CN_F_PURCHASE_PRICE == o.CN_F_PURCHASE_PRICE && p.CN_S_LOT_NO.Equals(o.CN_S_LOT_NO) && p.CN_S_PRODUCTION_BATCH.Equals(o.CN_S_PRODUCTION_BATCH));
|
if (d != null)
|
d.CN_F_QUANTITY += o.CN_F_QUANTITY;
|
else
|
{
|
TN_WM_B_TRAY_ITEM_DTLEntity newDtl = TransExpV2<TN_WM_B_TRAY_ITEM_DTLEntity, TN_WM_B_TRAY_ITEM_DTLEntity>.Trans(o);
|
newDtl.CN_GUID = "";
|
newDtl.CN_PARENT_GUID = y.CN_GUID;
|
x.TrayItemDtlList.Add(newDtl);
|
}
|
}
|
addMst.Add(x);
|
}
|
else
|
{
|
string newGuid = Guid.NewGuid().ToString();
|
addMstGuid.Add(newGuid);
|
|
TN_WM_B_TRAY_ITEM_MSTEntity newMst = y.Clone();
|
newMst.CN_GUID = newGuid;
|
newMst.CN_S_TRAY_CODE = endTrayCode;
|
newMst.CN_S_TRAY_GRID = "1";
|
newMst.TrayItemDtlList.ForEach(k => { k.CN_GUID = ""; k.CN_PARENT_GUID = newGuid; });
|
addMst.Add(newMst);
|
}
|
}
|
return OperateResult.Succeed();
|
}
|
#endregion
|
|
#region 组织减少起点托盘上的物料信息
|
/// <summary>
|
/// 组织减少起点托盘上的物料信息
|
/// </summary>
|
/// <param name="isFullLocation"></param>
|
/// <param name="resouceTrayItems"></param>
|
/// <param name="moveResultList"></param>
|
/// <param name="reduceMstGuid"></param>
|
/// <param name="reduceDtlGuid"></param>
|
/// <param name="reduceTrayMst"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(dbs)] CREATED 2019/4/2</history>
|
private OperateResult ReduceTrayMst(bool isFullLocation, List<TN_WM_B_TRAY_ITEM_MSTEntity> resouceTrayItems, List<TN_WM_B_MOVE_RESULTEntity> moveResultList,
|
out List<string> reduceMstGuid, out List<string> reduceDtlGuid, out List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst, RedisUserEntity user)
|
{
|
reduceTrayMst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
reduceMstGuid = new List<string>();
|
reduceDtlGuid = new List<string>();
|
if (isFullLocation)
|
{
|
//整托移库
|
//获取起点货位上面的物料
|
reduceTrayMst = resouceTrayItems;
|
return OperateResult.Succeed();
|
}
|
else
|
{
|
//部分移库
|
if (!moveResultList.Any())
|
{
|
reduceTrayMst = new List<TN_WM_B_TRAY_ITEM_MSTEntity>();
|
reduceMstGuid = new List<string>();
|
reduceDtlGuid = new List<string>();
|
return OperateResult.Error("未找到移库数据!");
|
}
|
#region 校验部分移库的物料和数量是否匹配,并组织容器减少的物料
|
foreach (var x in resouceTrayItems)
|
{
|
foreach (var y in moveResultList)
|
{
|
if (y.CN_F_QUANTITY == 0)
|
continue;
|
if (x.CN_S_TRAY_CODE.Equals(y.CN_S_TRAY_CODE) && x.CN_S_TRAY_GRID.Equals(y.CN_S_TRAY_GRID) && x.CN_S_ITEM_CODE.Equals(y.CN_S_ITEM_CODE))
|
{
|
decimal reduceQty = y.CN_F_QUANTITY;
|
if (y.CN_F_QUANTITY > x.CN_F_QUANTITY)
|
{
|
return OperateResult.Error("移动的物料数量不匹配,请联系管理员!");
|
}
|
else if (y.CN_F_QUANTITY == x.CN_F_QUANTITY)
|
{
|
//完全移除的物料
|
reduceMstGuid.Add(x.CN_GUID);
|
}
|
|
TN_WM_B_TRAY_ITEM_MSTEntity mst = new TN_WM_B_TRAY_ITEM_MSTEntity()
|
{
|
CN_GUID = x.CN_GUID,
|
CN_S_TRAY_CODE = x.CN_S_TRAY_CODE,
|
CN_S_TRAY_GRID = x.CN_S_TRAY_GRID,
|
CN_S_ITEM_CODE = x.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = x.CN_S_ITEM_NAME,
|
CN_S_FIGURE_NO = x.CN_S_FIGURE_NO,
|
CN_S_MODEL = x.CN_S_MODEL,
|
CN_S_ITEM_STATE = x.CN_S_ITEM_STATE,
|
CN_S_OWNER = x.CN_S_OWNER,
|
CN_F_QUANTITY = reduceQty,
|
CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT,
|
CN_S_LOT_NO = x.CN_S_LOT_NO,
|
CN_S_PACKING_UNIT = x.CN_S_PACKING_UNIT,
|
CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH
|
};
|
|
y.CN_F_QUANTITY -= y.CN_F_QUANTITY;
|
|
foreach (var m in x.TrayItemDtlList)
|
{
|
foreach (var n in y.DtlList)
|
{
|
if (m.CN_S_PACKING_UNIT.Equals(n.CN_S_PACKING_UNIT) && m.CN_F_PACKING_QTY == n.CN_F_PACKING_QTY)
|
{
|
if (n.CN_F_QUANTITY == 0)
|
continue;
|
decimal qty = 0;
|
if (n.CN_F_QUANTITY > m.CN_F_QUANTITY)
|
{
|
qty = m.CN_F_QUANTITY;
|
n.CN_F_QUANTITY -= m.CN_F_QUANTITY;
|
reduceDtlGuid.Add(m.CN_GUID);
|
}
|
else if (n.CN_F_QUANTITY == m.CN_F_QUANTITY)
|
{
|
qty = n.CN_F_QUANTITY;
|
n.CN_F_QUANTITY = 0;
|
reduceDtlGuid.Add(m.CN_GUID);
|
}
|
else if (n.CN_F_QUANTITY < m.CN_F_QUANTITY)
|
{
|
qty = n.CN_F_QUANTITY;
|
n.CN_F_QUANTITY = 0;
|
}
|
mst.TrayItemDtlList.Add(new TN_WM_B_TRAY_ITEM_DTLEntity()
|
{
|
CN_GUID = m.CN_GUID,
|
CN_S_PACKING_UNIT = m.CN_S_PACKING_UNIT,
|
CN_F_PACKING_QTY = m.CN_F_PACKING_QTY,
|
CN_S_LOT_NO = m.CN_S_LOT_NO,
|
CN_S_PRODUCTION_BATCH = m.CN_S_PRODUCTION_BATCH,
|
CN_F_QUANTITY = qty,
|
CN_S_CREATOR = user.CN_S_LOGIN,
|
CN_S_CREATOR_BY = user.CN_S_NAME,
|
CN_T_CREATE = DateTime.Now
|
});
|
}
|
}
|
}
|
if (mst.TrayItemDtlList.Count == 0)
|
{
|
return OperateResult.Error("移动的包装数量与库存不一致!");
|
}
|
reduceTrayMst.Add(mst);
|
}
|
}
|
}
|
#endregion
|
}
|
return OperateResult.Succeed();
|
}
|
#endregion
|
|
#region 减少容器物料
|
/// <summary>
|
/// 减少容器物料
|
/// </summary>
|
/// <param name="reduceTrayMst">减少的数量</param>
|
/// <param name="reduceMstGuid">完全排除的主表ID</param>
|
/// <param name="reduceDtlGuid">完全排除的子表ID</param>
|
/// <param name="trans"></param>
|
/// <history>[HanHe(dbs)] CREATED 2019/4/2</history>
|
private void ReduceTrayItem(List<TN_WM_B_TRAY_ITEM_MSTEntity> reduceTrayMst, List<string> reduceMstGuid, List<string> reduceDtlGuid, IDbTransaction trans)
|
{
|
reduceTrayMst.ForEach(h =>
|
{
|
if (reduceMstGuid.Exists(y => y.Equals(h.CN_GUID)))
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Delete(new { CN_GUID = h.CN_GUID }, trans);
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_PARENT_GUID = h.CN_GUID }, trans);
|
}
|
else
|
{
|
CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().ReduceMstQty(h, trans);
|
h.TrayItemDtlList.ForEach(x =>
|
{
|
if (reduceDtlGuid.Exists(y => y.Equals(x.CN_GUID)))
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Delete(new { CN_GUID = x.CN_GUID }, trans);
|
else
|
CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().ReduceDtlQty(x, trans);
|
});
|
}
|
});
|
}
|
#endregion
|
|
#region 增加容器物料
|
/// <summary>
|
/// 增加容器物料
|
/// </summary>
|
/// <param name="tagTrayItems">增加的数量</param>
|
/// <param name="addMstGuid">增加增加的主表记录</param>
|
/// <param name="trans"></param>
|
/// <history>[HanHe(dbs)] CREATED 2019/4/2</history>
|
private void AddTrayItem(List<TN_WM_B_TRAY_ITEM_MSTEntity> tagTrayItems, List<string> addMstGuid, IDbTransaction trans)
|
{
|
tagTrayItems.ForEach(x =>
|
{
|
if (addMstGuid.Exists(y => y.Equals(x.CN_GUID)))
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Add(x, trans);
|
}
|
else
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().Update(new { CN_F_QUANTITY = x.CN_F_QUANTITY }, new { CN_GUID = x.CN_GUID }, trans);
|
//CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().AddMstQty(x, trans);
|
x.TrayItemDtlList.ForEach(y =>
|
{
|
if (string.IsNullOrEmpty(y.CN_GUID))
|
{
|
y.CN_GUID = Guid.NewGuid().ToString();
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Add(y, trans);
|
}
|
else
|
{
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().Update(new { CN_F_QUANTITY = y.CN_F_QUANTITY }, new { CN_GUID = y.CN_GUID }, trans);
|
//CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().AddDtlQty(y, trans);
|
}
|
});
|
});
|
}
|
#endregion
|
#endregion
|
|
#region 综合查询
|
/// <summary>
|
/// 综合查询
|
/// </summary>
|
/// <param name="tableName">主表字段</param>
|
/// <param name="pageIndex"></param>
|
/// <param name="pageSize"></param>
|
/// <param name="total"></param>
|
/// <param name="orderBy"></param>
|
/// <param name="param"></param>
|
/// <returns></returns>
|
public DataTable GetDataList(string tableName, int pageIndex, int pageSize, out long total, string orderBy = "")
|
{
|
return CreateDAL<TN_WM_MOVE_MSTDAL>().GetDataList(tableName, pageIndex, pageSize, out total, orderBy);
|
}
|
#endregion
|
}
|
}
|