BaoKai_202508-Wms-Jingwang..../WMS.Business/Stock/BussAreaRep.cs
2025-08-24 09:35:55 +08:00

2263 lines
99 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WMS.Model.Stock;
using System.Data;
using WMS.IData;
using WMS.Common;
using WMS.Business.Base;
using WMS.Model.Base;
using WMS.Model.CK;
namespace WMS.Business.Stock
{
public class BussAreaRep : IBussFactory
{
/// <summary>
/// 获取库区间调拨单结果集
/// </summary>
/// <returns>库区间调拨单</returns>
public List<AreaRepModel> GetAreaRepList(AreaRepModel model)
{
DataTable table = DataProvider.Instance.AreaRep.GetAreaRepDT(model);
List<AreaRepModel> AreaRepModel = ConvertHelper<AreaRepModel>.ConvertToList(table);
if (DataLogErrWrite(table, "获取库区间调拨单"))
{
return AreaRepModel;
}
return null;
}
/// <summary>
/// 删除库区间调拨单信息
/// </summary>
/// <param name="AreaRep">库区间调拨单</param>
/// <returns>是否成功</returns>
public string DeleteAreaRep(string AreaRepID)
{
DataProvider.Instance.AreaRep.DeleteAreaRep(AreaRepID);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
//删除规格明细
//SKUTabModel skuTab = new SKUTabModel();
//skuTab.DOCCTNUMBER = AreaRepID;
//DataProvider.Instance.SKUTab.DelSKUTab(skuTab);
//logList.Add(DataProvider.Instance.logData);
//删除消息
DataProvider.Instance.Message.DeleteMessByRelativeNumber(AreaRepID);
logList.Add(DataProvider.Instance.logData);
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// 删除库区间调拨单(包括明细)
/// </summary>
/// <param name="AreaRep">库区间调拨单</param>
/// <returns>是否成功</returns>
public string DeleteAreaRepAndTab(string AreaRepID)
{
DataProvider.Instance.AreaRep.DeleteAreaRep(AreaRepID);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
//获取原来的所有明细,减去原来的已占用库存
AreaRepOutModel tab = new AreaRepOutModel();
tab.AREA_REP_ID = AreaRepID;
DataTable table = DataProvider.Instance.AreaRepOut.GetAreaRepOutDT(tab);
List<AreaRepOutModel> list = ConvertHelper<AreaRepOutModel>.ConvertToList(table);
foreach (var item in list)
{
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = item.PUTIN_ID;
mi.GOODS_ID = item.GOODS_ID;
mi.LOCATION_ID = item.OUT_LOC_ID;
mi.OCCUPY_NUM = -item.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
//删除库存占用记录表相应记录
MIStockOccupyModel queryOccupy = new MIStockOccupyModel();
queryOccupy.GOODS_ID = mi.GOODS_ID;
queryOccupy.LOCATION_ID = mi.LOCATION_ID;
queryOccupy.PUTIN_ID = mi.PUTIN_ID;
List<MIStockOccupyModel> occupy = ConvertHelper<MIStockOccupyModel>.ConvertToList(DataProvider.Instance.MIStockOccupy.GetMIStockOccupyDT(queryOccupy));
DataProvider.Instance.MIStockOccupy.DeleteMIStockOccupy(occupy[0]);
logList.Add(DataProvider.Instance.logData);
}
DataProvider.Instance.AreaRepOut.DeleteAreaRepOutByAreaRepID(AreaRepID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRepIn.DeleteAreaRepInByAreaRepID(AreaRepID);
logList.Add(DataProvider.Instance.logData);
//删除规格明细
//SKUTabModel skuTab = new SKUTabModel();
//skuTab.DOCCTNUMBER = AreaRepID;
//DataProvider.Instance.SKUTab.DelSKUTab(skuTab);
//logList.Add(DataProvider.Instance.logData);
//删除消息
DataProvider.Instance.Message.DeleteMessByRelativeNumber(AreaRepID);
logList.Add(DataProvider.Instance.logData);
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// 新增库区间调拨单(包括明细)
/// </summary>
/// <param name="AreaRepModel">库区间调拨单Model</param>
/// <param name="listAreaRepOut">出库明细ModelList</param>
/// <param name="listAreaRepIn">入库明细ModelList</param>
/// <returns>是否成功</returns>
public string InsertAreaRepAndTab(AreaRepModel areaRepModel, List<AreaRepOutModel> listAreaRepOut, List<AreaRepInModel> listAreaRepIn, List<SKUTabModel> listSKU)
{
//新增库区间调拨单
areaRepModel.AREA_REP_ID = IBussFactory<WMS.Business.Base.BussDocumentTable>.Instance().GetDocumentStream("库区调拨单");
DataProvider.Instance.AreaRep.InsertAreaRep(areaRepModel);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
////删除所有明细
//DataProvider.Instance.AreaRepOut.DeleteAreaRepOutByAreaRepID(AreaRepModel.AREA_REP_ID);
//logList.Add(DataProvider.Instance.logData);
//DataProvider.Instance.AreaRepIn.DeleteAreaRepInByAreaRepID(AreaRepModel.AREA_REP_ID);
//logList.Add(DataProvider.Instance.logData);
//增加明细
foreach (AreaRepOutModel areaRepOutModel in listAreaRepOut)
{
if (!string.IsNullOrEmpty(areaRepModel.AREA_REP_ID))
{
areaRepOutModel.AREA_REP_ID = areaRepModel.AREA_REP_ID;
}
DataProvider.Instance.AreaRepOut.InsertAreaRepOut(areaRepOutModel);
logList.Add(DataProvider.Instance.logData);
////根据计划数修改已占用库存
//MIStockModel mi = new MIStockModel();
//mi.PUTIN_ID = areaRepOutModel.PUTIN_ID;
//mi.GOODS_ID = areaRepOutModel.GOODS_ID;
//mi.LOCATION_ID = areaRepOutModel.OUT_LOC_ID;
//mi.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
//DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
//logList.Add(DataProvider.Instance.logData);
////写入库存占用记录表
//MIStockModel mistock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(mi))[0];
//MIStockOccupyModel occupy = new MIStockOccupyModel();
//occupy.AREA_ID = mistock.AREA_ID;
//occupy.DOCCTNUMBER = areaRepOutModel.AREA_REP_ID;
//occupy.GOODS_ID = mistock.GOODS_ID;
//occupy.LOCATION_ID = mistock.LOCATION_ID;
//occupy.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
//occupy.PUTIN_ID = mistock.PUTIN_ID;
//occupy.STOCK_ID = mistock.STOCK_ID;
//occupy.STORAGE_ID = mistock.STORAGE_ID;
//DataProvider.Instance.MIStockOccupy.InsertMIStockOccupy(occupy);
//logList.Add(DataProvider.Instance.logData);
}
foreach (AreaRepInModel areaRepInModel in listAreaRepIn)
{
if (!string.IsNullOrEmpty(areaRepModel.AREA_REP_ID))
{
areaRepInModel.AREA_REP_ID = areaRepModel.AREA_REP_ID;
}
DataProvider.Instance.AreaRepIn.InsertAreaRepIn(areaRepInModel);
logList.Add(DataProvider.Instance.logData);
}
////新增规格明细
//if (listSKU != null && listSKU.Count > 0)
//{
// //新增规格明细
// foreach (var item in listSKU)
// {
// item.DOCCTNUMBER = areaRepModel.AREA_REP_ID;
// DataProvider.Instance.SKUTab.AddSKUTab(item);
// logList.Add(DataProvider.Instance.logData);
// }
//}
TaCmtOrRak();
#region
MessageModel messModel = new MessageModel();
messModel.ID = "KQ" + DateTime.Now.ToString("yyyyMMddHHmmss") + DataProvider.Instance.Message.GetSerialNum();
messModel.MENU_FORM = "FrmAreaRep";
messModel.MESS_CONTENT = "新增库区补货单,单据编号:" + areaRepModel.AREA_REP_ID;
messModel.MESS_DATE = DateTime.Now;
messModel.MESS_DEP = areaRepModel.STORAGE_ID;
messModel.MESS_FLAG = "0";
messModel.MESS_STAR = areaRepModel.CREATE_PERSON;
messModel.MESS_TO = areaRepModel.OUT_PERSON;
messModel.MESS_STATUS = "0";
messModel.WORK_TYPE = "worktype004";
messModel.WORK_KIND = "0";
messModel.MESS_TYPE = "6";
messModel.RELATIVE_NUMBER = areaRepModel.AREA_REP_ID;
messModel.STO_ID = areaRepModel.STORAGE_ID;
DataProvider.Instance.Message.Add(messModel);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
TaCmtOrRak();
#endregion
return ErrText;
}
/// <summary>
/// 修改库区间调拨单(包括明细)
/// </summary>
/// <param name="AreaRepModel">库区间调拨单Model</param>
/// <param name="listAreaRepOut">出库明细ModelList</param>
/// <param name="listAreaRepIn">入库明细ModelList</param>
/// <returns>是否成功</returns>
public string UpdateAreaRepAndTab(AreaRepModel areaRepModel, List<AreaRepOutModel> listAreaRepOut, List<AreaRepInModel> listAreaRepIn, List<SKUTabModel> listSKU)
{
//修改库区间调拨单
DataProvider.Instance.AreaRep.UpdateAreaRep(areaRepModel);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
if (areaRepModel.STATE != "0") {
//获取原来的所有明细,减去原来的已占用库存
AreaRepOutModel tab = new AreaRepOutModel();
tab.AREA_REP_ID = areaRepModel.AREA_REP_ID;
DataTable table = DataProvider.Instance.AreaRepOut.GetAreaRepOutDT(tab);
List<AreaRepOutModel> list = ConvertHelper<AreaRepOutModel>.ConvertToList(table);
foreach (var item in list)
{
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = item.PUTIN_ID;
mi.GOODS_ID = item.GOODS_ID;
mi.LOCATION_ID = item.OUT_LOC_ID;
mi.OCCUPY_NUM = -item.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
try
{
//删除库存占用记录表相应记录
MIStockOccupyModel queryOccupy = new MIStockOccupyModel();
queryOccupy.GOODS_ID = mi.GOODS_ID;
queryOccupy.LOCATION_ID = mi.LOCATION_ID;
queryOccupy.PUTIN_ID = mi.PUTIN_ID;
List<MIStockOccupyModel> occupy = ConvertHelper<MIStockOccupyModel>.ConvertToList(DataProvider.Instance.MIStockOccupy.GetMIStockOccupyDT(queryOccupy));
DataProvider.Instance.MIStockOccupy.DeleteMIStockOccupy(occupy[0]);
logList.Add(DataProvider.Instance.logData);
}
catch (Exception)
{
}
}
}
//删除所有明细
DataProvider.Instance.AreaRepOut.DeleteAreaRepOutByAreaRepID(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRepIn.DeleteAreaRepInByAreaRepID(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
//增加明细
foreach (AreaRepOutModel areaRepOutModel in listAreaRepOut)
{
DataProvider.Instance.AreaRepOut.InsertAreaRepOut(areaRepOutModel);
logList.Add(DataProvider.Instance.logData);
//根据计划数修改已占用库存
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = areaRepOutModel.PUTIN_ID;
mi.GOODS_ID = areaRepOutModel.GOODS_ID;
mi.LOCATION_ID = areaRepOutModel.OUT_LOC_ID;
mi.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
//写入库存占用记录表
MIStockModel mistock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(mi))[0];
MIStockOccupyModel occupy = new MIStockOccupyModel();
occupy.AREA_ID = mistock.AREA_ID;
occupy.DOCCTNUMBER = areaRepOutModel.AREA_REP_ID;
occupy.GOODS_ID = mistock.GOODS_ID;
occupy.LOCATION_ID = mistock.LOCATION_ID;
occupy.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
occupy.PUTIN_ID = mistock.PUTIN_ID;
occupy.STOCK_ID = mistock.STOCK_ID;
occupy.STORAGE_ID = mistock.STORAGE_ID;
DataProvider.Instance.MIStockOccupy.InsertMIStockOccupy(occupy);
logList.Add(DataProvider.Instance.logData);
}
foreach (AreaRepInModel areaRepInModel in listAreaRepIn)
{
DataProvider.Instance.AreaRepIn.InsertAreaRepIn(areaRepInModel);
logList.Add(DataProvider.Instance.logData);
}
//修改规格明细
//if (listSKU != null && listSKU.Count > 0)
//{
// //删除规格明细
// SKUTabModel skuTab = new SKUTabModel();
// skuTab.DOCCTNUMBER = areaRepModel.AREA_REP_ID;
// DataProvider.Instance.SKUTab.DelSKUTab(skuTab);
// logList.Add(DataProvider.Instance.logData);
// //新增规格明细
// foreach (var item in listSKU)
// {
// item.DOCCTNUMBER = areaRepModel.AREA_REP_ID;
// DataProvider.Instance.SKUTab.AddSKUTab(item);
// logList.Add(DataProvider.Instance.logData);
// }
//}
if (areaRepModel.STATE == "2"){//状态为完成
List<MIStockModel> hadUpdeteList = new List<MIStockModel>();//已经被修改过的库存记录
List<AreaRepOutModel> listOut = new List<AreaRepOutModel>();
foreach (AreaRepOutModel item in listAreaRepOut)
{
for (int i = 0; i < item.REAL_COUNT; i++)
{
listOut.Add(item);
}
//根据实际数修改实际库存
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = item.PUTIN_ID;
mi.GOODS_ID = item.GOODS_ID;
mi.LOCATION_ID = item.OUT_LOC_ID;
mi.SHELVES_NUM = item.REAL_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockNum(mi);
logList.Add(DataProvider.Instance.logData);
////根据计划数修改已占用库存
//mi = new MIStockModel();
//mi.PUTIN_ID = item.PUTIN_ID;
//mi.GOODS_ID = item.GOODS_ID;
//mi.LOCATION_ID = item.OUT_LOC_ID;
//mi.OCCUPY_NUM = -item.PLAN_COUNT;
//DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
//logList.Add(DataProvider.Instance.logData);
////删除库存占用记录表相应记录
//MIStockOccupyModel queryOccupy = new MIStockOccupyModel();
//queryOccupy.GOODS_ID = mi.GOODS_ID;
//queryOccupy.LOCATION_ID = mi.LOCATION_ID;
//queryOccupy.PUTIN_ID = mi.PUTIN_ID;
//List<MIStockOccupyModel> occupy = ConvertHelper<MIStockOccupyModel>.ConvertToList(DataProvider.Instance.MIStockOccupy.GetMIStockOccupyDT(queryOccupy));
//DataProvider.Instance.MIStockOccupy.DeleteMIStockOccupy(occupy[0]);
//logList.Add(DataProvider.Instance.logData);
}
List<MIStockModel> listMI = new List<MIStockModel>();
foreach (AreaRepOutModel outM in listOut)
{
AreaRepInModel inM = listAreaRepIn.Find(p => p.REAL_COUNT != p.TEMP_COUNT && p.GOODS_ID == outM.GOODS_ID);
inM.TEMP_COUNT++;
MIStockModel model = listMI.Find(i => i.LOCATION_ID == inM.IN_LOC_ID && i.GOODS_ID == outM.GOODS_ID && i.PUTIN_ID == outM.PUTIN_ID && i.AREA_ID == areaRepModel.IN_AREA_ID);
if (model != null)
{
model.SHELVES_NUM++;
}
else
{
model = new MIStockModel();
model.PUTIN_ID = outM.PUTIN_ID;
model.AREA_ID = areaRepModel.OUT_AREA_ID;
model.LOCATION_ID = outM.OUT_LOC_ID;
model.GOODS_ID = outM.GOODS_ID;
model = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(model))[0];
model.OCCUPY_NUM = 0;
model.LOCATION_ID = inM.IN_LOC_ID;
model.SHELVES_NUM = 1;
model.AREA_ID = areaRepModel.IN_AREA_ID;
listMI.Add(model);
}
}
foreach (MIStockModel model in listMI)
{
MIStockModel queryModel = new MIStockModel();
queryModel.PUTIN_ID = model.PUTIN_ID;
queryModel.AREA_ID = model.AREA_ID;
queryModel.LOCATION_ID = model.LOCATION_ID;
queryModel.GOODS_ID = model.GOODS_ID;
List<MIStockModel> queryList = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(queryModel));
if (queryList == null || queryList.Count == 0)
{
model.STOCK_ID = DataProvider.Instance.MIStock.InsertMIStock(model);
}
else
{
DataProvider.Instance.MIStock.UpdateMIStock(model);
}
logList.Add(DataProvider.Instance.logData);
//操作库存日志表
MIStockBackModel backModel = new MIStockBackModel();//入
backModel.AREA_ID = model.AREA_ID;
backModel.CHANGE_NUM = model.SHELVES_NUM;
backModel.GOODS_ID = model.GOODS_ID;
backModel.GOODS_NAME = model.GOODS_NAME;
backModel.GOODS_NUM = model.SHELVES_NUM;
backModel.GOODS_TYPEID = model.GOODS_TYPEID;
backModel.ID = DataProvider.Instance.MIStockBack.GetSerialNum();
backModel.LOCATION_ID = model.LOCATION_ID;
backModel.OPERATOR_MAN = areaRepModel.IN_PERSON;
backModel.OPERATOR_MAN_NAME = areaRepModel.IN_PERSON_NAME;
backModel.OPERATOR_TYPE = "0";
backModel.ORI_NUM = 0;
backModel.PUTIN_ID = model.PUTIN_ID;
backModel.PRODUCTION_DATE = model.PRODUCTION_DATE;
backModel.REMARK = model.REMARK;
backModel.STOCK_ID = model.STOCK_ID;
backModel.STORAGE_ID = model.STORAGE_ID;
backModel.STORAGE_NAME = model.STORAGE_NAME;
backModel.VERSION = model.VERSION;
DataProvider.Instance.MIStockBack.AddBMiStockack(backModel);
logList.Add(DataProvider.Instance.logData);
//修改库位已占用体积
GoodsInfoModel goods = new GoodsInfoModel();
Decimal perVo = Convert.ToDecimal(DataProvider.Instance.Goods.GetGoodsDataTable(model.GOODS_ID, "", "", "").Rows[0]["GVOLUME"].ToString());
Decimal allVo = 0;
allVo = model.SHELVES_NUM * perVo;
if (allVo != 0)
{
//新库位
StorageAreaLocationModel loc = new StorageAreaLocationModel();
loc.STORAGE_ID = areaRepModel.STORAGE_ID;
loc.LOCATION_ID = model.LOCATION_ID;
loc = ConvertHelper<StorageAreaLocationModel>.ConvertToList(DataProvider.Instance.StorageAreaLocation.GetLocationInfoDS(loc))[0];
loc.HASVOLUME += allVo;
loc.OPERATORID = areaRepModel.IN_PERSON;
DataProvider.Instance.StorageAreaLocation.UpdateLocHasVolume(loc);
logList.Add(DataProvider.Instance.logData);
}
}
//写工作量
//WorkLoadModel workLoad = new WorkLoadModel();
//workLoad.BILLS_ID = areaRepModel.AREA_REP_ID;
//workLoad.USER_ID = areaRepModel.OUT_PERSON;
//workLoad.WORK_DATE = System.DateTime.Now;
//workLoad.WORK_DATE_STAR = System.DateTime.Now.Date;
//workLoad.WORK_DATE_END = System.DateTime.Now.Date;
//workLoad.WORK_NUM = areaRepModel.REAL_PLAN_NUM;
//workLoad.WORK_TYPE = "3";
////workLoad.DEP_ID =
//if (listAreaRepOut != null && listAreaRepOut.Count > 0)
//{
// workLoad.WORK_UNIT = listAreaRepOut[0].UNIT;
//}
//DataProvider.Instance.WorkLoad.Add(workLoad);
//logList.Add(DataProvider.Instance.logData);
//workLoad = new WorkLoadModel();
//workLoad.BILLS_ID = areaRepModel.AREA_REP_ID;
// workLoad.USER_ID = areaRepModel.IN_PERSON;
//workLoad.WORK_DATE = System.DateTime.Now;
//workLoad.WORK_DATE_STAR = System.DateTime.Now.Date;
//workLoad.WORK_DATE_END = System.DateTime.Now.Date;
//workLoad.WORK_NUM = areaRepModel.REAL_PLAN_NUM;
//workLoad.WORK_TYPE = "3";
////workLoad.DEP_ID =
//if (listAreaRepOut != null && listAreaRepOut.Count > 0)
//{
// workLoad.WORK_UNIT = listAreaRepOut[0].UNIT;
//}
// DataProvider.Instance.WorkLoad.Add(workLoad);
// logList.Add(DataProvider.Instance.logData);
//foreach (AreaRepInModel item in listAreaRepIn)
//{
// //操作库存表
// MIStockModel model = new MIStockModel();//入
// //model.LOCATION_ID = item.IN_LOC_ID;
// //model.GOODS_ID = item.GOODS_ID;
// ////得到库存记录
// //bool hadMIStock = false;
// //foreach (MIStockModel i in hadUpdeteList)
// //{
// // if (i.LOCATION_ID == model.LOCATION_ID && i.GOODS_ID == model.GOODS_ID)
// // {
// // hadMIStock = true;
// // model = i;
// // break;
// // }
// //}
// //if (!hadMIStock)
// //{
// // List<MIStockModel> nowMIStock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(model));
// // if (nowMIStock.Count > 0)//有该库存 修改
// // {
// // model = nowMIStock[0];
// // model.SHELVES_NUM += item.REAL_COUNT;
// // DataProvider.Instance.MIStock.UpdateMIStock(model);
// // logList.Add(DataProvider.Instance.logData);
// // }
// // else//无该库存 新增
// // {
// foreach (AreaRepOutModel i in listAreaRepOut)
// {
// if (i.GOODS_ID == item.GOODS_ID)
// {
// MIStockModel outModel = new MIStockModel();
// outModel.LOCATION_ID = i.OUT_LOC_ID;
// outModel.GOODS_ID = i.GOODS_ID;
// model = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(outModel))[0];
// break;
// }
// }
// model.LOCATION_ID = item.IN_LOC_ID;
// //StorageAreaLocationModel locModel = new StorageAreaLocationModel();
// //locModel.LOCATION_ID = model.LOCATION_ID;
// model.AREA_ID = areaRepModel.IN_AREA_ID;// IBussFactory<BussStorageAreaLocation>.Instance().GetLocationInfoDS(locModel)[0].STORAGE_AREA_ID;//入库库区编号
// model.GOODS_ID = item.GOODS_ID;
// model.SHELVES_NUM = item.REAL_COUNT;//原值是出库的 必须重新赋值
// model.WARE_DATE = System.DateTime.Now;
// model.AREA_NAME = areaRepModel.IN_AREA_NAME;
// model.DOCCTNUMBER = item.AREA_REP_ID;////////////////////////////////////////////
// model.STOCK_ID = DataProvider.Instance.MIStock.InsertMIStock(model);
// logList.Add(DataProvider.Instance.logData);
// // }
// //}
// //else
// //{//已经改过
// // model.SHELVES_NUM += item.REAL_COUNT;
// // DataProvider.Instance.MIStock.UpdateMIStock(model);
// // logList.Add(DataProvider.Instance.logData);
// //}
// //hadUpdeteList.Add(model);//保存修改过的库存记录
// //操作库存日志表
// MIStockBackModel backModel = new MIStockBackModel();//入
// backModel.AREA_ID = model.AREA_ID;
// backModel.CHANGE_NUM = model.SHELVES_NUM;
// backModel.GOODS_ID = model.GOODS_ID;
// backModel.GOODS_NAME = model.GOODS_NAME;
// backModel.GOODS_NUM = item.REAL_COUNT;
// backModel.GOODS_TYPEID = model.GOODS_TYPEID;
// backModel.ID = DataProvider.Instance.MIStockBack.GetSerialNum();
// backModel.LOCATION_ID = model.LOCATION_ID;
// backModel.OPERATOR_MAN = areaRepModel.IN_PERSON;
// backModel.OPERATOR_MAN_NAME = areaRepModel.IN_PERSON_NAME;
// backModel.OPERATOR_TYPE = "0";
// backModel.ORI_NUM = model.SHELVES_NUM - item.REAL_COUNT;
// backModel.PUTIN_ID = item.TAB_IN_ID;
// backModel.PRODUCTION_DATE = model.PRODUCTION_DATE;
// backModel.REMARK = model.REMARK;
// backModel.STOCK_ID = model.STOCK_ID;
// backModel.STORAGE_ID = model.STORAGE_ID;
// backModel.STORAGE_NAME = model.STORAGE_NAME;
// backModel.VERSION = model.VERSION;
// DataProvider.Instance.MIStockBack.Add(backModel);
// logList.Add(DataProvider.Instance.logData);
// //修改库位已占用体积
// GoodsInfoModel goods = new GoodsInfoModel();
// Decimal perVo = Convert.ToDecimal(DataProvider.Instance.Goods.GetGoodsDataTable(item.GOODS_ID, "", "", "").Rows[0]["GVOLUME"].ToString());
// Decimal allVo = 0;
// allVo = item.REAL_COUNT * perVo;
// if (allVo != 0)
// {
// //新库位
// StorageAreaLocationModel loc = new StorageAreaLocationModel();
// loc.STORAGE_ID = areaRepModel.STORAGE_ID;
// loc.LOCATION_ID = item.IN_LOC_ID;
// loc = ConvertHelper<StorageAreaLocationModel>.ConvertToList(DataProvider.Instance.StorageAreaLocation.GetLocationInfoDS(loc))[0];
// loc.HASVOLUME += allVo;
// loc.OPERATORID = areaRepModel.IN_PERSON;
// DataProvider.Instance.StorageAreaLocation.UpdateLocHasVolume(loc);
// logList.Add(DataProvider.Instance.logData);
// }
//}
//foreach (AreaRepOutModel item in listAreaRepOut)
//{
// //操作库存表
// MIStockModel model = new MIStockModel();//出
// model.LOCATION_ID = item.OUT_LOC_ID;
// model.GOODS_ID = item.GOODS_ID;
// model.PUTIN_ID = item.PUTIN_ID;
// model.AREA_ID = areaRepModel.OUT_AREA_ID;
// //得到库存记录
// bool hadMIStock = false;
// foreach (MIStockModel i in hadUpdeteList)
// {
// if (i.LOCATION_ID == model.LOCATION_ID && i.GOODS_ID == model.GOODS_ID && i.PUTIN_ID == model.PUTIN_ID && i.AREA_ID == model.AREA_ID)
// {
// hadMIStock = true;
// model = i;
// break;
// }
// }
// if (!hadMIStock)
// {
// model = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(model))[0];
// }
// model.SHELVES_NUM -= item.REAL_COUNT;
// if (model.SHELVES_NUM == 0)
// { //删该条库存
// DataProvider.Instance.MIStock.DeleteMIStock(model);
// logList.Add(DataProvider.Instance.logData);
// }
// else
// {
// hadUpdeteList.Add(model);//保存修改过的库存记录
// DataProvider.Instance.MIStock.UpdateMIStock(model);
// logList.Add(DataProvider.Instance.logData);
// }
// //操作库存日志表
// MIStockBackModel backModel = new MIStockBackModel();//出
// backModel.AREA_ID = model.AREA_ID;
// backModel.CHANGE_NUM = model.SHELVES_NUM;
// backModel.GOODS_ID = model.GOODS_ID;
// backModel.GOODS_NAME = model.GOODS_NAME;
// backModel.GOODS_NUM = item.REAL_COUNT;
// backModel.GOODS_TYPEID = model.GOODS_TYPEID;
// backModel.ID = DataProvider.Instance.MIStockBack.GetSerialNum();
// backModel.LOCATION_ID = model.LOCATION_ID;
// backModel.OPERATOR_MAN = areaRepModel.OUT_PERSON;
// backModel.OPERATOR_MAN_NAME = areaRepModel.OUT_PERSON_NAME;
// backModel.OPERATOR_TYPE = "1";
// backModel.ORI_NUM = model.SHELVES_NUM + item.REAL_COUNT;
// backModel.OUT_ID = item.TAB_OUT_ID;
// backModel.PRODUCTION_DATE = model.PRODUCTION_DATE;
// backModel.REMARK = model.REMARK;
// backModel.STOCK_ID = model.STOCK_ID;
// backModel.STORAGE_ID = model.STORAGE_ID;
// backModel.STORAGE_NAME = model.STORAGE_NAME;
// backModel.VERSION = model.VERSION;
// DataProvider.Instance.MIStockBack.Add(backModel);
// logList.Add(DataProvider.Instance.logData);
// //修改库位已占用体积
// GoodsInfoModel goods = new GoodsInfoModel();
// Decimal perVo = Convert.ToDecimal(DataProvider.Instance.Goods.GetGoodsDataTable(item.GOODS_ID, "", "", "").Rows[0]["GVOLUME"].ToString());
// Decimal allVo = 0;
// allVo = item.REAL_COUNT * perVo;
// if (allVo != 0)
// {
// //原库位
// StorageAreaLocationModel loc = new StorageAreaLocationModel();
// loc.STORAGE_ID = areaRepModel.STORAGE_ID;
// loc.LOCATION_ID = item.OUT_LOC_ID;
// loc = ConvertHelper<StorageAreaLocationModel>.ConvertToList(DataProvider.Instance.StorageAreaLocation.GetLocationInfoDS(loc))[0];
// loc.HASVOLUME -= allVo;
// loc.OPERATORID = areaRepModel.OUT_PERSON;
// DataProvider.Instance.StorageAreaLocation.UpdateLocHasVolume(loc);
// logList.Add(DataProvider.Instance.logData);
// }
//}
}
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// 修改库区间调拨单状态
/// </summary>
/// <param name="AreaRepModel">库区间调拨单Model</param>
/// <returns>是否成功</returns>
public string UpdateAreaRepState(AreaRepModel AreaRepModel)
{
//修改库区间调拨单状态
DataProvider.Instance.AreaRep.UpdateAreaRepState(AreaRepModel);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
if (AreaRepModel.STATE == "1") {
AreaRepOutModel m = new AreaRepOutModel();
m.AREA_REP_ID = AreaRepModel.AREA_REP_ID;
DataTable table = DataProvider.Instance.AreaRepOut.GetAreaRepOutDT(m);
List<AreaRepOutModel> AreaRepOutModel = ConvertHelper<AreaRepOutModel>.ConvertToList(table);
foreach (var areaRepOutModel in AreaRepOutModel)
{
//根据计划数修改已占用库存
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = areaRepOutModel.PUTIN_ID;
mi.GOODS_ID = areaRepOutModel.GOODS_ID;
mi.LOCATION_ID = areaRepOutModel.OUT_LOC_ID;
mi.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
//写入库存占用记录表
MIStockModel mistock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(mi))[0];
MIStockOccupyModel occupy = new MIStockOccupyModel();
occupy.AREA_ID = mistock.AREA_ID;
occupy.DOCCTNUMBER = areaRepOutModel.AREA_REP_ID;
occupy.GOODS_ID = mistock.GOODS_ID;
occupy.LOCATION_ID = mistock.LOCATION_ID;
occupy.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
occupy.PUTIN_ID = mistock.PUTIN_ID;
occupy.STOCK_ID = mistock.STOCK_ID;
occupy.STORAGE_ID = mistock.STORAGE_ID;
DataProvider.Instance.MIStockOccupy.InsertMIStockOccupy(occupy);
logList.Add(DataProvider.Instance.logData);
}
}
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// 将已完成的或已关闭的库区间调拨单与属于它的明细放到备份表中
/// </summary>
/// <param name="areaRepModel">库区间调拨单</param>
/// <returns>是否成功</returns>
public string MoveAreaRepAndTabIntoBack(AreaRepModel areaRepModel)
{
DataProvider.Instance.AreaRep.UpdateAreaRepState(areaRepModel);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
DataProvider.Instance.AreaRep.InsertAreaRepBack(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRepOut.InsertAreaRepOutBack(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRepIn.InsertAreaRepInBack(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRep.DeleteAreaRep(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
//获取原来的所有明细,减去原来的已占用库存
AreaRepOutModel tab = new AreaRepOutModel();
tab.AREA_REP_ID = areaRepModel.AREA_REP_ID;
DataTable table = DataProvider.Instance.AreaRepOut.GetAreaRepOutDT(tab);
List<AreaRepOutModel> list = ConvertHelper<AreaRepOutModel>.ConvertToList(table);
foreach (var item in list)
{
try
{
if (string.IsNullOrEmpty(item.PUTIN_ID)) {
continue;
}
if (string.IsNullOrEmpty(item.GOODS_ID))
{
continue;
}
if (string.IsNullOrEmpty(item.OUT_LOC_ID))
{
continue;
}
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = item.PUTIN_ID;
mi.GOODS_ID = item.GOODS_ID;
mi.LOCATION_ID = item.OUT_LOC_ID;
mi.OCCUPY_NUM = -item.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
//删除库存占用记录表相应记录
MIStockOccupyModel queryOccupy = new MIStockOccupyModel();
queryOccupy.GOODS_ID = mi.GOODS_ID;
queryOccupy.LOCATION_ID = mi.LOCATION_ID;
queryOccupy.PUTIN_ID = mi.PUTIN_ID;
List<MIStockOccupyModel> occupy = ConvertHelper<MIStockOccupyModel>.ConvertToList(DataProvider.Instance.MIStockOccupy.GetMIStockOccupyDT(queryOccupy));
DataProvider.Instance.MIStockOccupy.DeleteMIStockOccupy(occupy[0]);
logList.Add(DataProvider.Instance.logData);
}
catch (Exception)
{
}
}
DataProvider.Instance.AreaRepOut.DeleteAreaRepOut(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.AreaRepIn.DeleteAreaRepIn(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
//删除消息
DataProvider.Instance.Message.DeleteMessByRelativeNumber(areaRepModel.AREA_REP_ID);
logList.Add(DataProvider.Instance.logData);
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// 打印完成
/// </summary>
/// <param name="model">库区间调拨单</param>
/// <returns>是否成功</returns>
public string PrintOK(AreaRepModel model)
{
//修改拣货单打印次数
model.PRINT_COUNT += 1;
DataProvider.Instance.AreaRep.UpdateAreaRep(model);
logList.Add(DataProvider.Instance.logData);
Transaction = DataProvider.Instance.TranOracle;
//新增打印记录
PrintInfoModel printInfo = new PrintInfoModel();
printInfo.Order_id = model.AREA_REP_ID;
printInfo.PRINT_DATE = model.DOCUMENT_TIME;
printInfo.PRINT_PER = model.DOCUMENT_PERSON_ID;
printInfo.Print_per_name = model.DOCUMENT_PERSON;
printInfo.PRINT_TYPE = "5";
DataProvider.Instance.PrintInfo.UpdatePrintInfo(printInfo);
logList.Add(DataProvider.Instance.logData);
TaCmtOrRak();
return ErrText;
}
#region
#region
/// <summary>
/// 需要的商品、商品数量,用于判断商品是否充足、拣货
/// </summary>
private List<OrderDetailModel> listOrderGoods = new List<OrderDetailModel>();
/// <summary>
/// 发货仓库的所有库存
/// </summary>
private List<MIStockModel> listMIStock = new List<MIStockModel>();
/// <summary>
/// 有所需商品的库存->需要拣货的库存(某种商品的)
/// </summary>
private List<MIStockModel> listPackingMIStock = new List<MIStockModel>();
/// <summary>
/// 某商品在listPackingMIStock中的总数
/// </summary>
private decimal num = 0;
/// <summary>
/// 某商品在拣货后为空库位的库位中的总数
/// </summary>
private decimal numNew = 0;
/// <summary>
/// 生产日期 是否优先
/// </summary>
private bool byProduce = true;
/// <summary>
/// 上架日期 是否优先
/// </summary>
private bool byAdded = true;
/// <summary>
/// 捡空库位 是否优先
/// </summary>
private bool byNull = true;
#endregion
#region
/// <summary>
/// 通过生产日期筛选库存记录
/// </summary>
/// <returns>true:数量正好满足 无需再次筛选</returns>
private bool GetMiStockByProductDate()
{
List<MIStockModel> newMIStockList = new List<MIStockModel>();
//获取listPackingMIStock中的生产日期并从小到大排序
List<DateTime> dtList = new List<DateTime>();
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (!dtList.Exists(p => p == oldMIStock.PRODUCTION_DATE))
{
dtList.Add(oldMIStock.PRODUCTION_DATE);
}
}
dtList.Sort();
for (int i = 0; i < dtList.Count; i++)//遍历生产日期
{
//将与当前生产日期相同的库存记录
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (oldMIStock.PRODUCTION_DATE == dtList[i])
{
newMIStockList.Add(oldMIStock);
}
}
//检查当前记录的库存能否满足拣货需求,若满足:跳出循环
num = 0;
foreach (MIStockModel newMIStock in newMIStockList)
{
//foreach (OrderDetailModel item in listOrderGoods)
//{
// if (item.GOOD_ID == newMIStock.GOODS_ID)
// {
// num += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区该商品总数
// }
//}
if (listPackingMIStock[0].GOODS_ID == newMIStock.GOODS_ID)
{
num += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == newMIStockList[0].GOODS_ID)
{
if (num == item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return true;
}
else if (num > item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return false;
}
}
}
}
return false;
}
/// <summary>
/// 通过上架日期筛选库存记录
/// </summary>
/// <returns>true:数量正好满足 无需再次筛选</returns>
private bool GetMiStockByWaveDate()
{
List<MIStockModel> newMIStockList = new List<MIStockModel>();
//获取listPackingMIStock中的上架日期并从小到大排序
List<DateTime> dtList = new List<DateTime>();
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (!dtList.Exists(p => p == oldMIStock.WARE_DATE))
{
dtList.Add(oldMIStock.WARE_DATE);
}
}
dtList.Sort();
for (int i = 0; i < dtList.Count; i++)//遍历上架日期
{
//将与当前上架日期相同的库存记录
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (oldMIStock.WARE_DATE == dtList[i])
{
newMIStockList.Add(oldMIStock);
}
}
//检查当前记录的库存能否满足拣货需求,若满足:跳出循环
num = 0;
foreach (MIStockModel newMIStock in newMIStockList)
{
//foreach (OrderDetailModel item in listOrderGoods)
//{
// if (item.GOOD_ID == newMIStock.GOODS_ID)
// {
// num += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区该商品总数
// }
//}
if (listPackingMIStock[0].GOODS_ID == newMIStock.GOODS_ID)
{
num += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == newMIStockList[0].GOODS_ID)
{
if (num == item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return true;
}
else if (num > item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return false;
}
}
}
}
return false;
}
/// <summary>
/// 通过拣货后的已占用容积筛选库存记录
/// </summary>
/// <param name="newMIStockList">只存放所需商品的库位</param>
/// <returns>false数量不足</returns>
private bool GetMiStockByOnlyOne(ref List<MIStockModel> newMIStockList)
{
numNew = 0;
//获取listPackingMIStock中的所有库位
List<string> locList = new List<string>();
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (!locList.Exists(p => p == oldMIStock.LOCATION_ID))
{
locList.Add(oldMIStock.LOCATION_ID);
}
}
locList.Sort();
//遍历存在该商品的所有库位
for (int i = 0; i < locList.Count; i++)
{
if (listMIStock.FindAll(p => p.LOCATION_ID == locList[i]).Count > 1)
{
locList[i] = string.Empty;//所有不只存放该商品的库位移除
}
}
//记录只存放一种商品的库存
foreach (string i in locList)
{
if (i != string.Empty)
{
foreach (MIStockModel item in listPackingMIStock)
{
if (i == item.LOCATION_ID)
{
newMIStockList.Add(item);
}
}
}
}
if (newMIStockList.Count > 0)//只存放该商品的库存->拣货后已占用容积为0的库位
{
//检查当前记录的库存能否满足拣货需求
foreach (MIStockModel newMIStock in newMIStockList)
{
if (listPackingMIStock[0].GOODS_ID == newMIStock.GOODS_ID)
{
numNew += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区只有该商品的库位上该商品总数
}
}
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == newMIStockList[0].GOODS_ID)
{
if (numNew == item.GOODS_NUM || newMIStockList.Count == 1)
{
listPackingMIStock = newMIStockList;
return true;
}
else if (numNew > item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
newMIStockList = new List<MIStockModel>();
GetMiStockBySurplus(ref newMIStockList);
return true;
//newMIStockList.Sort((left, right) =>
//{
// if ((left.ABLE_NUM) > (right.ABLE_NUM))
// return -1;
// else if ((left.ABLE_NUM) == (right.ABLE_NUM))
// return 0;
// else
// return 1;
//});//排序 先移走库存最小的
//while ( (numNew - newMIStockList[newMIStockList.Count - 1].ABLE_NUM) > item.GOODS_NUM)//保证拣货库位不多余
//{
// if ((numNew - newMIStockList[newMIStockList.Count - 1].ABLE_NUM) < item.GOODS_NUM)//保证商品不少于
// {
// break;
// }
// numNew -= newMIStockList[newMIStockList.Count - 1].ABLE_NUM;
// newMIStockList.RemoveAt(newMIStockList.Count - 1);//移除最后一个
//}
//return true;
}
else
{
return false;
}
}
}
}
return false;
}
/// <summary>
/// 通过拣货后的剩余容积筛选库存记录
/// </summary>
/// <param name="newMIStockList">只存放所需商品的库位(必须拣货的库位)</param>
private void GetMiStockBySurplus(ref List<MIStockModel> newMIStockList)
{
//int needNum = 0;//还需要的数量
//foreach (OrderDetailModel item in listOrderGoods)
//{
// if (item.GOOD_ID == newMIStockList[0].GOODS_ID)
// {
// needNum = Convert.ToDecimal(item.GOODS_NUM) - numNew;
// }
//}
////通过商品ID得商品
//DataTable table = DataProvider.Instance.Goods.GetGoodsDataTable(newMIStockList[0].GOODS_ID,"","","");
//GoodsInfoModel goods = ConvertHelper<GoodsInfoModel>.ConvertToList(table)[0];
if (newMIStockList.Count > 0)
{
//遍历必须拣货的库位拣货后已占用容积为0的
foreach (MIStockModel newMIStock in newMIStockList)
{
listPackingMIStock.RemoveAll(p => p.LOCATION_ID == newMIStock.LOCATION_ID);//移除重复库位
}
}
//获取listPackingMIStock中的所有库位
List<string> locList = new List<string>();
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (!locList.Exists(p => p == oldMIStock.LOCATION_ID))
{
locList.Add(oldMIStock.LOCATION_ID);
}
}
//locList.Sort();
List<StorageAreaLocationModel> listLoc = new List<StorageAreaLocationModel>();
foreach (string locID in locList)
{
StorageAreaLocationModel loc = new StorageAreaLocationModel();
loc.STORAGE_ID = listPackingMIStock[0].STORAGE_ID;
loc.LOCATION_ID = locID;
DataTable table = DataProvider.Instance.StorageAreaLocation.GetLocationInfoDS(loc);
loc = ConvertHelper<StorageAreaLocationModel>.ConvertToList(table)[0];
loc.HASVOLUME = 0;
listLoc.Add(loc);
}
//算各个库位拣货后的已占用体积
foreach (StorageAreaLocationModel loc in listLoc)
{
foreach (MIStockModel miStock in listMIStock)
{
if (miStock.LOCATION_ID == loc.LOCATION_ID && miStock.GOODS_ID != listPackingMIStock[0].GOODS_ID)
{
DataTable table = DataProvider.Instance.Goods.GetGoodsDataTable(miStock.GOODS_ID, "", "", "");
GoodsInfoModel otherGoods = ConvertHelper<GoodsInfoModel>.ConvertToList(table)[0];
loc.HASVOLUME += otherGoods.GVOLUME;
}
}
}
//按剩余容积排序
listLoc.Sort((left, right) =>
{
if ((left.VOLUME - left.HASVOLUME) > (right.VOLUME - right.HASVOLUME))
return 1;
else if ((left.VOLUME - left.HASVOLUME) == (right.VOLUME - right.HASVOLUME))
return 0;
else
return -1;
});
for (int i = 0; i < listLoc.Count; i++)//遍历
{
//将与当前编号相同的库存记录
foreach (MIStockModel oldMIStock in listPackingMIStock)
{
if (oldMIStock.LOCATION_ID == listLoc[i].LOCATION_ID)
{
newMIStockList.Add(oldMIStock);
}
}
//检查当前记录的库存能否满足拣货需求,若满足:跳出循环
num = 0;
foreach (MIStockModel newMIStock in newMIStockList)
{
if (listPackingMIStock[0].GOODS_ID == newMIStock.GOODS_ID)
{
num += Convert.ToDecimal(newMIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == newMIStockList[0].GOODS_ID)
{
if (num == item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return;
}
else if (num > item.GOODS_NUM)
{
listPackingMIStock = newMIStockList;
return;
}
}
}
}
}
#endregion
/// <summary>
/// 通过出库库区、商品、商品数量获取出库库位明细
/// </summary>
/// <param name="areaRepModel"></param>
/// <param name="listOut"></param>
/// <param name="haveStrategy"></param>
/// <returns>是否成功/找不到策略的信息</returns>
public string GetAreaRepOutLoc(AreaRepModel areaRepModel, ref List<AreaRepOutModel> listOut)
{
List<AreaRepOutModel> tempOut = new List<AreaRepOutModel>();//存放计划数量为0的
tempOut = listOut.FindAll(p=>p.PLAN_COUNT == 0 || !string.IsNullOrEmpty(p.OUT_LOC_ID));
listOut.RemoveAll(p => p.PLAN_COUNT == 0 || !string.IsNullOrEmpty(p.OUT_LOC_ID));
#region
listOrderGoods = new List<OrderDetailModel>();
listMIStock = new List<MIStockModel>();
listPackingMIStock = new List<MIStockModel>();
num = 0;
numNew = 0;
byProduce = true;
byAdded = true;
byNull = true;
listPackingMIStock = new List<MIStockModel>();//有所需商品的库存->需要拣货的库存(某种商品的)
#endregion
#region
foreach (AreaRepOutModel orderTab in listOut)
{
//获取商品标准单位
DataTable dt = DataProvider.Instance.Goods.GetGoodsDataTable(orderTab.GOODS_ID, "", "", "");
List<GoodsInfoModel> list = null;
if (DataLogErrWrite(dt, "获取商品标准单位"))
{
list = ConvertHelper<GoodsInfoModel>.ConvertToList(dt);
}
else
{
return ErrText;
}
string standardUnit = list[0].UNIT;
//如果不是标准单位 转换
if (orderTab.UNIT != null && standardUnit != orderTab.UNIT)
{
//获取商品可选单位、转换率
DataTable unitTable = DataProvider.Instance.Goods.GetGoodsUnit(orderTab.GOODS_ID);
if (!DataLogErrWrite(unitTable, "获取商品可选单位、转换率"))
{
return ErrText;
}
//获取转换率
decimal convert = 0;
foreach (DataRow unitRow in unitTable.Rows)
{
if (unitRow[0].ToString() == orderTab.UNIT)
{
convert = decimal.Parse(unitRow[2].ToString());
break;
}
}
if (convert == 0)
{
ErrText += "单位转换率不能为0,请检查商品资料 ";
return ErrText;
}
//转成标准单位,数量一并改变
if (orderTab.PLAN_COUNT > 0)
{
orderTab.PLAN_COUNT = orderTab.PLAN_COUNT / convert;
}
if (orderTab.REAL_COUNT > 0)
{
orderTab.REAL_COUNT = orderTab.REAL_COUNT / convert;
}
if (orderTab.MISTOCK_NUM > 0)
{
orderTab.MISTOCK_NUM = orderTab.MISTOCK_NUM / convert;
}
orderTab.UNIT = standardUnit;
}
}
#endregion
#region
foreach (var item in listOut)
{
OrderDetailModel tab = new OrderDetailModel();
tab.GOOD_ID = item.GOODS_ID;
tab.GOODS_NUM = item.PLAN_COUNT;
tab.UNIT = item.UNIT;
listOrderGoods.Add(tab);
}
#endregion
#region
MIStockModel queryMIStock = new MIStockModel();
queryMIStock.STORAGE_ID = areaRepModel.STORAGE_ID;
DataTable tableMIStock = DataProvider.Instance.MIStock.GetMIStockDT(queryMIStock);
listMIStock = ConvertHelper<MIStockModel>.ConvertToList(tableMIStock);//发货仓库的所有库存
if (!DataLogErrWrite(tableMIStock, "获取发货仓库的所有库存"))
{
return ErrText;
}
listMIStock.RemoveAll(p => p.ABLE_NUM == 0);//移除所有数量为0的
#endregion
#region
DataTable downStrategy = DataProvider.Instance.DownStrategy.GetDownStrategyDTByStorage(areaRepModel.STORAGE_ID);
bool haveStrategy = false;
foreach (DataRow row in downStrategy.Rows)
{
if (areaRepModel.OUT_AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
haveStrategy = true;
foreach (MIStockModel MIStock in listMIStock)
{
if (MIStock.AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == MIStock.GOODS_ID)
{
item.AREA_NUM += Convert.ToDecimal(MIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
}
}
}
}
if (!haveStrategy)
{
//ErrText = "找不到下架策略 ";
return ErrText;
}
#endregion
#region
foreach (OrderDetailModel item in listOrderGoods)//遍历需要拣货的商品
{
//获取有所需商品的库存集合
listPackingMIStock = new List<MIStockModel>();
foreach (DataRow row in downStrategy.Rows)
{
if (areaRepModel.OUT_AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
foreach (MIStockModel MIStock in listMIStock)
{
if (MIStock.AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
if (item.GOOD_ID == MIStock.GOODS_ID)
{
listPackingMIStock.Add(MIStock);
}
}
}
if (row["PRODUCE_FLAG"].ToString() == "0")
{
byProduce = false;
}
else
{
byProduce = true;
}
if (row["ADDED_FLAG"].ToString() == "0")
{
byAdded = false;
}
else
{
byAdded = true;
}
if (row["NULL_FLAG"].ToString() == "0")
{
byNull = false;
}
else
{
byNull = true;
}
}
}
//通过生产日期对listGoodsMIStock筛选
if (byProduce && (GetMiStockByProductDate() || listPackingMIStock.Count == 1))//数量正好满足或只有1个库位可以满足
{
}
else
{
//通过上架日期对listGoodsMIStock筛选
if (byAdded && (GetMiStockByWaveDate() || listPackingMIStock.Count == 1))//数量正好满足或只有1个库位可以满足
{
}
else
{
List<MIStockModel> newMIList = new List<MIStockModel>();//拣货后已占用容积为0的所有库位只有这一种商品的库位
if (byNull && GetMiStockByOnlyOne(ref newMIList))
{
}
else//少
{
GetMiStockBySurplus(ref newMIList);//取拣货后剩余容积大的
}
}
}
List<AreaRepOutModel> tempOutList = new List<AreaRepOutModel>();
foreach (var outModel in listOut)
{
decimal tempCount = outModel.PLAN_COUNT;
List<MIStockModel> tempList = listPackingMIStock.FindAll(p => p.GOODS_ID == outModel.GOODS_ID);
if (tempList.Count == 0) {
continue;
}
//outModel.OUT_LOC_ID = tempList[0].LOCATION_ID;
//if (tempList.Count > 1)
//{
// outModel.PLAN_COUNT = tempList[0].ABLE_NUM;
for (int i = 0; i < tempList.Count; i++)
{
AreaRepOutModel tempOutModel = new AreaRepOutModel();
tempOutModel.AREA_REP_ID = outModel.AREA_REP_ID;
tempOutModel.GOODS_ID = outModel.GOODS_ID;
tempOutModel.GOODS_NAME = outModel.GOODS_NAME;
tempOutModel.MISTOCK_NUM = outModel.MISTOCK_NUM;
tempOutModel.PRICE = outModel.PRICE;
tempOutModel.REAL_COUNT = outModel.REAL_COUNT;
tempOutModel.SCALE_UNIT = outModel.SCALE_UNIT;
tempOutModel.SORT = outModel.SORT;
tempOutModel.TAB_OUT_ID = outModel.TAB_OUT_ID;
tempOutModel.UNIT = outModel.UNIT;
tempOutModel.UNIT_NAME = outModel.UNIT_NAME;
tempOutModel.OUT_LOC_ID = tempList[i].LOCATION_ID;
tempOutModel.LOC_NUM = tempList[i].ABLE_NUM;
tempOutModel.DOCCTNUMBER = tempList[i].DOCCTNUMBER;
tempOutModel.PUTIN_ID = tempList[i].PUTIN_ID;
tempOutModel.PRODUCTION_DATE = tempList[i].PRODUCTION_DATE;
tempOutModel.WARE_DATE = tempList[i].WARE_DATE;
tempOutModel.PROVIDER_ID = tempList[i].PROVIDER_ID;
if (tempList.Count - 1 == i)
{
tempOutModel.PLAN_COUNT = tempCount - tempOutList.FindAll(p => p.GOODS_ID == outModel.GOODS_ID).Sum(p => p.PLAN_COUNT);
}
else {
tempOutModel.PLAN_COUNT = tempList[i].ABLE_NUM;
}
tempOutList.Add(tempOutModel);
}
//}
}
listOut.AddRange(tempOutList);
//单位转换回去
}
#endregion
listOut.RemoveAll(p=>p.PLAN_COUNT > 0 && string.IsNullOrEmpty(p.OUT_LOC_ID));
////根据库位 商品 汇总
//List<AreaRepOutModel> newOutList = new List<AreaRepOutModel>();
//foreach (var item in listOut)
//{
// if (newOutList.Exists(p => p.OUT_LOC_ID == item.OUT_LOC_ID && p.GOODS_ID == item.GOODS_ID))
// {
// AreaRepOutModel tempOutModel = newOutList.Find(p => p.OUT_LOC_ID == item.OUT_LOC_ID && p.GOODS_ID == item.GOODS_ID);
// tempOutModel.PLAN_COUNT += item.PLAN_COUNT;
// tempOutModel.LOC_NUM += item.LOC_NUM;
// }
// else {
// newOutList.Add(item);
// }
//}
//listOut.Clear();
//listOut.AddRange(newOutList);
listOut.AddRange(tempOut);
listOut.OrderBy(p => p.GOODS_ID);
return ErrText;
}
/// <summary>
/// 通过库区名称得到库区ID仓库编号指定为发货仓库ID
/// </summary>
/// <param name="areaName"></param>
/// <returns></returns>
private string getAreaID(string areaName)
{
StorageAreaModel queryArea = new StorageAreaModel();
queryArea.STORAGE_AREA_NAME = areaName;
queryArea.STORAGE_ID = storageID;
DataTable table = DataProvider.Instance.StorageArea.GetAreaInfoDS(queryArea, string.Empty);
string areaID = string.Empty;
if (table.Rows.Count == 0)
{
queryArea = new StorageAreaModel();
queryArea.STORAGE_ID = storageID;
table = DataProvider.Instance.StorageArea.GetAreaInfoDS(queryArea, string.Empty);
areaID = ConvertHelper<StorageAreaModel>.ConvertToList(table)[0].STORAGE_AREA_ID;
}
else
{
areaID = ConvertHelper<StorageAreaModel>.ConvertToList(table)[0].STORAGE_AREA_ID;
//if (DataLogErrWrite(table, "获取发货仓库拣货区库区编号"))
//{
//}
//else
//{
// return string.Empty;
//}
}
return areaID;
}
#endregion
private void getAreaGoodsType(ref List<AreaGoodsTypeModel> areaGoodsTypeList, string GOODS_TYPE_ID)
{
if (!string.IsNullOrEmpty(GOODS_TYPE_ID))
{
AreaGoodsTypeModel m = new AreaGoodsTypeModel();
m.GOODS_TYPE_ID = GOODS_TYPE_ID;
DataTable table2 = DataProvider.Instance.AreaGoodsType.GetAreaGoodsTypeDT(m);
areaGoodsTypeList = ConvertHelper<AreaGoodsTypeModel>.ConvertToList(table2);
if (areaGoodsTypeList == null || areaGoodsTypeList.Count == 0)
{
GoodsTypeModel goodsType = new GoodsTypeModel();
goodsType.GOODS_TYPE_ID = m.GOODS_TYPE_ID;
List<GoodsTypeModel> gtList = ConvertHelper<GoodsTypeModel>.ConvertToList(DataProvider.Instance.GoodsType.GetGoodsTypeDataTable(goodsType));
if (gtList != null && gtList.Count > 0 && !string.IsNullOrEmpty(gtList[0].PARENT_ID))
{
m.GOODS_TYPE_ID = gtList[0].PARENT_ID;
table2 = DataProvider.Instance.AreaGoodsType.GetAreaGoodsTypeDT(m);
areaGoodsTypeList = ConvertHelper<AreaGoodsTypeModel>.ConvertToList(table2);
if (areaGoodsTypeList == null || areaGoodsTypeList.Count == 0)
{
goodsType = new GoodsTypeModel();
goodsType.GOODS_TYPE_ID = m.GOODS_TYPE_ID;
gtList = ConvertHelper<GoodsTypeModel>.ConvertToList(DataProvider.Instance.GoodsType.GetGoodsTypeDataTable(goodsType));
if (gtList != null && gtList.Count > 0 && !string.IsNullOrEmpty(gtList[0].PARENT_ID))
{
m.GOODS_TYPE_ID = gtList[0].PARENT_ID;
table2 = DataProvider.Instance.AreaGoodsType.GetAreaGoodsTypeDT(m);
areaGoodsTypeList = ConvertHelper<AreaGoodsTypeModel>.ConvertToList(table2);
}
}
}
}
}
}
/// <summary>
/// 仓库编号
/// </summary>
string storageID;
/// <summary>
/// 线上订单占用库存
/// </summary>
/// <param name="province"></param>
/// <param name="city"></param>
/// <param name="district"></param>
/// <param name="id"></param>
/// <param name="listD"></param>
/// <returns></returns>
public string OccupyMIStock(string province, string city, string district,string id, Dictionary<string, decimal> listD)
{
StorageOrderModel storOrderModel = new StorageOrderModel();
storOrderModel.TOWN_ID = DataProvider.Instance.AddressArea.GetAddressArea(province, city, district).Rows[0][0].ToString();
DataTable table = DataProvider.Instance.StorageOrder.GetStorOrderDT(storOrderModel);
List<StorageOrderModel> storOrderList = ConvertHelper<StorageOrderModel>.ConvertToList(table);
if (storOrderList == null || storOrderList.Count == 0) { return "找不到配送仓库"; }
storageID = storOrderList[0].STORAGE_ID;
List<AreaRepOutModel> listOut = new List<AreaRepOutModel>();
foreach (var item in listD)
{
AreaRepOutModel areaRepOut = new AreaRepOutModel();
areaRepOut.GOODS_ID = item.Key;
areaRepOut.PLAN_COUNT = item.Value;
listOut.Add(areaRepOut);
}
List<AreaRepOutModel> tempOut = new List<AreaRepOutModel>();//存放计划数量为0的
tempOut = listOut.FindAll(p => p.PLAN_COUNT == 0 || !string.IsNullOrEmpty(p.OUT_LOC_ID));
listOut.RemoveAll(p => p.PLAN_COUNT == 0 || !string.IsNullOrEmpty(p.OUT_LOC_ID));
#region
listOrderGoods = new List<OrderDetailModel>();
listMIStock = new List<MIStockModel>();
listPackingMIStock = new List<MIStockModel>();
num = 0;
numNew = 0;
byProduce = true;
byAdded = true;
byNull = true;
listPackingMIStock = new List<MIStockModel>();//有所需商品的库存->需要拣货的库存(某种商品的)
#endregion
listPackingMIStock = new List<MIStockModel>();//有所需商品的库存->需要拣货的库存(某种商品的)
DataTable downStrategy = DataProvider.Instance.DownStrategy.GetDownStrategyDTByStorage(storageID);
StorageAreaModel tempArea = new StorageAreaModel();
tempArea.STORAGE_ID = storageID;
List<StorageAreaModel> listJianHuo = ConvertHelper<StorageAreaModel>.ConvertToList(DataProvider.Instance.StorageArea.GetAreaInfoDS(tempArea, "拣配区"));
List<StorageAreaModel> listShangJia = ConvertHelper<StorageAreaModel>.ConvertToList(DataProvider.Instance.StorageArea.GetAreaInfoDS(tempArea, "整箱区"));
foreach (DataRow row in downStrategy.Rows)
{
if (!listJianHuo.Exists(p => p.STORAGE_AREA_ID == row["STORAGE_AREA_ID"].ToString()))
{
row["STORAGE_AREA_ID"] = string.Empty;
}
}
#region
foreach (var item in listOut)
{
OrderDetailModel tab = new OrderDetailModel();
tab.GOOD_ID = item.GOODS_ID;
tab.GOODS_NUM = item.PLAN_COUNT;
tab.UNIT = item.UNIT;
listOrderGoods.Add(tab);
}
#endregion
#region
MIStockModel queryMIStock = new MIStockModel();
queryMIStock.STORAGE_ID = storageID;
DataTable tableMIStock = DataProvider.Instance.MIStock.GetMIStockDT(queryMIStock);
listMIStock = ConvertHelper<MIStockModel>.ConvertToList(tableMIStock);//发货仓库的所有库存
if (!DataLogErrWrite(tableMIStock, "获取发货仓库的所有库存"))
{
return ErrText;
}
listMIStock.RemoveAll(p => p.ABLE_NUM == 0);//移除所有数量为0的
#endregion
#region
int te = 0;
List<MIStockModel> areaList = new List<MIStockModel>();
foreach (DataRow row in downStrategy.Rows)
{
if (row["STORAGE_AREA_ID"].ToString() == string.Empty)
{
continue;
}
te++;
}
if (te == 0)
{
foreach (var item in listOrderGoods)
{
string areaID = string.Empty;
List<AreaGoodsTypeModel> areaGoodsTypeList = new List<AreaGoodsTypeModel>();
getAreaGoodsType(ref areaGoodsTypeList, item.GOODS_TYPE_ID);
if (areaGoodsTypeList != null && areaGoodsTypeList.Count > 0)
{
foreach (var jh in listJianHuo)
{
if (areaGoodsTypeList.Exists(p => p.AREA_ID == jh.STORAGE_AREA_ID))
{
areaID = jh.STORAGE_AREA_ID;
break;
}
}
}
if (areaID == string.Empty)
{
areaID = getAreaID("拣配区");
}
MIStockModel m = new MIStockModel();
m.AREA_ID = areaID;
m.GOODS_ID = item.GOOD_ID;
areaList.Add(m);
}
foreach (var area in areaList)
{
foreach (MIStockModel MIStock in listMIStock)
{
if (area.GOODS_ID == MIStock.GOODS_ID && MIStock.AREA_ID == area.AREA_ID)
{
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == MIStock.GOODS_ID)
{
item.AREA_NUM += Convert.ToDecimal(MIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
}
}
}
//ErrText += "找不到该仓库的下架策略或该仓库的下架策略已被禁用 ";
//return ErrText;
}
else
{
foreach (DataRow row in downStrategy.Rows)
{
if (row["STORAGE_AREA_ID"].ToString() == string.Empty)
{
continue;
}
foreach (MIStockModel MIStock in listMIStock)
{
if (MIStock.AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.GOOD_ID == MIStock.GOODS_ID)
{
item.AREA_NUM += Convert.ToDecimal(MIStock.ABLE_NUM);//记录拣货区该商品总数
}
}
}
}
}
}
#endregion
//判断库存是否充足,如果不足调拨
bool have = true;
List<OrderDetailModel> listAddGoods = new List<OrderDetailModel>();
foreach (OrderDetailModel item in listOrderGoods)
{
if (item.AREA_NUM < item.GOODS_NUM)
{
have = false;
if (listAddGoods.Exists(p => p.GOOD_ID == item.GOOD_ID))
{
listAddGoods.Find(p => p.GOOD_ID == item.GOOD_ID).GOODS_NUM += (item.GOODS_NUM - item.AREA_NUM);
}
else
{
OrderDetailModel t = new OrderDetailModel();
t.GOOD_ID = item.GOOD_ID;
t.GOODS_NUM = (item.GOODS_NUM - item.AREA_NUM);
t.GOODS_TYPE_ID = item.GOODS_TYPE_ID;
if (t.GOODS_NUM <= 0)
{
break;
}
listAddGoods.Add(t);
}
}
}
if (!have) {
List<AreaRepModel> listAreaRep = new List<AreaRepModel>();
List<AreaRepInModel> listInGoods = new List<AreaRepInModel>();
List<AreaRepOutModel> listOutGoods = new List<AreaRepOutModel>();
Transaction = DataProvider.Instance.TranOracle;
foreach (OrderDetailModel item in listAddGoods)
{
#region
string inAreaID = string.Empty;
string outAreaID = string.Empty;
List<AreaGoodsTypeModel> areaGoodsTypeList = new List<AreaGoodsTypeModel>();
getAreaGoodsType(ref areaGoodsTypeList, item.GOODS_TYPE_ID);
if (areaGoodsTypeList != null && areaGoodsTypeList.Count > 0)
{
foreach (var jh in listJianHuo)
{
if (areaGoodsTypeList.Exists(p => p.AREA_ID == jh.STORAGE_AREA_ID))
{
inAreaID = jh.STORAGE_AREA_ID;
break;
}
}
foreach (var sj in listShangJia)
{
if (areaGoodsTypeList.Exists(p => p.AREA_ID == sj.STORAGE_AREA_ID))
{
outAreaID = sj.STORAGE_AREA_ID;
break;
}
}
}
if (inAreaID == string.Empty)
{
inAreaID = getAreaID("拣配区");
}
if (outAreaID == string.Empty)
{
outAreaID = getAreaID("整箱区");
}
AreaRepModel areaRepGoods;
if (!listAreaRep.Exists(p => p.IN_AREA_ID == inAreaID && p.OUT_AREA_ID == outAreaID))
{
areaRepGoods = new AreaRepModel();//商品调拨单
areaRepGoods.CREATE_METHOD = "0";
//areaRepGoods.CREATE_PERSON = listOrders[0].CREATE_MAN;
areaRepGoods.IN_AREA_ID = inAreaID;
areaRepGoods.OUT_AREA_ID = outAreaID;
areaRepGoods.STATE = "0";
areaRepGoods.STORAGE_ID = storageID;
areaRepGoods.REASON = "0";
areaRepGoods.TOTAL_PLAN_NUM = 0;//计划出库总数
areaRepGoods.AREA_REP_ID = DataProvider.Instance.AreaRep.InsertAreaRep(areaRepGoods);
logList.Add(DataProvider.Instance.logData);
listAreaRep.Add(areaRepGoods);
}
else
{
areaRepGoods = listAreaRep.Find(p => p.IN_AREA_ID == inAreaID && p.OUT_AREA_ID == outAreaID);
}
#endregion
AreaRepInModel inGoods = new AreaRepInModel();
inGoods.GOODS_ID = item.GOOD_ID;
inGoods.AREA_REP_ID = areaRepGoods.AREA_REP_ID;
//上架区商品数
inGoods.MISTOCK_NUM = 0;
foreach (MIStockModel MIStock in listMIStock)
{
if (MIStock.AREA_ID == outAreaID)
{
if (inGoods.GOODS_ID == MIStock.GOODS_ID)
{
inGoods.MISTOCK_NUM += Convert.ToDecimal(MIStock.ABLE_NUM);
}
}
}
inGoods.PLAN_COUNT = item.GOODS_NUM;// num + repGoodsNum;////////////////////////////////???????????????????????????????
listInGoods.Add(inGoods);
AreaRepOutModel outGoods = new AreaRepOutModel();
outGoods.AREA_REP_ID = areaRepGoods.AREA_REP_ID;
outGoods.GOODS_ID = item.GOOD_ID;
outGoods.MISTOCK_NUM = inGoods.MISTOCK_NUM;
outGoods.PLAN_COUNT = inGoods.PLAN_COUNT;
listOutGoods.Add(outGoods);
//areaRepGoods.TOTAL_PLAN_NUM += inGoods.PLAN_COUNT;
//decimal nu = item.AREA_NUM - Convert.ToDecimal(item.GOODS_NUM);
//if (nu < addGoodsNum)//调拨商品
//{
// AreaRepInModel inGoods = new AreaRepInModel();
// inGoods.GOODS_ID = item.GOOD_ID;
// //上架区商品数
// inGoods.MISTOCK_NUM = 0;
// foreach (MIStockModel MIStock in listMIStock)
// {
// if (MIStock.AREA_NAME == "上架区")
// {
// if (inGoods.GOODS_ID == MIStock.GOODS_ID)
// {
// inGoods.MISTOCK_NUM += Convert.ToDecimal(MIStock.ABLE_NUM);
// }
// }
// }
// inGoods.PLAN_COUNT = 0;// num + repGoodsNum;
// listInGoods.Add(inGoods);
// AreaRepOutModel outGoods = new AreaRepOutModel();
// outGoods.GOODS_ID = item.GOOD_ID;
// outGoods.MISTOCK_NUM = inGoods.MISTOCK_NUM;
// outGoods.PLAN_COUNT = 0;// num + repGoodsNum;
// listOutGoods.Add(outGoods);
// areaRepGoods.TOTAL_PLAN_NUM += inGoods.PLAN_COUNT;
//}
}
foreach (var areaRepModel in listAreaRep)
{
List<AreaRepOutModel> listO = listOutGoods.FindAll(p => p.AREA_REP_ID == areaRepModel.AREA_REP_ID);
//ErrText += IBussFactory<BussAreaRep>.Instance().GetAreaRepOutLoc(areaRepModel, ref listO);
}
//增加明细
foreach (AreaRepOutModel areaRepOutModel in listOutGoods)
{
DataProvider.Instance.AreaRepOut.InsertAreaRepOut(areaRepOutModel);
logList.Add(DataProvider.Instance.logData);
////根据计划数修改已占用库存
//MIStockModel mi = new MIStockModel();
//mi.PUTIN_ID = areaRepOutModel.PUTIN_ID;
//mi.GOODS_ID = areaRepOutModel.GOODS_ID;
//mi.LOCATION_ID = areaRepOutModel.OUT_LOC_ID;
//mi.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
//DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
//logList.Add(DataProvider.Instance.logData);
////写入库存占用记录表
//MIStockModel mistock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(mi))[0];
//MIStockOccupyModel occupy = new MIStockOccupyModel();
//occupy.AREA_ID = mistock.AREA_ID;
//occupy.DOCCTNUMBER = areaRepOutModel.AREA_REP_ID;
//occupy.GOODS_ID = mistock.GOODS_ID;
//occupy.LOCATION_ID = mistock.LOCATION_ID;
//occupy.OCCUPY_NUM = areaRepOutModel.PLAN_COUNT;
//occupy.PUTIN_ID = mistock.PUTIN_ID;
//occupy.STOCK_ID = mistock.STOCK_ID;
//occupy.STORAGE_ID = mistock.STORAGE_ID;
//DataProvider.Instance.MIStockOccupy.InsertMIStockOccupy(occupy);
//logList.Add(DataProvider.Instance.logData);
listAreaRep.Find(p => p.AREA_REP_ID == areaRepOutModel.AREA_REP_ID).TOTAL_PLAN_NUM += areaRepOutModel.PLAN_COUNT;
}
foreach (AreaRepInModel areaRepInModel in listInGoods)
{
DataProvider.Instance.AreaRepIn.InsertAreaRepIn(areaRepInModel);
logList.Add(DataProvider.Instance.logData);
}
foreach (var item in listAreaRep)//修改计划总数
{
DataProvider.Instance.AreaRep.UpdateAreaRep(item);
logList.Add(DataProvider.Instance.logData);
}
TaCmtOrRak();//提交事务
return "库存不足";
}
#region
foreach (OrderDetailModel item in listOrderGoods)//遍历需要拣货的商品
{
//获取有所需商品的库存集合
listPackingMIStock = new List<MIStockModel>();
if (te == 0) {
foreach (var area in areaList)
{
foreach (MIStockModel MIStock in listMIStock)
{
if (area.GOODS_ID == MIStock.GOODS_ID && MIStock.AREA_ID == area.AREA_ID)
{
foreach (OrderDetailModel ite in listOrderGoods)
{
if (ite.GOOD_ID == MIStock.GOODS_ID)
{
listPackingMIStock.Add(MIStock);
}
}
}
}
}
}
else
{
foreach (DataRow row in downStrategy.Rows)
{
if (row["STORAGE_AREA_ID"].ToString() == string.Empty)
{
continue;
}
foreach (MIStockModel MIStock in listMIStock)
{
if (MIStock.AREA_ID == row["STORAGE_AREA_ID"].ToString())
{
if (item.GOOD_ID == MIStock.GOODS_ID)
{
listPackingMIStock.Add(MIStock);
}
}
}
if (row["PRODUCE_FLAG"].ToString() == "0")
{
byProduce = false;
}
else
{
byProduce = true;
}
if (row["ADDED_FLAG"].ToString() == "0")
{
byAdded = false;
}
else
{
byAdded = true;
}
if (row["NULL_FLAG"].ToString() == "0")
{
byNull = false;
}
else
{
byNull = true;
}
}
}
//通过生产日期对listGoodsMIStock筛选
if (byProduce && (GetMiStockByProductDate() || listPackingMIStock.Count == 1))//数量正好满足或只有1个库位可以满足
{
}
else
{
//通过上架日期对listGoodsMIStock筛选
if (byAdded && (GetMiStockByWaveDate() || listPackingMIStock.Count == 1))//数量正好满足或只有1个库位可以满足
{
}
else
{
List<MIStockModel> newMIList = new List<MIStockModel>();//拣货后已占用容积为0的所有库位只有这一种商品的库位
if (byNull && GetMiStockByOnlyOne(ref newMIList))
{
}
else//少
{
GetMiStockBySurplus(ref newMIList);//取拣货后剩余容积大的
}
}
}
List<AreaRepOutModel> tempOutList = new List<AreaRepOutModel>();
foreach (var outModel in listOut)
{
decimal tempCount = outModel.PLAN_COUNT;
List<MIStockModel> tempList = listPackingMIStock.FindAll(p => p.GOODS_ID == outModel.GOODS_ID);
if (tempList.Count == 0)
{
continue;
}
for (int i = 0; i < tempList.Count; i++)
{
AreaRepOutModel tempOutModel = new AreaRepOutModel();
tempOutModel.AREA_REP_ID = outModel.AREA_REP_ID;
tempOutModel.GOODS_ID = outModel.GOODS_ID;
tempOutModel.GOODS_NAME = outModel.GOODS_NAME;
tempOutModel.MISTOCK_NUM = outModel.MISTOCK_NUM;
tempOutModel.PRICE = outModel.PRICE;
tempOutModel.REAL_COUNT = outModel.REAL_COUNT;
tempOutModel.SCALE_UNIT = outModel.SCALE_UNIT;
tempOutModel.SORT = outModel.SORT;
tempOutModel.TAB_OUT_ID = outModel.TAB_OUT_ID;
tempOutModel.UNIT = outModel.UNIT;
tempOutModel.UNIT_NAME = outModel.UNIT_NAME;
tempOutModel.OUT_LOC_ID = tempList[i].LOCATION_ID;
tempOutModel.LOC_NUM = tempList[i].ABLE_NUM;
tempOutModel.DOCCTNUMBER = tempList[i].DOCCTNUMBER;
tempOutModel.PUTIN_ID = tempList[i].PUTIN_ID;
tempOutModel.PRODUCTION_DATE = tempList[i].PRODUCTION_DATE;
tempOutModel.WARE_DATE = tempList[i].WARE_DATE;
tempOutModel.PROVIDER_ID = tempList[i].PROVIDER_ID;
if (tempList.Count - 1 == i)
{
tempOutModel.PLAN_COUNT = tempCount - tempOutList.FindAll(p => p.GOODS_ID == outModel.GOODS_ID).Sum(p => p.PLAN_COUNT);
}
else
{
tempOutModel.PLAN_COUNT = tempList[i].ABLE_NUM;
}
tempOutList.Add(tempOutModel);
}
//}
}
listOut.AddRange(tempOutList);
}
#endregion
listOut.RemoveAll(p => p.PLAN_COUNT > 0 && string.IsNullOrEmpty(p.OUT_LOC_ID));
listOut.AddRange(tempOut);
Transaction = DataProvider.Instance.TranOracle;
//减库存
foreach (var i in listOut)
{
//查询数据库里面有没有该商品,如果没有则插入该商品(商品编号,商品名称)
foreach (var or_de_Model in listOut)
{
if (DataProvider.Instance.Goods.GetGoodsDataTable(or_de_Model.GOODS_ID, or_de_Model.GOODS_NAME, "", "").Rows.Count <= 0)
{
GoodsInfoModel goods = new GoodsInfoModel();
goods.GOODS_ID = or_de_Model.GOODS_ID;
goods.GOODS_NAME = or_de_Model.GOODS_NAME;
//DataProvider.Instance.Goods.AddGoodsInfo(goods);
}
}
//根据计划数修改已占用库存
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = i.PUTIN_ID;
mi.GOODS_ID = i.GOODS_ID;
mi.LOCATION_ID = i.OUT_LOC_ID;
mi.OCCUPY_NUM = i.PLAN_COUNT;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
//写入库存占用记录表
MIStockModel mistock = ConvertHelper<MIStockModel>.ConvertToList(DataProvider.Instance.MIStock.GetMIStockDT(mi))[0];
MIStockOccupyModel occupy = new MIStockOccupyModel();
occupy.AREA_ID = mistock.AREA_ID;
occupy.DOCCTNUMBER = id;
occupy.GOODS_ID = mistock.GOODS_ID;
occupy.LOCATION_ID = mistock.LOCATION_ID;
occupy.OCCUPY_NUM = i.PLAN_COUNT;
occupy.PUTIN_ID = mistock.PUTIN_ID;
occupy.STOCK_ID = mistock.STOCK_ID;
occupy.STORAGE_ID = mistock.STORAGE_ID;
DataProvider.Instance.MIStockOccupy.InsertMIStockOccupy(occupy);
logList.Add(DataProvider.Instance.logData);
}
TaCmtOrRak();
return ErrText;
}
/// <summary>
/// ERP线上订单取消库存占用
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string CancelOccupyMIStock(string id) {
MIStockOccupyModel queryOccupy = new MIStockOccupyModel();
queryOccupy.DOCCTNUMBER = id;
List<MIStockOccupyModel> occupy = ConvertHelper<MIStockOccupyModel>.ConvertToList(DataProvider.Instance.MIStockOccupy.GetMIStockOccupyDT(queryOccupy));
Transaction = DataProvider.Instance.TranOracle;
foreach (var i in occupy)
{
MIStockModel mi = new MIStockModel();
mi.PUTIN_ID = i.PUTIN_ID;
mi.GOODS_ID = i.GOODS_ID;
mi.LOCATION_ID = i.LOCATION_ID;
mi.AREA_ID = i.AREA_ID;
mi.STOCK_ID = i.STOCK_ID;
mi.STORAGE_ID = i.STORAGE_ID;
mi.OCCUPY_NUM = -i.OCCUPY_NUM;
DataProvider.Instance.MIStock.UpdateMIStockOccupyNum(mi);
logList.Add(DataProvider.Instance.logData);
DataProvider.Instance.MIStockOccupy.DeleteMIStockOccupy(i);
logList.Add(DataProvider.Instance.logData);
}
TaCmtOrRak();
return ErrText;
}
}
}