2248 lines
88 KiB
C#
2248 lines
88 KiB
C#
|
|
|||
|
/// <summary>
|
|||
|
///LOGIC CLASS FOR TABLE t_wmsOutRequest
|
|||
|
///By wm with codesmith.
|
|||
|
///on 05/18/2017
|
|||
|
/// </summary>
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using DeiNiu.wms.Data.Model;
|
|||
|
using System.Data;
|
|||
|
using System.Transactions;
|
|||
|
using DeiNiu.Utils;
|
|||
|
using System.Threading;
|
|||
|
using System.ServiceModel;
|
|||
|
|
|||
|
namespace DeiNiu.wms.Logical
|
|||
|
{
|
|||
|
[Serializable]
|
|||
|
public class lWmsOutRequest :lbase
|
|||
|
{
|
|||
|
WmsOutRequest _obj;
|
|||
|
WmsOutPickRequest _pickRequestObj;
|
|||
|
WmsOutPick _wop;
|
|||
|
WmsOutDetail _wod;
|
|||
|
|
|||
|
Erp_sale _esale;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public lWmsOutRequest(int operId):base(operId)
|
|||
|
{
|
|||
|
initialize();
|
|||
|
}
|
|||
|
public lWmsOutRequest()
|
|||
|
{
|
|||
|
initialize();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public Erp_sale esale
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_esale == null)
|
|||
|
{
|
|||
|
_esale = new Erp_sale();
|
|||
|
_esale.operater = operId;
|
|||
|
}
|
|||
|
return _esale;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public WmsOutPickRequest pickRequestObj
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_pickRequestObj == null)
|
|||
|
{
|
|||
|
_pickRequestObj = new WmsOutPickRequest();
|
|||
|
_pickRequestObj.operater = operId;
|
|||
|
}
|
|||
|
return _pickRequestObj;
|
|||
|
}
|
|||
|
}
|
|||
|
public WmsOutRequest outRequest
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_obj == null)
|
|||
|
{
|
|||
|
_obj = new WmsOutRequest();
|
|||
|
_obj.operater = operId;
|
|||
|
}
|
|||
|
return _obj;
|
|||
|
}
|
|||
|
}
|
|||
|
public WmsOutDetail outDetail
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_wod == null)
|
|||
|
{
|
|||
|
_wod = new WmsOutDetail();
|
|||
|
_wod.operater = operId;
|
|||
|
}
|
|||
|
return _wod;
|
|||
|
}
|
|||
|
}
|
|||
|
public WmsOutPick wop
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_wop == null)
|
|||
|
{
|
|||
|
_wop = new WmsOutPick();
|
|||
|
_wop.operater = operId;
|
|||
|
}
|
|||
|
return _wop;
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// get all data
|
|||
|
/// </summary>
|
|||
|
public DataSet getAllData()
|
|||
|
{
|
|||
|
return outRequest.Query();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// get all data
|
|||
|
/// </summary>
|
|||
|
public DataSet getAllActiveData()
|
|||
|
{
|
|||
|
return outRequest.QueryActived();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// get a record by id
|
|||
|
/// </summary>
|
|||
|
public void initialize(int id)
|
|||
|
{
|
|||
|
_obj = id != 0 ? new WmsOutRequest(id) : new WmsOutRequest();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// get a record by id 0
|
|||
|
/// </summary>
|
|||
|
public void initialize()
|
|||
|
{
|
|||
|
initialize(0);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// get a record by id
|
|||
|
/// </summary>
|
|||
|
public void initialize(DataRow dr)
|
|||
|
{
|
|||
|
_obj = new WmsOutRequest(dr);
|
|||
|
}
|
|||
|
|
|||
|
protected override DeiNiu.Data.BaseObject.BaseModel getModel()
|
|||
|
{
|
|||
|
return outRequest;
|
|||
|
}
|
|||
|
|
|||
|
//begin cust db operation, query, excute sql etc.
|
|||
|
|
|||
|
|
|||
|
private bool valid()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
static bool isSyncing =false;
|
|||
|
/// <summary>
|
|||
|
/// get in_stock requests in a transaction scope
|
|||
|
/// </summary>
|
|||
|
|
|||
|
internal void syncOrders()
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest),"start sync request....." );
|
|||
|
if (isSyncing)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
isSyncing = true;
|
|||
|
|
|||
|
// DataTable dt = null ;
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// dt = getWmsOutRequest.getNewOrders().Tables[0];
|
|||
|
|
|||
|
enumOutStockRequestStatus wmsStatus = enumOutStockRequestStatus.待审核;
|
|||
|
|
|||
|
if (WmsConstants.AUTO_APPROVE_SALE_ORDER)
|
|||
|
{
|
|||
|
wmsStatus = enumOutStockRequestStatus.准备分拣;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// esale.prepareSaleInTmpData(); //erp_wms 记录 临时数据
|
|||
|
//to get available out orders for wms
|
|||
|
outRequest.prepareSaleInTmpData(); // wms 记录 临时数据
|
|||
|
|
|||
|
// DataTable dt = outRequest.getNewOrders();
|
|||
|
|
|||
|
|
|||
|
// fixErpSaleDetailSkuId();
|
|||
|
|
|||
|
outRequest.syncOutRequest();
|
|||
|
|
|||
|
DataTable dtLastSync = outRequest.getLastSyncOrders(); //取本次同步的订单数据
|
|||
|
|
|||
|
WmsOutRequest wor;
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
foreach (DataRow dr in dtLastSync.Rows)
|
|||
|
{
|
|||
|
wor = new WmsOutRequest(dr);
|
|||
|
es = new Erp_sale(wor.orderNo);
|
|||
|
es.updateWhType(wor.orderNo, (int)getWhType((int)getOutStoreType(wor.orderType)), wmsStatus); //更新接口数据wms_state
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (dtLastSync.Rows.Count > 0) //记录接口数据同步时间戳
|
|||
|
{
|
|||
|
WmsSyncLog log = new WmsSyncLog();
|
|||
|
log.lastOrderNo = dtLastSync.Rows[0]["orderNo"].ToString();
|
|||
|
log.lastSyncTime = dtLastSync.Rows[0]["timeFromErp"].ToString();
|
|||
|
log.lastSyncTime = Convert.ToDateTime(dtLastSync.Rows[0]["timeFromErp"]).ToString("yyyy-MM-dd HH:mm:ss.fff"); ;
|
|||
|
// LogHelper.debug(this.GetType(), "last sync time is 1 " + dtLastSync.Rows[0]["timeFromErp"].ToString());
|
|||
|
// LogHelper.debug(this.GetType(), "last sync time is 2 " + log.lastSyncTime);
|
|||
|
log.type = 1;
|
|||
|
log.AddLog();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//根据wms 客户订单分拣类别属性,进行分拣通道分类
|
|||
|
outRequest.autoPickPrepare();
|
|||
|
|
|||
|
//自动核准普通客户订单,常规集单出货的客户(连锁分店)订单(非紧急单)单独控制
|
|||
|
|
|||
|
if (WmsConstants.AUTO_APPROVE_SALE_ORDER)
|
|||
|
{
|
|||
|
outRequest.autoApproveOutRequest(wmsStatus);
|
|||
|
|
|||
|
// outRequest.deleteBadData(); //TODO: check and find out how bad data in
|
|||
|
}
|
|||
|
// esale.syncSaleOrdersAfter(wmsStatus);
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
// return dt;
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
isSyncing = false;
|
|||
|
scope.Dispose();
|
|||
|
// return new DataTable() ;
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), e);
|
|||
|
throw new DeiNiu.Utils.DeiNiuException(e.Message );
|
|||
|
}
|
|||
|
}
|
|||
|
// return dt;
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "end sync request.....");
|
|||
|
isSyncing = false;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* erp 没有skuid的情况下,根据batch ,expired date,product data 取skuid
|
|||
|
*
|
|||
|
**/
|
|||
|
public void fixErpSaleDetailSkuId()
|
|||
|
{
|
|||
|
lLot llot =new lLot();
|
|||
|
DataTable dt = outRequest.getAvErpDetailNoSkuId();
|
|||
|
Erp_sale_d esd;
|
|||
|
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
esd = new Erp_sale_d(Convert.ToInt32(dr["id"].ToString()));
|
|||
|
String prd = Util.getShortDateString(esd.product_date.Trim());
|
|||
|
String vld = Util.getShortDateString(esd.save_date.Trim());
|
|||
|
|
|||
|
Dictionary<string,string> dicValue = new Dictionary<string,string>();
|
|||
|
|
|||
|
dicValue.Add(WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME, prd);
|
|||
|
dicValue.Add(WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME, vld);
|
|||
|
dicValue.Add(WmsConstants.SKU_RESEVRED_BATCH_ATTNAME,esd.batch.Trim());
|
|||
|
dicValue.Add(WmsConstants.SKU_RESEVRED_ENTI_ATTNAME , esd.entid);
|
|||
|
Dictionary<int, string> skuValue = new Dictionary<int, string>();
|
|||
|
skuValue =llot.getSKU(dicValue, esd.goods_id);
|
|||
|
foreach (int i in skuValue.Keys)
|
|||
|
{
|
|||
|
esd.skuId = i;
|
|||
|
esd.skuCode = skuValue[i];
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (esd.skuId > 0)
|
|||
|
{
|
|||
|
esd.Update();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public delegate void UpdateUI(int step);//声明一个更新主线程的委托
|
|||
|
public UpdateUI UpdateUIDelegate;
|
|||
|
|
|||
|
public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
|
|||
|
public AccomplishTask TaskCallBack;
|
|||
|
|
|||
|
|
|||
|
public static bool isProcessOutOrders = false;
|
|||
|
/// <summary>
|
|||
|
/// 出库单生成拣货单,完成出库定位
|
|||
|
/// </summary>
|
|||
|
/*
|
|||
|
public void preProcessOutOrders()
|
|||
|
{
|
|||
|
if (isProcessOutOrders)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "isProcessOutOrders is true, job running,return... ");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Thread threadPreProcess = new Thread(preProcessOutOrdersImp);
|
|||
|
threadPreProcess.IsBackground = true;
|
|||
|
threadPreProcess.Start();
|
|||
|
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void updateOutRequestState( string pickOrderNo)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " try updateOutRequestState " + pickOrderNo);
|
|||
|
enumOutStockRequestStatus rstateNew =
|
|||
|
string.IsNullOrEmpty(pickOrderNo) ? Utils.enumOutStockRequestStatus.准备分拣 //new state
|
|||
|
: Utils.enumOutStockRequestStatus.待定位;
|
|||
|
enumOutStockRequestStatus rstateOld =
|
|||
|
string.IsNullOrEmpty(pickOrderNo) ? enumOutStockRequestStatus.待定位 //old state
|
|||
|
: enumOutStockRequestStatus.准备分拣;
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), String.Format("rstateNew: {0}, rstateOld: {1}",rstateNew,rstateOld));
|
|||
|
DataTable dt = outRequest.getTemp();
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), String.Format("tmp rows cnt: {0} ", dt.Rows.Count));
|
|||
|
|
|||
|
int cnt= outRequest.updateTmpPickState( pickOrderNo, rstateNew, rstateOld);
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), String.Format("updateTmpPickState rows cnt: {0} ", cnt));
|
|||
|
|
|||
|
esale.updatePickStatus(pickOrderNo, rstateNew);
|
|||
|
|
|||
|
//----------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
enumOutStockRequestStatus rstate =
|
|||
|
string.IsNullOrEmpty(pickOrderNo) ? Utils.enumOutStockRequestStatus.准备分拣
|
|||
|
: Utils.enumOutStockRequestStatus.待定位;
|
|||
|
enumOutStockDetailStatus dstate =
|
|||
|
string.IsNullOrEmpty(pickOrderNo) ? enumOutStockDetailStatus.待处理
|
|||
|
: enumOutStockDetailStatus.等待分拣;
|
|||
|
|
|||
|
outDetail.updatePickState( dstate);
|
|||
|
|
|||
|
|
|||
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 预处理多个待出库订单
|
|||
|
/// 1.检查库存量是否够,不足则订单不能出库
|
|||
|
/// 2.检查零库库存量是否够,不够及时补货
|
|||
|
/// </summary>
|
|||
|
/// <param name="outRequests"></param>
|
|||
|
public void preProcessOutOrdersImp(enumOutStockRequestStatus status)
|
|||
|
{
|
|||
|
if (isProcessOutOrders)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " 销售订单正在处理中,稍后再试。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
// return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
isProcessOutOrders = true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (WmsConstants.AUTO_APPROVE_SALE_ORDER)
|
|||
|
{
|
|||
|
//开始同步下一批数据
|
|||
|
syncOrders();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Dictionary<string, decimal> bulkReps = getRepingCnt();//取今日未上架完成的补货商品明细
|
|||
|
Dictionary<string, decimal> bulkCountRequest = new Dictionary<string, decimal>();
|
|||
|
Dictionary<string, decimal> bulkRepRequest = new Dictionary<string, decimal>();
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "start create pick out request------> status :" + status);
|
|||
|
|
|||
|
// outRequest.preparePick(); // only impact on out detail with skuId.
|
|||
|
|
|||
|
|
|||
|
//根据客户合并出库单,生成拣货单,零货合并成整货的情况下,出整
|
|||
|
string lastCust = "";
|
|||
|
string lastCustAddress = "";
|
|||
|
string lastCustId = "";
|
|||
|
string lastSales = "";
|
|||
|
int lastOrderType =-1;
|
|||
|
int lastPriority = -1;
|
|||
|
bool isMerge = WmsConstants.OUT_REQUEST_MERGE;
|
|||
|
bool isProcessStock = WmsConstants.OUT_REQUEST_PROCESS_STOCK;
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " try QueryByStateForPick ---->");
|
|||
|
|
|||
|
DataTable dt = outRequest.QueryByStateForPick(status).Tables[0];
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " try QueryByStateForPick ----<end +" + dt.Rows.Count);
|
|||
|
int worCnt = 0;
|
|||
|
// string lastOrder = "";
|
|||
|
int maxOutRequestCnt =isMerge? WmsConstants.PAGER_SIZE/2:1;
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " request count " + dt.Rows.Count);
|
|||
|
int i = 0;
|
|||
|
LogHelper.debug(typeof(WmsOutRequest), " begin delete temp 1" );
|
|||
|
|
|||
|
DataView dv = dt.DefaultView;
|
|||
|
dv.Sort = " priority,customerId,orderType";
|
|||
|
outRequest.deleteTmp("");
|
|||
|
// for (int k = 0; k < dt.Rows.Count; k++)
|
|||
|
for (int k = 0; k < dv.Count; k++)
|
|||
|
{
|
|||
|
|
|||
|
DataRow dr = dv[k].Row;
|
|||
|
WmsOutRequest wor = new WmsOutRequest(dr);
|
|||
|
|
|||
|
if (!isMerge)
|
|||
|
{
|
|||
|
createPickorder((enumOutOrderType)lastOrderType, getOutStoreType(lastOrderType), bulkCountRequest);
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (string.IsNullOrEmpty(lastCustId))
|
|||
|
{
|
|||
|
lastCust = wor.customerName;// pd.customerId;
|
|||
|
lastCustAddress = wor.custAddress;
|
|||
|
lastCustId = wor.customerId;
|
|||
|
lastOrderType = wor.orderType;
|
|||
|
lastPriority = wor.priority;
|
|||
|
lastSales = wor.salesperson;
|
|||
|
}
|
|||
|
//同客户的订单准备合并成分拣单
|
|||
|
if (
|
|||
|
lastOrderType == wor.orderType && worCnt < maxOutRequestCnt && lastCustId == wor.customerId
|
|||
|
&& lastCust == wor.customerName && lastCustAddress.Equals(wor.custAddress)
|
|||
|
&& lastPriority == wor.priority && lastSales == wor.salesperson)
|
|||
|
{
|
|||
|
outRequest.insertTmp(wor.orderNo);
|
|||
|
if (!isStockLack(wor))
|
|||
|
{
|
|||
|
worCnt++;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else // new pk
|
|||
|
{
|
|||
|
|
|||
|
createPickorder((enumOutOrderType)lastOrderType, getOutStoreType(lastOrderType), bulkCountRequest);
|
|||
|
worCnt = 0;
|
|||
|
outRequest.insertTmp(wor.orderNo);
|
|||
|
if (!isStockLack(wor))
|
|||
|
{
|
|||
|
|
|||
|
lastCust = wor.customerName;// pd.customerId;
|
|||
|
lastCustAddress = wor.custAddress;
|
|||
|
lastCustId = wor.customerId;
|
|||
|
lastOrderType = wor.orderType;
|
|||
|
lastPriority = wor.priority;
|
|||
|
lastSales = wor.salesperson;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
createPickorder((enumOutOrderType)lastOrderType, getOutStoreType(lastOrderType), bulkCountRequest );
|
|||
|
|
|||
|
|
|||
|
List<WmsOutPickRequest> all;
|
|||
|
//scope.Complete();
|
|||
|
// }
|
|||
|
if (!isProcessStock)
|
|||
|
{
|
|||
|
isProcessOutOrders = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//比较零库库存
|
|||
|
foreach (string key in bulkCountRequest.Keys)
|
|||
|
{
|
|||
|
|
|||
|
string goodsId, skuId, batch;
|
|||
|
getKeyValueSplit(out goodsId, out skuId, out batch, key);
|
|||
|
decimal inProcessCnt = bulkReps.ContainsKey(key) ? bulkReps[key] : 0; //getRepingCnt(goodsId, batch);//正补货中的数量
|
|||
|
WmsGoods goods = new WmsGoods(goodsId, Convert.ToInt16(skuId), batch);// ObjectsFactory.getGoods(goodsId, Convert.ToInt16(skuId));//goodsCache[goodsId];//new WmsGoods(goodsId, batch);
|
|||
|
decimal cnt = bulkCountRequest[key] - goods.stockBulkCountOuting - goods.stockBulkAvCount - inProcessCnt;
|
|||
|
|
|||
|
if (skuId == "3724")
|
|||
|
LogHelper.debug(this.GetType(), string.Format("key {0},bulkCountRequest {1}, goods.stockBulkCountOuting {2} ,goods.stockBulkAvCount {3}, inProcessCnt {4}"
|
|||
|
, key, bulkCountRequest[key], goods.stockBulkCountOuting, goods.stockBulkAvCount, inProcessCnt));
|
|||
|
|
|||
|
if (goods.stockBatchAvCount > 0)
|
|||
|
if (cnt > 0 && goods.canRep(skuId))
|
|||
|
{ // 订单按商品,批号,和客户汇总后发现库存零货不足
|
|||
|
|
|||
|
bulkRepRequest[key] = cnt;
|
|||
|
// bulkCountRequest[key] = 0;
|
|||
|
if (skuId == "3724")
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " createGoodsRepOrder key: " + key + ",count " + cnt);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//生成补货单
|
|||
|
if (bulkRepRequest.Count > 0)
|
|||
|
{
|
|||
|
createGoodsRepOrder(bulkRepRequest);
|
|||
|
|
|||
|
}
|
|||
|
Dictionary<string, decimal> bulkRepRequestPlus = new Dictionary<string, decimal>();
|
|||
|
DataTable dtReplst = new WmsGoods().getRepLst();
|
|||
|
foreach (DataRow dr in dtReplst.Rows)
|
|||
|
{
|
|||
|
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
|||
|
string key = pd.goodsId.Trim() + WmsConstants.SPLIT + pd.skuId + WmsConstants.SPLIT + pd.batch;
|
|||
|
WmsGoods goods = new WmsGoods(pd.goodsId, pd.skuId, pd.batch);
|
|||
|
// LogHelper.debug(this.GetType(), string.Format("stockBatchAvCount {0} ", goods.stockBatchAvCount));
|
|||
|
if (goods.stockBatchAvCount > 0 && goods.canRep(pd.skuId + ""))
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), string.Format("goods.sumBulkOuting {0} ,goods.stockBulkAvCount{1} ", goods.sumBulkOuting(pd.skuId + ""), goods.stockBulkAvCount));
|
|||
|
if (goods.sumBulkOuting(pd.skuId + "") > goods.stockBulkAvCount)
|
|||
|
{
|
|||
|
if (!bulkRepRequest.ContainsKey(key))
|
|||
|
{
|
|||
|
|
|||
|
bulkRepRequestPlus.Add(key, pd.count);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (bulkRepRequestPlus.Count > 0)
|
|||
|
{
|
|||
|
createGoodsRepOrder(bulkRepRequestPlus);
|
|||
|
bulkRepRequestPlus.Clear();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// List<WmsOutPickRequest> prOld = pickRequestObj.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.等待分拣);
|
|||
|
// List<WmsOutPickRequest> pr4StockProcess = pickRequestObj.getRequestObjects(enumOutStoreType.拣货出库, enumOutStockRequestStatus.待定位);
|
|||
|
// List<WmsOutPickRequest> prRep = pickRequestObj.getRequestObjects(enumOutStoreType.补货出库, enumOutStockRequestStatus.待定位);
|
|||
|
// all = pr4StockProcess.Union(prRep).ToList<WmsOutPickRequest>();
|
|||
|
|
|||
|
all = pickRequestObj.getRequestObjects( enumOutStockRequestStatus.待定位);
|
|||
|
|
|||
|
// List<WmsOutPickRequest> all = prCache.Union(pr4StockProcess).Union(prRep).ToList<WmsOutPickRequest>(); //Union方法的返回结果中,重复元素仅保留一个
|
|||
|
|
|||
|
i = 2;
|
|||
|
WmsConstants.PREPICKING_ORDERS_CNT = all.Count;
|
|||
|
foreach (WmsOutPickRequest opr in all)
|
|||
|
{
|
|||
|
i++;
|
|||
|
|
|||
|
requestOutStock(opr);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
all = pickRequestObj.getRequestObjects(enumOutStockRequestStatus.等待补货);
|
|||
|
|
|||
|
// List<WmsOutPickRequest> all = prCache.Union(pr4StockProcess).Union(prRep).ToList<WmsOutPickRequest>(); //Union方法的返回结果中,重复元素仅保留一个
|
|||
|
|
|||
|
i = 2;
|
|||
|
WmsConstants.PREPICKING_ORDERS_CNT = all.Count;
|
|||
|
foreach (WmsOutPickRequest opr in all)
|
|||
|
{
|
|||
|
i++;
|
|||
|
|
|||
|
requestOutStock(opr);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
isProcessOutOrders = false;
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "end create pick out request------------------------------------------<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
|
|||
|
}
|
|||
|
|
|||
|
bool isStockLack(WmsOutRequest wor)
|
|||
|
{
|
|||
|
DataTable dtdiff = outRequest.getOverStock();
|
|||
|
if(wor.orderNo== "THKC202109058930042" || wor.orderNo == "THKC20210905WBH0032")
|
|||
|
{
|
|||
|
bool isHit = true;
|
|||
|
}
|
|||
|
|
|||
|
foreach (DataRow drx in dtdiff.Rows)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), "goods store lack detected: to insert... ");
|
|||
|
|
|||
|
WmsStockLack sl = new WmsStockLack(drx);
|
|||
|
|
|||
|
sl.getBySaleOrder(wor.orderNo, sl.goodsId, sl.skuId);
|
|||
|
if (sl.ID == 0)
|
|||
|
{
|
|||
|
sl.orderNo = wor.orderNo;
|
|||
|
sl.Add();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), "goods store lack detected: " + wor.orderNo + ", new id " + sl.ID);
|
|||
|
|
|||
|
updateDetailStockShortage(wor, sl.skuId, sl.lackCount);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return dtdiff.Rows.Count > 0;
|
|||
|
}
|
|||
|
|
|||
|
private void updateDetailStockShortage(WmsOutRequest wor, int skuId, decimal lackCount)
|
|||
|
{
|
|||
|
if (WmsConstants.OUT_STOCK_LACK_HOLD_ORDER)
|
|||
|
{
|
|||
|
wor.state = (int)enumOutStockRequestStatus.库存不足;
|
|||
|
wor.operater = this.operId;
|
|||
|
wor.Update();
|
|||
|
outRequest.updateDetailStockShortage(wor.orderNo, skuId, lackCount);
|
|||
|
LogHelper.debug(typeof(WmsOutRequest), " begin delete temp 2");
|
|||
|
outRequest.deleteTmp(wor.orderNo);
|
|||
|
}
|
|||
|
else
|
|||
|
{/* //在 outpickdetail处理
|
|||
|
wor.remark += "缺货:";
|
|||
|
foreach (WmsOutDetail wd in wor.outDetails)
|
|||
|
{
|
|||
|
if (lackCount <= 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
if (wd.skuId == skuId)
|
|||
|
{
|
|||
|
|
|||
|
if (wd.count > lackCount)
|
|||
|
{
|
|||
|
wd.count -= lackCount;
|
|||
|
wd.lackCount = lackCount;
|
|||
|
lackCount = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
lackCount -= wd.count;
|
|||
|
wd.lackCount= wd.count ;
|
|||
|
wd.count = 0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
wd.bulkCount = wd.count % wd.goods.bigCount;
|
|||
|
wd.batch1Count = wd.count - wd.bulkCount;
|
|||
|
wd.boxcnt = Convert.ToInt32( wd.batch1Count / wd.goods.bigCount);
|
|||
|
wd.Update();
|
|||
|
wor.remark += ";" + wd.skuId + " lack " + wd.lackCount;
|
|||
|
}
|
|||
|
|
|||
|
} * */
|
|||
|
wor.Update();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private enumOutStoreType getOutStoreType(int lastOrderType)
|
|||
|
{
|
|||
|
enumOutOrderType orderType = (enumOutOrderType)lastOrderType;
|
|||
|
switch (orderType)
|
|||
|
{
|
|||
|
case enumOutOrderType.销售出库:
|
|||
|
return enumOutStoreType.拣货出库;
|
|||
|
case enumOutOrderType.供应商退货:
|
|||
|
return enumOutStoreType.返厂出库;
|
|||
|
case enumOutOrderType.仓间调出:
|
|||
|
return enumOutStoreType.调拨出库;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return enumOutStoreType.拣货出库;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void createPickorder(enumOutOrderType orderType,enumOutStoreType outStoreType,
|
|||
|
Dictionary<string, decimal> bulkCountRequest )
|
|||
|
{
|
|||
|
DataTable outCust;
|
|||
|
WmsOutPickRequest pr = null;
|
|||
|
// WmsOutPickDetail pd = null;
|
|||
|
List<WmsOutPickDetail> pdCache = new List<WmsOutPickDetail>();
|
|||
|
// List<WmsOutPickRequest> prCache = new List<WmsOutPickRequest>();
|
|||
|
|
|||
|
outCust = outRequest.getNewRequestPickDetails().Tables[0];
|
|||
|
|
|||
|
int i = 0;
|
|||
|
foreach (DataRow dr1 in outCust.Rows)
|
|||
|
{
|
|||
|
i++;
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr1);
|
|||
|
|
|||
|
if (pr == null)
|
|||
|
{
|
|||
|
pr = new WmsOutPickRequest(dr1);
|
|||
|
pr.pickOrderNo = Util.getOrderNo(enumCreateOrderType.pickOrder, pr.getNextSeq(enumCreateOrderType.pickOrder));
|
|||
|
pr.orderType = (int)orderType;
|
|||
|
pr.orderTypeName = orderType.ToString();
|
|||
|
pr.outStoreType = (int)outStoreType;
|
|||
|
pr.bulkCnt = 0;
|
|||
|
pr.boxCnt = 0;
|
|||
|
pr.sumPrice = 0;
|
|||
|
// pr.operater = LoginInfo.UserId;
|
|||
|
|
|||
|
/*
|
|||
|
pr.customerId = pd.customerId;
|
|||
|
pr.customerName = pd.customerName;
|
|||
|
pr.custAddress = pd.custAddress;
|
|||
|
pr.salesperson = pd.salesperson;
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
pd.whtype = (int) getWhType((int)outStoreType);
|
|||
|
|
|||
|
pd.pickOrderNo = pr.pickOrderNo;
|
|||
|
pr.bulkCnt += pd.bulkCount; //pick request 总bulk cnt,作为拣选、复合工作量的指标
|
|||
|
pr.boxCnt += pd.boxcnt;
|
|||
|
pr.state = (int)enumOutStockRequestStatus.待定位;
|
|||
|
pr.sumPrice += pd.count * pd.price;
|
|||
|
if (WmsConstants.OUT_REQUEST_PROCESS_STOCK)
|
|||
|
{
|
|||
|
if (orderType == enumOutOrderType.销售出库)
|
|||
|
if (pd.bulkCount > 0 && pd.bulkCount > pd.goods.stockBulkAvCount /*pd.getGoodsStockCnt(enumWhLocVol.零库)*/)// pd.goods.stockBulkCount)
|
|||
|
{
|
|||
|
pd.description = "零库库存不足,等待补货";
|
|||
|
pr.state = (int)enumOutStockRequestStatus.等待补货;
|
|||
|
pd.state = (int)enumOutStockDetailStatus.等待补货;
|
|||
|
|
|||
|
pr.description = string.Format("{0} {1} 零库库存不足,等待补货 ", pd.goods.goodsName, pd.skuId);
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), pr.description);
|
|||
|
}
|
|||
|
}
|
|||
|
pd.operater = this.operId;
|
|||
|
|
|||
|
if (!WmsConstants.OUT_REQUEST_PROCESS_STOCK)
|
|||
|
{
|
|||
|
pd.bulkCount += pd.batch1Count + pd.batch2Count;
|
|||
|
pd.batch1Count = 0;
|
|||
|
pd.batch2Count =0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
pdCache.Add(pd);
|
|||
|
|
|||
|
|
|||
|
//calculate the total bulk for each goods
|
|||
|
if (pd.bulkCount > 0)
|
|||
|
{
|
|||
|
// string key = pd.goodsId.Trim() + WmsConstants.SPLIT + pd.batch.Trim();
|
|||
|
string key = pd.goodsId.Trim() + WmsConstants.SPLIT + pd.skuId + WmsConstants.SPLIT + pd.batch;
|
|||
|
if (bulkCountRequest.Keys.Contains(key))
|
|||
|
{
|
|||
|
bulkCountRequest[key] += pd.bulkCount;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bulkCountRequest[key] = pd.bulkCount;
|
|||
|
}
|
|||
|
// ObjectsFactory.putOutDetail(pd);
|
|||
|
// if (pd.skuId == 3724 )
|
|||
|
// LogHelper.debug(typeof(lWmsOutRequest), " pd.bulkCount: " + pd.bulkCount);
|
|||
|
|
|||
|
|
|||
|
if (pd.count == pd.bulkCount) //batch not exists
|
|||
|
{
|
|||
|
pd.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pd.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//create new pickorder
|
|||
|
if (pr != null)
|
|||
|
{
|
|||
|
pr.orderDate = pr.getDateTime();
|
|||
|
pr.operater = this.operId;
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
pr.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
// int jj = 0;
|
|||
|
updateOutRequestState(pr.pickOrderNo);
|
|||
|
|
|||
|
foreach (WmsOutPickDetail p in pdCache)
|
|||
|
{
|
|||
|
|
|||
|
if (p.batchPickState != (int)enumOutStockPickStatus.无需分拣)
|
|||
|
{
|
|||
|
pr.batchPickState = (int)enumOutStockPickStatus.待处理;
|
|||
|
}
|
|||
|
p.Add();
|
|||
|
pr.outDetails.Add(p);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
pr.Add();
|
|||
|
/*
|
|||
|
if (pr.state != (int)enumOutStockRequestStatus.等待补货)
|
|||
|
{
|
|||
|
prCache.Add(pr);
|
|||
|
}
|
|||
|
*/
|
|||
|
LogHelper.debug(typeof(WmsOutRequest), " begin delete temp 3");
|
|||
|
outRequest.deleteTmp("");
|
|||
|
|
|||
|
DataTable dt = outRequest.getRequestByPickOrder(pr.pickOrderNo);
|
|||
|
decimal fandian = 0m;
|
|||
|
int delivery = 0;
|
|||
|
WmsOutRequest wor = new WmsOutRequest();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
wor = new WmsOutRequest(dr);
|
|||
|
fandian += wor.fandian;
|
|||
|
delivery = wor.delivery;
|
|||
|
}
|
|||
|
|
|||
|
pr.fandian = fandian;
|
|||
|
pr.deliveryType = delivery;
|
|||
|
pr.Update();
|
|||
|
|
|||
|
scope1.Complete();
|
|||
|
//}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), er);
|
|||
|
// updateOutRequestState(lastCustId, lastCust, lastCustAddress, "");
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "error on creating pickoutrequest "+ pr.pickOrderNo);
|
|||
|
LogHelper.debug(typeof(WmsOutRequest), " begin delete temp 4");
|
|||
|
outRequest.deleteTmp("");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
pdCache.Clear();
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "pickrequest created " + pr.pickOrderNo);
|
|||
|
requestOutStock(pr.pickOrderNo);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private enumWhType getWhType(int outStoreType)
|
|||
|
{
|
|||
|
enumOutStoreType outType = (enumOutStoreType)outStoreType;
|
|||
|
|
|||
|
switch (outType)
|
|||
|
{
|
|||
|
case enumOutStoreType.报废出库:
|
|||
|
return enumWhType.报废库;
|
|||
|
|
|||
|
case enumOutStoreType.返厂出库:
|
|||
|
return enumWhType.返厂库;
|
|||
|
|
|||
|
default:
|
|||
|
return enumWhType.合格库;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private Dictionary<WmsOutPickRequest, List<WmsOutPickDetail>> handleErrorObjects(Dictionary<WmsOutPickRequest, List<WmsOutPickDetail>> errorObjects)
|
|||
|
{
|
|||
|
|
|||
|
if (errorObjects.Count == 0)
|
|||
|
{
|
|||
|
return errorObjects;
|
|||
|
}
|
|||
|
|
|||
|
List<WmsOutPickRequest> prCache = new List<WmsOutPickRequest>();
|
|||
|
foreach (WmsOutPickRequest pr1 in errorObjects.Keys)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
pr1.operater = this.operId;
|
|||
|
pr1.Add();
|
|||
|
|
|||
|
foreach (WmsOutPickDetail pd1 in errorObjects[pr1])
|
|||
|
{
|
|||
|
pd1.operater = this.operId;
|
|||
|
pd1.Add();
|
|||
|
}
|
|||
|
if (pr1.state != (int)enumOutStockRequestStatus.等待补货)
|
|||
|
{
|
|||
|
prCache.Add(pr1);
|
|||
|
}
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
//continue loop
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest),er);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
foreach (WmsOutPickRequest pr in prCache)
|
|||
|
{
|
|||
|
errorObjects.Remove(pr);
|
|||
|
}
|
|||
|
|
|||
|
return errorObjects;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void getKeyValueSplit(out string goodsId, out string skuId, out string skuCode,string key)
|
|||
|
{
|
|||
|
string[] tmp = key.Split(WmsConstants.SPLIT.ToCharArray());
|
|||
|
goodsId = tmp[0].ToString();
|
|||
|
skuId = tmp[3].ToString(); //TODO: 为什么分解成4条?
|
|||
|
skuCode = tmp[6].ToString(); //TODO: 为什么分解成4条?
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 批次生成零库补货单(整库出库单)
|
|||
|
/// 补货单捡完货出库完成后, 会生成零库入库单,然后开始补货入库流程
|
|||
|
/// </summary>
|
|||
|
/// <param name="requestRep"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool createGoodsRepOrder(Dictionary<string, decimal> requestRep)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " createGoodsRepOrder start ,detail count: " + requestRep.Count);
|
|||
|
|
|||
|
if (requestRep.Count == 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
WmsOutPickRequest repRequest = new WmsOutPickRequest();
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
repRequest.orderType = (int)enumOutOrderType.补货出库;
|
|||
|
repRequest.outStoreType = (int)enumOutStoreType.补货出库;
|
|||
|
repRequest.operater = this.operId;
|
|||
|
repRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.repOrderOut, repRequest.getNextSeq(enumCreateOrderType.repOrderOut));
|
|||
|
repRequest.orderTypeName = enumOutOrderType.补货出库.ToString();
|
|||
|
repRequest.orderDate = repRequest.getDateTime();// use database default date
|
|||
|
repRequest.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
repRequest.state = (int)enumOutStockRequestStatus.待定位;//(int)enumOutStockRequestStatus.正在分拣;// (int)enumOutStockRequestStatus.等待分拣;
|
|||
|
|
|||
|
//create request detail
|
|||
|
WmsOutPickDetail outd = new WmsOutPickDetail();
|
|||
|
WmsOutPickDetail cachedObj;
|
|||
|
bool kidborn = false;
|
|||
|
foreach (string key in requestRep.Keys)
|
|||
|
{
|
|||
|
string goodsId, skuId, skuCode;
|
|||
|
getKeyValueSplit(out goodsId, out skuId, out skuCode, key);
|
|||
|
// WmsOutPickDetail outd = new WmsOutPickDetail();
|
|||
|
cachedObj = new WmsOutPickDetail();// ObjectsFactory.getOutDetail(goodsId, Convert.ToInt16(skuId));
|
|||
|
WmsGoods goods = new WmsGoods(goodsId);
|
|||
|
DataTable dt = goods.getSkuValues(goods.lotId, Convert.ToInt16(skuId), WmsConstants.SKU_RESEVRED_BATCH_ATTNAME);
|
|||
|
string batch = "";
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
batch = dr["value"].ToString();
|
|||
|
break;
|
|||
|
}
|
|||
|
// Sku sku = new Sku(skuId);
|
|||
|
// outd.skuCode = sku.skuCode;
|
|||
|
outd.skuCode = skuCode;
|
|||
|
outd.pickOrderNo = repRequest.pickOrderNo;
|
|||
|
// outd.operater = repRequest.operater;
|
|||
|
outd.goodsId = goodsId;
|
|||
|
outd.batch = batch;
|
|||
|
outd.skuId = Convert.ToInt16(skuId);
|
|||
|
outd.productDate = cachedObj.productDate;
|
|||
|
outd.validDate = cachedObj.validDate;
|
|||
|
decimal cnt = requestRep[key];
|
|||
|
outd.count = cnt;
|
|||
|
//if (cachedObj.goods.bigCount != 0)
|
|||
|
if (goods.bigCount != 0)
|
|||
|
{
|
|||
|
int boxcnt = (int)Math.Ceiling(cnt / goods.bigCount);
|
|||
|
cnt = boxcnt * goods.bigCount; //取整箱
|
|||
|
outd.count = cnt;
|
|||
|
outd.boxcnt = boxcnt;
|
|||
|
}
|
|||
|
outd.batch1Count = cnt;
|
|||
|
outd.whtype = cachedObj.whtype;
|
|||
|
outd.operater = this.operId;
|
|||
|
outd.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
outd.Add();
|
|||
|
kidborn = true;
|
|||
|
}
|
|||
|
if (kidborn)
|
|||
|
{
|
|||
|
repRequest.Add();
|
|||
|
scope.Complete();
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " start process stock for rep request " +repRequest.pickOrderNo);
|
|||
|
return requestOutStock(repRequest);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
scope.Dispose();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public bool createGoodsRepOrder(WmsGoods goods, int skuId,string skuCode, decimal count)
|
|||
|
{
|
|||
|
if (count <= 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
Dictionary<string, decimal> requestRep = new Dictionary<string, decimal>();
|
|||
|
requestRep[goods.goodsId + WmsConstants.SPLIT + skuId + WmsConstants.SPLIT + skuCode] = count;
|
|||
|
return createGoodsRepOrder(requestRep);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public bool createGoodsRepOrder(string[] goodsRep)
|
|||
|
{
|
|||
|
WmsOutPickRequest repRequest = new WmsOutPickRequest();
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
repRequest.orderType = (int)enumOutOrderType.补货出库;
|
|||
|
repRequest.outStoreType = (int)enumOutStoreType.补货出库;
|
|||
|
repRequest.operater = this.operId;
|
|||
|
repRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.repOrderOut, repRequest.getNextSeq(enumCreateOrderType.repOrderOut));
|
|||
|
repRequest.orderTypeName = enumOutStoreType.补货出库.ToString();
|
|||
|
repRequest.orderDate = repRequest.getDateTime();// use database default date
|
|||
|
repRequest.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
repRequest.state = (int)enumOutStockRequestStatus.待定位;// (int)enumOutStockRequestStatus.正在分拣;// (int)enumOutStockRequestStatus.等待分拣;
|
|||
|
repRequest.priority =(int) enumPickPriority.加急;//高优先级别
|
|||
|
//create request detail
|
|||
|
WmsOutPickDetail outd = new WmsOutPickDetail();
|
|||
|
int i = 0;
|
|||
|
foreach (string str in goodsRep)
|
|||
|
{
|
|||
|
|
|||
|
string[] tmp = str.Split(WmsConstants.SPLIT.ToCharArray());
|
|||
|
string goodsId = tmp[0].ToString();
|
|||
|
string batch = tmp[3].ToString();
|
|||
|
string prdDate = tmp[9].ToString();
|
|||
|
string validDate = tmp[12].ToString();
|
|||
|
decimal repCnt =Convert.ToDecimal( tmp[6].ToString());
|
|||
|
int skuId = Convert.ToInt16( tmp[15].ToString());
|
|||
|
string skuCode = tmp[18].ToString();
|
|||
|
|
|||
|
WmsGoods goods = new WmsGoods(goodsId,skuId,batch);
|
|||
|
|
|||
|
if (goods.stockBatch3Count +goods.stockBatch2Count+ goods.stockBatch1Count < repCnt)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
// WmsOutPickDetail outd = new WmsOutPickDetail();
|
|||
|
|
|||
|
outd.pickOrderNo = repRequest.pickOrderNo;
|
|||
|
// outd.operater = repRequest.operater;
|
|||
|
outd.goodsId = goodsId;
|
|||
|
outd.batch = batch;
|
|||
|
outd.skuCode = skuCode;
|
|||
|
outd.skuId = skuId;
|
|||
|
outd.productDate = prdDate;
|
|||
|
outd.validDate = validDate;
|
|||
|
decimal cnt = repCnt ;
|
|||
|
if (cnt < goods.bigCount)
|
|||
|
{
|
|||
|
cnt = goods.bigCount;
|
|||
|
}
|
|||
|
outd.count = cnt;
|
|||
|
outd.state = (int)enumOutStockDetailStatus.等待补货;
|
|||
|
outd.batch1Count = cnt;
|
|||
|
outd.whtype =(int) enumWhType.合格库 ;
|
|||
|
outd.operater = this.operId;
|
|||
|
outd.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
outd.Add();
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
if (i > 0)
|
|||
|
{
|
|||
|
repRequest.Add();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
scope.Dispose();
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
|
|||
|
return requestOutStock(repRequest);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 根据补库出库单创建补库手持分拣数据
|
|||
|
/// need transacation scope
|
|||
|
/// </summary>
|
|||
|
/// <param name="outRequest"></param>
|
|||
|
private void createRepPortData(WmsOutPickRequest outRequest)
|
|||
|
{
|
|||
|
/*
|
|||
|
WmsInRequest repRequest = new WmsInRequest();
|
|||
|
|
|||
|
repRequest.orderType = (int)enumInOrderType.repOrderIn;
|
|||
|
// repRequest.operater = LoginInfo.UserId;
|
|||
|
repRequest.orderNo = Util.getOrderNo(enumCreateOrderType.repOrderIn, repRequest.getNextSeq());
|
|||
|
repRequest.orderTypeName = "补零入库单";
|
|||
|
repRequest.state = (int)enumInStockOrderStatus.normal;
|
|||
|
repRequest.orderDate = DateTime.Now.Date.ToString();// use database default date
|
|||
|
repRequest.operater = this.operId;
|
|||
|
repRequest.Add();
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
DataTable dt = new WmsStockRecord().getPickStockRecods(outRequest.pickOrderNo, true).Tables[0];
|
|||
|
int i = 0;
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
WmsOutPickPort wpp = new WmsOutPickPort();
|
|||
|
|
|||
|
if (
|
|||
|
|
|||
|
string.IsNullOrEmpty(dr[WmsStockRecord.fields.count.ToString()].ToString())
|
|||
|
&& string.IsNullOrEmpty(dr[WmsStockRecord.fields.countOuting.ToString()].ToString())
|
|||
|
|| string.IsNullOrEmpty(dr[WmsStockRecord.fields.locationId.ToString()].ToString()))
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
wpp.count = Convert.ToDecimal(dr[WmsStockRecord.fields.count.ToString()].ToString())
|
|||
|
+ Convert.ToDecimal(dr[WmsStockRecord.fields.countOuting.ToString()].ToString());
|
|||
|
|
|||
|
if (wpp.count == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
wpp.locationId = dr[WmsStockRecord.fields.locationId.ToString()].ToString();
|
|||
|
wpp.pickOrderNo = outRequest.pickOrderNo;
|
|||
|
wpp.recordId = Convert.ToInt32( dr["id"].ToString());
|
|||
|
wpp.volType = wpp.volType = Convert.ToInt16(dr["volType"].ToString());
|
|||
|
wpp.recType = (int)enumStockRecordType.补零出库;
|
|||
|
wpp.partion = Convert.ToInt32(dr["partion"].ToString());
|
|||
|
wpp.pickDetailId = Convert.ToInt32(dr["orderDetailId"].ToString());
|
|||
|
wpp.Add();
|
|||
|
|
|||
|
i++;
|
|||
|
|
|||
|
}
|
|||
|
if (i > 0)
|
|||
|
{
|
|||
|
outRequest.state = (int)enumOutStockRequestStatus.等待波次;
|
|||
|
outRequest.Update();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取(今天)的未上架(未完成的)补货商品明细
|
|||
|
/// </summary>
|
|||
|
/// <param name="dt"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public Dictionary<string, decimal> getRepingCnt()
|
|||
|
{
|
|||
|
|
|||
|
Dictionary<string, decimal> ret = new Dictionary<string, decimal>();
|
|||
|
DataTable dt = pickRequestObj.getRepRequestDetailsLessThan(enumOutStockPickStatus.复核完成);//取未完成零货上架的补库商品明细
|
|||
|
|
|||
|
List<WmsOutPickDetail> lst = new List<WmsOutPickDetail>();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
// lst.Add(new WmsOutPickDetail(dr));
|
|||
|
ret[dr["goodsId"] + WmsConstants.SPLIT + dr["skuId"]] = Convert.ToDecimal( dr["count"].ToString());
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public decimal getRepingCnt(string goodsId, string batch)
|
|||
|
{
|
|||
|
|
|||
|
return 0m;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 出单一订单
|
|||
|
/// </summary>
|
|||
|
/// <param name="orderNo"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool requestOutStock(WmsOutPickRequest requestOrder)
|
|||
|
{
|
|||
|
LogHelper.debug("lWmsOutRequest", "requestOutStock begin : " + requestOrder.pickOrderNo);
|
|||
|
// printStockIn(orderNo);
|
|||
|
requestOrder.operater = this.operId;
|
|||
|
if(requestOrder.customerId == "29628")
|
|||
|
{
|
|||
|
bool isHit = true;
|
|||
|
}
|
|||
|
if (requestOrder.ID == 0)
|
|||
|
{
|
|||
|
// return false;
|
|||
|
// throw new DeiNiuException(requestOrder.pickOrderNo + " 不存在");
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (requestOrder.state == (int)enumOutStockRequestStatus.分拣完成)
|
|||
|
{
|
|||
|
// return false;
|
|||
|
// throw new DeiNiuException(requestOrder.pickOrderNo + " 已经完成分拣");
|
|||
|
return false;
|
|||
|
}
|
|||
|
else
|
|||
|
if (requestOrder.state == (int)enumOutStockRequestStatus.正在分拣)
|
|||
|
{
|
|||
|
// return false;
|
|||
|
// throw new DeiNiuException(requestOrder.pickOrderNo + " 正在分拣");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// stockOutType = requestOrder.orderType == (int)enumOutStoreType.补货出库 ?
|
|||
|
// enumStockRecordType.补零出库 : enumStockRecordType.销售出库;
|
|||
|
stockOutType = Util.getStockRecordType(requestOrder.outStoreType);
|
|||
|
|
|||
|
requestOrder.state = (int)enumOutStockRequestStatus.待定位;
|
|||
|
|
|||
|
// TransactionOptions option = new TransactionOptions();
|
|||
|
// option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
|
|||
|
// using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
|
|||
|
// ReadUncommitted 可以在事务期间读取和修改可变数据。
|
|||
|
// RepeatableRead 可以在事务期间读取可变数据,但是不可以修改。可以在事务期间添加新数据。
|
|||
|
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
|
|||
|
{
|
|||
|
//IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
|
|||
|
IsolationLevel = System.Transactions.IsolationLevel.Serializable,
|
|||
|
Timeout = new TimeSpan(0, 10, 0)
|
|||
|
}
|
|||
|
))
|
|||
|
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
bool isNoBatchOut = true;
|
|||
|
decimal sumBulkCunt = 0m;
|
|||
|
int bulkTypeCnt = 0;
|
|||
|
int boxcnt = 0;
|
|||
|
foreach (WmsOutPickDetail requestDetail in requestOrder.outDetails)
|
|||
|
{
|
|||
|
// if ((enumOutStockDetailStatus)requestDetail.state != enumOutStockDetailStatus.待处理)
|
|||
|
if ((enumOutStockDetailStatus)requestDetail.state >= enumOutStockDetailStatus.等待分拣)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (requestDetail.state >= (int)enumOutStockDetailStatus.等待分拣)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (requestDetail.state == (int)enumOutStockDetailStatus.分拣异常)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
requestDetail.operater = this.operId;
|
|||
|
//LogHelper.debug("lWmsOutRequest","requestOutStock begin detail ID: " + requestDetail.ID);
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
if (!WmsConstants.OUT_REQUEST_PROCESS_STOCK
|
|||
|
|| goodsOutStock(requestDetail,requestOrder.orderType ==(int)enumOutOrderType.补货出库))
|
|||
|
{
|
|||
|
|
|||
|
if(!WmsConstants.OUT_REQUEST_PROCESS_STOCK){
|
|||
|
logStockOutErpLocation(requestDetail);
|
|||
|
}
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.等待分拣;
|
|||
|
boxcnt += requestDetail.boxcnt;
|
|||
|
if (requestDetail.bulkCount > 0)//有零货出库,处理整不足出零的情况
|
|||
|
{
|
|||
|
requestDetail.bulkPickState = (int)enumOutStockPickStatus.已定位;
|
|||
|
if (requestOrder.bulkPickState != (int)enumOutStockPickStatus.已定位)
|
|||
|
{
|
|||
|
requestOrder.bulkPickState = (int)enumOutStockPickStatus.已定位;
|
|||
|
//requestOrder.Update();
|
|||
|
}
|
|||
|
|
|||
|
bulkTypeCnt++;
|
|||
|
sumBulkCunt += requestDetail.bulkCount;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
requestDetail.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
|
|||
|
if (requestDetail.batch1Count + requestDetail.batch2Count == 0)
|
|||
|
{
|
|||
|
requestDetail.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
requestDetail.batchPickState = (int)enumOutStockPickStatus.已定位;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
requestDetail.Update();
|
|||
|
|
|||
|
isNoBatchOut = isNoBatchOut && (requestDetail.batch1Count + requestDetail.batch2Count == 0);
|
|||
|
|
|||
|
// LogHelper.debug("lWmsOutRequest", "requestOutStock end detail ID succeed: " + requestDetail.ID);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// LogHelper.debug("lWmsOutRequest", "requestOutStock end detail ID faild : " + requestDetail.ID);
|
|||
|
LogHelper.debug("lWmsOutRequest", requestDetail.description);
|
|||
|
// LogHelper.WriteLog(typeof(lWmsOutRequest),requestDetail.description);
|
|||
|
throw new DeiNiuException(requestDetail.description);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
catch (DeiNiuStockBulkCountException bulkEx)
|
|||
|
{
|
|||
|
//LogHelper.WriteLog(typeof(lWmsOutRequest), bulkEx);
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest),string.Format("pickorder {0} stock bulk exception :{1}", requestOrder.pickOrderNo,bulkEx.Message));
|
|||
|
|
|||
|
if (requestOrder.pickGroup > 0 && requestOrder.outStoreType == (int)enumOutStoreType.配货汇总拣货出库) //汇总拣货继续
|
|||
|
{
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.等待补货;
|
|||
|
requestDetail.description = bulkEx.Message;
|
|||
|
requestDetail.Update();
|
|||
|
requestOrder.description = requestDetail.goods.goodsName + " 库存不足; " + DateTime.Now;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
// scope.Dispose();
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.等待补货;
|
|||
|
requestDetail.description = bulkEx.Message;
|
|||
|
requestDetail.Update();
|
|||
|
requestOrder.state = (int)enumOutStockRequestStatus.等待补货;
|
|||
|
requestOrder.Update();
|
|||
|
|
|||
|
continue;
|
|||
|
// return false;
|
|||
|
// throw bulkEx;
|
|||
|
}
|
|||
|
catch (DeiNiuNoStockException nostkEr)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), nostkEr);
|
|||
|
|
|||
|
if (requestOrder.pickGroup > 0 && requestOrder.outStoreType == (int)enumOutStoreType.配货汇总拣货出库) //汇总拣货继续
|
|||
|
{
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.库存不足;
|
|||
|
requestDetail.description = nostkEr.Message;
|
|||
|
requestDetail.Update();
|
|||
|
|
|||
|
requestOrder.description = requestDetail.goods.goodsName + " 库存不足; " + DateTime.Now;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
scope.Dispose();
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.库存不足;
|
|||
|
requestDetail.description = nostkEr.Message;
|
|||
|
requestDetail.Update();
|
|||
|
/*if (requestOrder.orderType == (int)enumOutOrderType.补货单) //补货单继续
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//requestOrder.state = (int)enumOutStockRequestStatus.库存不足;
|
|||
|
requestOrder.state = (int)enumOutStockRequestStatus.待定位;
|
|||
|
requestOrder.Update();
|
|||
|
// throw nostkEr;
|
|||
|
return false;
|
|||
|
}
|
|||
|
catch (DeiNiuException er)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), er);
|
|||
|
|
|||
|
if (requestOrder.pickGroup > 0 && requestOrder.outStoreType == (int)enumOutStoreType.配货汇总拣货出库) //汇总拣货继续
|
|||
|
{
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.分拣异常; ;
|
|||
|
requestDetail.description = er.Message;
|
|||
|
requestDetail.Update();
|
|||
|
requestOrder.description = requestDetail.goods.goodsName + " 库存不足; " + DateTime.Now;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
scope.Dispose();
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.分拣异常; ;
|
|||
|
requestDetail.description = er.Message;
|
|||
|
requestDetail.Update();
|
|||
|
requestOrder.description = er.Message;
|
|||
|
requestOrder.state = (int)enumOutStockRequestStatus.订单异常;
|
|||
|
requestOrder.Update();
|
|||
|
return false;
|
|||
|
// throw er;
|
|||
|
}
|
|||
|
catch (NullReferenceException ne)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), ne);
|
|||
|
throw new DeiNiuException("internal error :(-");
|
|||
|
}
|
|||
|
catch (Exception err)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), err);
|
|||
|
throw err;
|
|||
|
// return false;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//如果是补零出库单,入手持捡货表
|
|||
|
if (requestOrder.outStoreType == (int)enumOutStoreType.补货出库)
|
|||
|
{
|
|||
|
createRepPortData(requestOrder);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
if (isNoBatchOut)
|
|||
|
{
|
|||
|
requestOrder.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
if (sumBulkCunt == 0)
|
|||
|
{
|
|||
|
requestOrder.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
|
|||
|
requestOrder.bulkCnt = sumBulkCunt;
|
|||
|
requestOrder.boxCnt = boxcnt;
|
|||
|
if (requestOrder.state != (int)enumOutStockRequestStatus.等待补货)
|
|||
|
{
|
|||
|
|
|||
|
requestOrder.state = (int)enumOutStockRequestStatus.定位完成;
|
|||
|
|
|||
|
//TODO: update request order status
|
|||
|
esale.updatePickStatus(requestOrder.pickOrderNo, enumOutStockRequestStatus.定位完成);
|
|||
|
outRequest.updatePickState(requestOrder.pickOrderNo, enumOutStockRequestStatus.定位完成, enumOutStockRequestStatus.待定位);
|
|||
|
}
|
|||
|
|
|||
|
if (WmsConstants.OUT_BULK_SEEDS_PICK_ON && bulkTypeCnt < WmsConstants.OUT_MAX_SEEDS_GOODSTYPE_CNT && sumBulkCunt < WmsConstants.OUT_MAX_SEEDS_BULK_CNT_SUM)
|
|||
|
{
|
|||
|
requestOrder.seedsLabelId = WmsConstants.SEEDS_LABLEID_MARK_VALUE; //适合播种的标记
|
|||
|
}
|
|||
|
|
|||
|
requestOrder.Update();
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), e);
|
|||
|
scope.Dispose();
|
|||
|
return false;
|
|||
|
//throw e;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
LogHelper.debug("lWmsOutRequest", "requestOutStock end : " + requestOrder.pickOrderNo);
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public bool requestOutStock(string orderNo)
|
|||
|
{
|
|||
|
return requestOutStock(new WmsOutPickRequest(orderNo));
|
|||
|
}
|
|||
|
private bool goodsOutStock(WmsOutPickDetail requestDetail, bool isRep = false)
|
|||
|
{
|
|||
|
// WmsGoods goods = new WmsGoods(requestDetail.goodsId);
|
|||
|
//goods.getStockInfo(goods.goodsId,requestDetail.batch);//to get stock information for the goods.
|
|||
|
|
|||
|
if (isRep && requestDetail.bulkCount > 0)
|
|||
|
{
|
|||
|
bool ishit = true;
|
|||
|
}
|
|||
|
|
|||
|
WmsGoods goods = new WmsGoods(requestDetail.goodsId, requestDetail.skuId, requestDetail.batch);
|
|||
|
|
|||
|
if (goods.bigCount == 0)
|
|||
|
{
|
|||
|
// requestDetail.lackCount = requestDetail.count;
|
|||
|
// requestDetail.count=0;
|
|||
|
requestDetail.description = string.Format("{0},{1},非法商品,不存在大包装等基础信息", goods.goodsName, goods.goodsId);
|
|||
|
requestDetail.state = (int)enumOutStockDetailStatus.分拣异常;
|
|||
|
// throw new DeiNiuException(requestDetail.description);
|
|||
|
return true;
|
|||
|
}
|
|||
|
if (goods.isZhitong)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
decimal countOuting = WmsConstants.OUT_STOCK_DEDUCT ? goods.stockSumCountOuting : 0;
|
|||
|
|
|||
|
|
|||
|
//根据库存情况,调整出货的类型,减少出库任务碎小的问题,比如整库不足,出零库,会有先出整库时实际从零库出而产生一笔零库出库任务,可能会有多个出零库记录。
|
|||
|
decimal b2cnt = requestDetail.batch2Count - (goods.stockBatch2Count - goods.stockBatch2CountOuting);
|
|||
|
if (b2cnt > 0)
|
|||
|
{
|
|||
|
requestDetail.batch2Count = goods.stockBatch2Count - goods.stockBatch2CountOuting;
|
|||
|
requestDetail.batch1Count += b2cnt;
|
|||
|
}
|
|||
|
decimal b1cnt = requestDetail.batch1Count - (goods.stockBatch1Count - goods.stockBatch1CountOuting);
|
|||
|
if (!isRep && b1cnt > 0)
|
|||
|
{
|
|||
|
|
|||
|
requestDetail.batch1Count = goods.stockBatch1Count - goods.stockBatch1CountOuting;
|
|||
|
requestDetail.bulkCount += b1cnt;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
decimal bulkCnt = requestDetail.bulkCount;
|
|||
|
decimal batch1Cnt = requestDetail.batch1Count;
|
|||
|
decimal batch2Cnt = requestDetail.batch2Count;
|
|||
|
// decimal batch3Cnt = requestDetail.bat;
|
|||
|
decimal tmp = 0m;
|
|||
|
|
|||
|
|
|||
|
if (goods.stockSumCount - countOuting < requestDetail.count)
|
|||
|
{
|
|||
|
if (isRep)
|
|||
|
{
|
|||
|
requestDetail.description = "应补" + requestDetail.count + ",实际补 " + (goods.stockSumCount - countOuting);
|
|||
|
requestDetail.count = goods.stockSumCount - countOuting;
|
|||
|
|
|||
|
if (requestDetail.count < goods.bigCount)
|
|||
|
{
|
|||
|
requestDetail.count = 0;
|
|||
|
requestDetail.Delete();
|
|||
|
// requestDetail.Update();
|
|||
|
return true;
|
|||
|
}
|
|||
|
requestDetail.batch1Count = requestDetail.count;
|
|||
|
requestDetail.batch2Count = 0;
|
|||
|
requestDetail.Update();
|
|||
|
batch1Cnt = requestDetail.batch1Count;
|
|||
|
batch2Cnt = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!WmsConstants.OUT_STOCK_LACK_HOLD_ORDER)
|
|||
|
{
|
|||
|
WmsStockLack sl = new WmsStockLack();
|
|||
|
sl.getByPickOrder(requestDetail.pickOrderNo, requestDetail.goodsId, requestDetail.skuId);
|
|||
|
if (sl.ID == 0)
|
|||
|
{
|
|||
|
sl.whType = requestDetail.whtype;
|
|||
|
sl.goodsId = goods.goodsId;
|
|||
|
sl.pickOrderNo = requestDetail.pickOrderNo;
|
|||
|
sl.productDate = requestDetail.productDate;
|
|||
|
sl.validDate = requestDetail.validDate;
|
|||
|
sl.skuCode = requestDetail.skuCode;
|
|||
|
sl.skuId = requestDetail.skuId;
|
|||
|
sl.lackCount = requestDetail.count - (goods.stockSumCount - countOuting);
|
|||
|
sl.type = 1;
|
|||
|
sl.Add();
|
|||
|
}
|
|||
|
|
|||
|
requestDetail.lackCount = requestDetail.count - (goods.stockSumCount - countOuting);
|
|||
|
requestDetail.count = goods.stockSumCount - countOuting;
|
|||
|
requestDetail.count = requestDetail.count > 0 ? requestDetail.count : 0;
|
|||
|
|
|||
|
requestDetail.bulkCount = requestDetail.count % goods.bigCount;
|
|||
|
requestDetail.batch1Count = requestDetail.count - requestDetail.bulkCount;
|
|||
|
|
|||
|
bulkCnt = requestDetail.bulkCount;
|
|||
|
batch1Cnt = requestDetail.batch1Count;
|
|||
|
batch2Cnt = requestDetail.batch2Count;
|
|||
|
|
|||
|
if (requestDetail.count > 0)
|
|||
|
{
|
|||
|
requestDetail.Update();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// requestDetail.Delete();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
string msg = string.Format("rquest {3}, goods sku {0},required count {1},stock available cnt {2} ", requestDetail.skuId,
|
|||
|
requestDetail.count, goods.stockSumCount - countOuting, requestDetail.pickOrderNo);
|
|||
|
|
|||
|
throw new DeiNiuNoStockException(msg);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
if (!isRep && bulkCnt > 0 && bulkCnt > goods.stockBulkAvCount /*requestDetail.getGoodsStockCnt(enumWhLocVol.零库)*/)// pd.goods.stockBulkCount)
|
|||
|
{
|
|||
|
if (requestDetail.whtype == (int)enumWhType.合格库)
|
|||
|
{
|
|||
|
// this.createGoodsRepOrder(goods, requestDetail.skuId, requestDetail.skuCode, bulkCnt); //TODO: check if the rep has been created for it.
|
|||
|
|
|||
|
}
|
|||
|
string msg = string.Format("goods sku {0},required bulkcount {1},stock bulk cnt {2} ", goods.goodsName, bulkCnt, goods.stockBulkAvCount);
|
|||
|
throw new DeiNiuStockBulkCountException(msg);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (batch1Cnt + batch2Cnt >
|
|||
|
goods.stockBatch1Count + goods.stockBatch2Count + goods.stockBatch3Count
|
|||
|
- goods.stockBatch1CountOuting - goods.stockBatch2CountOuting - goods.stockBatch3CountOuting
|
|||
|
)
|
|||
|
{
|
|||
|
string msg = string.Format("整库存库存不足,{0} ,detailId{6},skuId{5}, skuCode {4}, \n {1} 整货需 {2}, 实际整库存 {3} "
|
|||
|
, requestDetail.pickOrderNo, goods.goodsName
|
|||
|
, batch1Cnt + batch2Cnt, goods.stockBatch1Count + goods.stockBatch2Count
|
|||
|
, requestDetail.skuCode, requestDetail.skuId, requestDetail.ID);
|
|||
|
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), msg);
|
|||
|
// throw new DeiNiuNoStockException(msg);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (batch2Cnt > 0)
|
|||
|
{
|
|||
|
batch2Cnt = reductStockCnt(goods, batch2Cnt, enumWhLocVol.中整, requestDetail); //出大整
|
|||
|
if (batch2Cnt > 0)
|
|||
|
{
|
|||
|
requestDetail.batch2Count -= batch2Cnt;
|
|||
|
}
|
|||
|
tmp = batch2Cnt;
|
|||
|
batch2Cnt = reductStockCnt(goods, batch2Cnt, enumWhLocVol.小整, requestDetail);//出小整
|
|||
|
|
|||
|
requestDetail.batch1Count += tmp - batch2Cnt;
|
|||
|
|
|||
|
if (!isRep)
|
|||
|
{
|
|||
|
tmp = batch2Cnt;
|
|||
|
|
|||
|
batch2Cnt = reductStockCnt(goods, batch2Cnt, enumWhLocVol.零库, requestDetail);//出零货
|
|||
|
|
|||
|
requestDetail.bulkCount += tmp - batch2Cnt;
|
|||
|
}
|
|||
|
}
|
|||
|
if (batch1Cnt > 0)
|
|||
|
{
|
|||
|
batch1Cnt = reductStockCnt(goods, batch1Cnt, enumWhLocVol.小整, requestDetail);//出小整
|
|||
|
if (batch1Cnt > 0)
|
|||
|
{
|
|||
|
requestDetail.batch1Count -= batch1Cnt;
|
|||
|
}
|
|||
|
tmp = batch1Cnt;
|
|||
|
batch1Cnt = reductStockCnt(goods, batch1Cnt, enumWhLocVol.中整, requestDetail);//小整不足,出中整
|
|||
|
|
|||
|
requestDetail.batch2Count += tmp - batch1Cnt;
|
|||
|
|
|||
|
tmp = batch1Cnt;
|
|||
|
|
|||
|
batch1Cnt = reductStockCnt(goods, batch1Cnt, enumWhLocVol.大整, requestDetail);//中整不足,出大整
|
|||
|
|
|||
|
tmp = batch1Cnt;
|
|||
|
|
|||
|
if (!isRep)
|
|||
|
{
|
|||
|
batch1Cnt = reductStockCnt(goods, batch1Cnt, enumWhLocVol.零库, requestDetail);//整不足,出零货 //TODO: HOW TO PROCESS request bulkcount ,batch count?
|
|||
|
|
|||
|
requestDetail.bulkCount += tmp - batch1Cnt;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (isRep)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if (batch2Cnt > 0 || batch1Cnt > 0) //货物不足,异常,
|
|||
|
{
|
|||
|
if (!isRep)
|
|||
|
{
|
|||
|
throw new DeiNiuNoStockException("库存异常");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
decimal batchCont = requestDetail.batch1Count - tmp;// +requestDetail.batch2Count;
|
|||
|
|
|||
|
int boxcnt = (int)Math.Ceiling(batchCont / requestDetail.goods.bigCount);
|
|||
|
if (requestDetail.boxcnt != boxcnt)
|
|||
|
{
|
|||
|
requestDetail.boxcnt = boxcnt;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* 在开始已判断是否零库缺货
|
|||
|
* 整库不足出零库的情况,在总货量足够的情况下,不会出现零库不足的问题
|
|||
|
if (bulkCnt > 0 && bulkCnt > requestDetail.getGoodsStockCnt(enumWhLocVol.零库))// pd.goods.stockBulkCount)
|
|||
|
{
|
|||
|
throw new DeiNiuStockBulkCountException();
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
bulkCnt = reductStockCnt(goods, bulkCnt, enumWhLocVol.零库, requestDetail);// 出零货
|
|||
|
|
|||
|
|
|||
|
if (bulkCnt > 0) //零库不足,需要补零库; 整库零出的零不够需补货的情况应该不存在
|
|||
|
{
|
|||
|
bulkCnt = Math.Ceiling(bulkCnt / goods.bigCount) * goods.bigCount;
|
|||
|
//this.createGoodsRepOrder(goods, requestDetail.skuId, requestDetail.skuCode, bulkCnt); //TODO: check if the rep has been created for it.
|
|||
|
LogHelper.debug(this.GetType(), "零库不足,补零,非常不可能。。。");
|
|||
|
throw new DeiNiuStockBulkCountException();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return true; ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private decimal reductStockCnt(WmsGoods goods, decimal targetCnt, enumWhLocVol locVol, WmsOutPickDetail requestDetail)
|
|||
|
{
|
|||
|
|
|||
|
if (locVol == enumWhLocVol.零库) //零库出库单笔捡货不能超过9999 //TODO: to test the logic
|
|||
|
{
|
|||
|
decimal tmpCnt = 0;
|
|||
|
while (targetCnt > 0)
|
|||
|
{
|
|||
|
if (WmsConstants.OUT_LIGHT_ENABLE && targetCnt > WmsConstants.MAX_PICK_CNT_BULK)
|
|||
|
{
|
|||
|
|
|||
|
tmpCnt = WmsConstants.MAX_PICK_CNT_BULK;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmpCnt = targetCnt;
|
|||
|
|
|||
|
}
|
|||
|
targetCnt = targetCnt - tmpCnt;
|
|||
|
decimal decnt = 0;
|
|||
|
foreach (WmsStock st in goods.stocks)
|
|||
|
{
|
|||
|
if (tmpCnt == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
if (st.location.volType == (int)locVol)
|
|||
|
{
|
|||
|
decimal cnt = st.count - st.countOut;
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
cnt = cnt - st.countOuting;
|
|||
|
}
|
|||
|
decimal reductCnt = cnt >= tmpCnt ? tmpCnt : cnt;
|
|||
|
|
|||
|
if (reductCnt <= 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
st.countOuting += reductCnt;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
st.countOut += reductCnt;
|
|||
|
|
|||
|
}
|
|||
|
st.operater = this.operId;
|
|||
|
// st.Update();
|
|||
|
st.updateCountOut();
|
|||
|
logStockOut(requestDetail, goods, st, reductCnt);
|
|||
|
tmpCnt -= reductCnt;
|
|||
|
decnt += reductCnt;
|
|||
|
}
|
|||
|
}
|
|||
|
if (decnt <= 0 && tmpCnt>0) //零库不足
|
|||
|
{
|
|||
|
throw new DeiNiuStockBulkCountException();
|
|||
|
}
|
|||
|
targetCnt += tmpCnt;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
foreach (WmsStock st in goods.stocks)
|
|||
|
{
|
|||
|
if (targetCnt == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
if (st.location.volType == (int)locVol)
|
|||
|
{
|
|||
|
decimal cnt = st.count - st.countOut;
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
cnt = cnt - st.countOuting;
|
|||
|
}
|
|||
|
|
|||
|
decimal reductCnt = cnt >= targetCnt ? targetCnt : cnt;
|
|||
|
|
|||
|
if (reductCnt <= 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
st.countOuting += reductCnt;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
st.countOut += reductCnt;
|
|||
|
if (st.countIn + st.count - st.countOut <= 0) //库存扣完,删除记录
|
|||
|
{
|
|||
|
st.Delete();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
st.operater = this.operId;
|
|||
|
st.Update();
|
|||
|
logStockOut(requestDetail, goods, st, reductCnt);
|
|||
|
targetCnt -= reductCnt;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return targetCnt;
|
|||
|
}
|
|||
|
|
|||
|
private enumStockRecordType stockOutType = enumStockRecordType.销售出库;
|
|||
|
private void logStockOut(WmsOutPickDetail request, WmsGoods goods, WmsStock stock, decimal count)
|
|||
|
{
|
|||
|
|
|||
|
WmsStockRecord r = new WmsStockRecord();
|
|||
|
r.batch = stock.batch.Trim();
|
|||
|
r.skuCode = stock.skuCode;
|
|||
|
r.skuId = stock.skuId;
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
r.countOuting = count;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
r.count = count;
|
|||
|
}
|
|||
|
r.goodsId = request.goodsId.Trim();
|
|||
|
r.locationId = stock.locationId.Trim();
|
|||
|
r.productDate = stock.productDate;
|
|||
|
r.validDate = stock.validDate;
|
|||
|
// r.orderNo = request.orderNo.Trim();
|
|||
|
r.orderNo = request.pickOrderNo.Trim();
|
|||
|
r.rectype = (int)stockOutType;//out
|
|||
|
// r.regeditCode = goods..Trim();
|
|||
|
r.operater = this.operId;
|
|||
|
r.orderDetailId = request.ID;//order detailId,同步 零货捡取临时数据、复核临时数据 的状态
|
|||
|
|
|||
|
if (stock.location.partion > 0)
|
|||
|
{
|
|||
|
Node nd = new Node(stock.location.partion);
|
|||
|
r.partion = nd.flag;
|
|||
|
}
|
|||
|
|
|||
|
r.Add();
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void logStockOutErpLocation(WmsOutPickDetail pd )
|
|||
|
{
|
|||
|
LogHelper.debug("lWmsOutRequest", "logStockOutErpLocation: " + pd.ID);
|
|||
|
|
|||
|
WmsStockRecord r = new WmsStockRecord();
|
|||
|
r.batch = pd.batch.Trim();
|
|||
|
r.skuCode = pd.skuCode;
|
|||
|
r.skuId = pd.skuId;
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
r.countOuting = pd.bulkCount;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
r.count = pd.bulkCount;
|
|||
|
}
|
|||
|
r.goodsId = pd.goodsId.Trim();
|
|||
|
r.locationId = pd.locationId.Trim();
|
|||
|
r.productDate = pd.productDate;
|
|||
|
r.validDate = pd.validDate;
|
|||
|
// r.orderNo = request.orderNo.Trim();
|
|||
|
r.orderNo = pd.pickOrderNo.Trim();
|
|||
|
r.rectype =(int) enumStockRecordType.销售出库; ;//out
|
|||
|
// r.regeditCode = goods..Trim();
|
|||
|
r.operater = this.operId;
|
|||
|
r.orderDetailId = pd.ID;//order detailId,同步 零货捡取临时数据、复核临时数据 的状态
|
|||
|
|
|||
|
if (pd.location.partion > 0)
|
|||
|
{
|
|||
|
Node nd = new Node(pd.location.partion);
|
|||
|
r.partion = nd.flag;
|
|||
|
}
|
|||
|
|
|||
|
r.Add();
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
internal int approveOrder(string orderNo, int status, int priority, bool canMerge)
|
|||
|
{
|
|||
|
WmsOutRequest order = new WmsOutRequest(orderNo);
|
|||
|
|
|||
|
if (string.IsNullOrEmpty(order.pickOrderNo))
|
|||
|
{
|
|||
|
order.state = status;
|
|||
|
order.operater = outRequest.operater;
|
|||
|
order.priority = priority;
|
|||
|
order.isMergable = canMerge;
|
|||
|
|
|||
|
Erp_sale es = new Erp_sale(orderNo);
|
|||
|
es.wms_state = status;
|
|||
|
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
es.Update();
|
|||
|
order.Update();
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
throw new Exception("操作失败,订单已经进入分拣作业");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
internal string genPickOrder(string orderNo)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
WmsOutRequest order = new WmsOutRequest(orderNo);
|
|||
|
if (order.ID == 0)
|
|||
|
{
|
|||
|
return "";
|
|||
|
}
|
|||
|
if (string.IsNullOrEmpty(order.pickOrderNo))
|
|||
|
{
|
|||
|
List<WmsOutDetail> outds = order.outDetails;
|
|||
|
|
|||
|
WmsOutPickRequest pr = new WmsOutPickRequest();
|
|||
|
|
|||
|
DataTable dt = order.getOutDetailForPick();
|
|||
|
|
|||
|
pr = new WmsOutPickRequest();
|
|||
|
pr.pickOrderNo = Util.getOrderNo(enumCreateOrderType.pickOrder, pr.getNextSeq(enumCreateOrderType.pickOrder));
|
|||
|
pr.orderType = order.orderType;
|
|||
|
pr.outStoreType = (int)getOutStoreType(order.orderType);// (int)enumOutStoreType.拣货出库;
|
|||
|
pr.operater = this.operId;
|
|||
|
pr.customerId = order.customerId;
|
|||
|
pr.customerName = order.customerName;
|
|||
|
pr.custAddress = order.custAddress;
|
|||
|
List<WmsOutPickDetail> pdCache = new List<WmsOutPickDetail>();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
|||
|
|
|||
|
pd.pickOrderNo = pr.pickOrderNo;
|
|||
|
pr.bulkCnt += pd.bulkCount; //pick request 总bulk cnt,作为拣选、复合工作量的指标
|
|||
|
pr.boxCnt += pd.boxcnt;
|
|||
|
|
|||
|
if (pd.bulkCount > 0 && pd.bulkCount > pd.goods.stockBulkAvCount /* pd.getGoodsStockCnt(enumWhLocVol.零库)*/)// pd.goods.stockBulkCount)
|
|||
|
{
|
|||
|
pd.description = "零库库存不足,等待补货";
|
|||
|
pr.state = (int)enumOutStockRequestStatus.等待补货;
|
|||
|
pd.state = (int)enumOutStockDetailStatus.等待补货;
|
|||
|
|
|||
|
pr.description = string.Format("{0} 零库库存不足,等待补货 ", pd.goods.goodsName);
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), pr.description);
|
|||
|
}
|
|||
|
pd.operater = this.operId;
|
|||
|
|
|||
|
|
|||
|
//calculate the total bulk for each goods
|
|||
|
if (pd.bulkCount > 0)
|
|||
|
{
|
|||
|
if (pd.count == pd.bulkCount) //batch not exists
|
|||
|
{
|
|||
|
pd.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pd.bulkPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
pdCache.Add(pd);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (pdCache.Count > 0 && pr != null)
|
|||
|
{
|
|||
|
pr.orderDate = pr.getDateTime();
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
pr.batchPickState = (int)enumOutStockPickStatus.无需分拣;
|
|||
|
|
|||
|
|
|||
|
foreach (WmsOutDetail wd in outds)
|
|||
|
{
|
|||
|
wd.state = (int)enumOutStockDetailStatus.等待分拣;
|
|||
|
wd.Update();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
order.pickOrderNo = pr.pickOrderNo;
|
|||
|
order.state =(int) Utils.enumOutStockRequestStatus.待定位;
|
|||
|
order.Update();
|
|||
|
|
|||
|
esale.updatePickStatus(pr.pickOrderNo, Utils.enumOutStockRequestStatus.待定位);
|
|||
|
|
|||
|
foreach (WmsOutPickDetail p in pdCache)
|
|||
|
{
|
|||
|
if (p.batchPickState != (int)enumOutStockPickStatus.无需分拣)
|
|||
|
{
|
|||
|
pr.batchPickState = (int)enumOutStockPickStatus.待处理;
|
|||
|
}
|
|||
|
p.Add();
|
|||
|
// pr.outDetails.Add(p); //why duplicated sometimes?
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
pr.Add();
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutRequest), er);
|
|||
|
|
|||
|
// updateOutRequestState(order.customerId,order.customerName, order.custAddress, "");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
requestOutStock(pr.pickOrderNo);
|
|||
|
|
|||
|
return pr.pickOrderNo;
|
|||
|
// pdCache.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
throw new Exception(string.Format("操作失败,订单{0}已经进入分拣作业",orderNo));
|
|||
|
}
|
|||
|
|
|||
|
return "" ;
|
|||
|
}
|
|||
|
|
|||
|
internal string genPickOrderByOrders(string[] orderNos)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
internal string createPickOrderByDetails(int[] detailIds)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
internal string createSeedsOrder(int pickGroup,int pickStartOn,string dueDate )
|
|||
|
{
|
|||
|
enumOutStockRequestStatus enOs = enumOutStockRequestStatus.待审核;
|
|||
|
enumOutStockDetailStatus enOd = enumOutStockDetailStatus.待处理;
|
|||
|
// DataTable dt = outRequest.getSeedsSumDetail(pickGroup, pickStartOn, dueDate, enOs, enOd);
|
|||
|
|
|||
|
WmsOutPickRequest pr = new WmsOutPickRequest(pickGroup, pickStartOn, dueDate);
|
|||
|
|
|||
|
if (pr.ID == 0)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
|
|||
|
{
|
|||
|
IsolationLevel = System.Transactions.IsolationLevel.Serializable,
|
|||
|
Timeout = new TimeSpan(0, 10, 0)
|
|||
|
}
|
|||
|
))
|
|||
|
{
|
|||
|
|
|||
|
pr.pickGroup = pickGroup;
|
|||
|
pr.pickStartOn = pickStartOn;
|
|||
|
pr.dueDate = dueDate;
|
|||
|
pr.orderType = (int)enumOutOrderType.销售出库;
|
|||
|
pr.outStoreType = (int)enumOutStoreType.配货汇总拣货出库;
|
|||
|
pr.pickOrderNo = Util.getOrderNo(enumCreateOrderType.pickOrder, pr.getNextSeq(enumCreateOrderType.pickOrder));
|
|||
|
pr.operater = operId;
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "开始新建拣货明细, " );
|
|||
|
int cnt = outRequest.groupPickStart(pickGroup, pickStartOn, dueDate, pr.pickOrderNo,this.operId);
|
|||
|
if (cnt > 0)
|
|||
|
{
|
|||
|
pr.Add();
|
|||
|
}
|
|||
|
#region slow way, 1 second slower
|
|||
|
/* DataTable dt = outRequest.getSeedsSumDetail(pickGroup, pickStartOn, dueDate, enOs, enOd);
|
|||
|
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
|||
|
|
|||
|
pd.pickOrderNo = pr.pickOrderNo;
|
|||
|
pd.state = (int)enumOutStockPickStatus.待处理;
|
|||
|
pd.Add();
|
|||
|
|
|||
|
}
|
|||
|
if (dt.Rows.Count > 0)
|
|||
|
{
|
|||
|
pr.Add();
|
|||
|
}*/
|
|||
|
#endregion
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), " 新建拣货明细 完成 ");
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
LogHelper.debug(typeof(LoginInfo), "------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!---------NOT -set userId:---------------- " );
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "开始计算出库: ");
|
|||
|
requestOutStock(pr);
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), "计算出库结束 ");
|
|||
|
|
|||
|
return pr.pickOrderNo;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
internal DataTable getSeedsSumDetail(int pickGroup, int pickStartOn, string dueDate, int enOrderState, int enDetailState)
|
|||
|
{
|
|||
|
return outRequest.getSeedsSumDetail(pickGroup, pickStartOn, dueDate,
|
|||
|
(enumOutStockRequestStatus)enDetailState, (enumOutStockDetailStatus)enDetailState);
|
|||
|
}
|
|||
|
|
|||
|
internal DataSet getSeedsSumDetail( string queryStr, int rowStart, int rowEnd)
|
|||
|
{
|
|||
|
queryStr = pareseCondition(queryStr);
|
|||
|
return outRequest.getSeedsSumDetail( queryStr, rowStart, rowEnd);
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getSeedsDetailByGoods(string goodsId)
|
|||
|
{
|
|||
|
return outRequest.getSeedsDetailByGoods(goodsId);
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getSeedsDetailBySku(int skuId)
|
|||
|
{
|
|||
|
return outRequest.getSeedsDetail(skuId);
|
|||
|
}
|
|||
|
|
|||
|
internal void updateTestData(){
|
|||
|
|
|||
|
|
|||
|
Erp_sale sale = new Erp_sale();
|
|||
|
|
|||
|
DataTable dt = sale.QueryActived().Tables[0];
|
|||
|
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
sale = new Erp_sale(dr);
|
|||
|
sale.updateCreatetime();
|
|||
|
|
|||
|
Thread.Sleep(10000);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Erp_purch ep = new Erp_purch();
|
|||
|
|
|||
|
dt = ep.QueryActived().Tables[0];
|
|||
|
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
ep = new Erp_purch(dr);
|
|||
|
ep.updateCreatetime();
|
|||
|
|
|||
|
Thread.Sleep(10000);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|