ldj/WcfService1/BLL/lWmsInRequest.cs

3224 lines
114 KiB
C#
Raw 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.

/// <summary>
///LOGIC CLASS FOR TABLE t_wmsInRequest
///By wm with codesmith.
///on 05/12/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.Data.BaseObject;
using DeiNiu.Utils;
//using Microsoft.Reporting.WinForms;
namespace DeiNiu.wms.Logical
{
[Serializable]
public class lWmsInRequest : lbase
{
WmsInRequest _obj;
WmsStock _stkObj;
// private int p;
Erp_purch _erpPurchObj;
Erp_purch_ship _erpPurchShipObj;
Erp_purch_receive_pre _preInObj = new Erp_purch_receive_pre();
public Erp_purch_receive_pre preInObj
{
get
{
if (_preInObj == null)
{
_preInObj = new Erp_purch_receive_pre();
_preInObj.operater = this.operId;
}
return _preInObj;
}
}
public Erp_purch_ship erpPurchShipObj
{
get
{
if (_erpPurchShipObj == null)
{
_erpPurchShipObj = new Erp_purch_ship();
_erpPurchShipObj.operater = this.operId;
}
return _erpPurchShipObj;
}
}
public WmsStock stkObj
{
get
{
if (_stkObj == null)
{
_stkObj = new WmsStock();
_stkObj.operater = this.operId;
}
return _stkObj;
}
}
public Erp_purch erpPurchObj
{
get
{
if (_erpPurchObj == null)
{
_erpPurchObj = new Erp_purch();
_erpPurchObj.operater = this.operId;
}
return _erpPurchObj;
}
}
public lWmsInRequest()
{
initialize();
}
public lWmsInRequest(int p):base(p)
{
initialize();
}
public WmsInRequest getWmsInRequest
{
get
{
return _obj;
}
}
/// <summary>
/// get all data
/// </summary>
public DataSet getAllData()
{
return _obj.Query();
}
/// <summary>
/// get all data
/// </summary>
public DataSet getAllActiveData()
{
return _obj.QueryActived();
}
protected override BaseModel getModel()
{
return _obj;
}
/// <summary>
/// get a record by id
/// </summary>
public void initialize(int id)
{
_obj = id != 0 ? new WmsInRequest(id) : new WmsInRequest();
}
/// <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 WmsInRequest(dr);
}
//begin cust db operation, query, excute sql etc.
/// <summary>
/// get in_stock request in a transaction scope
/// </summary>
public void syncOrders()
{
using (TransactionScope scope = new TransactionScope())
{
_obj.syncInRequest();
scope.Complete();
}
}
private bool valid()
{
return true;
}
public bool requestInStock(string orderNo)
{
return requestInStock(new WmsInRequest(orderNo));
}
public bool requestInStock(WmsInRequest requestOrder)
{
// printStockIn(orderNo);
requestOrder.operater = this.operId;
if (requestOrder.ID == 0)
{
return false;
//throw new DeiNiuException(requestOrder.orderNo + " 不存在");
}
if (requestOrder.state == (int)enumInStockOrderStatus.)
{
return false;
// throw new DeiNiuException(requestOrder.orderNo + " 已经入库");
}
//入库前检查产品生产日期,有效期
bool isDateInvalid = false;
foreach (WmsInRequestDetail requestDetail in requestOrder.inDetails)
{
if (requestDetail.state == (int)enumInStockDetailStatus.)
{
continue;
}
if (requestDetail.whType == (int)enumWhType.)
{
continue;
}
requestDetail.operater = this.operId;
if (!checkAndUpdateValidDate(requestDetail)) //生产日期,有效期错误
{
isDateInvalid = true;
requestDetail.state = (int)enumInStockDetailStatus.;
requestDetail.Update();
}
}
if (isDateInvalid)
{
requestOrder.state = (int)enumInStockOrderStatus.;
requestOrder.Update();
return false;
}
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
{
IsolationLevel = System.Transactions.IsolationLevel.Serializable,
Timeout = new TimeSpan(0, 10, 0)
}
))
{
foreach (WmsInRequestDetail requestDetail in requestOrder.inDetails)
{
if (requestDetail.state == (int)enumInStockDetailStatus.)
{
continue;
}
requestDetail.operater = this.operId;
try
{
requestDetailIn( requestOrder,requestDetail);
}
catch (DeiNiuNoFreeLocationkException nfe)
{
scope.Dispose();
requestDetail.state = (int)enumInStockDetailStatus.; ;
requestDetail.description = nfe.Message;
requestDetail.Update();
requestOrder.state = (int)enumInStockOrderStatus.;
requestOrder.Update();
throw nfe;
}
catch (DeiNiuException er)
{
scope.Dispose();
requestDetail.state = (int)enumInStockDetailStatus.; ;
requestDetail.description = er.Message;
requestDetail.Update();
requestOrder.state = (int)enumInStockOrderStatus.;
requestOrder.Update();
throw er;
}
catch (Exception err)
{
throw err;
}
}
requestOrder.state = (int)enumInStockOrderStatus.;
requestOrder.Update();
if (!WmsConstants.IN_STOCK_RECEIVE_VALID) //不启用验收模块,则一次入库完毕。
{
erpPurchObj.updateStockStatus(requestOrder.orderNo, enumInStockOrderStatus.,
enumReceiveStockDetailStatus.,operId);
}
else
{
Erp_purch ep = new Erp_purch(requestOrder.orderNo);
if (ep.wms_state == (int)enumInStockOrderStatus.) //入库单明细全部完成验收后
{
ep.wms_state = (int)enumInStockOrderStatus.;
ep.Update();
}
}
// Erp_purch_d epd = new Erp_purch_d();
scope.Complete();
}
//if (requestOrder.orderType == (int)enumInOrderType.purOrder)
//{
// // printStockIn(requestOrder.orderNo);
//}
return true;
}
private void requestDetailIn(WmsInRequest requestOrder, WmsInRequestDetail requestDetail, int recommandWareHouse = 0)
{
enumWhType whType = (enumWhType)requestDetail.whType;
if (whType == enumWhType.)
{
//Wmslocation location = new Wmslocation();
// List<Wmslocation> locs = location.geLocations(enumWhType.不合格库);
requestDetail.state = (int)enumInStockDetailStatus.;
requestDetail.description = "已入不合格区";
requestDetail.Update();
}
else if (whType == enumWhType.)
{
zhitongIn(requestDetail);
}
else if (goodsInStock(requestDetail, recommandWareHouse))
{
requestDetail.state = (int)enumInStockDetailStatus.;
requestDetail.countIn = requestDetail.validCount;
requestDetail.Update();
updateErpDetail(requestDetail);
}
else //if(WmsConstants.IN_STOCK_ONE_TIME)
{
throw new DeiNiuException("入库异常");
}
}
private void zhitongIn(WmsInRequestDetail requestDetail)
{
WmsStockPre wsp = new WmsStockPre();
wsp.orderno = requestDetail.orderNo;
wsp.orderDetailId = requestDetail.ID;
wsp.partion = requestDetail.partion;
wsp.skuCode = requestDetail.skuCode;
wsp.skuId = requestDetail.skuId;
wsp.batch = requestDetail.batch;
wsp.productDate = requestDetail.productDate;
wsp.validDate = requestDetail.validDate;
wsp.count = requestDetail.validCount;
wsp.goodsId = requestDetail.goodsId;
wsp.Add();
requestDetail.state = (int)enumInStockDetailStatus.;
requestDetail.countIn = requestDetail.validCount;
requestDetail.description = "已入越库区";
requestDetail.Update();
updateErpDetail(requestDetail);
logStock(requestDetail, null, wsp.count, enumInStoreType., wsp);
}
/// <summary>
/// 更新入库数据
/// </summary>
/// <param name="requestDetail"></param>
/// <returns></returns>
bool updateErpDetail(WmsInRequestDetail requestDetail)
{
if (!WmsConstants.IN_STOCK_RECEIVE_VALID)
{
return false;
}
DataTable dt = erpPurchObj.getValidedInDetail(requestDetail.orderNo, (int)enumReceiveStockDetailStatus.);
decimal inCnt = requestDetail.validCount;//.countIn;
foreach (DataRow dr in dt.Rows)
{
Erp_receiveValidDetail evd = new Erp_receiveValidDetail(dr);
if (evd.goods_id == requestDetail.goodsId
&& evd.batch == requestDetail.batch
&& evd.productDate == requestDetail.productDate
&& evd.validDate == requestDetail.validDate)
{
evd.inCount = evd.valid_count < inCnt ? evd.valid_count : inCnt;
inCnt -= evd.inCount;
evd.operater = this.operId;
evd.wms_state = (int)enumReceiveStockDetailStatus.;
evd.Update();
}
if (inCnt <= 0)
{
break;
}
}
return true;
}
/// <summary>
/// 更新上架数据
/// </summary>
/// <param name="requestDetail"></param>
/// <returns></returns>
bool updateErpDetail(int detailId)
{
LogHelper.debug(GetType(), "updateErpDetail ? " + detailId);
WmsInRequestDetail requestDetail = new WmsInRequestDetail(detailId);
decimal upShelfCnt = requestDetail.countIn;//.countIn;
// DataTable dt = erpPurchObj.getValidedInDetail(requestDetail.orderNo, (int)enumReceiveStockDetailStatus.待上架);
Erp_receiveValidDetail evd = new Erp_receiveValidDetail(requestDetail.validId);
evd.upShelfCount += upShelfCnt;
evd.operater = this.operId;
evd.wms_state = (int)enumReceiveStockDetailStatus.;
evd.Update();
LogHelper.debug(GetType(), "updateErpDetail ? upShelfCnt is " + upShelfCnt + ", erp_receiveValidDetail updated ");
new Erp_purch_receive_pre().upShelfCount(evd.preInOrder, requestDetail.purch_d_id, upShelfCnt, operId);
/*
DataTable dt = new Erp_receiveValidDetail().getDetailByFlowNo(requestDetail.preInOrder, requestDetail.flowNo);
DataView dv = dt.DefaultView;
dv.RowFilter = "skuId=" + requestDetail.skuId;
LogHelper.debug(GetType(), "updateErpDetail ? filter by skuId" + requestDetail.skuId +", erp_receiveValidDetail count is " + dv.Count);
decimal upShelfCnt = requestDetail.countIn;//.countIn;
foreach (DataRowView dr in dv)
{
Erp_receiveValidDetail evd = new Erp_receiveValidDetail(dr.Row);
// evd.upShelfCount = evd.inCount < upShelfCnt ? evd.inCount : upShelfCnt;
evd.upShelfCount += upShelfCnt;
// upShelfCnt -= evd.inCount;
evd.operater = this.operId;
evd.wms_state = (int)enumReceiveStockDetailStatus.已上架;
evd.Update();
LogHelper.debug(GetType(), "updateErpDetail ? upShelfCnt is " + upShelfCnt + ", erp_receiveValidDetail updated ");
new Erp_purch_receive_pre().upShelfCount(evd.preInOrder, requestDetail.purch_d_id, upShelfCnt, operId);
}
* */
/// WmsInRequest wir = new WmsInRequest(requestDetail.orderNo);
Erp_purch_d epd = new Erp_purch_d(requestDetail.purch_d_id);
epd.onShelfCount += upShelfCnt;
if (epd.onShelfCount >= epd.validCount && epd.wms_state == (int)enumReceiveStockDetailStatus.)
{
epd.wms_state =(int)enumReceiveStockDetailStatus.;
}
epd.operater = operId;
epd.Update();
DataTable dtDetails = erpPurchObj.getOrderDetail(requestDetail.orderNo);
DataView dvDetail = dtDetails.DefaultView;
dvDetail.RowFilter = "wms_state<" + (int)enumReceiveStockDetailStatus.;
if (dvDetail.Count == 0)
{
_erpPurchObj = new Erp_purch(requestDetail.orderNo);
_erpPurchObj.wms_state = (int)enumInStockOrderStatus.;
_erpPurchObj.operater = operId;
_erpPurchObj.Update();
}
// erpPurchObj.updateStockStatus(requestDetail.orderNo, (enumInStockOrderStatus)wir.state, enumReceiveStockDetailStatus.已上架, operId);
/*
if(wir.state == (int)enumInStockOrderStatus.已上架 ){
erpPurchObj.updateStockStatus(requestDetail.orderNo, enumInStockOrderStatus.已上架, enumReceiveStockDetailStatus.已上架,operId);
}
*/
/*
dt = erpPurchObj.getValidedInDetail(requestDetail.orderNo, (int)enumReceiveStockDetailStatus.待上架);
if (dt.Rows.Count == 0)
{
_erpPurchObj = new Erp_purch(requestDetail.orderNo);
erpPurchObj.wms_state = (int)enumInStockOrderStatus.已上架;
erpPurchObj.Update();
}
*/
return true;
}
bool checkAndUpdateValidDate(WmsInRequestDetail requestDetail)
{
string productDate = requestDetail.productDate.Trim();
string validDate = requestDetail.validDate.Trim();
string[] invailidChars = { ".","-","/"};
foreach (string s in invailidChars)
{
if (WmsConstants.GOODS_VALID_DATE_FORMAT.IndexOf(s) == -1)
{
productDate = productDate.Replace(s, "");
validDate = validDate.Replace(s, "");
}
}
if (productDate.Length < 6 || productDate.Length > 8 || validDate.Length < 6 || validDate.Length > 8)
{
if (WmsConstants.IN_STOCK_CHECK_DATE)
{
return false;
}
}
productDate += productDate.Length == 6 ? "28" : "";
validDate += validDate.Length == 6 ? "01" : "";
DateTime dtprd, dtvlid;
try
{
dtprd = DateTime.ParseExact(productDate, WmsConstants.GOODS_VALID_DATE_FORMAT, System.Globalization.CultureInfo.CurrentCulture);
dtvlid = DateTime.ParseExact(validDate, WmsConstants.GOODS_VALID_DATE_FORMAT, System.Globalization.CultureInfo.CurrentCulture);
if (WmsConstants.IN_STOCK_CHECK_DATE && dtvlid <= DateTime.Now)
{
requestDetail.description = "产品过期";
return false;
}
requestDetail.productDate = dtprd.ToString(WmsConstants.GOODS_VALID_DATE_FORMAT);
requestDetail.validDate = dtvlid.ToString(WmsConstants.GOODS_VALID_DATE_FORMAT);
}
catch
{
if (WmsConstants.IN_STOCK_CHECK_DATE)
{
return false;
}
}
requestDetail.state = (int)enumInStockDetailStatus.;
requestDetail.Update();
return true;
}
/// <summary>
/// 分配货位入库
/// 1.整货入整库,整库不能进零货
///2. WmsConstants.IN_STOCK_CHECK_BULK_FIRST = true: 商品在零库已有零货位存在的情况下,优先补足零货
/// </summary>
/// <param name="requestDetail"></param>
/// <returns></returns>
private bool goodsInStock(WmsInRequestDetail requestDetail, int recommandWareHouse = 0)
{
LogHelper.debug(this.GetType(),string.Format("request order {0},detail id {1},count{2}"
, requestDetail.orderNo, requestDetail.ID, requestDetail.orderCount));
decimal count = requestDetail.validCount - requestDetail.countIn;
if (count <= 0)
{
return true;
}
// WmsGoods goods = ObjectsFactory.getGoods(requestDetail.goodsId, requestDetail.skuId, requestDetail.batch,true);//new WmsGoods(requestDetail.goodsId);
WmsGoods goods = new WmsGoods(requestDetail.goodsId, requestDetail.skuId, requestDetail.batch);
WmsStock stock = new WmsStock();
int goodType = goods.goodsType;
string goodsId = goods.goodsId;
string batch = requestDetail.batch;
int skuId = requestDetail.skuId;
string skuCode = requestDetail.skuCode;
if (skuId >0 && string.IsNullOrEmpty(skuCode))
{
Sku sku = new Sku(skuId);
if (sku.ID > 0)
{
requestDetail.skuCode = skuCode = sku.skuCode;
}
}
decimal bigCount = goods.bigCount;
//decimal boxCount = 0; //箱数
decimal bulkCnt = 0;
decimal batch1Cnt = 0;
decimal batch2Cnt = 0;
decimal batch3Cnt = 0;
decimal bulkCntFromBatch = 0;
decimal bulkMax = goods.bulkMax;
decimal batchMax1 = goods.batchMax1;
decimal batchMax2 = goods.batchMax2;
decimal batchMax3 = goods.batchMax3;
// decimal stockCnt =0;
if (bigCount == 0)
{
throw new DeiNiuException(string.Format("请维护 '{0}' 的大包装数量", requestDetail.goodsName));
}
if (goodType == 0)
{
throw new DeiNiuException(string.Format("请维护 '{0}' 的商品类型", requestDetail.goodsName));
}
//现在默认 每种商品 在零货位上的最大容量为 1.3箱 小整4箱 大整 20
//一箱 是指一个大包装量(erp bigCount)
bulkMax = bulkMax > 0 ? bulkMax : bigCount * WmsConstants.BULK_MAX_RATE;
batchMax1 = batchMax1 > 0 ? batchMax1 : bigCount * WmsConstants.BATCH1_MAX_RATE;
batchMax2 = batchMax2 > 0 ? batchMax2 : bigCount * WmsConstants.BATCH2_MAX_RATE;
batchMax3 = batchMax3 > 0 ? batchMax3 : bigCount * WmsConstants.BATCH3_MAX_RATE;
//boxCount = count / bigCount ;
decimal boxcnt = 0m;
// boxcnt = Math.Floor(count / bigCount);
// bulkCnt = count - boxcnt * bigCount;
bulkCnt = count % bigCount; //取余数,不足箱部分
count -= bulkCnt;
count = count > 0 ? count : 0;
if (count > 0)
{
if ( WmsConstants.IN_STOCK_CHECK_BULK_FIRST
&& goods.bulkMax >=0 //只有对设置零库库容的商品有效
)
{
decimal tmp = 0m;
//优先补足零库
DataTable dt0;
// dt0 = stock.queryByGoodsIdVolType(skuId,skuCode,goods.goodsId, requestDetail.batch, enumWhLocVol.零库, enumWhType.合格库);
dt0 = stock.queryByGoodsIdVolType(0, "", goods.goodsId, requestDetail.batch, enumWhLocVol.,
(enumWhType)requestDetail.whType);//库容按商品ID不是按skuId
//计算补零货数
foreach (DataRow dr in dt0.Rows)
{
stock = new WmsStock(dr);
decimal onShelfCnt = stock.count - stock.countOut;
onShelfCnt = onShelfCnt > 0 ? onShelfCnt : 0;
tmp += onShelfCnt ;// - stock.countLock;
if (WmsConstants.IN_STOCK_PDA_SCAN)
{
tmp += stock.countIn;
}
}
decimal diff = bulkMax - tmp;
if (diff > 0) //需要补
{
if (diff > bulkCnt ) //需要拆箱补货
{
if ( WmsConstants.IN_STOCK_DIFF_PARTS) //同一组验收数量可进不同货区
{
decimal cnt = Math.Ceiling((diff - bulkCnt) / bigCount) * bigCount;
cnt = cnt > count ? count : cnt;
bulkCnt += cnt;
count -= cnt;
}
}
}
/*
bulkCnt += tmp >= bulkMax ? 0 //零库充足,不补
: bulkMax - (tmp + bulkCnt) ; //补充部分
bulkCnt = Math.Ceiling(bulkCnt / bigCount) * bigCount; //成箱补充
bulkCnt = bulkCnt > count ? count : bulkCnt;
count = count - bulkCnt;
count = count > 0 ? count : 0;
*/
}
}
boxcnt = Math.Floor(count / bigCount);
if (count > batchMax1) //入整库
{
if (count > batchMax2)
{
batch3Cnt = count;
}
else
{
batch2Cnt = count;
}
}
else
{
batch1Cnt = count;
}
/*
if (count >= batchMax1) //入整库
{
if (count >= batchMax2) //入大整
{
boxcnt = Math.Floor(count / batchMax2);
batch2Cnt = boxcnt * batchMax2;
batch1Cnt = count - batch2Cnt;
boxcnt = Math.Floor(batch1Cnt / batchMax1);
batch1Cnt = boxcnt * batchMax1;
// batch2Cnt = count;
}
else //入小整
{
boxcnt = Math.Floor(count / batchMax1);
batch1Cnt = boxcnt * batchMax1; ;
//batch1Cnt = count;
}
//剩余有零货的话则入零货
bulkCnt += count - batch2Cnt - batch1Cnt;
}
else //入零库
{
bulkCnt += count;
}
*/
LogHelper.debug(this.GetType(),string.Format("入库数量 大整:{0},小整:{1},零货:{2}", batch2Cnt, batch1Cnt, bulkCnt));
/*
if (orderType == enumInOrderType.repOrderIn) //处理补零入库单
{
batch1Cnt = 0;
batch2Cnt = 0;
bulkCnt = requestDetail.validCount - requestDetail.countIn;
}
*/
DataTable dt = stock.querySameGoodsLocations( goods.goodsId,skuId,requestDetail.batch
, (enumWhType)requestDetail.whType, recommandWareHouse);
Dictionary<WmsStock, decimal> locsUpdate = new Dictionary<WmsStock, decimal>();
Dictionary<WmsStock, decimal> locsBulk = new Dictionary<WmsStock, decimal>();
Dictionary<WmsStock, decimal> locsBatch1 = new Dictionary<WmsStock, decimal>();
Dictionary<WmsStock, decimal> locsBatch2 = new Dictionary<WmsStock, decimal>();
Dictionary<WmsStock, decimal> locsBatch3= new Dictionary<WmsStock, decimal>();
string lastBatch3Location = "";
string lastBatch2Location = "";
string lastBatch1Location = "";
string lastBulkLocation = "";
string lastLoc = "";
//计算补货货位及数量
foreach (DataRow dr in dt.Rows)
{
stock = new WmsStock(dr);
if (lastLoc == "")
{
lastLoc = stock.locationId;
}
else
if (lastLoc.Equals(stock.locationId))
{
continue;
}
lastLoc = stock.locationId;
stock = new WmsStock(dr);
if(WmsConstants.IN_STOCK_ABC && stock.location.ABC !=goods.ABC){
continue;
}
enumWhLocStoreType stype = (enumWhLocStoreType)Convert.ToInt16(dr["storeType"].ToString());
switch (stype)
{
case enumWhLocStoreType.:
if (stock.batch != batch || stock.skuId != skuId)
{
continue;
}
break;
case enumWhLocStoreType.:
if (stock.batch != batch || stock.skuId != skuId)
{
continue;
}
break;
}
decimal existCnt = stock.count + stock.countIn - stock.countOut;// -stock.countOuting;// - stock.countLock;
existCnt = existCnt > 0 ? existCnt : 0;
LogHelper.debug(this.GetType(), string.Format("现有库存 {0}, skuid {1}, 数量{2}",
stock.locationId, stock.skuId, existCnt));
int locVolType = Convert.ToInt32(dr[WmsLocation.fields.volType.ToString()].ToString());
decimal goodsMaxcnt = goods.getMaxCount(locVolType);
enumWhLocVol volType = (enumWhLocVol)locVolType;
decimal freeCntCapicity = Math.Ceiling((1 - stock.getUsedPercent(lastLoc)) * goodsMaxcnt);
LogHelper.debug(this.GetType(), string.Format("可用容量 {0} ",freeCntCapicity ));
if (freeCntCapicity <= 0)
{
continue;
}
switch (volType)
{ //当前货位类型
case enumWhLocVol.:
lastBulkLocation = stock.locationId;
if (bulkCnt == 0)
{
continue;
}
if (bulkCnt <= freeCntCapicity)
{
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), bulkCnt);
bulkCnt = 0;
}
else
{
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), freeCntCapicity);
bulkCnt -= freeCntCapicity;
}
/* if (existCnt < goodsMaxcnt ) //补充货位 仅适合单品单批
{
lastBulkLocation = stock.locationId;
decimal c = goodsMaxcnt - existCnt;
if (c < bulkCnt) // 需要新货位
{
bulkCnt -= c; //补现有货位后,剩余的入新货位
}
else
{
c = bulkCnt;
bulkCnt = 0;
}
locsUpdate.Add(new WmsStock(stock.goodsId, stock.batch,stock.locationId), c);
}*/
break;
case enumWhLocVol.:
lastBatch1Location = stock.locationId;
if (batch1Cnt == 0)
{
continue;
}
if (batch1Cnt <= freeCntCapicity)
{
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), batch1Cnt);
batch1Cnt = 0;
}
else
{
decimal buchongCount = Math.Floor(freeCntCapicity / bigCount) * bigCount;//补整箱
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), buchongCount);
batch1Cnt -= buchongCount;
}
/*if (existCnt < goodsMaxcnt) //补充货位
{
lastBatch1Location = stock.locationId;
decimal buchongCount = goodsMaxcnt - existCnt;
if (buchongCount < batch1Cnt) // 需要新货位
{
buchongCount = Math.Floor(buchongCount / bigCount) * bigCount;//补整箱
batch1Cnt -= buchongCount; //补现有货位后,剩余的入新货位
}
else
{
buchongCount = batch1Cnt;
batch1Cnt = 0;
}
// locsBatch1.Add(new WmsStock(stock.locationId), c);
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), buchongCount);
}
* */
break;
case enumWhLocVol.:
lastBatch2Location = stock.locationId;
if (batch2Cnt == 0)
{
/*if (batch1Cnt > 0 && WmsConstants.IN_STOCK_BIG_LOCATION_FIRST)//优先补大货位
{
}
else
{
continue;
}*/
if (batch1Cnt <= 0
|| !WmsConstants.IN_STOCK_BIG_LOCATION_FIRST)//优先补大货位
{
continue;
}
}
if (existCnt < goodsMaxcnt) //补充货位
{
lastBatch2Location = stock.locationId;
decimal maxCount = goodsMaxcnt - existCnt;
maxCount = Math.Floor(maxCount / bigCount) * bigCount;//补整箱
decimal buchongCount = maxCount;// -batch2Cnt;
if (batch2Cnt >= maxCount ) // 需要新货位
{
batch2Cnt -= maxCount; //补现有货位后,剩余的入新货位
}
else //大整数量全部补充货位
{
buchongCount = batch2Cnt;// maxCount - batch2Cnt;
if (batch1Cnt > 0 && WmsConstants.IN_STOCK_BIG_LOCATION_FIRST) //优先补大货位
{
if (batch1Cnt > maxCount - buchongCount) //小整补完大整货位仍有余
{
batch1Cnt -= maxCount - buchongCount;
buchongCount = maxCount;
}
else //小整全部补大整
{
// maxCount = batch1Cnt + batch2Cnt;
buchongCount = batch1Cnt + batch2Cnt;
batch1Cnt = 0;
}
}
batch2Cnt = 0;
}
// locsBatch2.Add(new WmsStock(stock.locationId), c);
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), buchongCount);
}
break;
case enumWhLocVol.:
lastBatch3Location = stock.locationId;
if (batch3Cnt == 0)
{
if (batch2Cnt <= 0
|| !WmsConstants.IN_STOCK_BIG_LOCATION_FIRST)//优先补大货位
{
continue;
}
}
if (existCnt < goodsMaxcnt) //补充货位
{
lastBatch3Location = stock.locationId;
decimal maxCount = goodsMaxcnt - existCnt;
maxCount = Math.Floor(maxCount / bigCount) * bigCount;//补整箱
decimal buchongCount = maxCount;// -batch2Cnt;
if (batch3Cnt >= maxCount ) // 需要新货位
{
batch3Cnt -= maxCount; //补现有货位后,剩余的入新货位
}
else //大整数量全部补充货位
{
buchongCount = batch3Cnt;// maxCount - batch2Cnt;
if (batch2Cnt > 0 && WmsConstants.IN_STOCK_BIG_LOCATION_FIRST) //优先补大货位
{
if (batch2Cnt > maxCount - buchongCount) //小整补完大整货位仍有余
{
batch2Cnt -= maxCount - buchongCount;
buchongCount = maxCount;
}
else //小整全部补大整
{
// maxCount = batch1Cnt + batch2Cnt;
buchongCount = batch2Cnt + batch3Cnt;
batch2Cnt = 0;
}
}
batch3Cnt = 0;
}
// locsBatch2.Add(new WmsStock(stock.locationId), c);
locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), buchongCount);
}
break;
}
// stockCnt += cnt;
}
//入大整
WmsLocation nearLocation = new WmsLocation();
nearLocation.warehouse = recommandWareHouse;
nearLocation.goodsType = goods.goodsType;
nearLocation.ABC = goods.ABC;
nearLocation.ownerCode = requestDetail.entid;// goods.ownerCode; //可能多货主共享商品id
Dictionary<WmsLocation, Decimal> locs2add = new Dictionary<WmsLocation, decimal>();
int locCnt = 1;
if (batch3Cnt > 0)
{
nearLocation.locationId = lastBatch3Location;
decimal cnt = batch3Cnt / batchMax3;
locCnt = (int)Math.Ceiling(cnt);//有余数则会进一位
nearLocation.volType = (int)enumWhLocVol.;
List<WmsLocation> locs = null;
try
{
locs = nearLocation.getFreeLocation(nearLocation, (enumWhType)requestDetail.whType, locCnt);
}
catch (DeiNiuNoFreeLocationkException er) //大整货位不足
{
batch2Cnt += batch3Cnt;
// batch2Cnt = 0;
}
if (locs != null)
{
foreach (WmsLocation loc in locs)
{
decimal c2 = batch3Cnt > batchMax3 ? batchMax3 : batch3Cnt;
// locsBatch2.Add(loc, c2);
locs2add.Add(loc, c2);
batch3Cnt -= batchMax3;
if (batch3Cnt < 0)
{
break;
}
}
if (batch3Cnt > 0)
{
batch2Cnt += batch3Cnt; ////大整货位不足,入小整
// batch2Cnt = 0;
}
}
}
if (batch2Cnt > 0)
{
nearLocation.locationId = lastBatch2Location;
decimal cnt = batch2Cnt / batchMax2;
locCnt = (int)Math.Ceiling(cnt);//有余数则会进一位
nearLocation.volType = (int)enumWhLocVol.;
List<WmsLocation> locs = null;
try
{
locs = nearLocation.getFreeLocation(nearLocation, (enumWhType)requestDetail.whType, locCnt);
}
catch (DeiNiuNoFreeLocationkException er) //大整货位不足
{
batch1Cnt += batch2Cnt;
// batch2Cnt = 0;
}
if (locs != null)
{
foreach (WmsLocation loc in locs)
{
decimal c2 = batch2Cnt > batchMax2 ? batchMax2 : batch2Cnt;
// locsBatch2.Add(loc, c2);
locs2add.Add(loc, c2);
batch2Cnt -= batchMax2;
if (batch2Cnt < 0)
{
break;
}
}
if (batch2Cnt > 0)
{
batch1Cnt += batch2Cnt; ////大整货位不足,入小整
// batch2Cnt = 0;
}
}
}
if (batch1Cnt > 0)
{
decimal cnt = batch1Cnt / batchMax1;
locCnt = (int)Math.Ceiling(cnt);
nearLocation.locationId = lastBatch1Location;
nearLocation.volType = (int)enumWhLocVol.;
List<WmsLocation> locs = null;
try
{
locs = nearLocation.getFreeLocation(nearLocation, (enumWhType)requestDetail.whType, locCnt);
}
catch (DeiNiuNoFreeLocationkException er) //小整货位不足
{
bulkCntFromBatch +=batch1Cnt;
//bulkCnt += batch1Cnt;
batch1Cnt = 0;
}
if (locs != null)
{
foreach (WmsLocation loc in locs)
{
decimal c1 = batch1Cnt > batchMax1 ? batchMax1 : batch1Cnt;
// locsBatch1.Add(loc.locationId, c1);
locs2add.Add(loc, c1);
batch1Cnt -= batchMax1;
if (batch1Cnt < 0)
{
break;
}
}
}
if (batch1Cnt > 0 )
{
if (batch2Cnt > 0) //大整货位不足,入零库
{
bulkCntFromBatch += batch1Cnt;
// bulkCnt += batch1Cnt;
batch1Cnt = 0;
}
else
{ //入大整
batch2Cnt = batch1Cnt;
nearLocation.volType = (int)enumWhLocVol.;
nearLocation.locationId = lastBatch2Location;
cnt = batch2Cnt / batchMax2;
locCnt = (int)Math.Ceiling(cnt);//有余数则会进一位
try
{
locs = nearLocation.getFreeLocation(nearLocation, (enumWhType)requestDetail.whType, locCnt);
}
catch (DeiNiuNoFreeLocationkException er) //大小整货位不足
{
bulkCntFromBatch += batch1Cnt;
// bulkCnt += batch1Cnt;
batch1Cnt = 0;
}
if (locs != null)
{
foreach (WmsLocation loc in locs)
{
decimal c2 = batch2Cnt > batchMax2 ? batchMax2 : batch2Cnt;
// locsBatch2.Add(loc, c2);
locs2add.Add(loc, c2);
batch2Cnt -= batchMax2;
if (batch2Cnt < 0)
{
break;
}
}
if (batch2Cnt > 0)
{
bulkCntFromBatch += batch1Cnt;
//bulkCnt += batch2Cnt; ////大小整货位不足,入零库
// batch2Cnt = 0;
}
}
}
}
batch3Cnt = 0;
batch2Cnt = 0;
batch1Cnt = 0;
//如果不允许整货入零库则报异常
if (!WmsConstants.IN_STOCK_NO_BATCH_LOCATION_IN_BULK && bulkCntFromBatch > 0)
{
if (WmsConstants.NO_FREE_LOCATION_USE_TMP)
{
WmsLocation loc = new WmsLocation();
loc.locationId = WmsConstants.TMP_BATCH_LOCATION;
locs2add.Add(loc, bulkCntFromBatch);
bulkCntFromBatch = 0;
}else
// string msg = string.Format("{0}", location);
throw new DeiNiuNoFreeLocationkException();
}
bulkCnt += bulkCntFromBatch;
}
if (bulkCnt > 0)
{
decimal cnt = bulkCnt / bulkMax;
locCnt = (int)Math.Ceiling(cnt);
nearLocation.volType = (int)enumWhLocVol.;
nearLocation.locationId = lastBulkLocation;
List<WmsLocation> locs = null;
try
{
locs = nearLocation.getFreeLocation(nearLocation, (enumWhType)requestDetail.whType, locCnt);
}
catch (DeiNiuNoFreeLocationkException er) //零货位不足
{
// throw er;
}
if (locs != null)
{
foreach (WmsLocation loc in locs)
{
decimal c = bulkCnt > bulkMax ? bulkMax : bulkCnt;
//locsBulk .Add(loc.locationId, c );
locs2add.Add(loc, c);
bulkCnt -= bulkMax;
if (bulkCnt < 0)
{
break;
}
}
}
//bulkCnt += 500;//for debug
if (bulkCnt > 0) //get locations from other sharing locations
{
// string msg = string.Format("{0}", location);
decimal goodsMaxcnt = goods.getMaxCount((int)enumWhLocVol.);
locCnt = (int)Math.Ceiling(bulkCnt / goodsMaxcnt) * 50;
dt = stock.queryOtherSharingLocations(goods, (int)enumWhLocVol., locCnt,
(enumWhType)requestDetail.whType);
lastLoc = "";
foreach (DataRow dr in dt.Rows)
{
stock = new WmsStock(dr);
if (lastLoc == "")
{
lastLoc = stock.locationId;
}
else
if (lastLoc.Equals(stock.locationId))
{
continue;
}
lastLoc = stock.locationId;
lastBulkLocation = stock.locationId;
decimal freeCntCapicity = Math.Ceiling((1 - Convert.ToDecimal(dr["usedPercent"].ToString())) * goodsMaxcnt);
if (freeCntCapicity <= 0)
{
continue;
}
if (bulkCnt > freeCntCapicity)
{
//locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), freeCntCapicity);
locs2add.Add(new WmsLocation( stock.locationId) , freeCntCapicity);
bulkCnt -= freeCntCapicity;
}
else
{
// locsUpdate.Add(new WmsStock( stock.locationId,stock.skuId), bulkCnt);
locs2add.Add(new WmsLocation(stock.locationId), bulkCnt);
bulkCnt = 0;
break;
}
}
if (bulkCnt > 0)
{
if (WmsConstants.NO_FREE_LOCATION_USE_TMP)
{
WmsLocation loc = new WmsLocation();
loc.locationId = WmsConstants.TMP_BULK_LOCATION;
locs2add.Add(loc, bulkCnt);
bulkCnt = 0;
}else
throw new DeiNiuNoFreeLocationkException();
}
}
}
foreach (var item in locs2add)
{
stock = new WmsStock();
stock.locationId = item.Key.locationId;
if (WmsConstants.IN_STOCK_PDA_SCAN)
{
stock.countIn += item.Value;
}
else
{
stock.count = item.Value;
}
stock.goodsId = requestDetail.goodsId;
stock.batch = requestDetail.batch;
stock.productDate = requestDetail.productDate;
stock.validDate = requestDetail.validDate;
stock.validationTerm = 1;
stock.operater = this.operId;
stock.state = (int)enumStockLocationStatus.;
stock.skuCode = skuCode;
stock.skuId = skuId;
stock.maintainDate = stock.getDateTime();
if (String.IsNullOrEmpty(stock.batch))
{
stock.batch = requestDetail.productDate ;
}
stock.Add();
logStock(requestDetail, stock, item.Value, enumInStoreType.);
}
// to update location count in stock
// Dictionary<WmsStock, decimal> locsUpdateStock = new Dictionary<WmsStock, decimal>();
// locsBatch1.Union(locsBatch2).Union(locsBulk); //合并
//locsUpdateStock.Concat(locsBatch1).Concat(locsBatch2).Concat(locsBulk); //合并
// mergeDictionary(locsBulk, mergeDictionary(locsBatch2, mergeDictionary(locsBatch1, locsUpdateStock)));
foreach (var item in locsUpdate)
{
stock = item.Key;
if (WmsConstants.IN_STOCK_PDA_SCAN)
{
stock.countIn += item.Value;
}
else
{
stock.count += item.Value;
}
stock.operater = this.operId;
stock.Update();
logStock(requestDetail, stock, item.Value, enumInStoreType.);
}
return batch2Cnt + batch1Cnt + bulkCnt <= 0;
}
internal enumRepResult newBarcode(string goodsId, string barcode,decimal packingQty,decimal chang,decimal kuan,decimal gao,decimal weight)
{
ErpGoods goods = new ErpGoods(goodsId);
if( goods.ID > 0)
{
if (String.IsNullOrEmpty(goods.barCode))
{
goods.barCode = barcode;
goods.Update();
}
DataTable dt = new Erp_packing().queryByGoodsId(goodsId);
DataView dv = dt.DefaultView;
dv.RowFilter = "barcode='" + barcode + "'";
if (dv.Count == 0)
{
Erp_packing ep = new Erp_packing();
ep.goodsId = goodsId;
ep.packingQty = packingQty;
ep.chang = chang;
ep.kuan = kuan;
ep.gao = gao;
ep.weight = weight;
ep.Add();
}
return enumRepResult.;
}
return enumRepResult.;
}
internal enumRepResult zhiTongSeedOut(int outDetailId, int inDetailId, decimal seedCnt)
{
WmsInRequestDetail wid = new WmsInRequestDetail(inDetailId);
WmsOutDetail wod = new WmsOutDetail(outDetailId);
wod.pickCount += seedCnt;
wid.receiveCount += seedCnt;
using (TransactionScope scope = new TransactionScope())
{
wod.Update();
wid.Update();
WmsStockRecord wsr = new WmsStockRecord();
wsr.orderNo = wod.orderNo;
wsr.orderDetailId = wod.ID;
wsr.goodsId = wid.goodsId;
wsr.count = seedCnt;
wsr.locationId = wid.partion+"";
wsr.Add();
WmsOutPickPort wop = new WmsOutPickPort();
wop.recordId = wsr.ID;
wop.pickBy = operId;
wop.pickTime = wop.getDateTime();
wop.partion = wid.partion;
wop.pickCount = seedCnt;
wop.pickOrderNo = wid.pickOrderNo;
wop.state = (int)enumPickState.;
wop.recType = (int)enumStockRecordType.;
wop.Add();
scope.Complete();
}
return enumRepResult.;
}
/*
private Dictionary<string, decimal> addLocsUpdate(Dictionary<string, decimal> locsUpdate, string locationId, decimal count)
{
if (locsUpdate.Keys.Contains(locationId))
{
locsUpdate[locationId] += count;
}
else
{
locsUpdate[locationId] = count;
}
return locsUpdate;
}
private Dictionary<WmsStock, decimal> mergeDictionary(Dictionary<WmsStock, decimal> dic1, Dictionary<WmsStock, decimal> dicto)
{
foreach (WmsStock key in dic1.Keys)
{
dicto[key] = dic1[key];
}
return dicto;
}
*/
private void logStock(WmsInRequestDetail request, WmsStock stock, decimal count,
enumInStoreType inStoreType, WmsStockPre stockPre = null)
{
WmsStockRecord r = new WmsStockRecord();
r.batch = request.batch.Trim();
if (WmsConstants.IN_STOCK_PDA_SCAN)
{
r.countIn = count;
}
else
{
r.count = count;
}
int recType =(int)enumStockRecordType.;
if (inStoreType == enumInStoreType.)
{
}
else if (inStoreType == enumInStoreType.)
{
recType = (int)enumStockRecordType.;
}
r.goodsId = request.goodsId.Trim();
if (stock != null)
{
WmsLocation loc = new WmsLocation(stock.locationId.Trim());
if (loc.part > 0) {
Node nd = new Node(loc.part);
r.partion = nd.flag;
}
r.locationId = stock.locationId.Trim();
r.productDate = stock.productDate;
r.validDate = stock.validDate;
}
if (stockPre != null)
{
r.locationId = stockPre.partion+"";
r.productDate = stockPre.productDate;
r.validDate = stockPre.validDate;
}
r.orderNo = request.orderNo.Trim();
r.regeditCode = request.regeditCode.Trim();
r.rectype = recType;//in
r.operater = this.operId;
r.skuCode = request.skuCode;
r.skuId = request.skuId;
r.orderDetailId = request.ID;
r.Add();
if ( WmsConstants.IN_STOCK_PDA_SCAN)
{
WmsInUpPort inPort = new WmsInUpPort();
inPort.count = count;
inPort.orderNo = request.orderNo;
inPort.locationId = r.locationId;//stock.locationId;
inPort.recordId = r.ID;
inPort.detailId = request.ID;
inPort.productDate = r.productDate;
inPort.validDate = r.validDate;
inPort.goodsId = r.goodsId;
inPort.batch = r.batch;
inPort.recType = r.rectype;
inPort.operater = this.operId;
inPort.state =(int) enumInStockDetailStatus.;
inPort.skuCode = request.skuCode;
inPort.skuId = request.skuId;
inPort.flowNo = request.flowNo;
inPort.inPreOrder = request.preInOrder;
inPort.partion = r.partion;
inPort.Add();
//add up shelf task
string jobNo = Util.getOrderNo(enumCreateOrderType.preInOrder, _obj.getNextSeq(enumCreateOrderType.preInOrder));
WmsFlow wmsflow = new WmsFlow();
wmsflow.operater = operId;
wmsflow.orderNo = r.orderNo;
wmsflow.type = (int)Util.getTaskType(inPort.recType);
wmsflow.task = jobNo;
// wmsflow.fromPartion = inPort.partion;
wmsflow.toPartion = inPort.partion;
wmsflow.taskPartion = inPort.partion;
wmsflow.Add();
}
}
public bool deleteInRequest(string orderNo)
{
WmsInRequest inr = new WmsInRequest(orderNo);
bool r = false;
if ((enumInStockOrderStatus)inr.state == enumInStockOrderStatus.)
{
return false;
}
using (TransactionScope scope = new TransactionScope())
{
r= inr.deleteRequest(orderNo);
scope.Complete();
}
return r;
}
/// <summary>
/// PDA入库上架单列表
/// </summary>
/// <param name="flowNo">预打印的上架流水号 </param>
/// <returns></returns>
public DataTable getPortStockInDetailsByFlowNo(string flowNo)
{
//return getWmsInRequest.getStockInDetail(id);
return getWmsInRequest.getInPortDetails( flowNo);
}
/// <summary>
/// PDA入库上架单明细
/// </summary>
/// <param name="portId">上架 port Id </param>
/// <returns></returns>
public DataTable getPortStockInDetailByPortId(int portId)
{
//return getWmsInRequest.getStockInDetail(id);
return getWmsInRequest.getInPortDetail(portId);
}
internal enumRepResult finishUpShelfItem(string flowNo, int portId, decimal count, string locationId, string reason)
{
WmsInUpPort inPort = new WmsInUpPort(portId);
if (count<=0)
{
return enumRepResult.;
}
if (inPort.state == (int)enumInStockDetailStatus.)
{
return enumRepResult.;
}
inPort.upCount += count;
if (inPort.upCount > inPort.count)
{
return enumRepResult.;
}
string description = string.Format("\n type{0},目标货位{1},实际货位{2} 上架数量{3} 备注:{4}",
inPort.recType,inPort.locationId,locationId, count, reason);
LogHelper.debug(GetType(), description);
WmsStockRecord sr1 = new WmsStockRecord();
sr1.count = count;
sr1.count1 = inPort.upCount;
sr1.goodsId = inPort.goodsId;
sr1.batch = inPort.batch;
sr1.skuId = inPort.skuId;
sr1.skuCode = inPort.skuCode;
sr1.description = description;
sr1.orderNo = inPort.orderNo;
sr1.operater = operId;
sr1.rectype = inPort.recType;
sr1.productDate = inPort.productDate;
sr1.validDate = inPort.validDate;
sr1.locationId = locationId;
sr1.skuCode = inPort.skuCode;
sr1.skuId = inPort.skuId;
sr1.orderDetailId = inPort.detailId;
WmsStock stk = new WmsStock( inPort.locationId,inPort.skuId); //
lWmsStock lsk = new lWmsStock(operId);
enumRepResult rp = lsk.validLocation(locationId, inPort.goodsId, inPort.skuId, inPort.batch, inPort.count);
if (rp != enumRepResult.)
{
return rp;
}
if (stk.ID == 0)
{
stk.skuCode = inPort.skuCode;
stk.goodsId = inPort.goodsId;
stk.skuId = inPort.skuId;
stk.locationId = locationId;
stk.batch = inPort.batch;
stk.productDate = inPort.productDate;
stk.validDate = inPort.validDate;
stk.maintainDate = stk.getDateTime();
}
//WmsStock stk2; ;
stk.operater = operId;
stk.countIn -= count;
stk.countIn = stk.countIn > 0 ? stk.countIn : 0;
if (locationId == inPort.locationId)
{
stk.count += count;
}
else
{
inPort.description += string.Format(";{0}:{1}:{2}:{3}", locationId, count,operId, DateTime.Now);
}
enumRepResult result = enumRepResult.;
using (TransactionScope scope = new TransactionScope())
{
if (0 < inPort.upCount && inPort.upCount < inPort.count)
{
inPort.state = (int)enumInStockDetailStatus.;
}
else if (inPort.upCount == inPort.count)
{
inPort.state = (int)enumInStockDetailStatus.;
}
inPort.Update();
sr1.Add();
if (stk.ID == 0)
{
stk.Add();
}
if (locationId != inPort.locationId) //手工指定货位
{
WmsLocation loc = new WmsLocation(locationId);
if (loc.ID == 0)
{
return enumRepResult.;
}
WmsInUpPort newPort = new WmsInUpPort(inPort.getDetail(inPort.ID).Rows[0]);
newPort.state = (int)enumInStockDetailStatus.;
newPort.count = count;
newPort.upCount = count;
newPort.description = description;
newPort.locationId = locationId;
newPort.Add();
/*
WmsStock newStk = new WmsStock( locationId,inPort.skuId);
if (newStk.ID == 0) //new one
{
newStk.skuCode = inPort.skuCode;
newStk.goodsId = inPort.goodsId;
newStk.skuId = inPort.skuId;
newStk.locationId = locationId;
newStk.batch = inPort.batch;
newStk.productDate = inPort.productDate;
newStk.validDate = inPort.validDate;
newStk.maintainDate = newStk.getDateTime();
newStk.Add();
}
*/
result = new lWmsStock(this.operId).upDownGoodsCountWithLocation(locationId, inPort.goodsId, inPort.skuId, inPort.batch, count, "",
enumStockRecordType., inPort.recordId);
if (result != enumRepResult.)
{
scope.Dispose();
return result;
}
}
if (stk.ID > 0) // always should be existed already.
stk.updateCountOut();
//是否一托货全部完成上架
/*
if (inPort.isDoneByFlow(flowNo))
{
//free flow number
// WmsFlow.free(flowNo);
WmsFlow.done(flowNo);
}
*/
LogHelper.debug(GetType(), "isDoneByDetailId ? " + inPort.detailId);
// WmsInRequestDetail requestDetail = new WmsInRequestDetail(inPort.detailId);
/*
Erp_purch_d epd = new Erp_purch_d(new WmsInRequestDetail(inPort.detailId).purch_d_id);
epd.onShelfCount += count;
if (epd.onShelfCount >= epd.validCount && epd.wms_state == (int)enumReceiveStockDetailStatus.已验收)
{
epd.wms_state = (int)enumReceiveStockDetailStatus.已上架;
}
epd.operater = operId;
epd.Update();
*/
if (inPort.isDoneByDetailId(inPort.detailId))
{
LogHelper.debug(GetType(), "isDoneByDetailId ? " + true);
/*
WmsInRequest wir = new WmsInRequest(inPort.orderNo);
wir.state = (int)enumInStockOrderStatus.已上架;
wir.operater = operId;
wir.Update();
WmsInRequestDetail wid = new WmsInRequestDetail(inPort.detailId);
wid.state = (int)enumInStockDetailStatus.上架完成;
wid.operater = operId;
wid.Update();*/
getWmsInRequest.finishUpShelf(inPort.orderNo, inPort.detailId,operId); //更新订单及明细状态
//更新ERP 上架数据
updateErpDetail(inPort.detailId);
}
// if (inPort.isDoneByOrderNo(inPort.orderNo))
{
}
scope.Complete();
}
return enumRepResult.;
}
/// <summary>
/// 待收货列表
/// </summary>
/// <param name="querystr"></param>
/// <param name="rownumStart"></param>
/// <param name="rownumEnd"></param>
/// <returns></returns>
public DataSet queryReceives(string querystr, int rownumStart, int rownumEnd)
{
return erpPurchObj.queryReceiveNos(querystr, rownumStart, rownumEnd);
}
/// <summary>
/// 收货、原始采购订单明细
/// </summary>
/// <param name="orderNo"></param>
/// <returns></returns>
public DataTable getRequestInDetail(string orderNo,int status =-1)
{
return erpPurchObj.queryPurchDetail(orderNo,status); ;
}
public DataTable getRequestDetailByVender(string venderName, int status = -1)
{
return erpPurchObj.getRequestDetailByVender(venderName, status); ;
}
/// <summary>
/// 收货、原始采购订单明细
/// </summary>
/// <param name="orderNo"></param>
/// <returns></returns>
public DataTable get4ValidDetail(string orderNo)
{
return erpPurchObj.get4ValidDetail(orderNo); ;
}
/// <summary>
/// 记录收货明细
/// </summary>
/// <param name="id"></param>
/// <param name="arriveNumber">到货数量</param>
/// <param name="count">收货数量、拒收数量</param>
/// <param name="inType">0:收货1拒收</param>
/// <param name="inRemark"></param>
/// <returns></returns>
internal bool receiveDetail(string preInNo, int id, decimal arriveNumber, decimal count, int inType, string inRemark,
int shipId, bool isCache, int cachePartion, decimal temperature = 0 )
{
Erp_purch_d epd = new Erp_purch_d(id);
if (epd.count == 0)
{
return false;
}
decimal rcNumber =inType == 0?count : 0;
decimal rjNumber = inType == 1 ? count : 0;
epd.arriveCount += arriveNumber;
epd.receiveCount += rcNumber;
epd.rejectCount += rjNumber;
epd.storeType = isCache ? 1 : 0;
epd.zhitongPartion = cachePartion;
enumReceiveStockDetailStatus nextState = enumReceiveStockDetailStatus.;
WmsGoods wg = new WmsGoods(epd.goods_id);
if (!wg.isQc)
{
nextState = enumReceiveStockDetailStatus.;
}
if (!WmsConstants.IN_STOCK_OVER_RECEIVE)
{
epd.receiveCount = epd.receiveCount > epd.count? epd.count: epd.receiveCount ;
}
if (epd.receiveCount > 0)
{
if (epd.receiveCount + epd.rejectCount >= epd.count) //应收数量计算,包含拒收数量
{
epd.wms_state = (int)nextState;
}
}
else
{
if ( epd.rejectCount >= epd.count)
{
epd.wms_state = (int)enumReceiveStockDetailStatus.;
}
}
epd.operater = this.operId;
epd.receiveRemark = inRemark;
//add receive log
Erp_purch_receive_log erl = new Erp_purch_receive_log();
erl.preInOrder = preInNo;
erl.arriveCount = arriveNumber;
erl.receiveCount = rcNumber;
erl.rejectCount = rjNumber;
erl.receiveRemark = inRemark;
erl.shipId = shipId;
erl.operater = this.operId;
erl.pur_order = epd.pur_order;
erl.purch_d_id = epd.ID;
erl.temperature = temperature;
using (TransactionScope scope = new TransactionScope())
{
erl.Add();
epd.Update();
bool isReject = true;
bool isAllProceed = true;
DataTable dt = getRequestInDetail(epd.pur_order);
foreach (DataRow dr in dt.Rows)
{
if (Convert.ToInt16(dr["wms_state"].ToString()) == (int)enumReceiveStockDetailStatus.)
{
isAllProceed = false;
isReject = false;
break;
}
isReject = isReject
&& (Convert.ToInt16(dr["wms_state"].ToString()) == (int)enumReceiveStockDetailStatus.);
}
// process order
Erp_purch ep = new Erp_purch(epd.pur_order);
ep.operater = this.operId;
if (isAllProceed)
{
ep.wms_state = isReject ? (int)enumInStockOrderStatus. : (int)nextState;
ep.Update();
}
else
{
if (rcNumber > 0)
{
//ep.wms_state = isReject ? (int)enumInStockOrderStatus.已拒收 : (int)enumInStockOrderStatus.待验收;
ep.canValid = !isReject; //部分验收
ep.Update();
}
}
//to create/update inRequest,indetail for no qc goods.
if (!wg.isQc)
{
if ( string.IsNullOrEmpty(epd.batch) || string.IsNullOrEmpty(epd.productDate)||string.IsNullOrEmpty(epd.validDate))
{
return false;
}
createInrequest4NoQc((enumInOrderType)ep.orderType, epd, isCache, cachePartion, wg);
}
scope.Complete();
}
return true;
}
void createInrequest4NoQc( enumInOrderType orderType, Erp_purch_d epd,bool isCache, int cachePartion, WmsGoods wg)
{
StructsValideIn svi = new StructsValideIn();
svi.goods_id = epd.goods_id;
svi.flowNo = epd.ID+"";
svi.seeds_count = 0;
svi.valid_count = epd.count;
svi.validby = 0;
svi.validAccount = "";
svi.validAccount1 = "";
svi.reason = "No QC needed.";
svi.validResult = 0;
svi.receive_order = epd.pur_order;
svi.purch_d_id = epd.ID;
svi.wms_state = (int)enumReceiveStockDetailStatus.;
svi.batch = "";
svi.product_date = "";
svi.save_date = "";
svi.zhitongPartion = cachePartion;
svi.validResult = cachePartion > 0 ? (int)enumWhType. : (int)getWhType(orderType);
svi.whType = svi.validResult;
string skuCode = string.Format("{0}:{1};", "goodsId", epd.goods_id);
int skuId = new lLot().getSKU(skuCode, null, wg.lotId, epd.goods_id, wg.ownerCode);
svi.skuCode = skuCode;
svi.skuId = skuId;
validIn(svi,true);
}
private enumWhType getWhType(enumInOrderType orderType)
{
enumWhType whType = enumWhType.;
switch (orderType)
{
case enumInOrderType.:
whType = enumWhType.;
break;
case enumInOrderType.:
whType = enumWhType.;
break;
case enumInOrderType.退:
whType = enumWhType.退;
break;
case enumInOrderType.:
whType = enumWhType.;
break;
}
return whType;
}
/// <summary>
/// OBSOLETED!!!!!
/// </summary>
/// <param name="orderNo"></param>
/// <param name="inType">收货 or 拒收</param>
/// <param name="inRemark"></param>
/// <returns></returns>
internal bool receiveByOrder(string orderNo, int inType, string inRemark, int shipId, bool isCache, int cachePartion)
{
Erp_purch ep = new Erp_purch(orderNo);
DataTable dt = getRequestInDetail(orderNo);
decimal rcNumber = 0;
decimal rjNumber = 0;
Erp_purch_d epd ;
bool isNeedQc = false;
enumReceiveStockDetailStatus nextState = enumReceiveStockDetailStatus.;
WmsGoods wg;
using (TransactionScope scope = new TransactionScope())
{
foreach (DataRow dr in dt.Rows)
{
epd = new Erp_purch_d(dr);
nextState = enumReceiveStockDetailStatus.;
epd.storeType = isCache ? 0 : 1;
epd.zhitongPartion = cachePartion;
wg = new WmsGoods(epd.goods_id);
if (!wg.isQc) //跳过验收界面,直接进入入库环节
{
nextState = enumReceiveStockDetailStatus.;
//create inrequest
createInrequest4NoQc((enumInOrderType)ep.orderType,epd, isCache, cachePartion, wg);
}
else
{
isNeedQc = true;
}
rcNumber = inType == 0 ? epd.count - epd.receiveCount: 0;
rjNumber = inType == 1 ? epd.count - epd.receiveCount : 0;
epd.arriveCount += rcNumber + rjNumber;
epd.receiveCount += rcNumber;
epd.rejectCount += rjNumber;
epd.wms_state = inType == 0 ? (int)nextState : (int)enumReceiveStockDetailStatus.;
epd.operater = this.operId;
epd.Update();
Erp_purch_receive_log erl = new Erp_purch_receive_log();
erl.arriveCount = rcNumber + rjNumber;
erl.receiveCount = rcNumber;
erl.rejectCount = rjNumber;
erl.receiveRemark = inRemark;
erl.shipId = shipId;
erl.operater = this.operId;
erl.pur_order = epd.pur_order;
erl.purch_d_id = epd.ID;
erl.Add();
}
enumInStockOrderStatus nextphState = isNeedQc ? enumInStockOrderStatus. : enumInStockOrderStatus.;
ep.wms_state = inType == 1 ? (int)enumInStockOrderStatus. : (int)nextphState;
ep.operater = this.operId;
ep.receiveRemark = inRemark;
ep.Update();
scope.Complete();
}
return true;
}
internal DataSet queryValidation(string querystr, int rownumStart, int rownumEnd)
{
return erpPurchObj.queryValidation(querystr, rownumStart, rownumEnd);
}
internal DataTable getValidedInDetail(string orderNo, int status =-1)
{
return erpPurchObj.getValidedInDetail(orderNo, status);
}
internal bool validIn(StructsValideIn validIn, bool isInStockNow = false, int recommandWareHouse = 0)
{
using (TransactionScope scope = new TransactionScope())
{
Erp_purch_d epd = new Erp_purch_d(validIn.purch_d_id);
Erp_purch ep = new Erp_purch(epd.pur_order);
epd.validCount += validIn.valid_count;
decimal acount = epd.count /*-epd.receiveCount*/ -epd.rejectCount;
epd.wms_state = epd.validCount >= acount /*epd.receiveCount*/ ? (int)enumReceiveStockDetailStatus. : epd.wms_state;
epd.operater = this.operId;
epd.Update();
if (String.IsNullOrEmpty(validIn.batch))
{
validIn.batch = validIn.product_date;
}
Erp_receiveValidDetail erd = new Erp_receiveValidDetail();
erd.flowNo = validIn.flowNo;
erd.batch = validIn.batch;
erd.goods_id = validIn.goods_id;
erd.operater = validIn.validby;// this.operId;
erd.purch_d_id = validIn.purch_d_id;
erd.receive_order = validIn.receive_order;
erd.reason = validIn.reason;
erd.seeds_count = validIn.seeds_count;
erd.valid_count = validIn.valid_count;
erd.productDate = validIn.product_date;
erd.validDate = validIn.save_date;
erd.validby = validIn.validby;
erd.validby1 = validIn.validby1;
erd.validResult = validIn.validResult;
erd.whType = validIn.zhitongPartion == 0 ? (int)getWhType((enumInOrderType)ep.orderType) : erd.validResult;
erd.wms_state = validIn.wms_state;
erd.erp_state = validIn.erp_state;
erd.preInOrder = String.IsNullOrEmpty(validIn.preInOrder) ? "" : validIn.preInOrder;
erd.skuId = validIn.skuId;
erd.skuCode = validIn.skuCode;
erd.partion = validIn.zhitongPartion;
erd.validbyTime = erd.getDateTime();
erd.validbyTime1 = erd.validbyTime;
erd.pickorderNo = validIn.pickOrderNo;
erd.Add();
bool isAllProceed = true;
DataTable dt = getRequestInDetail(epd.pur_order);
foreach (DataRow dr in dt.Rows)
{
// if (Convert.ToInt16(dr["wms_state"].ToString()) != (int)enumReceiveStockDetailStatus.待入库)
if (Convert.ToInt16(dr["wms_state"].ToString()) == (int)enumReceiveStockDetailStatus.
|| Convert.ToInt16(dr["wms_state"].ToString()) == (int)enumReceiveStockDetailStatus.
)
{
isAllProceed = false;
break;
}
}
if (isAllProceed)
{
ep.wms_state = (int)enumInStockOrderStatus.;
ep.operater = this.operId;
ep.Update();
}
//to create/update in stock request in wms.
WmsInRequest wir = new WmsInRequest(epd.pur_order);
if (wir.ID == 0)
{
// create new wmsInRequest
dt = ep.getRequestIn(ep.pur_order);
foreach (DataRow dr in dt.Rows)
{
wir = new WmsInRequest(dr);
break;
}
wir.operater = this.operId;
wir.orderType = 0;
wir.Add();
}
wir.state = (int)enumInStockOrderStatus.;
wir.Update();
dt = erd.getRequestValidInDetail(erd.ID); // 一条验收记录对应一个WmsInRequestDetail记录
foreach (DataRow dr in dt.Rows)
{
WmsInRequestDetail wid = new WmsInRequestDetail(dr);
wid.operater = this.operId;
wid.state = (int)enumInStockDetailStatus.;
wid.entid = epd.entid;
wid.Add();
if (isInStockNow)
{
try
{
requestDetailIn(wir, wid, recommandWareHouse);
}
catch (Exception er)
{
scope.Dispose();
throw er;
// return false;
}
}
break;
}
scope.Complete();
}
return true;
}
internal DataTable getReceivePreSumByVender(string venderId)
{
return erpPurchObj.getReceivePreSumByVender(venderId);
}
internal DataTable getReceivePreSumByVenderNotValided(string venderId)
{
return erpPurchObj.getReceivePreSumByVenderNotValided(venderId);
}
internal DataTable getReceivePreSumByPreNo(string preNo)
{
return erpPurchObj.getReceivePreSumByPreNo(preNo);
}
internal DataTable getReceiveHistory(string purOrderNo)
{
return erpPurchObj.getReceiveHistory(purOrderNo);
}
internal int newShipInfo(structShip ship)
{
Erp_purch_ship eps = new Erp_purch_ship();
eps.shipOrder = String.IsNullOrEmpty( ship.shipOrder)?"":ship.shipOrder;
eps.company = String.IsNullOrEmpty(ship.company) ? "" : ship.company;
eps.driverID = String.IsNullOrEmpty(ship.driverID) ? "" : ship.driverID;
eps.driverName = String.IsNullOrEmpty(ship.driverName) ? "" : ship.driverName;
eps.driverPhone = String.IsNullOrEmpty(ship.driverPhone) ? "" : ship.driverPhone;
eps.operater = this.operId;
eps.remark = String.IsNullOrEmpty(ship.remark) ? "" : ship.remark;
eps.temperature = ship.temperature ;
eps.veNumber = String.IsNullOrEmpty(ship.veNumber) ? "" : ship.veNumber;
eps.Add() ;
return eps.ID;
}
internal DataSet getShipRecs(string querystr, int rownumStart, int rownumEnd)
{
return erpPurchShipObj .QueryPages( querystr, rownumStart, rownumEnd);
}
internal DataSet getReceiveRecs(string querystr, int rownumStart, int rownumEnd)
{
return erpPurchObj.getReceiveRecs( querystr, rownumStart, rownumEnd);
}
internal DataTable getShipReceiveDetail(string shipNo)
{
return erpPurchShipObj.getShipReceiveDetail(shipNo);
}
internal DataTable getShipReceiveDetail(int shipId)
{
return erpPurchShipObj.getShipReceiveDetail(shipId);
}
internal DataTable getShipDetail(string shipNo)
{
return erpPurchShipObj.getShipDetail(shipNo);
}
internal DataSet queryValidationLog(string querystr, int rownumStart, int rownumEnd)
{
return erpPurchObj.queryValidationLog(querystr, rownumStart, rownumEnd);
}
//----多笔订单一起验收
internal string receiveDetailsPre(enumInOrderType ordeType, int[] ids, int shipId,string venderId)
{ string preNo="";
List<Erp_purch_d> lst = new List<Erp_purch_d>();
foreach (int id in ids)
{
lst.Add(new Erp_purch_d(id));
}
using (TransactionScope scope = new TransactionScope())
{
foreach (Erp_purch_d pd in lst)
{
receiveDetailPre(pd.pur_order, ordeType, pd.ID, pd.count, "", shipId);
pd.wms_state = (int)enumReceiveStockDetailStatus.;
pd.Update();
}
preNo = postPreIn(venderId, shipId);
foreach (Erp_purch_d pd in lst)
{
receivePreDetail(preNo, pd.goods_id, pd.count, pd.count, 0, "", false, 0, 0);
}
scope.Complete();
}
return preNo;
}
/// <summary>
/// 条目预收
/// </summary>
/// <param name="id"></param>
/// <param name="arriveNumber"></param>
/// <param name="inRemark"></param>
/// <param name="shipId"></param>
/// <returns></returns>
internal bool receiveDetailPre(string orderNo,enumInOrderType ordeType,int id, decimal arriveNumber, string inRemark, int shipId)
{
//新到arriveNumber 允许负值最终预到明细的arriveCount不可负值
// Erp_purch_d ed = new Erp_purch_d(id);
Erp_purch_receive_pre eprp = new Erp_purch_receive_pre( );
eprp.getNewDetailByOrderDetailId(id);
eprp.mem = inRemark;
eprp.pur_order = orderNo;
eprp.purch_d_id = id;
if (eprp.ID > 0)
{
eprp.arriveCount += arriveNumber; //同一个采购单下,未生成预到单的,明细预到数量累积 ,同一个预到单号下预到明细ID唯一预到数量不累加。
//prp.arriveCount = eprp.arriveCount > 0 ? eprp.arriveCount : 0;
if (eprp.arriveCount <= 0)
{
return eprp.Delete()>0;
}
return eprp.Update() > 1;
}
else if (arriveNumber > 0)
{
eprp.orderType = (int)ordeType;
eprp.arriveCount = arriveNumber;
return eprp.Add() >1;
}
return false;
}
/// <summary>
/// 整单预收
/// </summary>
/// <param name="orderNo"></param>
/// <param name="inRemark"></param>
/// <param name="shipId"></param>
/// <returns></returns>
internal bool receiveByOrderPre(string orderNo,enumInOrderType ordeType, string inRemark, int shipId)
{
DataTable dt = getRequestInDetail(orderNo);
Erp_purch_d epd;
// Erp_purch_receive_pre eprp;
foreach (DataRow dr in dt.Rows)
{
epd = new Erp_purch_d(dr);
receiveDetailPre(orderNo,ordeType, epd.ID, epd.count - epd.receiveCount, inRemark, shipId);
/*
eprp = new Erp_purch_receive_pre(epd.pur_order, epd.ID);
if (eprp.ID > 0)
{
eprp.arriveCount = epd.count - epd.receiveCount;
eprp.mem = inRemark;
eprp.Update();
continue;
}
eprp.arriveCount = epd.count - epd.receiveCount;
eprp.mem = inRemark;
eprp.pur_order = epd.pur_order;
eprp.purch_d_id = epd.ID;
eprp.Add();
*/
}
return true;
}
internal DataTable queryPurchDetailByVender(string venderId, int status)
{
return erpPurchObj.queryPurchDetailByVender(venderId, status);
}
internal string postPreIn(string venderId ,int shipid)
{
string preInNo = Util.getOrderNo(enumCreateOrderType.preInOrder, preInObj.getNextSeq(enumCreateOrderType.preInOrder));
if (preInObj.postPreIn(venderId, preInNo, shipid))
{
if (WmsConstants.IN_STOCK_PREIN_AUTO_RECEIVE)
{
receivePreDetailAuto(preInNo);
}
return preInNo;
}
return "";
}
internal bool receivePreDetailAuto(string preInNo)
{
DataTable dt = preInObj.getDetailByOrder(preInNo);
DataView dv = dt.DefaultView;
dv.Sort = "count1 asc";
decimal epdReceiveCount = 0;
decimal epdMax = 0;
bool ret = false;
Erp_purch_d epd;
Erp_purch_receive_pre eprd;
foreach (DataRowView dr in dv)
{
epd = new Erp_purch_d(dr.Row);
eprd = new Erp_purch_receive_pre(preInNo, epd.ID);
// epdMax = epd.count - epd.rejectCount - epd.receiveCount;
decimal receiveNumber = eprd.arriveCount;
decimal arriveNumber = eprd.arriveCount;
epdMax = eprd.arriveCount - eprd.receiveCount;
if (epdMax == 0)
{
continue;
}
if (epdMax >= receiveNumber)
{
epdReceiveCount = receiveNumber;
}
else
{
epdReceiveCount = epdMax;
}
using (TransactionScope scope = new TransactionScope())
{
ret = receiveDetail(preInNo, epd.ID, arriveNumber, epdReceiveCount, 0, "AutoReceive", eprd.shipId, false, 0, 100);
ret = ret && eprd.receive(preInNo, epd.ID, epdReceiveCount, operId) > 0;
scope.Complete();
}
receiveNumber = receiveNumber - epdReceiveCount;
}
return ret;
}
internal DataTable getPreInDetail(string preInNo)
{
return preInObj.getPreInDetailWince(preInNo);
}
/// <summary>
/// pda 收货,基于预收数据
/// </summary>
/// <param name="preInNo"></param>
/// <param name="goodsId"></param>
/// <param name="arriveNumber"></param>
/// <param name="receiveNumber"></param>
/// <param name="inType"></param>
/// <param name="inRemark"></param>
/// <param name="isCache"></param>
/// <param name="cachePartion"></param>
/// <returns></returns>
internal bool receivePreDetail(string preInNo, string goodsId, decimal arriveNumber, decimal receiveNumber,
int inType, string inRemark,bool isCache, int cachePartion,decimal temperature)
{
DataTable dt = preInObj.getDetailByOrder(preInNo);
DataView dv = dt.DefaultView;
dv.RowFilter = string.Format("goodsId ='{0}' ", goodsId );
dv.Sort = "count1 asc";
decimal epdReceiveCount = 0;
decimal epdMax = 0;
bool ret = false;
Erp_purch_d epd;
Erp_purch_receive_pre eprd;
foreach (DataRowView dr in dv)
{
epd = new Erp_purch_d(dr.Row);
eprd = new Erp_purch_receive_pre(preInNo, epd.ID);
// epdMax = epd.count - epd.rejectCount - epd.receiveCount;
epdMax = eprd.arriveCount - eprd.receiveCount;
if (epdMax == 0)
{
continue;
}
if (epdMax >= receiveNumber)
{
epdReceiveCount = receiveNumber;
}
else
{
epdReceiveCount = epdMax;
}
using (TransactionScope scope = new TransactionScope())
{
ret = receiveDetail(preInNo, epd.ID, arriveNumber, epdReceiveCount, inType, inRemark, eprd.shipId, isCache, cachePartion, temperature);
ret = ret && eprd.receive(preInNo, epd.ID, epdReceiveCount, operId)>0;
scope.Complete();
}
receiveNumber = receiveNumber - epdReceiveCount;
if (receiveNumber <= 0)
{
break;
}
}
return ret;
}
public decimal getValidSeedsCnt(string goodsId, decimal batchCount)
{
WmsGoods wg = new WmsGoods(goodsId);
decimal bigcount = wg.bigCount;
if (bigcount == 0)
{
return -1;
}
decimal bulkcnt = batchCount % bigcount;
decimal boxcnt = (batchCount - bulkcnt) / bigcount;
decimal seedsStep = WmsConstants.GOODS_IN_VALID_SEEDS_BOXS_STEP;
decimal minStep = WmsConstants.GOODS_IN_VALID_SEEDS_BOXS_STEP_MIN; ;
decimal stepFactor = WmsConstants.GOODS_IN_VALID_SEEDS_BOXS_STEP_FACTOR; ;
decimal seedsCount = 0;
if (boxcnt < seedsStep)
{
if (boxcnt > minStep)
{
seedsCount = minStep;
}
else
{
seedsCount = boxcnt;
}
}
else
{
seedsCount = minStep + Math.Ceiling((boxcnt - seedsStep) / seedsStep) * stepFactor;
}
seedsCount = seedsCount > 0 ? seedsCount : 1;
return seedsCount;
}
internal DataTable getGoodsPackByBarcode(string barcode)
{
return new WmsGoods().getGoodsBybarcod(barcode);
}
internal DataTable getGoodsDetailByBarcode(string barcode)
{
return new WmsGoods().getGoodsDetailBybarcode(barcode);
}
internal DataTable getReceiveDetailByBarcode(string preInOrder,string barcode)
{
return this.preInObj.getReceiveDetailByBarcode(preInOrder,barcode);
}
internal enumValidInResult validIn(string preInNo, string flowNo, string goodsId, decimal batchCount, decimal seedsCnt,
Dictionary<string, string> skuValues, bool isPass, bool isIsuLocations,int secondValidUser=0,int recommandWareHouse=0,
bool ischeckLeftValidDays=true, bool isFlowUni=false,bool isZhitong=false,string pickOrderNo=null,int zhitongPartion=0)
{
if (isFlowUni)
{
DataTable tmp = getWmsInRequest.getInPortDetails(preInNo, flowNo);
if(tmp.Rows.Count > 0)
{
return enumValidInResult.使;
}
}
decimal epdValidCount = 0;
decimal epdMax = 0;
bool ret = false;
Erp_purch_d epd;
Erp_purch_receive_pre eprd ;
string skuCode = "";
int skuId = 0;
StructsValideIn svi = new StructsValideIn();
try
{
if (!isZhitong && skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME))
{
skuValues[WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME] = Util.getShortDateString(skuValues[WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME]);
if (skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME))
{
skuValues[WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME] = Util.getShortDateString(skuValues[WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME]);
DateTime prdDate= Util.pareseDateString(skuValues[WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME]);
DateTime validDate= Util.pareseDateString(skuValues[WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME]);
if (prdDate >= validDate
|| prdDate > DateTime.Now
|| validDate < DateTime.Now)
{
return enumValidInResult.;
}
TimeSpan ts1 = new TimeSpan(validDate.Ticks);
TimeSpan ts2 = new TimeSpan(prdDate.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
int expDays = ts.Days;
ts = ts1.Subtract(new TimeSpan(DateTime.Now.Ticks)).Duration();
int leftDays = ts.Days;
if (ischeckLeftValidDays && leftDays < WmsConstants.IN_STOCK_LEFT_VALID_DAYS)
{
return enumValidInResult.;
}
if (ischeckLeftValidDays && leftDays < expDays * WmsConstants.IN_STOCK_LEFT_VALID_DAYS)
{
// return enumValidInResult.临期商品;
}
}
}
}
catch (Exception e)
{
LogHelper.debug(this.GetType(),"日期格式错误" );
LogHelper.WriteLog(this.GetType(), e);
return enumValidInResult.;
}
svi.validby1 = secondValidUser;
if (!isZhitong && isPass)
{
Dictionary<int, string> dic =new lLot(operId).getSKU(skuValues, goodsId);
foreach (int i in dic.Keys)
{
skuId = i;
skuCode = dic[i];
break;
}
svi.validResult = (int)enumWhType.;
}
else
{
svi.validResult = (int)enumWhType.;
}
svi.goods_id = goodsId;
svi.validby = operId;
svi.reason = "";
// svi.receive_order = preInNo;
svi.wms_state = (int)enumReceiveStockDetailStatus.;
svi.batch = "";
svi.product_date = "";
svi.save_date = "";
svi.preInOrder = preInNo;
svi.flowNo = flowNo;
svi.pickOrderNo=pickOrderNo;
if (skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_BATCH_ATTNAME))
svi.batch = skuValues[WmsConstants.SKU_RESEVRED_BATCH_ATTNAME];
if (skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME))
svi.product_date = skuValues[WmsConstants.SKU_RESEVRED_PRDDATE_ATTNAME];
if (skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME))
svi.save_date = skuValues[WmsConstants.SKU_RESEVRED_EXPIREDATE_ATTNAME];
if (skuValues.ContainsKey(WmsConstants.SKU_RESEVRED_ENTI_ATTNAME))
svi.entId = skuValues[WmsConstants.SKU_RESEVRED_ENTI_ATTNAME];
//svi.zhitongPartion = 1;
// svi.validResult = (int)enumWhType.越仓收货区;
svi.skuCode = skuCode;
svi.skuId = skuId;
DataTable dt = preInObj.getDetailByOrder(preInNo);
DataView dv = dt.DefaultView;
dv.RowFilter = string.Format("goodsId ='{0}' ", goodsId);
dv.Sort = "count1 asc";
using (TransactionScope scope = new TransactionScope())
{
foreach (DataRowView dr in dv)
{
epd = new Erp_purch_d(dr.Row);
eprd = new Erp_purch_receive_pre(preInNo, epd.ID);
// epdMax = epd.count - epd.rejectCount - epd.receiveCount;
svi.whType = (int)getWhType((enumInOrderType)eprd.orderType);
epdMax = eprd.receiveCount - eprd.validCount;
if (epdMax == 0)
{
continue;
}
if (epdMax >= batchCount)
{
epdValidCount = batchCount;
}
else
{
epdValidCount = epdMax;
}
svi.receive_order = epd.pur_order;
svi.seeds_count = seedsCnt;
svi.valid_count = batchCount;
svi.purch_d_id = epd.ID;
svi.whType = (int)getWhType((enumInOrderType)eprd.orderType);
if (isZhitong || epd.storeType == 1)//越仓
{
svi.zhitongPartion = zhitongPartion;// epd.zhitongPartion;
svi.validResult = (int)enumWhType.;
svi.whType = (int)enumWhType.;
}
eprd.validCount += batchCount;
eprd.operater = operId;
eprd.Update();
ret = validIn(svi, isIsuLocations, recommandWareHouse );
if (!ret)
{
scope.Dispose();
return enumValidInResult.;
}
ret = ret && eprd.Update() > 0;
batchCount = batchCount - epdValidCount;
if (batchCount <= 0)
{
break;
}
}
//creat tasks/jobs
DataTable inPorts = this.getWmsInRequest.getInPortDetails(flowNo);
dv = inPorts.DefaultView;
dv.RowFilter = "jobNo is null";
dv.Sort = "partion";
int lastPartion = 0;
foreach (DataRow dr in inPorts.Rows)
{
WmsInUpPort port = new WmsInUpPort(dr);
if (lastPartion != port.partion)
{
port.jobNo = Util.getOrderNo(enumCreateOrderType.pickJobNo, _obj.getNextSeq(enumCreateOrderType.pickJobNo));
port.Update();
WmsFlow wmsflow = new WmsFlow();
wmsflow.operater = operId;
wmsflow.orderNo = preInNo;
wmsflow.flowNo = flowNo;
wmsflow.type = (int)enumStockRecordType.;
wmsflow.typeName = enumStockRecordType..ToString(); ;
wmsflow.task = port.jobNo;
wmsflow.taskPartion = port.partion;
wmsflow.Add();
}
lastPartion = port.partion;
}
scope.Complete();
return enumValidInResult.;
}
}
/// <summary>
/// 按单取消
/// </summary>
/// <param name="preInNo">预到单</param
/// <param name="skuId">SkuID</param>
/// <returns></returns>
internal bool retrieveValidByPreNo(string preInNo,int skuId=0)
{
WmsInRequestDetail wid = new WmsInRequestDetail();
DataTable dt = wid.getByPreInOrder(preInNo);
foreach(DataRow dr in dt.Rows)
{
wid=new WmsInRequestDetail(dr);
if (skuId == 0 || skuId > 0 && skuId == wid.skuId)
{
retrieveValidByDetailId(wid.ID);
}
}
return true;
}
/// <summary>
/// 按板取消
/// </summary>
/// <param name="flowNo"></param>
/// <returns></returns>
internal bool retrieveValidByFlow(string flowNo)
{
WmsInRequestDetail wid = new WmsInRequestDetail();
DataTable dt = wid.getByFlowNo(flowNo);
foreach (DataRow dr in dt.Rows)
{
wid = new WmsInRequestDetail(dr);
if (flowNo == wid.flowNo)
{
retrieveValidByDetailId(wid.ID);
}
}
return true;
}
/// <summary>
/// 撤销验收记录
/// </summary>
/// <param name="detailId">验收记录ID,wmsRequestInDetail.id</param>
/// <returns></returns>
internal bool retrieveValidByDetailId(int detailId)
{
WmsInRequestDetail wid = new WmsInRequestDetail(detailId);
WmsInRequest wmsInRequest = new WmsInRequest(wid.orderNo);
wmsInRequest.state = (int)enumInStockOrderStatus.;
WmsInUpPort wip = new WmsInUpPort();
DataTable dtWip = wip.getJobsByFlowSku(wid.flowNo, wid.skuId);
DataTable dt = new Erp_receiveValidDetail().getDetailByFlowNo(wid.preInOrder, wid.flowNo);
using (TransactionScope scope = new TransactionScope())
{
foreach (DataRow dr in dtWip.Rows)
{
wip = new WmsInUpPort(dr);
if (wip.detailId == detailId)
{
if (wip.state == (int)enumInStockDetailStatus. || wip.state == (int)enumInStockDetailStatus.)
{
continue;
}
WmsStock wmsStock = new WmsStock(wip.locationId, wip.skuId);
if (wmsStock.ID > 0)
{
wmsStock.countIn -= wip.count;
wmsStock.updateCountOut();
}
wip.state = (int)enumInStockDetailStatus.;
wip.description += String.Format("上架取消 by {0},{1}", operId, DateTime.Now);
wip.Update();
}
}
Erp_purch_receive_pre epr;
Erp_receiveValidDetail erv;
foreach (DataRow dr in dt.Rows)
{
erv = new Erp_receiveValidDetail(dr);
if (erv.skuId == wid.skuId)
{
epr = new Erp_purch_receive_pre(erv.preInOrder, erv.purch_d_id);
epr.validCount -= wip.count;
epr.Update();
Erp_purch_d epd = new Erp_purch_d(erv.purch_d_id);
epd.validCount -= wip.count;
epd.wms_state = (int)enumReceiveStockDetailStatus.;
epd.Update();
erv.Delete();
}
}
Erp_purch epc = new Erp_purch(wip.orderNo);
epc.wms_state = 0;
epc.Update();
wid.Delete();
wmsInRequest.Update();
scope.Complete();
}
return true;
}
/// <summary>
/// 取消上架任务,重新验货入库
/// 同批次的,同托盘的其他任务一起取消
/// </summary>
/// <param name="flowNo">up shelf job flowno</param>
/// <param name="jobId">up shelf job id</param>
/// <returns></returns>
internal bool retrieveValidByJobId(int jobId)
{
WmsInUpPort wip = new WmsInUpPort(jobId);
if (wip.skuId == 0 || wip.upCount > 0)
{
return false;
}
wip.state = (int)enumInStockDetailStatus.;
wip.description += String.Format("上架取消 by {0},{1}", operId, DateTime.Now);
Erp_purch_receive_pre epr;
Erp_receiveValidDetail erv;
DataTable dt = new Erp_receiveValidDetail().getDetailByFlowNo(wip.inPreOrder, wip.flowNo);
DataTable dtWip = wip.getJobsByFlowSku(wip.flowNo, wip.skuId);
using (TransactionScope scope = new TransactionScope())
{
foreach (DataRow dr in dtWip.Rows)
{
wip = new WmsInUpPort(dr);
if(wip.state==(int)enumInStockDetailStatus. || wip.state == (int)enumInStockDetailStatus.)
{
continue;
}
WmsStock wmsStock = new WmsStock(wip.locationId, wip.skuId);
if (wmsStock.ID > 0)
{
wmsStock.countIn -= wip.count;
wmsStock.updateCountOut();
}
}
foreach (DataRow dr in dt.Rows)
{
erv = new Erp_receiveValidDetail(dr);
if (erv.skuId == wip.skuId)
{
epr = new Erp_purch_receive_pre(erv.preInOrder, erv.purch_d_id);
epr.validCount -= wip.count;
epr.Update();
Erp_purch_d epd = new Erp_purch_d(erv.purch_d_id);
epd.validCount -= wip.count;
epd.wms_state = (int)enumReceiveStockDetailStatus.;
epd.Update();
erv.Delete();
WmsInRequestDetail wid = new WmsInRequestDetail(erv.receive_order, erv.ID);
wid.Delete();
}
}
wip.retrieveJobs(wip.flowNo, wip.skuId, wip.description);
Erp_purch epc = new Erp_purch(wip.orderNo);
epc.wms_state = 0;
epc.Update();
WmsInRequest wmsInRequest = new WmsInRequest(wip.orderNo);
wmsInRequest.state = (int)enumInStockOrderStatus.;
wmsInRequest.Update();
scope.Complete();
}
return true;
}
internal bool isFlowNoValid(string preInOrder, string flowNo)
{
DataTable dt = new Erp_receiveValidDetail().getDetailByFlowNo(preInOrder, flowNo);
return dt.Rows.Count > 0;
}
internal DataTable getPreValidResult4Wince(string preInNo, string flowNo, bool showAllUsers = false)
{
if (showAllUsers)
{
return getWmsInRequest.getPreValidResult4Wince(preInNo, flowNo, 0);
}
return getWmsInRequest.getPreValidResult4Wince(preInNo, flowNo, operId);
}
internal DataTable getValidInDetail(string preInNo, string flowNo)
{
return getWmsInRequest.getValidInDetail(preInNo, flowNo);
}
internal void truncateDataForTestOnly()
{
getWmsInRequest.truncateDataForTestOnly();
}
internal DataSet queryReceivesByVender(string querystr, int rownumStart, int rownumEnd)
{
DataSet ds = erpPurchObj.queryReceivesByVender(querystr, rownumStart, rownumEnd);
/*
DataView dv = ds.Tables[0].DefaultView;
dv.Sort = "vender";
string vender="";
if (dv.Count > 0)
{
vender=dv[0]["vender"].ToString();
dv.RowFilter =string.Format("vender ='{0}'" ,vender );
ds.Tables.Add(dv.ToTable("vender"));
DataTable dt = getReceivePreSumByVenderNotValided(vender).Copy() ;
dt.TableName = "venderPres";
ds.Tables.Add(dt);
}
*/
return ds;
}
internal DataTable getReceiveDetailByPreInOrder(string preInOrder)
{
return this.preInObj.getPreInDetailWindows(preInOrder);
}
public DataSet getPreInVendDetailsWindows(string venderPinyin, int orderType)
{
return this.preInObj.getPreInVendDetailsWindows(venderPinyin, orderType);
}
public DataTable getRequestByVenderPinyin(string pinYin, enumInStockOrderStatus status,int orderType)
{
return erpPurchObj.getRequestByVenderPinyin(pinYin, status, orderType);
}
/// <summary>
/// 扫描板号,返回直通物品订单明细
/// </summary>
/// <param name="flowNo"></param>
/// <returns></returns>
public DataTable getZhiTongOrderDetail(string flowNo)
{
return getWmsInRequest.getZhiTongOrderDetail(flowNo);
}
}
}