2023-05-23 16:13:17 +08:00
/// <summary>
///INTERFACE CLASS FOR TABLE t_wmslocation
///By wm with codesmith.
///on 05/02/2017
/// </summary>
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Data ;
using System.Data.SqlClient ;
using DeiNiu.Utils ;
2024-11-02 21:03:22 +08:00
using System.Collections ;
2023-05-23 16:13:17 +08:00
namespace DeiNiu.wms.Data.Model
{
[Serializable]
public class WmsLocation : WmsLocation_base
{
private int _partion = 0 ;
2024-11-15 23:52:43 +08:00
private int _empId = 0 ;
2023-05-23 16:13:17 +08:00
public int partion
{
get {
if ( _partion = = 0 & & ID > 0 )
{
DataTable dt = CustQuery ( 10 ) . Tables [ 0 ] ;
if ( dt . Rows . Count > 0 )
{
2024-11-15 23:52:43 +08:00
// dt.Rows[0]["partion"].ToString();
2023-05-23 16:13:17 +08:00
if ( dt . Columns . Contains ( "partion" ) & & ! ( dt . Rows [ 0 ] [ "partion" ] is DBNull ) )
{
_partion = Convert . ToInt32 ( dt . Rows [ 0 ] [ "partion" ] . ToString ( ) ) ;
}
}
}
return _partion ;
}
set { _partion = value ; }
}
2024-11-15 23:52:43 +08:00
public int empId
{
get
{
if ( _empId = = 0 & & ID > 0 )
{
DataTable dt = CustQuery ( 10 ) . Tables [ 0 ] ;
if ( dt . Rows . Count > 0 )
{
// dt.Rows[0]["empId"].ToString();
if ( dt . Columns . Contains ( "empId" ) & & ! ( dt . Rows [ 0 ] [ "empId" ] is DBNull ) )
{
_empId = Convert . ToInt32 ( dt . Rows [ 0 ] [ "empId" ] . ToString ( ) ) ;
}
}
}
return _empId ;
}
set = > _empId = value ;
}
2023-05-23 16:13:17 +08:00
public WmsLocation ( )
{
}
public WmsLocation ( SqlConnection _Conn ) : base ( _Conn )
{
}
public WmsLocation ( int id ) : base ( id )
{
}
public WmsLocation ( DataRow dr ) : base ( dr )
{
2024-11-15 23:52:43 +08:00
try
{
_empId = Convert . ToInt32 ( dr [ "empId" ] . ToString ( ) ) ;
}
catch ( Exception er )
{
log . Error ( er ) ;
}
2023-05-23 16:13:17 +08:00
}
public WmsLocation ( String locationId )
{
cmdParameters [ 0 ] = locationId ;
getModel ( 10 ) ;
}
public new int Add ( )
{
base . Add ( ) ;
this . locationId128 = Util . getCode128 ( locationId + "" ) ;
Update ( ) ;
return ID ;
}
protected override void getImp ( )
{
model_imp = new Wmslocation_Imp ( ) ;
}
2024-02-06 19:36:47 +08:00
2023-05-23 16:13:17 +08:00
//begin cust db operation, query, excute sql etc.
//public override DataSet Query()
//{
// return CustQuery(100);
//}
2024-02-06 19:36:47 +08:00
public WmsLocation getVirLocations ( int part )
{
return getLocation ( enumWhLocVol . 虚 拟 , part , 0 ) ;
}
public WmsLocation getLocation ( enumWhLocVol volType , int part , int abc )
{
// getFreeLocation()
List < WmsLocation > locations = getLocations ( volType , 1 , abc , part ) ;
foreach ( WmsLocation l in locations )
{
if ( l . warehouse = = part )
{
return l ;
}
}
if ( locations . Count > 0 )
{
return locations [ 0 ] ;
}
else
{
2024-03-06 20:48:05 +08:00
// throw new Exception( string .Format("没有库位,请创建库位,库位类型 {0}, part {1}, abc {2} ", volType.ToString(),part,abc));
2024-11-02 21:03:22 +08:00
return new WmsLocation ( WmsConstants . TMP_BULK_LOCATION ) ;
2024-02-06 19:36:47 +08:00
}
}
public List < WmsLocation > getLocations ( enumWhLocVol whLocVol , int count = 1 , int abc = 0 , int part = 0 )
2023-05-23 16:13:17 +08:00
{
List < WmsLocation > locations = new List < WmsLocation > ( ) ;
cmdParameters [ 0 ] = count ;
2024-02-06 19:36:47 +08:00
cmdParameters [ 1 ] = ( int ) whLocVol ;
cmdParameters [ 2 ] = abc ;
cmdParameters [ 3 ] = part ;
DataSet ds = CustQuery ( 301 ) ;
2023-05-23 16:13:17 +08:00
int freeCnt = 0 ;
foreach ( DataTable dt in ds . Tables )
{
freeCnt + = dt . Rows . Count ;
}
foreach ( DataTable dt in ds . Tables )
{
foreach ( DataRow dr in dt . Rows )
{
locations . Add ( new WmsLocation ( dr ) ) ;
if ( locations . Count = = count )
{
return locations ;
}
}
}
if ( locations . Count < count ) //未找到足够空货位
{
2024-02-06 19:36:47 +08:00
LogHelper . debug ( this . GetType ( ) , "0 to free location in stock , whLocVol? " + whLocVol ) ;
2023-05-23 16:13:17 +08:00
freeLocations ( ) ;
string error = string . Format ( "空货位不足,需要{0}个,找到{1}个。" , count , locations . Count ) ;
2024-03-06 20:48:05 +08:00
2023-05-23 16:13:17 +08:00
// throw new DeiNiuNoFreeLocationkException(error);
}
return locations ;
}
2024-02-06 19:36:47 +08:00
public List < WmsLocation > getLocations ( int wareHouse , int volType , enumWhType whType , int count = 1 )
{
List < WmsLocation > locations = new List < WmsLocation > ( ) ;
cmdParameters [ 0 ] = count ;
cmdParameters [ 1 ] = ( int ) whType ;
cmdParameters [ 2 ] = wareHouse ;
cmdParameters [ 3 ] = volType ;
DataSet ds = CustQuery ( 302 ) ;
int freeCnt = 0 ;
foreach ( DataTable dt in ds . Tables )
{
freeCnt + = dt . Rows . Count ;
}
foreach ( DataTable dt in ds . Tables )
{
foreach ( DataRow dr in dt . Rows )
{
locations . Add ( new WmsLocation ( dr ) ) ;
if ( locations . Count = = count )
{
return locations ;
}
}
}
return locations ;
}
public List < WmsLocation > getNewLocations ( decimal count , WmsGoods goods , enumWhLocVol volType )
{
List < WmsLocation > newLocs = new List < WmsLocation > ( ) ;
2024-11-02 21:03:22 +08:00
2024-02-06 19:36:47 +08:00
decimal goodsMaxcnt = goods . getMaxCount ( ( int ) volType ) ;
if ( count > 0 )
{
WmsLocation nearLocation = new WmsLocation ( ) ;
nearLocation . goodsType = goods . goodsType ;
nearLocation . whType = ( int ) enumWhType . 合 格 库 ;
nearLocation . volType = ( int ) volType ;
// nearLocation.locationId = lastBulkLocation;
nearLocation . ABC = goods . ABC ;
nearLocation . warehouse = goods . part ;
decimal cnt = count / goodsMaxcnt ;
int locCnt = ( int ) Math . Ceiling ( cnt ) ;
try
{
2024-11-02 21:03:22 +08:00
newLocs = nearLocation . getFreeLocation ( nearLocation , goods . goodsId , 0 , enumWhType . 合 格 库 , locCnt ) ;
2024-02-06 19:36:47 +08:00
}
catch ( DeiNiuNoFreeLocationkException er ) //大小整货位不足
{
}
}
return newLocs ;
}
public int updateLocJobCross ( string whereIds , bool isCross , int operId )
{
cmdParameters [ 0 ] = whereIds ;
cmdParameters [ 1 ] = isCross ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 720 ) ;
}
2024-11-02 21:03:22 +08:00
public List < WmsLocation > getFreeLocation ( WmsLocation nearLocation , string goodsId , int skuId , enumWhType whType , int count = 1 )
2023-05-23 16:13:17 +08:00
{
2024-11-02 21:03:22 +08:00
log . Debug ( string . Format ( "to get new locations, goodsid:{0},skuId:{1},whType:{2}, location count{3},nearlocationId:{4}" , goodsId , skuId , count , nearLocation . locationId ) ) ;
2023-05-23 16:13:17 +08:00
List < WmsLocation > locations = new List < WmsLocation > ( ) ;
2023-09-04 22:41:19 +08:00
if ( nearLocation ! = null & & nearLocation . warehouse = = 0 )
2023-05-23 16:13:17 +08:00
{
2023-09-04 22:41:19 +08:00
nearLocation . warehouse = WmsConstants . IN_STOCK_DEFAULT_WAREHOUSE ;
if ( WmsConstants . IN_STOCK_DEFAULT_WAREHOUSE = = 0 )
{
throw new DeiNiuException ( "请设置商品的默认库房存储分区信息" ) ;
}
2023-05-23 16:13:17 +08:00
}
2024-11-02 21:03:22 +08:00
if ( String . IsNullOrEmpty ( nearLocation . locationId ) )
{
DataTable dt = new WmsStock ( ) . querySameGoodsLocations ( goodsId , ( enumWhLocVol ) nearLocation . volType , skuId , "" , whType ) ;
2023-05-23 16:13:17 +08:00
2024-11-02 21:03:22 +08:00
if ( skuId > 0 & & dt . Rows . Count = = 0 ) // 无相关批次库存, 找其他批次
{
dt = new WmsStock ( ) . querySameGoodsLocations ( goodsId , enumWhLocVol . 零 库 , 0 , "" , whType ) ;
}
foreach ( DataRow dr in dt . Rows ) //
{
nearLocation . locationId = new WmsStock ( dr ) . locationId ;
break ;
}
}
2023-05-23 16:13:17 +08:00
2024-11-02 21:03:22 +08:00
log . Debug ( "start to get locations......." + nearLocation ) ;
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
cmdParameters [ 0 ] = nearLocation . locationId ;
cmdParameters [ 1 ] = nearLocation . goodsType ;
cmdParameters [ 2 ] = nearLocation . volType ;
cmdParameters [ 3 ] = count ;
cmdParameters [ 4 ] = ( int ) whType ;
cmdParameters [ 5 ] = nearLocation . ABC ;
cmdParameters [ 6 ] = nearLocation . ownerCode ;
cmdParameters [ 7 ] = nearLocation . warehouse ;
DataSet ds = CustQuery ( 300 ) ;
int freeCnt = 0 ;
foreach ( DataTable dt in ds . Tables )
{
2024-02-06 19:36:47 +08:00
foreach ( DataRow dr in dt . Rows )
{
freeCnt + = new WmsLocation ( dr ) . scaleFactor ;
}
// freeCnt += dt.Rows.Count;
2023-05-23 16:13:17 +08:00
}
if ( freeCnt < count )
{
2024-11-02 21:03:22 +08:00
log . Debug ( "1 to free location in stock , whtype? " + whType ) ;
2023-05-23 16:13:17 +08:00
freeLocations ( ) ;
ds = CustQuery ( 300 ) ;
}
2024-02-06 19:36:47 +08:00
freeCnt = 0 ;
WmsLocation loc ;
2023-05-23 16:13:17 +08:00
foreach ( DataTable dt in ds . Tables )
{
foreach ( DataRow dr in dt . Rows )
{
2024-02-06 19:36:47 +08:00
loc = new WmsLocation ( dr ) ;
freeCnt + = loc . scaleFactor ;
locations . Add ( loc ) ;
if ( freeCnt > = count )
2023-05-23 16:13:17 +08:00
{
2024-11-02 21:03:22 +08:00
log . Debug ( " end get locations...<<" ) ;
2023-09-04 22:41:19 +08:00
return locations ;
2023-05-23 16:13:17 +08:00
}
}
}
2023-09-04 22:41:19 +08:00
2024-02-06 19:36:47 +08:00
if ( freeCnt > 0 ) //未找到足够空货位
2023-05-23 16:13:17 +08:00
{
2024-11-02 21:03:22 +08:00
log . Debug ( "2 to free location in stock , whtype? " + whType ) ;
2023-05-23 16:13:17 +08:00
freeLocations ( ) ;
2023-09-04 22:41:19 +08:00
string error = string . Format ( "货区 {3} volType {2} 空货位不足,需要{0}个,找到{1}个。" , count , locations . Count , nearLocation . volType , nearLocation . warehouse ) ;
2024-11-02 21:03:22 +08:00
log . Error ( error ) ;
2023-09-04 22:41:19 +08:00
}
else
2024-11-02 21:03:22 +08:00
{
log . Debug ( " end get locations...<<" ) ;
2023-09-04 22:41:19 +08:00
throw new DeiNiuNoFreeLocationkException ( ) ;
2023-05-23 16:13:17 +08:00
}
2024-11-02 21:03:22 +08:00
log . Debug ( " end get locations...<<" ) ;
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
return locations ;
}
/// <summary>
/// 清除空货位
/// </summary>
/// <returns></returns>
public int freeLocations ( )
{
2023-09-04 22:41:19 +08:00
int count = CustOper ( 400 ) ;
return count ;
2023-05-23 16:13:17 +08:00
}
/// <summary>
/// get location info by locId
/// </summary>
/// <returns></returns>
2024-11-15 23:52:43 +08:00
public DataTable getLocationDt ( string locId )
2023-05-23 16:13:17 +08:00
{
cmdParameters [ 0 ] = locId ;
return CustQuery ( 500 ) . Tables [ 0 ] ;
}
public bool updateWhLocations ( string p , Structs locs , int operId )
{
cmdParameters [ 0 ] = p ;
cmdParameters [ 1 ] = locs . whType ;
cmdParameters [ 2 ] = locs . whVoltype ;
cmdParameters [ 3 ] = locs . goodsType ;
cmdParameters [ 4 ] = locs . volType ;
cmdParameters [ 5 ] = locs . part ;
cmdParameters [ 6 ] = operId ;
return CustOper ( 600 ) > 0 ;
}
public bool updateSizeLocations ( string p , Structs locs , int operId )
{
cmdParameters [ 0 ] = p ;
cmdParameters [ 1 ] = locs . length ;
cmdParameters [ 2 ] = locs . width ;
cmdParameters [ 3 ] = locs . height ;
cmdParameters [ 4 ] = locs . weight ;
cmdParameters [ 5 ] = operId ;
return CustOper ( 610 ) > 0 ;
}
public bool updateLocationStatus ( string IDS , int status , int operId )
{
cmdParameters [ 0 ] = IDS ;
cmdParameters [ 1 ] = status ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 620 ) > 0 ;
}
public bool updateLocationTranLines ( string IDS , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDS ;
cmdParameters [ 1 ] = locs . transLine ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 630 ) > 0 ;
}
public bool updateLocationABC ( string IDS , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDS ;
cmdParameters [ 1 ] = locs . ABC ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 660 ) > 0 ;
}
2024-02-06 19:36:47 +08:00
public bool updateLocScale ( string IDS , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDS ;
cmdParameters [ 1 ] = locs . scale ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 710 ) > 0 ;
}
2023-05-23 16:13:17 +08:00
public bool updateLocationLabelId ( string IDs , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDs ;
cmdParameters [ 1 ] = locs . elabId ;
cmdParameters [ 2 ] = locs . elabAddress ;
cmdParameters [ 3 ] = operId ;
return CustOper ( 640 ) > 0 ;
}
public int deleteLocations ( string IDs )
{
cmdParameters [ 0 ] = IDs ;
return CustOper ( 650 ) ;
}
/// <summary>
/// query location percent data
/// </summary>
/// <returns></returns>
public DataTable getLocationsUsedPercent ( )
{
return CustQuery ( 670 ) . Tables [ 0 ] ;
}
public bool updateLocationOwner ( string IDS , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDS ;
cmdParameters [ 1 ] = locs . ownerCode ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 680 ) > 0 ;
}
public bool updateLocationStoreType ( string IDs , Structs locs , int operId )
{
cmdParameters [ 0 ] = IDs ;
cmdParameters [ 1 ] = locs . storeType ;
cmdParameters [ 2 ] = operId ;
return CustOper ( 690 ) > 0 ;
}
public bool isFree ( string locId )
{
cmdParameters [ 0 ] = locId ;
return CustQuery ( 700 ) . Tables [ 0 ] . Rows . Count = = 1 ;
}
public int locationEleIdCombine ( int shelf , int channel , int eleId )
{
cmdParameters [ 0 ] = channel ;
cmdParameters [ 1 ] = shelf ;
cmdParameters [ 2 ] = eleId ;
return CustOper ( 800 ) ;
}
public void formatLocName ( )
{
WmsLocation loc ;
DataTable dt = CustQuery ( 900 ) . Tables [ 0 ] ;
foreach ( DataRow dr in dt . Rows )
{
loc = new WmsLocation ( dr ) ;
if ( loc . locationId . Length < 3 )
{
continue ;
}
loc . locationId = string . Format ( "{0}.{1:D2}.{2:D2}.{3}{4}" ,
loc . locationId . Substring ( 0 , 3 ) , loc . channel , loc . shelf , loc . layer , loc . col ) ;
loc . locationId128 = Util . getCode128 ( loc . locationId ) ;
loc . Update ( ) ;
// break;
}
2024-02-06 19:36:47 +08:00
}
public WmsLocation getByPartion ( int partion , int cnt )
{
cmdParameters [ 0 ] = partion ;
cmdParameters [ 1 ] = cnt ;
DataTable dt = CustQuery ( 1000 ) . Tables [ 0 ] ;
if ( dt . Rows . Count > 0 )
{
return new WmsLocation ( dt . Rows [ 0 ] ) ;
}
return new WmsLocation ( ) ;
2023-05-23 16:13:17 +08:00
}
}
}