2023-05-23 16:13:17 +08:00
/// <summary>
///LOGIC CLASS FOR TABLE t_wmsOutPickPort
///By wm with codesmith.
///on 06/17/2020
/// </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 ;
namespace DeiNiu.wms.Logical
{
[Serializable]
public class lWmsOutPickPort : lbase
{
WmsOutPickPort _obj ;
public lWmsOutPickPort ( )
{
initialize ( ) ;
}
2023-11-21 19:18:23 +08:00
WmsInRequestDetail _inRequestDetail ;
public WmsInRequestDetail getWmsInRequestDetail
{
get
{
if ( _inRequestDetail = = null )
{
_inRequestDetail = new WmsInRequestDetail ( ) ;
}
_inRequestDetail . operater = operId ;
return _inRequestDetail ;
}
}
WmsInUpPort _inUpPort ;
public WmsInUpPort getWmsInUpPort
{
get
{
if ( _inUpPort = = null )
{
_inUpPort = new WmsInUpPort ( ) ;
}
_inUpPort . operater = operId ;
return _inUpPort ;
}
}
2023-05-23 16:13:17 +08:00
public WmsOutPickPort getWmsOutPickPort
{
get
{
if ( _obj = = null )
{
_obj = new WmsOutPickPort ( ) ;
}
_obj . operater = operId ;
return _obj ;
}
}
public lWmsOutPickPort ( int operId )
: base ( operId )
{
initialize ( ) ;
}
WmsWave _wmsWave ;
WmsWave wmsWave
{
get
{
if ( _wmsWave = = null )
{
_wmsWave = new WmsWave ( ) ;
}
_wmsWave . operater = operId ;
return _wmsWave ;
}
}
/// <summary>
/// get all data
/// </summary>
public DataSet getAllData ( )
{
return _obj . Query ( ) ;
}
/// <summary>
/// get all data
/// </summary>
public DataSet getAllActiveData ( )
{
return _obj . QueryActived ( ) ;
}
/// <summary>
/// get a record by id
/// </summary>
public void initialize ( int id )
{
_obj = id ! = 0 ? new WmsOutPickPort ( id ) : new WmsOutPickPort ( ) ;
}
/// <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 WmsOutPickPort ( dr ) ;
}
protected override DeiNiu . Data . BaseObject . BaseModel getModel ( )
{
return _obj ;
}
//begin cust db operation, query, excute sql etc.
internal int add ( WmsOutPickPort obj )
{
return obj . Add ( ) ;
}
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
internal DataSet getWaveDetails ( string waveNo , int rowStart , int rowEnd )
{
return _obj . getWaveDetails ( waveNo , rowStart , rowEnd ) ;
}
internal DataTable getWaveDetails ( string waveNo )
{
return _obj . getWaveDetails ( waveNo ) ;
}
internal DataSet getWavePages ( int state , int rowStart , int rowEnd )
{
return wmsWave . queryPages ( state , rowStart , rowEnd ) ;
}
internal DataTable getPickInfo ( string waveNo , int volType )
{
return _obj . getPickInfo ( waveNo , volType ) ;
}
internal DataTable getPickInfo ( string waveNo )
{
return _obj . getPickInfo ( waveNo ) ;
}
internal DataTable getPickSummary ( string waveNo , int volType )
{
return _obj . getPickSummary ( waveNo , volType ) ;
}
// to move to lStockOutPort
/// <summary>
/// 出库分拣任务
/// 按相同的集货区域的拣货单合并拣货
/// 同一个波次按拣货区域划分为不同的任务
/// 每个任务有一个或多个拣货明细
/// 每个任务考虑作为播种亮灯的播种单号
/// </summary>
/// <returns></returns>
public bool createPickWaves ( )
2023-09-04 22:41:19 +08:00
{
DataTable dt = getWmsOutPickPort . getNewPickTasks ( new WaveRule ( ) . getCurrentActiveRule ( enumWaveRuleType . 普 通 波 次 ) ) ;
logOut . Debug ( "start to process new waves...count:" + dt . Rows . Count ) ;
2023-05-23 16:13:17 +08:00
if ( dt . Rows . Count = = 0 )
{
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
return false ;
}
int lastTranArea = - 100 , lastPartion = - 100 , lastVolType = - 100 , lastOrderType = - 100 ; ;
string lastPickRequest = "" , waveNo = "" , jobNo = "" , lastWaveNo = "" ;
bool isNewWave = false , isNewJob = false ;
Dictionary < int , string > waveJobs = new Dictionary < int , string > ( ) ;
int waveSize = 0 ;
int maxSize = WmsConstants . WAVE_ORDERS_CNT ;
int jobMax = WmsConstants . WAVE_TASK_MAX_CNT ;
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
int jobcnt = 0 ;
2023-11-21 19:18:23 +08:00
int taskcnt = 0 ;
2023-05-23 16:13:17 +08:00
bool isCreateFlowTask = WmsConstants . OUT_LIGHT_ENABLE ? WmsConstants . DPS_TASK_GENERATION : true ;
2023-09-04 22:41:19 +08:00
WmsOutPickPort _obj ;
2023-05-23 16:13:17 +08:00
WmsFlow wmsflow ;
2023-12-03 22:13:49 +08:00
decimal boxMax = 0 ;
decimal boxPercent = 0 ;
2023-09-04 22:41:19 +08:00
using ( TransactionScope scope = new TransactionScope ( TransactionScopeOption . Required , new TransactionOptions ( )
2023-05-23 16:13:17 +08:00
{
2023-09-04 22:41:19 +08:00
//IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
IsolationLevel = System . Transactions . IsolationLevel . Serializable ,
Timeout = new TimeSpan ( 0 , 10 , 0 )
}
) )
{
// logSpec.Debug("start work...to create wave and jobs ");
2023-05-23 16:13:17 +08:00
foreach ( DataRow dr in dt . Rows )
{
2023-12-03 22:13:49 +08:00
_obj = new WmsOutPickPort ( dr ) ;
boxMax = Convert . ToDecimal ( dr [ "full_max" ] . ToString ( ) ) ;
if ( boxMax > 0 )
{
boxPercent + = ( _obj . count / boxMax ) * 100 ;
}
2023-05-23 16:13:17 +08:00
if ( lastTranArea = = - 100 )
{
lastTranArea = _obj . tranArea ;
}
if ( lastPartion = = - 100 )
{
lastPartion = _obj . partion ;
}
if ( lastVolType = = - 100 )
{
lastVolType = _obj . volType ;
}
/ *
if ( lastOrderType = = - 100 )
{
lastOrderType = _obj . or ;
}
* /
if ( lastPickRequest ! = _obj . pickOrderNo )
{
waveSize + + ;
//TODO:更新拣货状态 1. 整库拣货状态 2. 零库拣货状态
if ( String . IsNullOrEmpty ( lastPickRequest ) )
{
lastPickRequest = _obj . pickOrderNo ;
}
WmsOutPickRequest pr = new WmsOutPickRequest ( lastPickRequest ) ;
2023-09-04 22:41:19 +08:00
if ( pr . state ! = ( int ) enumOutStockRequestStatus . 等 待 补 货 ) {
2023-05-23 16:13:17 +08:00
pr . state = ( int ) enumOutStockRequestStatus . 正 在 分 拣 ;
pr . Update ( ) ;
2023-09-04 22:41:19 +08:00
}
2023-11-21 19:18:23 +08:00
jobcnt = jobMax ; //每个job只属于一个分拣单
2023-05-23 16:13:17 +08:00
}
isNewWave = String . IsNullOrEmpty ( waveNo )
| | lastTranArea ! = _obj . tranArea //集货目的地不同,开新波次
| | waveSize = = maxSize ; //达到波次最大订单数,开新波次
if ( isNewWave )
{
/ * if ( ! string . IsNullOrEmpty ( waveNo ) & & waveJobs . ContainsKey ( lastPartion ) )
{
WmsFlow wmsflow = new WmsFlow ( jobNo , waveNo ) ;
if ( wmsflow . ID > 0 ) {
wmsflow . taskCnt = jobcnt ;
wmsflow . Update ( ) ;
}
} * /
lastWaveNo = waveNo ;
waveNo = Util . getOrderNo ( enumCreateOrderType . waveOrder , _obj . getNextSeq ( enumCreateOrderType . waveOrder ) ) ;
waveJobs = new Dictionary < int , string > ( ) ;
waveSize = 0 ;
WmsWave wave = new WmsWave ( ) ;
wave . waveNo = waveNo ;
wave . type = _obj . recType ;
wave . operater = operId ;
wave . Add ( ) ;
}
isNewJob = isNewWave | | lastPartion ! = _obj . partion
| | jobcnt > = jobMax
2023-12-03 22:13:49 +08:00
| | ! waveJobs . ContainsKey ( _obj . partion )
| | boxPercent > = 100 ;
2023-05-23 16:13:17 +08:00
if ( jobcnt > = maxSize )
{
}
if ( isNewJob )
{
2023-12-03 22:13:49 +08:00
boxPercent = 0 ;
2023-05-23 16:13:17 +08:00
isCreateFlowTask = WmsConstants . OUT_LIGHT_ENABLE ? WmsConstants . DPS_TASK_GENERATION : true ;
isCreateFlowTask = isCreateFlowTask | | lastVolType > 0 ;
// LogHelper.WriteLog(typeof(lWmsOutPickPort), string.Format("1 isCreateFlowTask: {0},lastVolType {1}", isCreateFlowTask, lastVolType));
if ( isCreateFlowTask & & ! string . IsNullOrEmpty ( jobNo ) )
{
wmsflow = new WmsFlow ( jobNo ) ;
if ( wmsflow . ID > 0 )
{
2023-11-21 19:18:23 +08:00
wmsflow . taskCnt = taskcnt ; // waveJobs[lastPartion].Length;
2023-05-23 16:13:17 +08:00
wmsflow . Update ( ) ;
}
}
2023-11-21 19:18:23 +08:00
jobcnt = 0 ; taskcnt = 0 ;
2023-05-23 16:13:17 +08:00
jobNo = Util . getOrderNo ( enumCreateOrderType . pickJobNo , _obj . getNextSeq ( enumCreateOrderType . pickJobNo ) ) ;
waveJobs [ _obj . partion ] = jobNo ;
isCreateFlowTask = WmsConstants . OUT_LIGHT_ENABLE ? WmsConstants . DPS_TASK_GENERATION : true ;
isCreateFlowTask = isCreateFlowTask | | _obj . volType > 0 ;
// LogHelper.WriteLog(typeof(lWmsOutPickPort), string.Format("2 isCreateFlowTask: {0},_obj.volType {1}", isCreateFlowTask, _obj.volType));
if ( isCreateFlowTask )
{
wmsflow = new WmsFlow ( ) ;
wmsflow . operater = operId ;
2023-11-21 19:18:23 +08:00
wmsflow . orderNo = _obj . pickOrderNo ; // waveNo;
2023-05-23 16:13:17 +08:00
wmsflow . type = ( int ) Util . getTaskType ( _obj . recType ) ;
2023-11-21 19:18:23 +08:00
wmsflow . typeName = Util . getTaskType ( _obj . recType ) . ToString ( ) ;
2023-05-23 16:13:17 +08:00
wmsflow . task = jobNo ;
wmsflow . fromPartion = _obj . partion ;
wmsflow . toPartion = _obj . tranArea ;
wmsflow . taskPartion = _obj . partion ;
2023-11-21 19:18:23 +08:00
// wmsflow.fromLocationId=_obj.locationId;
2023-05-23 16:13:17 +08:00
wmsflow . Add ( ) ;
}
}
else
{
jobNo = waveJobs [ _obj . partion ] ;
}
jobcnt + + ;
2023-11-21 19:18:23 +08:00
taskcnt + + ;
2023-05-23 16:13:17 +08:00
_obj . waveOrder = waveNo ;
_obj . jobNo = jobNo ;
_obj . operater = operId ;
_obj . Update ( ) ;
lastTranArea = _obj . tranArea ;
lastPickRequest = _obj . pickOrderNo ;
lastPartion = _obj . partion ;
lastVolType = _obj . volType ;
}
if ( ! string . IsNullOrEmpty ( waveNo ) )
{
wmsflow = new WmsFlow ( jobNo ) ;
if ( wmsflow . ID > 0 )
{
2023-11-21 19:18:23 +08:00
wmsflow . taskCnt = taskcnt ;
2023-05-23 16:13:17 +08:00
wmsflow . Update ( ) ;
}
}
scope . Complete ( ) ;
}
2023-09-04 22:41:19 +08:00
logOut . Debug ( "end process new waves.. in last wave, created job count " + jobcnt ) ;
2023-05-23 16:13:17 +08:00
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
return true ;
}
WmsOutDesk _desk ;
WmsOutDesk desk
{
get
{
if ( _desk = = null )
{
_desk = new WmsOutDesk ( ) ;
_desk . operater = operId ;
}
return _desk ;
}
}
WmsOutDesk _seedsDesk ;
WmsOutDesk seedsDesk
{
get
{
if ( _seedsDesk = = null )
{
_seedsDesk = new WmsOutDesk ( ) ;
}
return _seedsDesk ;
}
}
static List < int > lblist = new List < int > ( ) ;
static Dictionary < int , int > comLables = new Dictionary < int , int > ( ) ;
void initialDebugSetting ( )
{
DataTable dt = new Node ( ) . QueryByFlag ( 10001 ) ;
foreach ( DataRow dr in dt . Rows )
{
Node node = new Node ( dr ) ;
if ( ! node . isOn )
{
continue ;
}
try
{
string labels = node . description ;
string [ ] lbs = labels . Split ( ',' ) ;
foreach ( string s in lbs )
{
2023-09-04 22:41:19 +08:00
comLables [ Convert . ToInt32 ( s . Trim ( ) ) ] = Convert . ToInt32 ( node . name . Trim ( ) ) ;
lblist . Add ( Convert . ToInt32 ( s . Trim ( ) ) ) ;
2023-05-23 16:13:17 +08:00
}
}
catch
{
continue ;
}
}
}
private string waveOrder = "" ;
public void newBulkDPSPickWave ( )
{
if ( ! WmsConstants . OUT_LIGHT_ENABLE )
{
return ;
}
//播种筛选,
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
//1. 单个订单的品种少 、数量少
//2. 订单数量多
//只处理订单零货部分
//加入播种选项,所有订单零货部分使用摘取+播种方式
//1.播种点数量可配置, 分别用不同颜色区分
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个, 一次捡6个客户的订单零货部分, 送由一个播种点播种)
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
//4.
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
/ /
LogHelper . debug ( typeof ( lWmsOutPickPort ) , "开始新波次。。。。。。。。。。。。。。。。。。" ) ;
DataTable dtPorts = getWmsOutPickPort . getNewPickTasks ( new WaveRule ( ) . getCurrentActiveRule ( enumWaveRuleType . DPS灯光波次 ) ) ;
LogHelper . debug ( typeof ( lWmsOutPickPort ) , string . Format ( "待处理任务数量:{0}" , dtPorts . Rows . Count ) ) ;
if ( dtPorts . Rows . Count = = 0 )
{
LogHelper . debug ( typeof ( lWmsOutPickPort ) , string . Format ( "无订单需要处理,波次结束" ) ) ;
new lWmsOutPickRequest ( this . operId ) . checkRepAndNoStockOrders ( ) ;
return ;
}
desk . restDeskStatus ( enumDeskState . 空 闲 ) ;
desk . restDeskStatus ( enumDeskState . 空 闲 , enumDeskType . 播 种 ) ; //播种台状态复位到空闲,是不是可以由播种员实际播种任务进度控制?
_seedsDesk = desk . getRandomDesk ( enumDeskState . 空 闲 , enumDeskType . 播 种 ) ; ;
_desk = desk . getRandomDesk ( enumDeskState . 空 闲 , enumDeskType . 复 核 ) ;
int labelMaxInWave = WmsConstants . MAX_LABEL_DATA_IN_A_WAVE ; //一个标签一个波次只能存储40条数据
#if DEBUG
// if (lblist.Count == 0)
{
lblist . Clear ( ) ;
initialDebugSetting ( ) ;
}
lblist . Sort ( ) ;
#endif
// List<WmsStockRecord> strecs = null;
waveOrder = Util . getOrderNo ( enumCreateOrderType . dpsOrder , _obj . getNextSeq ( enumCreateOrderType . dpsOrder ) ) ;
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
Dictionary < int , int > labelCnt = new Dictionary < int , int > ( ) ;
Dictionary < int , int > comCnt = new Dictionary < int , int > ( ) ;
Dictionary < int , int > tmplabelCnt = new Dictionary < int , int > ( ) ;
Dictionary < int , int > tmpcomCnt = new Dictionary < int , int > ( ) ;
bool isReachLimit = false ;
int waveSize = 0 ;
//List<WmsOutPickPort> lstPort;
List < WmsOutPickLable_tmp > lstLabel ;
List < WmsStockRecord > lstBulk ;
LogHelper . debug ( typeof ( lWmsOutPickRequest ) , string . Format ( "waveNo {0}" , waveOrder ) ) ;
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
bool isSeedsEnabled = WmsConstants . OUT_BULK_SEEDS_PICK_ON ;
int pickGoodsTypeMin = WmsConstants . OUT_MAX_SEEDS_GOODSTYPE_CNT ; //单独摘取订单 最少货物类型
int pickGoodsCountMin = WmsConstants . OUT_MAX_SEEDS_BULK_CNT_SUM ; // 单独摘取订单 最少货物数量
int seedsCount = seedsDesk . seedsCount ; //播种台一次播种订单数量
decimal sumBulkCnt = 0 ;
bool isSeedPickInSameWave = true ;
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
List < WmsOutPickRequest > seedsRequests = new List < WmsOutPickRequest > ( ) ;
Dictionary < string , WmsStockRecord > seedsBulks = new Dictionary < string , WmsStockRecord > ( ) ;
if ( desk . ID = = 0 ) // no free pick desk
{
if ( isSeedsEnabled )
{
_seedsDesk = desk . getRandomDesk ( enumDeskState . 空 闲 , enumDeskType . 播 种 ) ;
if ( seedsDesk . ID = = 0 )
{
return ;
}
}
else
{
return ;
}
}
int bulkCnt = 0 ;
int requestCnt = 0 ;
//开始处理有零货的订单
DateTime d0 = DateTime . Now ;
double totoalTime = 0d ;
string lastAddress = "" ;
// foreach (WmsOutPickRequest request in requests)
WmsOutPickPort wopp ;
string lastPickOrder = "" ;
List < WmsOutPickPort > lstPort = new List < WmsOutPickPort > ( ) ;
lstBulk = new List < WmsStockRecord > ( ) ;
int elebleId = 0 , port = 0 ;
WmsOutPickRequest request ;
List < WmsOutPickRequest > taskRequests = new List < WmsOutPickRequest > ( ) ;
Dictionary < String , List < WmsStockRecord > > tasks = new Dictionary < string , List < WmsStockRecord > > ( ) ;
Dictionary < String , List < WmsOutPickPort > > portTasks = new Dictionary < string , List < WmsOutPickPort > > ( ) ;
foreach ( DataRow dr in dtPorts . Rows )
{
DateTime d00 = DateTime . Now ;
wopp = new WmsOutPickPort ( dr ) ;
if ( lastPickOrder ! = wopp . pickOrderNo )
{
lastPickOrder = wopp . pickOrderNo ;
_desk = desk . getRandomDesk ( enumDeskState . 空 闲 , enumDeskType . 复 核 ) ;
if ( _desk . ID > 0 )
{
request = new WmsOutPickRequest ( lastPickOrder ) ;
request . desk = _desk . color ;
desk . state = ( int ) enumDeskState . 任 务 中 ;
desk . Update ( ) ;
taskRequests . Add ( request ) ;
}
else
{
break ;
}
}
if ( ! tasks . Keys . Contains ( lastPickOrder ) )
{
tasks [ lastPickOrder ] = new List < WmsStockRecord > ( ) ;
}
if ( ! portTasks . Keys . Contains ( lastPickOrder ) )
{
portTasks [ lastPickOrder ] = new List < WmsOutPickPort > ( ) ;
}
tasks [ lastPickOrder ] . Add ( new WmsStockRecord ( dr ) ) ;
portTasks [ lastPickOrder ] . Add ( wopp ) ;
}
#region savedata
foreach ( WmsOutPickRequest pickRequest in taskRequests )
{
int lastId = 0 ;
LogHelper . debug ( typeof ( lWmsOutPickRequest ) , " 摘果式 保存整货和零货出库分拣数据" ) ;
lstLabel = new List < WmsOutPickLable_tmp > ( ) ;
WmsOutPickLable_tmp wpl ;
foreach ( WmsStockRecord rec in tasks [ pickRequest . pickOrderNo ] )
{
// if (rec.count == 0)
if ( rec . count + rec . countOuting < 1 ) //不支持小数
{
continue ;
}
if ( lblist . Count > 0 )
{
int id = new Random ( ) . Next ( lblist . Count ) ;
//#if DEBUG
rec . location . elabId = lblist [ id ] ; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
while ( lblist . Count > 1 & & lastId = = rec . location . elabId )
{
id = new Random ( ) . Next ( lblist . Count ) ;
rec . location . elabId = lblist [ id ] ;
}
lastId = rec . location . elabId ;
//#endif
}
wpl = new WmsOutPickLable_tmp ( ) ;
wpl . pickOrderNo = pickRequest . pickOrderNo ;
wpl . recordId = rec . ID ;
wpl . color = pickRequest . desk ;
wpl . count = rec . count + rec . countOuting ;
wpl . locationId = rec . locationId ;
wpl . elabAddress = rec . location . elabAddress ;
wpl . elabId = rec . location . elabId ;
wpl . port = rec . location . port ;
wpl . orderDetailId = rec . orderDetailId ;
//#if DEBUG
try
{
if ( comLables . Count > 0 )
{
wpl . port = comLables [ wpl . elabId ] ; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
}
}
catch { }
//#endif
wpl . dpsOrder = waveOrder ;
wpl . operater = this . operId ;
lstLabel . Add ( wpl ) ;
}
//保存整货和零货出库分拣数据
try
{
using ( TransactionScope scope1 = new TransactionScope ( ) )
{
foreach ( WmsOutPickLable_tmp wp in lstLabel ) //建立电子拣选临时数据
{
wp . Add ( ) ;
}
foreach ( WmsOutPickPort pt in portTasks [ pickRequest . pickOrderNo ] )
{
pt . dpsOrder = waveOrder ;
pt . Update ( ) ;
}
if ( lstLabel . Count > 0 )
{
pickRequest . waveOrder = waveOrder ;
pickRequest . state = ( int ) enumOutStockRequestStatus . 正 在 分 拣 ;
pickRequest . waveStart = pickRequest . getDateTime ( ) ;
pickRequest . operater = this . operId ;
pickRequest . updateBulkPickStatus ( pickRequest . pickOrderNo , enumOutStockPickStatus . 正 在 分 拣 , operId ) ;
// pickRequest.state =
pickRequest . Update ( ) ;
}
waveSize + + ;
scope1 . Complete ( ) ;
}
}
catch ( Exception e )
{
LogHelper . WriteLog ( typeof ( lWmsOutPickRequest ) , e ) ;
desk . restDeskStatus ( enumDeskState . 空 闲 ) ;
throw e ;
}
}
#endregion
// totoalTime += ts00.TotalSeconds;
//建立零库电子拣选临时数据
new WmsOutPickRequest ( ) . saveTempData4Validation ( waveOrder ) ;
WmsConstants . WAVE_CURRENT_PICK_STATUS . Clear ( ) ;
WmsConstants . WAVE_CURRENT_ORDER = waveOrder ;
WmsConstants . WAVE_LAST_TIME = DateTime . Now ;
//检查待补货出货单状态
new lWmsOutPickRequest ( this . operId ) . checkRepAndNoStockOrders ( ) ;
}
2023-11-21 19:18:23 +08:00
internal int clearJobLightTask ( string jobNo )
{
return new WmsOutPickLable_tmp ( ) . clearByDpsOrder ( jobNo ) ;
}
internal DataTable prePareLightByJob ( string jobNo , bool isValid )
{
WmsOutPickLable_tmp wpl = new WmsOutPickLable_tmp ( ) ;
log . Debug ( " to get pick port task for light :" + jobNo + " isValid :" + isValid ) ;
if ( ! isValid )
{
DataTable dt = getWmsOutPickPort . geTasksByJobNo ( jobNo ) ;
if ( dt . Rows . Count > 0 )
{
wpl = new WmsOutPickLable_tmp ( dt . Rows [ 0 ] ) ;
}
else
{
return dt ;
}
using ( TransactionScope scope = new TransactionScope ( ) )
{
int i = 0 ;
wpl . clearByDpsOrder ( jobNo ) ;
wpl . clearByPartion ( wpl . partion ) ;
foreach ( DataRow dr in dt . Rows )
{
// WmsOutPickPort wpp = new WmsOutPickPort(dr);
// log.Debug(" get pick port task :" + wpp);
decimal pcs = Convert . ToDecimal ( dr [ "pcs" ] . ToString ( ) ) ;
wpl = new WmsOutPickLable_tmp ( dr ) ;
wpl . count = pcs > 0 ? pcs : 1 ;
wpl . color = 1 ;
wpl . dpsOrder = jobNo ;
#if DEBUG
wpl . elabId = + + i ;
log . Debug ( "use fake id....." + wpl . elabId ) ;
#endif
wpl . Add ( ) ;
log . Debug ( "2 get pick port task for light :" + wpl ) ;
}
scope . Complete ( ) ;
}
}
return wpl . getByDpsOrder ( jobNo ) ;
}
internal DataTable getPickSummary ( int takeBy , int partion , int orderType )
{
return getWmsOutPickPort . getPickLightTasks ( takeBy , partion , orderType ) ;
}
2023-05-23 16:13:17 +08:00
/ *
* 分 配 拣 货 任 务
* /
public void taskAssign ( int taskBy , int partion , int lineId , int maxLocCnt = 0 , int maxBoxs = 0 ,
2023-11-21 19:18:23 +08:00
bool batchOnly = true , enumOrderType orderType = enumOrderType . 销 售 出 库 )
2023-05-23 16:13:17 +08:00
{
2023-09-04 22:41:19 +08:00
// logTest.Debug(string.Format("1 maxLocCnt {0},maxBoxs {1}",maxLocCnt,maxBoxs));
maxLocCnt = maxLocCnt < = 0 ? WmsConstants . MAX_PICK_LOT_CNT : maxLocCnt ;
maxBoxs = maxBoxs < = 0 ? WmsConstants . MAX_PICK_BOX_CNT : maxBoxs ;
// logTest.Debug(string.Format("2 maxLocCnt {0},maxBoxs {1}", maxLocCnt, maxBoxs));
2023-11-21 19:18:23 +08:00
// int lotcnt = 0,boxcnt=0;
2023-12-03 22:13:49 +08:00
if ( isJobMax ( taskBy , partion , lineId , maxLocCnt , maxBoxs ,
2023-11-21 19:18:23 +08:00
batchOnly , orderType ) )
2023-05-23 16:13:17 +08:00
{
return ;
}
2023-11-21 19:18:23 +08:00
int lotcnt = 0 , boxcnt = 0 ;
WmsOutPickPort wop ;
2023-05-23 16:13:17 +08:00
2023-11-21 19:18:23 +08:00
DataTable dt = getWmsOutPickPort . getFreeTasks ( partion , lineId , batchOnly , orderType , taskBy ) ;
2023-05-23 16:13:17 +08:00
2023-09-04 22:41:19 +08:00
// logTest.Debug(string.Format(" exists tasks to do , loc cnt :{0}, box cnt: {1}, free tasks cnt :{2}", lotcnt, boxcnt,dt.Rows.Count));
2023-05-23 16:13:17 +08:00
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
using ( TransactionScope scope = new TransactionScope ( ) )
{
foreach ( DataRow dr in dt . Rows )
{
wop = new WmsOutPickPort ( dr ) ;
lotcnt + + ;
2023-09-04 22:41:19 +08:00
boxcnt + = Convert . ToInt32 ( dr [ "boxcnt" ] . ToString ( ) ) ;
2023-05-23 16:13:17 +08:00
2023-11-21 19:18:23 +08:00
if ( lotcnt > maxLocCnt | | boxcnt > maxBoxs )
2023-05-23 16:13:17 +08:00
{
2023-11-21 19:18:23 +08:00
// logTest.Debug(string.Format(" All tasks to do , loc cnt :{0}, box cnt: {1}",lotcnt,boxcnt));
2023-05-23 16:13:17 +08:00
break ;
}
wop . takeBy = taskBy ;
// wop.operater = operId;
wop . Update ( ) ;
2023-11-21 19:18:23 +08:00
// log.Debug( " user " + taskBy + " task Assign :" + wop.ID);
/ *
WmsFlow wf = new WmsFlow ( wop . jobNo ) ;
wf . owner = operId ;
wf . state = ( int ) enumFlowTaskStatus . 进 行 中 ;
wf . Update ( ) ;
* /
2023-05-23 16:13:17 +08:00
2023-09-04 22:41:19 +08:00
/ * *
* 改 为 下 架 时 生 成 补 零 上 架 任 务
*
2023-05-23 16:13:17 +08:00
if ( wop . recType ! = ( int ) enumStockRecordType . 补 零 出 库 )
{
continue ;
}
//to create inport data
int skuId = Convert . ToInt32 ( dr [ "skuId" ] . ToString ( ) ) ;
string goodsId = dr [ "goodsId" ] . ToString ( ) ;
string batch = dr [ "batch" ] . ToString ( ) ;
string skucode = dr [ "skucode" ] . ToString ( ) ;
string prdtime = dr [ "productDate" ] . ToString ( ) ;
string vltime = dr [ "validDate" ] . ToString ( ) ;
DataTable dtBulkLocs = lstk . getBulkLocations ( skuId , "" , goodsId , batch , wop . count ) ;
foreach ( DataRow dr1 in dtBulkLocs . Rows )
{
//todo: to add stock record
WmsInUpPort wip = new WmsInUpPort ( ) ;
wip . locationId = dr1 [ 0 ] . ToString ( ) ;
wip . count = Convert . ToDecimal ( dr1 [ 1 ] . ToString ( ) ) ;
wip . orderNo = wop . pickOrderNo ;
wip . skuId = skuId ;
wip . skuCode = skucode ;
wip . batch = batch ;
wip . goodsId = goodsId ;
wip . detailId = wop . pickDetailId ;
wip . recType = ( int ) enumStockRecordType . 补 零 入 库 ;
wip . recordId = wop . recordId ;
wip . productDate = prdtime ;
wip . validDate = vltime ;
wip . flowNo = "0" ;
WmsLocation loc = new WmsLocation ( wip . locationId ) ;
Node nd = new Node ( loc . part ) ;
if ( nd . ID > 0 )
{
wip . partion = nd . flag ;
}
wip . Add ( ) ;
//create stock,lock the location
2023-09-04 22:41:19 +08:00
WmsStock newStk = new WmsStock ( wip . locationId , skuId , wip . goodsId ) ;
2023-05-23 16:13:17 +08:00
if ( newStk . ID = = 0 ) //new one
{
newStk . countIn = wip . count ;
newStk . skuCode = skucode ;
newStk . goodsId = goodsId ;
newStk . skuId = skuId ;
newStk . locationId = wip . locationId ;
newStk . batch = batch ;
newStk . productDate = wip . productDate ;
newStk . validDate = wip . validDate ;
newStk . maintainDate = newStk . getDateTime ( ) ;
newStk . Add ( ) ;
}
}
2023-09-04 22:41:19 +08:00
* /
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
}
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
scope . Complete ( ) ;
}
2023-09-04 22:41:19 +08:00
/ /
// logTest.Debug(string.Format(" All tasks to do , loc cnt :{0}, box cnt: {1},max lot limit {2},max box limit {3},orderType:{4}", lotcnt, boxcnt,maxLocCnt,maxBoxs,orderType));
2023-05-23 16:13:17 +08:00
}
2023-11-21 19:18:23 +08:00
2023-12-03 22:13:49 +08:00
bool isJobMax ( int takeBy , int partion , int lineId , int maxLocCnt = 0 , int maxBoxs = 0 , bool batchOnly = true , enumOrderType orderType = enumOrderType . 销 售 出 库 )
2023-11-21 19:18:23 +08:00
{
maxLocCnt = maxLocCnt < = 0 ? WmsConstants . MAX_PICK_LOT_CNT : maxLocCnt ;
maxBoxs = maxBoxs < = 0 ? WmsConstants . MAX_PICK_BOX_CNT : maxBoxs ;
// logTest.Debug(string.Format("2 maxLocCnt {0},maxBoxs {1}", maxLocCnt, maxBoxs));
int lotcnt = 0 , boxcnt = 0 ;
WmsOutPickPort wop ;
2023-12-03 22:13:49 +08:00
DataTable dt = getWmsOutPickPort . getAssignedTasks ( takeBy , - 1 , - 1 , batchOnly , orderType ) ;
2023-11-21 19:18:23 +08:00
lotcnt = dt . Rows . Count ;
if ( lotcnt > = maxLocCnt )
{
2023-12-03 22:13:49 +08:00
logOut . Debug ( " user " + takeBy + " 无法分配更多的任务了,未完成 task lotcnt :" + lotcnt ) ;
2023-11-21 19:18:23 +08:00
2023-12-03 22:13:49 +08:00
return true ;
2023-11-21 19:18:23 +08:00
}
foreach ( DataRow dr in dt . Rows )
{
wop = new WmsOutPickPort ( dr ) ;
try
{
boxcnt + = Convert . ToInt32 ( dr [ "boxcnt" ] . ToString ( ) ) ;
}
catch { }
if ( boxcnt > = maxBoxs )
{
2023-12-03 22:13:49 +08:00
logOut . Debug ( " user " + takeBy + " 无法分配更多的任务了,未完成 box cnt :" + boxcnt ) ;
return true ;
2023-11-21 19:18:23 +08:00
}
// wop.operater = operId;
}
2023-12-03 22:13:49 +08:00
return false ;
2023-11-21 19:18:23 +08:00
}
/// <summary>
/// 以Job 为单位分配工作
/// </summary>
/// <param name="taskBy"></param>
/// <param name="partion"></param>
/// <param name="lineId"></param>
/// <param name="maxLocCnt"></param>
/// <param name="maxBoxs"></param>
/// <param name="batchOnly"></param>
/// <param name="orderType"></param>
public void taskAssignByJob ( int taskBy , int partion , int lineId , int maxLocCnt = 0 , int maxBoxs = 0 ,
bool batchOnly = true , enumOrderType orderType = enumOrderType . 销 售 出 库 )
{
// logTest.Debug(string.Format("1 maxLocCnt {0},maxBoxs {1}",maxLocCnt,maxBoxs));
maxLocCnt = maxLocCnt < = 0 ? WmsConstants . MAX_PICK_LOT_CNT : maxLocCnt ;
maxBoxs = maxBoxs < = 0 ? WmsConstants . MAX_PICK_BOX_CNT : maxBoxs ;
// logTest.Debug(string.Format("2 maxLocCnt {0},maxBoxs {1}", maxLocCnt, maxBoxs));
2023-12-03 22:13:49 +08:00
if ( isJobMax ( taskBy , partion , lineId , maxLocCnt , maxBoxs ,
2023-11-21 19:18:23 +08:00
batchOnly , orderType ) )
{
return ;
}
int lotcnt = 0 , boxcnt = 0 ;
WmsOutPickPort wop ;
DataTable dt = getWmsOutPickPort . getFreeTasksByJob ( partion , lineId , batchOnly , orderType , taskBy ) ;
// logTest.Debug(string.Format(" exists tasks to do , loc cnt :{0}, box cnt: {1}, free tasks cnt :{2}", lotcnt, boxcnt,dt.Rows.Count));
DataView dv = dt . DefaultView ;
dv . Sort = "jobNo" ;
string lastJob = "" ;
using ( TransactionScope scope = new TransactionScope ( ) )
{
foreach ( DataRowView dr in dv )
{
/ *
lotcnt + + ;
boxcnt + = Convert . ToInt32 ( dr [ "boxcnt" ] . ToString ( ) ) ;
if ( lotcnt > maxLocCnt | | boxcnt > maxBoxs )
{
// logTest.Debug(string.Format(" All tasks to do , loc cnt :{0}, box cnt: {1}",lotcnt,boxcnt));
break ;
}
* /
wop = new WmsOutPickPort ( dr . Row ) ;
wop . takeBy = taskBy ;
// wop.operater = operId;
wop . Update ( ) ;
// log.Debug( " user " + taskBy + " task Assign :" + wop.ID);
if ( string . IsNullOrEmpty ( lastJob ) )
{
lastJob = wop . jobNo ;
}
else
if ( lastJob ! = wop . jobNo )
{
WmsFlow wf = new WmsFlow ( wop . jobNo ) ;
wf . owner = operId ;
wf . state = ( int ) enumFlowTaskStatus . 进 行 中 ;
wf . Update ( ) ;
}
lastJob = wop . jobNo ;
}
scope . Complete ( ) ;
}
/ /
// logTest.Debug(string.Format(" All tasks to do , loc cnt :{0}, box cnt: {1},max lot limit {2},max box limit {3},orderType:{4}", lotcnt, boxcnt,maxLocCnt,maxBoxs,orderType));
}
2023-12-03 22:13:49 +08:00
internal DataTable taskAssignByJob ( string lastJobNo , string locationId , int warehouse = 0 , int taskBelongTo = 0 )
{
logOut . Debug ( string . Format ( "last job :{0}, location {1},warehouse {2},takebelongto {3}" , lastJobNo , locationId , warehouse , taskBelongTo ) ) ;
DataTable jobs = new DataTable ( "jobs" ) ;
int partion = 0 ;
int lineId = 0 ;
bool batchOnly = false ;
string orderNo = "" ;
if ( ! string . IsNullOrEmpty ( lastJobNo ) )
{
WmsFlow flow = new WmsFlow ( lastJobNo ) ;
orderNo = flow . orderNo ;
}
WmsLocation loc = new WmsLocation ( locationId ) ;
if ( loc . ID = = 0 & & warehouse = = 0 )
{
return jobs ;
}
enumOrderType orderType = enumOrderType . 销 售 出 库 ; //默认取全部订单类型
bool isWeightSeeds = loc . isWeightSeeds ;
logOut . Debug ( "蔬菜类 is weight seeds ? " + isWeightSeeds ) ;
if ( isJobMax ( operId , 0 , lineId , 0 , 0 , batchOnly , orderType ) )
{
logOut . Debug ( " job max exeed" ) ;
return jobs ;
}
warehouse = warehouse = = 0 ? loc . warehouse : warehouse ;
DataTable dtFreeTasks = getWmsOutPickPort . getFreeTasksByJob ( partion , lineId , batchOnly , orderType , taskBelongTo , warehouse , orderNo , lastJobNo , isWeightSeeds ) ;
if ( dtFreeTasks . Rows . Count = = 0 ) // 上一个job没有可用的下架任务, 取新 orderNo 订单下的jobNo
{
dtFreeTasks = getWmsOutPickPort . getFreeTasksByJob ( partion , lineId , batchOnly , orderType , taskBelongTo , warehouse , orderNo , "" , isWeightSeeds ) ;
}
if ( dtFreeTasks . Rows . Count = = 0 ) // orderNo 订单下没有可用的下架任务, 取新的任务
{
dtFreeTasks = getWmsOutPickPort . getFreeTasksByJob ( partion , lineId , batchOnly , orderType , taskBelongTo , warehouse , "" , "" , isWeightSeeds ) ;
}
if ( dtFreeTasks . Rows . Count = = 0 )
{
logOut . Debug ( " no free tasks" ) ;
return jobs ;
}
DataView dv = dtFreeTasks . DefaultView ;
int lotcnt = 0 , boxcnt = 0 ;
string lastJob = "" ;
WmsOutPickPort wop ;
if ( isWeightSeeds )
{
dv . Sort = "goodsId" ;
string lastGoods = "" ;
foreach ( DataRowView drv in dv )
{
if ( string . IsNullOrEmpty ( lastGoods ) )
{
lastGoods = drv [ "goodsId" ] . ToString ( ) ; ;
} else if ( lastGoods ! = drv [ "goodsId" ] . ToString ( ) )
{
break ;
}
wop = new WmsOutPickPort ( drv . Row ) ;
wop . takeBy = operId ;
wop . Update ( ) ;
log . Debug ( " user " + operId + " task Assign :" + wop . ID ) ;
if ( lastJob ! = wop . jobNo )
{
lastJob = wop . jobNo ;
WmsFlow wf = new WmsFlow ( wop . jobNo ) ;
wf . owner = operId ;
wf . state = ( int ) enumFlowTaskStatus . 进 行 中 ;
wf . Update ( ) ;
log . Debug ( " user " + operId + " flow Assign :" + wf . task ) ;
}
lotcnt + + ;
boxcnt + = Convert . ToInt32 ( drv [ "boxcnt" ] . ToString ( ) ) ;
if ( lotcnt > = dv . Count * WmsConstants . MAX_PICK_PERCENT / 100 | | lotcnt > WmsConstants . MAX_PICK_LOT_CNT | | boxcnt > WmsConstants . MAX_PICK_BOX_CNT )
{
logTest . Debug ( string . Format ( " All tasks to do , loc cnt :{0}, box cnt: {1}" , lotcnt , boxcnt ) ) ;
break ;
}
}
return jobs ;
}
dv . Sort = "pickorderNo,jobNo" ;
string lastOrder = "" ;
foreach ( DataRowView drv in dv )
{
wop = new WmsOutPickPort ( drv . Row ) ;
if ( string . IsNullOrEmpty ( lastOrder ) )
{
lastOrder = wop . pickOrderNo ;
} else if ( lastOrder ! = wop . pickOrderNo )
{
break ;
}
wop . takeBy = operId ;
wop . Update ( ) ;
logOut . Debug ( " user " + operId + " task Assign :" + wop . ID ) ;
if ( lastJob ! = wop . jobNo )
{
lastJob = wop . jobNo ;
WmsFlow wf = new WmsFlow ( wop . jobNo ) ;
wf . owner = operId ;
wf . state = ( int ) enumFlowTaskStatus . 进 行 中 ;
wf . Update ( ) ;
}
lotcnt + + ;
boxcnt + = Convert . ToInt32 ( drv [ "boxcnt" ] . ToString ( ) ) ;
if ( lotcnt > = dv . Count * WmsConstants . MAX_PICK_PERCENT / 100 | | lotcnt > WmsConstants . MAX_PICK_LOT_CNT | | boxcnt > WmsConstants . MAX_PICK_BOX_CNT )
{
logOut . Debug ( string . Format ( " All tasks to do , loc cnt :{0}, box cnt: {1}" , lotcnt , boxcnt ) ) ;
break ;
}
}
return jobs ;
}
2023-05-23 16:13:17 +08:00
/// <summary>
/// 取总播种操作
/// </summary>
/// <param name="flowNo">取总板号</param>
/// <param name="outDetailId">销售明细id</param>
/// <param name="seedCnt">分播数量</param>
/// <param name="toFlowNo">周转箱号</param>
/// <returns></returns>
2023-11-21 19:18:23 +08:00
internal enumRepResult seedsPickOut ( string flowNo , int skuId , string productDate , string batch , int outDetailId , decimal seedCnt , string toFlowNo , int inDetailId )
2023-05-23 16:13:17 +08:00
{
2023-11-21 19:18:23 +08:00
// logTest.Debug(string.Format(" flowNo:{0} , batch :{1} , outDetailId:{2} , seedsCnt:{3}", flowNo, batch ,outDetailId, seedCnt));
2023-09-04 22:41:19 +08:00
// WmsOutDetail wod = new WmsOutDetail(outDetailId);
// WmsOutRequest wor = new WmsOutRequest(wod.orderNo);
2023-11-21 19:18:23 +08:00
bool isZhitongSeed = inDetailId > 0 ;
if ( isZhitongSeed )
{
return zhitongSeedOut ( inDetailId , outDetailId , seedCnt , flowNo , toFlowNo ) ;
}
2023-09-04 22:41:19 +08:00
WmsOutPickDetail wod = new WmsOutPickDetail ( outDetailId ) ;
2023-11-21 19:18:23 +08:00
// logTest.Debug(string.Format("seeds pickdetail {0}", wod.ToString()));
if ( ! isZhitongSeed & & string . IsNullOrEmpty ( wod . seedsPickNo ) | | wod . state = = ( int ) enumOutStockDetailStatus . 播 种 完 成 )
2023-09-04 22:41:19 +08:00
{
logTest . Debug ( string . Format ( " detialId {0}, seedsNo is null, {1}" , outDetailId , enumRepResult . 不 适 合 播 种 ) ) ;
return enumRepResult . 不 适 合 播 种 ;
}
2023-11-21 19:18:23 +08:00
if ( wod . count ! = seedCnt )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
logTest . Debug ( string . Format ( " detialId {0}, order Cnt {1}, seeds cnt {2}" , outDetailId , wod . count , seedCnt ) ) ;
2023-09-04 22:41:19 +08:00
}
2023-11-21 19:18:23 +08:00
WmsFlow wmsflow = new WmsFlow ( wod . seedsPickNo + wod . goodsId + batch , flowNo ) ;
// logTest.Debug(string.Format("orderNo {0}, flowNo {1}, wmsflow {2}", wod.seedsPickNo + wod.goodsId + batch, flowNo, wmsflow.ToString()));
enumRepResult rs = wmsflow . checkFlow ( operId , wmsflow . type ) ;
if ( rs ! = enumRepResult . 成 功 )
{
logTest . Debug ( string . Format ( " {0} checkflow result {1}, WmsConstants.MAX_TASKS_OWN {2}" , operId , rs , WmsConstants . MAX_TASKS_OWN ) ) ;
return rs ; // enumRepResult.任务已被他人抢占;
}
//to check the toFlowNo plate
// WmsPlate toPlate = new WmsPlate(toFlowNo);
2023-09-04 22:41:19 +08:00
2023-11-21 19:18:23 +08:00
WmsPlateStock_tmp tmpStk = new WmsPlateStock_tmp ( ) ;
string custId = tmpStk . getRelatedCustId ( flowNo ) ;
if ( ! string . IsNullOrEmpty ( custId ) & & custId ! = wod . customerId )
{
return enumRepResult . 容 器 已 被 其 他 客 户 占 用 ;
}
2023-09-04 22:41:19 +08:00
seedCnt = seedCnt > wod . count - wod . seeded ? wod . count - wod . seeded : seedCnt ;
2023-11-21 19:18:23 +08:00
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
// pickport with flowno can be multi records, update the finished seeds count in loop
2023-11-21 19:18:23 +08:00
DataTable dt = getWmsOutPickPort . getFlowNoDetails ( flowNo , wod . goodsId , batch ) ;
2023-09-04 22:41:19 +08:00
List < WmsOutPickPort > lstExists = new List < WmsOutPickPort > ( ) ;
2023-11-21 19:18:23 +08:00
List < WmsPlateStock_tmp > lstUpdate = new List < WmsPlateStock_tmp > ( ) ;
;
2023-05-23 16:13:17 +08:00
decimal tmpCnt = seedCnt ;
2023-11-21 19:18:23 +08:00
DataView dv = dt . DefaultView ;
dv . RowFilter = "state=" + ( int ) enumPickState . 已 分 播 ;
int seedsDoneCnt = dv . Count ;
dv . RowFilter = "" ;
// logTest.Debug(string.Format("1 seeds done cnt {0}, totalcnt of task{1}", seedsDoneCnt, dt.Rows.Count));
foreach ( DataRow dr in dt . Rows )
2023-05-23 16:13:17 +08:00
{
2023-11-21 19:18:23 +08:00
WmsOutPickPort wop = new WmsOutPickPort ( dr ) ;
2023-09-04 22:41:19 +08:00
decimal tmpCnt2 = 0 ;
2023-11-21 19:18:23 +08:00
if ( wop . state = = ( int ) enumPickState . 已 分 播 )
{
seedsDoneCnt + + ;
}
2023-09-04 22:41:19 +08:00
if ( wop . state = = 1 ) //已经拣货完毕
2023-05-23 16:13:17 +08:00
{
if ( wop . seedsOutCount + tmpCnt < = wop . pickCount )
{
2023-09-04 22:41:19 +08:00
tmpCnt2 = tmpCnt ;
2023-05-23 16:13:17 +08:00
wop . seedsOutCount + = tmpCnt ;
2023-09-04 22:41:19 +08:00
lstExists . Add ( wop ) ;
tmpCnt = 0 ;
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
}
else
{
tmpCnt - = wop . pickCount - wop . seedsOutCount ;
wop . seedsOutCount = wop . pickCount ;
2023-11-21 19:18:23 +08:00
2023-09-04 22:41:19 +08:00
lstExists . Add ( wop ) ;
tmpCnt2 = wop . pickCount ;
2023-05-23 16:13:17 +08:00
}
2023-09-04 22:41:19 +08:00
/ *
* 更 新 临 时 库 数 据
*
* /
2023-11-21 19:18:23 +08:00
DataTable dt1 = tmpStk . getByOutPort ( wop . ID ) ;
foreach ( DataRow dr1 in dt1 . Rows )
{
if ( tmpCnt2 < = 0 )
2023-09-04 22:41:19 +08:00
{
break ;
}
tmpStk = new WmsPlateStock_tmp ( dr1 ) ;
2023-11-21 19:18:23 +08:00
// log.Debug("1 tmpStk.count " + tmpStk.count + ", tmpCnt2: " + tmpCnt2);
2023-09-04 22:41:19 +08:00
if ( tmpStk . count > = tmpCnt2 )
{
tmpStk . count - = tmpCnt2 ;
tmpCnt2 = 0 ;
}
else
2023-11-21 19:18:23 +08:00
{
2023-09-04 22:41:19 +08:00
tmpCnt2 - = tmpStk . count ;
2023-11-21 19:18:23 +08:00
tmpStk . count = 0 ;
2023-09-04 22:41:19 +08:00
}
2023-11-21 19:18:23 +08:00
// log.Debug("2 tmpStk.count " + tmpStk.count + ", tmpCnt2: " + tmpCnt2);
// log.Debug(tmpStk);
lstUpdate . Add ( tmpStk ) ;
2023-09-04 22:41:19 +08:00
}
if ( tmpCnt = = 0 )
{
break ;
}
}
2023-05-23 16:13:17 +08:00
}
2023-11-21 19:18:23 +08:00
if ( tmpCnt > 0 )
2023-05-23 16:13:17 +08:00
{
2023-11-21 19:18:23 +08:00
//logTest.Debug(string.Format(" 播种请求数量{0}, 可用播种数量{1},flowNo:{2} , batch :{3} , outDetailId:{4} ", seedCnt, seedCnt - tmpCnt, flowNo, batch, outDetailId));
// return enumRepResult.分播数量大于剩余数量;
2023-09-04 22:41:19 +08:00
}
seedCnt - = tmpCnt ;
if ( seedCnt < = 0 )
{
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
return enumRepResult . 分 播 数 量 大 于 剩 余 数 量 ;
}
2023-09-04 22:41:19 +08:00
seedCnt = seedCnt > wod . count - wod . seeded ? wod . count - wod . seeded : seedCnt ;
wod . seeded + = seedCnt ;
2023-11-21 19:18:23 +08:00
if ( wod . count < = wod . seeded )
{
wod . state = ( int ) enumOutStockDetailStatus . 播 种 完 成 ;
}
2023-09-04 22:41:19 +08:00
2023-11-21 19:18:23 +08:00
// log.Debug(" 1 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
2023-05-23 16:13:17 +08:00
using ( TransactionScope scope = new TransactionScope ( ) )
{
2023-11-21 19:18:23 +08:00
// logTest.Debug(string.Format("start update 分播 tasks ,operid {0}, wmsflow : {1}",operId, wmsflow.ToString() ));
2023-05-23 16:13:17 +08:00
wod . Update ( ) ;
2023-09-04 22:41:19 +08:00
if ( wod . isAllPicked ( wod . pickOrderNo ) )
{
new lWmsOutPickRequest ( operId ) . updateOrderStatus ( wod . pickOrderNo , enumOutStockPickStatus . 分 拣 完 成 ) ;
}
2023-11-21 19:18:23 +08:00
2023-05-23 16:13:17 +08:00
WmsStockRecord wsr = new WmsStockRecord ( ) ;
2023-09-04 22:41:19 +08:00
wsr . orderNo = wod . pickOrderNo ;
2023-05-23 16:13:17 +08:00
wsr . orderDetailId = wod . ID ;
2023-11-21 19:18:23 +08:00
wsr . goodsId = wod . goodsId ;
2023-05-23 16:13:17 +08:00
wsr . count = seedCnt ;
wsr . locationId = flowNo ;
2023-09-04 22:41:19 +08:00
wsr . operater = operId ;
2023-11-21 19:18:23 +08:00
wsr . batch = batch ; // wod.batch;
wsr . productDate = productDate ;
wsr . skuId = skuId ;
wsr . rectype = ( int ) enumStockRecordType . 集 货 分 播 ;
2023-05-23 16:13:17 +08:00
wsr . Add ( ) ;
WmsOutPickPort wop = new WmsOutPickPort ( ) ;
wop . recordId = wsr . ID ;
wop . pickBy = operId ;
2023-11-21 19:18:23 +08:00
wop . pickTime = wop . getDateTime ( ) ;
2023-05-23 16:13:17 +08:00
wop . pickCount = seedCnt ;
2023-11-21 19:18:23 +08:00
wop . pickOrderNo = wod . pickOrderNo ;
2023-05-23 16:13:17 +08:00
wop . state = ( int ) enumPickState . 已 分 播 ;
2023-11-21 19:18:23 +08:00
wop . recType = ( int ) enumStockRecordType . 集 货 分 播 ;
2023-05-23 16:13:17 +08:00
wop . seedsFromFlowNo = flowNo ;
wop . flowNo = toFlowNo ;
2023-09-04 22:41:19 +08:00
wop . pickDetailId = wod . ID ;
wop . operater = operId ;
2023-11-21 19:18:23 +08:00
wop . jobNo = wmsflow . task ;
int id = wop . Add ( ) ;
2023-09-04 22:41:19 +08:00
2023-11-21 19:18:23 +08:00
/ *
if ( toPlate . customerId ! = wod . customerId )
{
toPlate . customerId = wod . customerId ;
toPlate . Update ( ) ;
}
* /
foreach ( WmsOutPickPort port in lstExists )
{
if ( port . pickCount < = port . seedsOutCount )
{
port . state = ( int ) enumPickState . 已 分 播 ;
seedsDoneCnt + + ;
port . Update ( ) ;
}
// WmsPlateStock_tmp t = new WmsPlateStock_tmp();
// t.getByOutPort(wop.ID);
// t.Delete();
}
// logTest.Debug(string.Format("2 seeds done cnt {0}, totalcnt of task{1}", seedsDoneCnt, dt.Rows.Count));
wmsflow . finishedTasksPlus ( operId , true , seedsDoneCnt = = dt . Rows . Count ) ;
// log.Debug(" 2 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
foreach ( WmsPlateStock_tmp tmp in lstUpdate )
{
// log.Debug("3 tmp.count " + tmp.count);
// log.Debug(tmpStk);
if ( tmp . count = = 0 )
{
// log.Debug("deleted tmp stock, outPortId " + tmp.outPortId);
tmp . Delete ( ) ;
}
else
{
tmp . Update ( ) ;
}
}
if ( lstUpdate . Count > 0 )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
WmsPlateStock_tmp stk = lstUpdate [ 0 ] ; //copy source tmp stk info
2023-09-04 22:41:19 +08:00
stk . outPortId = id ;
stk . plateId = toFlowNo ;
stk . count = seedCnt ;
2023-11-21 19:18:23 +08:00
stk . orderNo = wod . pickOrderNo ;
stk . recordId = wsr . ID ;
stk . skuId = skuId ;
stk . productDate = productDate ;
stk . customerId = wod . customerId ;
2023-09-04 22:41:19 +08:00
stk . Add ( ) ;
}
2023-11-21 19:18:23 +08:00
scope . Complete ( ) ;
}
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
2023-11-21 19:18:23 +08:00
return enumRepResult . 成 功 ;
}
2023-12-03 22:13:49 +08:00
2023-11-21 19:18:23 +08:00
private enumRepResult zhitongSeedOut ( int inDetailId , int outDetailId , decimal seedCnt , string flowNo , string toFlowNo )
{
logOut . Debug ( "直通分货开始。。。。。。。。" ) ;
WmsPlateStock_tmp tmpStk = new WmsPlateStock_tmp ( ) ;
WmsOutPickDetail wod = new WmsOutPickDetail ( outDetailId ) ;
WmsInRequestDetail wid = new WmsInRequestDetail ( inDetailId ) ;
WmsFlow flow = new WmsFlow ( wid . taskNo ) ;
enumRepResult rs = flow . checkFlow ( operId , flow . type ) ;
if ( rs ! = enumRepResult . 成 功 )
{
return rs ;
}
DataTable dt = getWmsInUpPort . getJobsByFlowSku ( flowNo , wid . goodsId , wid . productDate ) ;
List < WmsInUpPort > lstExists = new List < WmsInUpPort > ( ) ;
List < WmsPlateStock_tmp > lstUpdate = new List < WmsPlateStock_tmp > ( ) ;
decimal tmpCnt = seedCnt ;
foreach ( DataRow dr in dt . Rows )
{
WmsInUpPort wip = new WmsInUpPort ( dr ) ;
decimal tmpCnt2 = 0 ;
if ( wip . state = = ( int ) enumInStockDetailStatus . 已 分 配 货 位 ) //已经收货完毕
{
if ( wip . upCount + tmpCnt < = wip . count )
{
tmpCnt2 = tmpCnt ;
wip . upCount + = tmpCnt ;
lstExists . Add ( wip ) ;
tmpCnt = 0 ;
}
else
{
tmpCnt - = wip . count - wip . upCount ;
wip . upCount = wip . count ;
lstExists . Add ( wip ) ;
tmpCnt2 = wip . count ;
}
/ *
* 更 新 临 时 库 数 据
*
* /
DataTable dt1 = tmpStk . getByInPort ( wip . ID ) ;
foreach ( DataRow dr1 in dt1 . Rows )
{
if ( tmpCnt2 < = 0 )
{
break ;
}
tmpStk = new WmsPlateStock_tmp ( dr1 ) ;
// log.Debug("1 tmpStk.count " + tmpStk.count + ", tmpCnt2: " + tmpCnt2);
if ( tmpStk . count > = tmpCnt2 )
{
tmpStk . count - = tmpCnt2 ;
tmpCnt2 = 0 ;
}
else
{
tmpCnt2 - = tmpStk . count ;
tmpStk . count = 0 ;
}
// log.Debug("2 tmpStk.count " + tmpStk.count + ", tmpCnt2: " + tmpCnt2);
// log.Debug(tmpStk);
lstUpdate . Add ( tmpStk ) ;
}
if ( tmpCnt = = 0 )
{
break ;
}
}
}
if ( seedCnt > wid . validCount - wid . seedOutCnt )
{
seedCnt = wid . validCount - wid . seedOutCnt ;
// return enumRepResult.分播数量大于剩余数量;
}
seedCnt = seedCnt > wod . count - wod . seeded ? wod . count - wod . seeded : seedCnt ;
wod . seeded + = seedCnt ;
if ( wod . count < = wod . seeded )
{
wod . state = ( int ) enumOutStockDetailStatus . 播 种 完 成 ;
}
// log.Debug(" 1 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
using ( TransactionScope scope = new TransactionScope ( ) )
{
wid . seedOutCnt + = seedCnt ;
wid . Update ( ) ;
flow . finishedTasksPlus ( operId , true , wid . seedOutCnt > = wid . validCount ) ;
wod . Update ( ) ;
if ( wod . isAllPicked ( wod . pickOrderNo ) )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
new lWmsOutPickRequest ( operId ) . updateOrderStatus ( wod . pickOrderNo , enumOutStockPickStatus . 分 拣 完 成 ) ;
}
logOut . Debug ( string . Format ( "zhitong seeds out goodsId :{0}, seedCnt :{1}, wid seedOutCnt {2}, wod id {3}, seeded count {4}" , wid . goodsId , seedCnt , wid . seedOutCnt , wod . ID , wod . seeded ) ) ;
WmsStockRecord wsr = new WmsStockRecord ( ) ;
wsr . orderNo = wod . pickOrderNo ;
wsr . orderDetailId = wod . ID ;
wsr . goodsId = wod . goodsId ;
wsr . count = seedCnt ;
wsr . locationId = flowNo ;
wsr . operater = operId ;
wsr . batch = wid . productDate ; // wod.batch;
wsr . productDate = wid . productDate ;
wsr . skuId = wid . skuId ;
wsr . rectype = ( int ) enumStockRecordType . 集 货 分 播 ;
wsr . Add ( ) ;
WmsOutPickPort wop = new WmsOutPickPort ( ) ;
wop . recordId = wsr . ID ;
wop . pickBy = operId ;
wop . pickTime = wop . getDateTime ( ) ;
wop . count = wop . pickCount = seedCnt ;
wop . pickOrderNo = wod . pickOrderNo ;
wop . state = ( int ) enumPickState . 已 分 播 ;
wop . recType = ( int ) enumStockRecordType . 集 货 分 播 ;
wop . seedsFromFlowNo = flowNo ;
wop . flowNo = toFlowNo ;
wop . pickDetailId = wod . ID ;
wop . operater = operId ;
wop . jobNo = flow . task ;
int id = wop . Add ( ) ;
foreach ( WmsInUpPort port in lstExists )
{
if ( port . count < = port . upCount )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
port . state = ( int ) enumInStockDetailStatus . 直 通 分 货 完 成 ;
port . Update ( ) ;
2023-09-04 22:41:19 +08:00
}
2023-11-21 19:18:23 +08:00
}
/ *
if ( toPlate . customerId ! = wod . customerId )
{
toPlate . customerId = wod . customerId ;
toPlate . Update ( ) ;
2023-05-23 16:13:17 +08:00
}
2023-11-21 19:18:23 +08:00
* /
// log.Debug(" 2 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
foreach ( WmsPlateStock_tmp tmp in lstUpdate )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
// log.Debug("3 tmp.count " + tmp.count);
// log.Debug(tmpStk);
if ( tmp . count = = 0 )
2023-09-04 22:41:19 +08:00
{
2023-11-21 19:18:23 +08:00
// log.Debug("deleted tmp stock, outPortId " + tmp.outPortId);
2023-09-04 22:41:19 +08:00
tmp . Delete ( ) ;
}
else
{
tmp . Update ( ) ;
}
}
2023-11-21 19:18:23 +08:00
if ( lstUpdate . Count > 0 )
{
WmsPlateStock_tmp stk = lstUpdate [ 0 ] ; //copy source tmp stk info
stk . outPortId = id ;
stk . plateId = toFlowNo ;
stk . count = seedCnt ;
stk . orderNo = wod . pickOrderNo ;
stk . recordId = wsr . ID ;
// stk.skuId = skuId;
// stk.productDate = productDate;
stk . customerId = wod . customerId ;
stk . Add ( ) ;
}
2023-09-04 22:41:19 +08:00
2023-05-23 16:13:17 +08:00
scope . Complete ( ) ;
}
2023-11-21 19:18:23 +08:00
logOut . Debug ( "直通分货结束" ) ;
2023-05-23 16:13:17 +08:00
return enumRepResult . 成 功 ;
}
2023-09-04 22:41:19 +08:00
internal enumRepResult stackDone ( string preInNo , string flowNo )
{
throw new NotImplementedException ( ) ;
}
2023-05-23 16:13:17 +08:00
internal DataTable getSeedsPickDetail ( string flowNo , bool isOrderByCust )
{
2023-09-04 22:41:19 +08:00
// return getWmsOutPickPort.getSeedsOutDetail(flowNo, isOrderByCust);
return getWmsOutPickPort . getSeedsOutPickDetail ( flowNo , isOrderByCust ) ;
2023-05-23 16:13:17 +08:00
}
/ *
* 取 消 拣 货 任 务
*
* /
2023-11-21 19:18:23 +08:00
public int taskRessign ( int taskBy , int partion , int lineId , bool batchOnly = true , enumOrderType orderType = enumOrderType . 销 售 出 库 )
2023-05-23 16:13:17 +08:00
{
DataTable dt = getWmsOutPickPort . getAssignedTasks ( taskBy , partion , lineId , batchOnly , orderType ) ;
int i = 0 ;
WmsOutPickPort wop ;
using ( TransactionScope scope = new TransactionScope ( ) )
{
foreach ( DataRow dr in dt . Rows )
{
wop = new WmsOutPickPort ( dr ) ;
wop . takeBy = 0 ;
// wop.operater = operId;
if ( wop . state = = ( int ) enumPickState . 未 拣 )
{
wop . Update ( ) ;
i + + ;
LogHelper . debug ( "lWmsOutPickPort" , " user " + taskBy + " task resign:" + wop . ID ) ;
}
}
scope . Complete ( ) ;
}
return i ;
}
2023-11-21 19:18:23 +08:00
public DataTable getAssignedTasks4Wince ( int taskBy , int partion = 0 , int lineId = - 1 , bool batchOnly = true , enumOrderType orderType = enumOrderType . 销 售 出 库 )
2023-05-23 16:13:17 +08:00
{
return getWmsOutPickPort . getAssignedTasks4Wince ( taskBy , partion , lineId , batchOnly , orderType ) ;
}
2023-12-03 22:13:49 +08:00
public DataTable getAssignedOutTasks ( int taskBy , int partion = 0 , int lineId = - 1 , bool batchOnly = false , enumOrderType orderType = enumOrderType . 销 售 出 库 , int taskId = 0 )
2023-05-23 16:13:17 +08:00
{
2023-12-03 22:13:49 +08:00
if ( taskId > 0 & & ConstAuthourity . havePermission ( operId , WmsConstants . SPECIAL_VALID_REASSIN_TASK_BY_ID ) )
{
WmsOutPickPort wop = new WmsOutPickPort ( taskId ) ;
if ( ! string . IsNullOrEmpty ( wop . jobNo ) )
{
// if (wop.state == 0)
{
if ( wop . takeBy > 0 )
{
wop . description + = " 原任务所有者 为 " + wop . takeBy + ",reassign to " + operId + ", " + DateTime . Now ;
}
wop . takeBy = operId ;
wop . Update ( ) ;
}
}
}
2023-05-23 16:13:17 +08:00
2023-12-03 22:13:49 +08:00
return getWmsOutPickPort . getAssignedTasks ( taskBy , partion , lineId , batchOnly , orderType ) ;
}
// internal DataTable getAssignedOutTasks(int taskBy)
// {
// return getWmsOutPickPort.getAssignedTasks(taskBy);
// }
2023-05-23 16:13:17 +08:00
public DataTable getPartions ( int userID )
{
return getWmsOutPickPort . getPartions ( userID ) ;
}
internal DataTable getRepTasks ( int takeBy , int taskPartion )
{
return getWmsOutPickPort . getRepTasks ( takeBy , taskPartion ) ;
}
2023-09-04 22:41:19 +08:00
internal DataTable getFlows4SeedsOut ( )
{
return getWmsOutPickPort . getFlows4SeedsOut ( ) ;
}
2023-11-21 19:18:23 +08:00
internal DataTable getFlows4ZhitongSeedsOut ( )
{
return getWmsInRequestDetail . getFlows4ZhitongSeedsOut ( ) ;
}
2023-05-23 16:13:17 +08:00
}
}