ldj/WcfService1/BLL/lWmsOutPickPort.cs

2370 lines
84 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_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();
}
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;
}
}
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();
}
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()
{
DataTable dt = getWmsOutPickPort.getNewPickTasks(new WaveRule().getCurrentActiveRule(enumWaveRuleType.));
if (dt.Rows.Count == 0)
{
return false;
}
logTest.Debug("start to process new waves...count:" + dt.Rows.Count);
int lastTranArea = -100, lastPartion = -100, lastVolType = -100, lastOrderType = -100;//,lastChannel=-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.MAX_JOBS_IN_A_WAVE;
int jobcnt = 0;
int taskcnt = 0;
bool isCreateFlowTask = WmsConstants.OUT_LIGHT_ENABLE ? WmsConstants.DPS_TASK_GENERATION :true ;
WmsOutPickPort _obj;
WmsFlow wmsflow;
decimal boxMax = 0;
decimal boxPercent = 0;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
{
//IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
IsolationLevel = System.Transactions.IsolationLevel.Serializable,
Timeout = new TimeSpan(0, 10, 0)
}
))
{
// logSpec.Debug("start work...to create wave and jobs ");
foreach (DataRow dr in dt.Rows)
{
// int channel = Convert.ToInt32(dr["channel"].ToString());
_obj = new WmsOutPickPort(dr);
boxMax = Convert.ToDecimal(dr["full_max"].ToString());
if (boxMax > 0)
{
boxPercent += (_obj.count / boxMax) * 100;
}
if (lastTranArea == -100)
{
lastTranArea = _obj.tranArea;
}
if (lastPartion == -100)
{
lastPartion = _obj.partion;
}
if (lastVolType == -100)
{
lastVolType = _obj.volType;
}
// if (lastChannel == -100)
{
// lastChannel = channel;
}
/*
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);
if (pr.state != (int)enumOutStockRequestStatus.) {
pr.state = (int)enumOutStockRequestStatus.;
pr.Update();
}
jobcnt = jobMax; //每个job只属于一个分拣单
}
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
|| !waveJobs.ContainsKey(_obj.partion)
//|| lastChannel != channel
|| boxPercent>=100;
if (jobcnt >= maxSize)
{
}
if (isNewJob)
{
boxPercent= 0;
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)
{
wmsflow.taskCnt = taskcnt;// waveJobs[lastPartion].Length;
wmsflow.Update();
}
}
jobcnt = 0; taskcnt = 0;
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;
wmsflow.orderNo = _obj.pickOrderNo;// waveNo;
wmsflow.type = (int)Util.getTaskType(_obj.recType);
wmsflow.typeName = Util.getTaskType(_obj.recType).ToString();
wmsflow.task = jobNo;
wmsflow.fromPartion = _obj.partion;
wmsflow.toPartion = _obj.tranArea;
wmsflow.taskPartion = _obj.partion;
// wmsflow.fromLocationId=_obj.locationId;
wmsflow.Add();
}
}
else
{
jobNo = waveJobs[_obj.partion];
}
jobcnt++;
taskcnt++;
_obj.waveOrder = waveNo;
_obj.jobNo = jobNo;
_obj.operater = operId;
_obj.Update();
//lastChannel = channel;
lastTranArea = _obj.tranArea;
lastPickRequest = _obj.pickOrderNo;
lastPartion = _obj.partion;
lastVolType = _obj.volType;
}
if (!string.IsNullOrEmpty(waveNo) )
{
wmsflow = new WmsFlow(jobNo );
if (wmsflow.ID > 0)
{
wmsflow.taskCnt = taskcnt;
wmsflow.Update();
}
}
scope.Complete();
}
logTest.Debug("end process new waves.. in last wave, created job count " +jobcnt);
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)
{
comLables[Convert.ToInt32(s.Trim())] = Convert.ToInt32(node.name.Trim());
lblist.Add(Convert.ToInt32(s.Trim()));
}
}
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();
}
/// <summary>
/// 返回亮灯数据
/// </summary>
/// <param name="deskId"></param>
/// <param name="flowno"></param>
/// <param name="barcode"></param>
/// <param name="userId"></param>
/// <param name="isValid"></param>
/// <returns></returns>
internal DataTable prePareLightSeeds(int deskId, string flowno, string barcode, int userId, bool isValid)
{
return getWmsOutPickPort.getLightSeeds(deskId, flowno, barcode);
}
internal DataTable getLightTasks(string query, int wareHouse, int partion, int lineId, int state,string date, bool isLight)
{
return getWmsOutPickPort.getLightTasks( pareseCondition(query), wareHouse, partion, lineId, state,date, isLight);
}
internal int clearJobLightTask(string jobNo)
{
return new WmsOutPickLable_tmp().clearByDpsOrder(jobNo);
}
internal DataTable prePareLightByJob(int userId,string jobNo,bool isValid)
{
operId = userId;
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;
}
WmsFlow wmsflow = new WmsFlow(jobNo);
wmsflow.owner = operId;
using (TransactionScope scope = new TransactionScope())
{
int i = 0;
wpl.clearByDpsOrder(jobNo);
wmsflow.Update();
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 = wpp.virtialCnt>0? 1:3;
wpl.dpsOrder = jobNo;
if (dt.Columns.Contains("goodsid"))
{
string goodsid = dr["goodsid"].ToString().Trim().Substring(1);
goodsid = goodsid.Substring(goodsid.Length - 2);
try { wpl.elabAddress = Convert.ToUInt16(goodsid); }
catch
{
}
}
#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 getPickLightTasks(int takeBy, int partion, int orderType)
{
return getWmsOutPickPort.getPickLightTasks( takeBy, partion, orderType);
}
/*
* 分配拣货任务
*/
public void taskAssign(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));
// int lotcnt = 0,boxcnt=0;
if (isJobMax(taskBy, partion, lineId, maxLocCnt, maxBoxs,
batchOnly, orderType))
{
return;
}
int lotcnt = 0, boxcnt = 0;
WmsOutPickPort wop;
DataTable dt = getWmsOutPickPort.getFreeTasks(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));
using (TransactionScope scope = new TransactionScope())
{
foreach (DataRow dr in dt.Rows)
{
wop = new WmsOutPickPort(dr);
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.takeBy = taskBy;
// wop.operater = operId;
wop.Update();
// log.Debug( " user " + taskBy + " task Assign :" + wop.ID);
/*
WmsFlow wf = new WmsFlow(wop.jobNo);
wf.owner = operId;
wf.state = (int)enumFlowTaskStatus.进行中;
wf.Update();
*/
/**
* 改为下架时生成补零上架任务
*
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
WmsStock newStk = new WmsStock(wip.locationId, skuId,wip.goodsId);
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();
}
}
*/
}
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));
}
bool isJobMax(int takeBy, int partion, int lineId, int maxLocCnt = 0, int maxBoxs = 0, bool batchOnly = true, enumOrderType orderType = enumOrderType.)
{
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;
DataTable dt = getWmsOutPickPort.getAssignedTasks(takeBy, partion, -1, batchOnly, orderType);
lotcnt = dt.Rows.Count;
if (lotcnt >= maxLocCnt)
{
logOut.Debug(" user " + takeBy + " 无法分配更多的任务了,未完成 task lotcnt :" + lotcnt);
return true;
}
foreach (DataRow dr in dt.Rows)
{
wop = new WmsOutPickPort(dr);
try
{
boxcnt += Convert.ToInt32(dr["boxcnt"].ToString());
}
catch { }
if (boxcnt >= maxBoxs)
{
logOut.Debug(" user " + takeBy + " 无法分配更多的任务了,未完成 box cnt :" + boxcnt);
return true;
}
// wop.operater = operId;
}
return false;
}
/// <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));
if(isJobMax( taskBy, partion, lineId, maxLocCnt, maxBoxs ,
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));
}
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="";
bool isWeightSeeds = false;
bool isWeightSeedsLitmited= false; //接受最大量约束
if (!string.IsNullOrEmpty(lastJobNo))
{
WmsFlow flow = new WmsFlow(lastJobNo);
orderNo = flow.orderNo;
}
DataTable dtFreeTasks = new DataTable();
bool isWholePickOrder = locationId.StartsWith("PK");
if (isWholePickOrder)
{
dtFreeTasks = getWmsOutPickPort.getFreeTasksByPickOrder(locationId);
}
else
{
WmsLocation loc = new WmsLocation(locationId);
if (loc.ID == 0 && warehouse == 0)
{
return jobs;
}
partion = loc.partion;
enumOrderType orderType = enumOrderType.; //默认取全部订单类型
isWeightSeeds = loc.isWeightSeeds
|| loc.part == 16759 //蔬菜类,边拣边分,获取单品所有任务,不跨区分配
// || loc.part == 16761 //冷冻
// || loc.part == 16762
; //冷冻
isWeightSeedsLitmited = loc.part == 16761 || loc.part == 16762; //冷冻
// logOut.Debug("蔬菜类 is weight seeds ? " + isWeightSeeds);
if (!isWeightSeeds && isJobMax(operId, partion, lineId, 0, 0, batchOnly, orderType))
{
logOut.Debug(" job max exeed");
return jobs;
}
warehouse = warehouse == 0 ? loc.warehouse : warehouse;
logOut.Debug(string.Format("partion {0}, lineId {1}, batchOnly {2}, orderType {3}, taskBelongTo {4},warehouse {5}, orderNo {6},lastJobNo {7},isWeightSeeds {8}isWeightSeedsLitmited {9} ", partion, lineId, batchOnly, orderType, taskBelongTo, warehouse, orderNo, lastJobNo, isWeightSeeds, isWeightSeedsLitmited));
// DataTable dtFreeTasks = new DataTable(); getWmsOutPickPort.getFreeTasksByJob(partion, lineId, batchOnly, orderType, taskBelongTo,warehouse, orderNo,lastJobNo,isWeightSeeds); //取同一个job下的任务可能碰到缺货的任务穿插交错的情况
// partion = 0;// set partion to zero, 目的是减少 扫描取任务的频率
bool isTimeForFetchTasks = (DateTime.Now.Hour >= WmsConstants.SEEDS_TASK_FETCH_START_HOUR
&& DateTime.Now.Hour <= WmsConstants.SEEDS_TASK_FETCH_END_HOUR ) &&
( DateTime.Now.Minute >= WmsConstants.SEEDS_TASK_FETCH_START_MINUTES && DateTime.Now.Minute <= WmsConstants.SEEDS_TASK_FETCH_END_MINUTES);
// logOut.Debug(string.Format("当前小时 {0} 分{1}" ,DateTime.Now.Hour, DateTime.Now.Minute));
// logOut.Debug(string.Format("任务分配开始时间{0}:{1},结束时间{2}:{3}, 可以抢拣货任务? {4}", WmsConstants.SEEDS_TASK_FETCH_START_HOUR, WmsConstants.SEEDS_TASK_FETCH_START_MINUTES, WmsConstants.SEEDS_TASK_FETCH_END_HOUR, WmsConstants.SEEDS_TASK_FETCH_END_MINUTES, isTimeForFetchTasks));
if (!isTimeForFetchTasks)
{
throw new Exception(string.Format("不在任务分配时间{0}:{1:D2}---{2}:{3:D2} ",
WmsConstants.SEEDS_TASK_FETCH_START_HOUR, WmsConstants.SEEDS_TASK_FETCH_START_MINUTES, WmsConstants.SEEDS_TASK_FETCH_END_HOUR, WmsConstants.SEEDS_TASK_FETCH_END_MINUTES));
//return jobs;
}
if (isWeightSeeds || isWeightSeedsLitmited)
{
dtFreeTasks = getWmsOutPickPort.getFreeTasksByJob(partion, lineId, batchOnly, orderType, taskBelongTo, warehouse, "", "", true);
}
else
{
if (dtFreeTasks.Rows.Count == 0) // 指定区域 上一个job没有可用的下架任务 取orderNo 订单下新 的jobNo
{
logTest.Debug(" 1 指定区域 上一个job没有可用的下架任务 取orderNo 订单下新 的jobNo ");
dtFreeTasks = getWmsOutPickPort.getFreeTasksByJob(partion, lineId, batchOnly, orderType, taskBelongTo, warehouse, orderNo, "", isWeightSeeds);
}
if (dtFreeTasks.Rows.Count == 0) // 不指定区域, orderNo 订单下新 的jobNo
{
logTest.Debug("2 不指定区域, orderNo 订单下新 的jobNo ");
dtFreeTasks = getWmsOutPickPort.getFreeTasksByJob(0, lineId, batchOnly, orderType, taskBelongTo, warehouse, orderNo, "", isWeightSeeds);
}
if (dtFreeTasks.Rows.Count == 0)// 不指定区域 orderNo 订单下没有可用的下架任务, 取所在区域 新的任务
{
logTest.Debug("3 不指定区域 orderNo 订单下没有可用的下架任务, 取所在区域 新的任务 ");
dtFreeTasks = getWmsOutPickPort.getFreeTasksByJob(partion, lineId, batchOnly, orderType, taskBelongTo, warehouse, "", "", isWeightSeeds);
}
if (dtFreeTasks.Rows.Count == 0)//所在区域没有下架任务,不指定区域,取新任务
{
logTest.Debug("4 所在区域没有下架任务,不指定区域,取新任务 ");
dtFreeTasks = getWmsOutPickPort.getFreeTasksByJob(0, 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 || isWeightSeedsLitmited)
{
dv.RowFilter = "recType=" + (int)enumStockRecordType.;
dv.Sort = "locationId,goodsId";
int taskCnt = 0;
foreach (DataRowView drv in dv)
{
wop = new WmsOutPickPort(drv.Row);
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();
// logOut.Debug(" user " + operId + " flow Assign :" + wf.task);
}
taskCnt++;
if (isWeightSeedsLitmited)
{
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("1 can't assign more tasks , loc cnt :{0}, box cnt: {1}, dv.Count * WmsConstants.MAX_PICK_PERCENT / 100: {2}", lotcnt, boxcnt, dv.Count * WmsConstants.MAX_PICK_PERCENT / 100));
break;
}
}
else if (taskCnt > 20)
{
break;
}
/*
*/
}
if (taskCnt > 0)
{
return jobs;
}
dv.RowFilter = "recType <>" + (int)enumStockRecordType.;
// dv.Sort = "priority desc,goodsId";
dv.Sort = "goodsId";
string lastGoods = "";
logOut.Debug(string.Format(" tasks count for assisgn {0}", dv.Count));
foreach (DataRowView drv in dv)
{
//非集货订单 则按商品分配,一次获取一个单品所有任务分配给一个人
{
if (string.IsNullOrEmpty(lastGoods))
{
lastGoods = drv["goodsId"].ToString();
logOut.Debug(string.Format(" current goods {0} {1} " , lastGoods, drv["goodsname"].ToString()));
}
else if (lastGoods != drv["goodsId"].ToString())
{
logOut.Debug(string.Format(" next goods {0}.....break... ", drv["goodsname"].ToString()));
break;
}
}
wop = new WmsOutPickPort(drv.Row);
wop.takeBy = operId;
wop.Update();
taskCnt++;
logOut.Debug(string.Format("user id {0} , task assign ID {1}, toatal task cnt {2}", operId,wop.ID,taskCnt));
if (lastJob != wop.jobNo)
{
lastJob = wop.jobNo;
WmsFlow wf = new WmsFlow(wop.jobNo);
wf.owner = operId;
wf.state = (int)enumFlowTaskStatus.;
wf.Update();
// logOut.Debug(" user " + operId + " flow Assign :" + wf.task);
}
}
return jobs;
}
dv.Sort = " warehouse,partion,channel,shelf,col,layer,goodsid";
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();
}
if (!isWholePickOrder) //非整单获取
{
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("2 can't assign more tasks , loc cnt :{0}, box cnt: {1}, dv.Count * WmsConstants.MAX_PICK_PERCENT / 100: {2}", lotcnt, boxcnt, dv.Count * WmsConstants.MAX_PICK_PERCENT / 100));
break;
}
}
}
return jobs;
}
internal decimal seedsPickOut2(string flowNo, int skuId, string productDate, string batch, int outDetailId,
decimal seedCnt, string toFlowNo, int inDetailId, bool isForceClose)
{
decimal seeded = new WmsOutPickDetail(outDetailId).seeded;
enumRepResult rs = seedsPickOut(flowNo,skuId,productDate,batch,outDetailId,seedCnt,toFlowNo,inDetailId,isForceClose);
if (rs == enumRepResult.)
{
return new WmsOutPickDetail(outDetailId).seeded - seeded;
}
return 0;
}
/// <summary>
/// 取总播种操作
/// </summary>
/// <param name="flowNo">取总板号</param>
/// <param name="outDetailId">销售明细id</param>
/// <param name="seedCnt">分播数量</param>
/// <param name="toFlowNo">周转箱号</param>
/// <returns></returns>
internal enumRepResult seedsPickOut(string flowNo,int skuId,string productDate, string batch, int outDetailId,
decimal seedCnt, string toFlowNo,int inDetailId, bool isForceClose)
{
logTest.Debug(string.Format(" flowNo:{0} batch :{1} , outDetailId:{2} , seedsCnt:{3}, toFlowNo {4} ", flowNo, batch ,outDetailId, seedCnt,toFlowNo));
// WmsOutDetail wod = new WmsOutDetail(outDetailId);
// WmsOutRequest wor = new WmsOutRequest(wod.orderNo);
bool isZhitongSeed = inDetailId > 0;
if (isZhitongSeed)
{
return zhitongSeedOut(inDetailId, outDetailId, seedCnt, flowNo, toFlowNo);
}
WmsOutPickDetail wod = new WmsOutPickDetail(outDetailId);
logTest.Debug(string.Format("seeds pickdetail {0}", wod.ToString()));
if (wod.ID==0 || !isZhitongSeed && string.IsNullOrEmpty(wod.seedsPickNo) )
{
logTest.Debug(string.Format(" detialId {0}, seedsNo is null, {1}", outDetailId, enumRepResult.));
return enumRepResult.;
}
if ( wod.state == (int)enumOutStockDetailStatus.)
{
return enumRepResult.;
}
if (wod.count != seedCnt)
{
logTest.Debug(string.Format(" detialId {0}, order Cnt {1}, seeds cnt {2}", outDetailId, wod.count, seedCnt));
}
// WmsFlow wmsflow = new WmsFlow(wod.seedsPickNo+wod.goodsId+batch, flowNo);
WmsFlow wmsflow = new WmsFlow(wod.seedsPickNo, 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 toP = new WmsPlate(toFlowNo);
string custId = toP.customerId;
// logTest.Debug("1 " + toP);
if (String.IsNullOrEmpty(custId))
{
if (toP.ID > 0)
{
if (toP.partion == 0 && String.IsNullOrEmpty(toP.customerId))
{
toP.partion = wod.goods.part;
toP.customerId = wod.customerId;
toP.Update();
logTest.Debug("2 updated plate customerId " + wod.customerId);
}
custId = toP.customerId;
}
else
{
custId = new WmsPlateStock_tmp().getRelatedCustId(toFlowNo);
}
}
//------》》》》 //TODO: to remove this block
/*
logTest.Debug("3 " + toP);
toP = new WmsPlate(toFlowNo); //TODO: to remove this line
logTest.Debug("31 new saved plate: " + toP); //TODO: to remove this line
logTest.Debug(" to flow "+ toFlowNo +" , exist customer id " + custId + ", wod customerId is " + wod.customerId);
if (toP.ID > 0)
{
custId = new WmsPlateStock_tmp().getRelatedCustId(toFlowNo);
}
*/
//------<《《《《《
if (!string.IsNullOrEmpty(custId) && custId != wod.customerId)
{
return enumRepResult.;
}
if (!WmsConstants.OUT_SEEDS_CAN_OVER_REQ) //不许超发
{
seedCnt = seedCnt > wod.count - wod.seeded ? wod.count - wod.seeded : seedCnt;
}
// 更新总拣记录 pickport with flowno can be multi records, update the finished seeds count in loop
DataTable dt = getWmsOutPickPort.getFlowNoDetails(wod.seedsPickNo, flowNo, wod.goodsId, batch);
List<WmsOutPickPort> lstSeeds = new List<WmsOutPickPort>();
List<WmsPlateStock_tmp> lstUpdate = new List<WmsPlateStock_tmp>();
;
decimal tmpCnt = seedCnt;
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)
{
WmsOutPickPort wop = new WmsOutPickPort(dr);
decimal tmpCnt2 = 0;
if (wop.state == (int)enumPickState.)
{
seedsDoneCnt++;
}
if (wop.state == 1) //已经拣货完毕
{
if (wop.seedsOutCount + tmpCnt <= wop.pickCount)
{
tmpCnt2 = tmpCnt;
wop.seedsOutCount += tmpCnt;
lstSeeds.Add(wop);
tmpCnt = 0;
}
else
{
tmpCnt -= wop.pickCount - wop.seedsOutCount;
wop.seedsOutCount = wop.pickCount;
lstSeeds.Add(wop);
tmpCnt2 = wop.pickCount;
}
/*
* 更新临时库数据
*
*/
WmsPlateStock_tmp tmpStk = new WmsPlateStock_tmp();
DataTable dt1 = tmpStk.getByOutPort(wop.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 (tmpCnt > 0)
{
logTest.Debug(string.Format(" 播种请求数量{0}, 可用播种数量{1},flowNo:{2} batch :{3} , outDetailId:{4} ", seedCnt, seedCnt - tmpCnt, flowNo, batch, outDetailId));
// return enumRepResult.分播数量大于剩余数量;
}
seedCnt -= tmpCnt;
if (seedCnt < 0)
{
logTest.Debug(string.Format("分播数量大于剩余数量 seedCnt {0} ", seedCnt));
return enumRepResult.;
}
if (!WmsConstants.OUT_SEEDS_CAN_OVER_REQ) //不许超发
{
seedCnt = seedCnt > wod.count - wod.seeded ? wod.count - wod.seeded : seedCnt;
}
logTest.Debug(string.Format("wod {0}, new seeded cnt {1} ",wod.ID,seedCnt));
wod.seeded += seedCnt;
if (wod.count <= wod.seeded || isForceClose)
{
wod.state = (int)enumOutStockDetailStatus.;
}
logTest.Debug(" 1 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
using (TransactionScope scope = new TransactionScope())
{
logTest.Debug(string.Format("seeds out start update 分播 tasks ,operid {0}, wmsflow : {1}",operId, wmsflow.ToString() ));
wod.Update();
if (wod.isAllPicked(wod.pickOrderNo))
{
new lWmsOutPickRequest(operId).updateOrderStatus(wod.pickOrderNo, enumOutStockPickStatus.);
}
WmsStockRecord wsr = new WmsStockRecord();
wsr.orderNo = wod.pickOrderNo;
wsr.orderDetailId = wod.ID;
wsr.goodsId = wod.goodsId;
wsr.count = seedCnt;
wsr.locationId = lstSeeds[0].locationId;//flowNo;
wsr.operater = operId;
wsr.batch = batch;// wod.batch;
wsr.productDate = productDate;
wsr.skuId = skuId;
wsr.rectype = (int)enumStockRecordType.;
wsr.Add();
WmsOutPickPort wop = new WmsOutPickPort();
wop.recordId = wsr.ID;
wop.pickBy = operId;
wop.pickTime = wop.getDateTime();
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 = wmsflow.task;
wop.takeBy = operId;
wop.locationId = wsr.locationId;
wop.count = wod.count;
int id = wop.Add();
/* /// 发车时从已分播到客户的容器里减去容器占用
WmsStock stk1 = new WmsStock(wsr.locationId, wsr.skuId, wsr.goodsId);
stk1.plateCount -= seedCnt;
stk1.updateCountOut();
*/
/*
if(toPlate.customerId!=wod.customerId)
{
toPlate.customerId = wod.customerId;
toPlate.Update();
}
*/
foreach (WmsOutPickPort port in lstSeeds)
{
if (port.pickCount <= port.seedsOutCount)
{
port.state = (int)enumPickState.;
seedsDoneCnt++;
}
port.Update();
// WmsPlateStock_tmp t = new WmsPlateStock_tmp();
// t.getByOutPort(wop.ID);
// t.Delete();
}
log.Debug(string.Format("2 seeds done cnt {0}, totalcnt of task {1}, lstUpdate.Count {2}", seedsDoneCnt, dt.Rows.Count, lstUpdate.Count));
wmsflow.finishedTasksPlus(operId, seedCnt / wod.goods.minOperateCount, true, false); //下架任务更新分播数据
WmsFlow wmsflowCust = new WmsFlow(wmsflow.orderNo, wod.customerId + "-" + operId); //按分播单 和客户ID 分播ID 创建分播任务
if (wmsflowCust.ID == 0)
{
wmsflowCust.operater = operId;
wmsflowCust.orderNo = wmsflow.orderNo;// + sr.goodsId + sr.batch;
wmsflowCust.flowNo = wod.customerId + "-" + operId;
wmsflowCust.type = wmsflow.type;
wmsflowCust.typeName = wmsflow.typeName;
wmsflowCust.task = Util.getOrderNo(enumCreateOrderType.pickJobNo, _obj.getNextSeq(enumCreateOrderType.pickJobNo));
wmsflowCust.taskCnt = 1;
wmsflowCust.Add();
}
wmsflowCust.finishedTasksPlus(operId, seedCnt / wod.goods.minOperateCount, true); //更新分播任务
// 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();
}
}
log.Debug(" 2 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
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.jobNo = stk.orderNo + toFlowNo; ;
stk.operater = operId;
stk.customerId = wod.customerId;
WmsOutPickRequest wopr = new WmsOutPickRequest(wod.pickOrderNo);
wopr.createLoadTruckJob(operId);
if ( !WmsConstants.AUTO_LOAD_TRUCK &&
toP.type != (int)enumPlateLevel. && toP.plateLevel != (int)enumPlateLevel.)
{
stk.state = (int)enumPlateStatus.;
WmsFlow jiFlow = new WmsFlow(stk.orderNo, toFlowNo, enumFlowTaskStatus., EnumFlowTaskType.);
if (jiFlow.ID == 0)
{
jiFlow.operater = operId;
jiFlow.orderNo = stk.orderNo;
jiFlow.flowNo = toFlowNo;
jiFlow.type = (int)EnumFlowTaskType.;
jiFlow.typeName = EnumFlowTaskType..ToString();
jiFlow.task = stk.orderNo + toFlowNo;// stk.jobNo;
jiFlow.fromPartion = wmsflow.toPartion;
jiFlow.toLocationId = new WmsOutPickRequest(wod.pickOrderNo).tranLocationId;
jiFlow.taskCnt = 1;
jiFlow.Add();
}
}
else //客户类型的容器,新增装车任务
{
stk.state = (int)enumPlateStatus.;
if (!WmsConstants.IS_PLATE_IN_LINE && string.IsNullOrEmpty(toP.customerId))
{
int lineId = 0;
DataTable dt1 = stk.getOutPort(stk.outPortId);
foreach (DataRow dr1 in dt1.Rows)
{
custId = dr1["customerId"].ToString();
lineId = Convert.ToInt32(dr1["lineId"].ToString());
toP.volume += Convert.ToDecimal(dr1["volCm"].ToString());
toP.load += Convert.ToDecimal(dr1["weight"].ToString());
break;
}
if (wod != null)
{
toP.partion = wod.goods.part;
}
toP.lineId = lineId;
toP.jobNo = wopr.loadTruckJob;
toP.customerId = custId;
toP.Update();
}
}
stk.Add();
}
if (WmsConstants.AUTO_LOAD_TRUCK)
{
try
{
string truck = "000";// + wsr.locationId.Substring(0, 1);
new lWmsPlate(operId).loadTruck(toFlowNo, truck);
}
catch (Exception er)
{
log.Error(er);
}
}
scope.Complete();
}
return enumRepResult.;
}
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.;
}
WmsOutPickRequest wopr = new WmsOutPickRequest(wod.pickOrderNo);
// log.Debug(" 1 WmsPlateStock_tmp lstUpdate count " + lstUpdate.Count);
using (TransactionScope scope = new TransactionScope())
{
wopr.createLoadTruckJob(operId);
string custId = "";
WmsPlate toP = new WmsPlate(toFlowNo);
if (toP.ID > 0)
{
if (toP.partion == 0 && String.IsNullOrEmpty(toP.customerId))
{
toP.partion = wod.goods.part;
toP.customerId = wod.customerId;
toP.Update();
}
custId = toP.customerId;
}
if (String.IsNullOrEmpty(custId))
{
custId = new WmsPlateStock_tmp().getRelatedCustId(toFlowNo);
}
// logTest.Debug(" to flow " + toFlowNo + " , exist customer id " + custId + ", wod customerId is " + wod.customerId);
if (!string.IsNullOrEmpty(custId) && custId != wod.customerId)
{
return enumRepResult.;
}
wid.seedOutCnt+=seedCnt;
wid.Update();
flow.finishedTasksPlus(operId,seedCnt/wod.goods.minOperateCount,true,wid.seedOutCnt>=wid.validCount);
wod.Update();
if (wod.isAllPicked(wod.pickOrderNo))
{
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)
{
port.state = (int)enumInStockDetailStatus.;
port.Update();
}
}
/*
if(toPlate.customerId!=wod.customerId)
{
toPlate.customerId = wod.customerId;
toPlate.Update();
}
*/
// 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)
{
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.state = (int)enumPlateStatus.;
stk.customerId = wod.customerId;
stk.Add();
WmsFlow jiFlow = new WmsFlow();
// WmsFlow jiFlow = new WmsFlow(stk.orderNo + toFlowNo, toFlowNo, enumFlowTaskStatus.未开始);
// if (jiFlow.ID == 0)
if (!WmsConstants.AUTO_LOAD_TRUCK)
{
jiFlow.operater = operId;
jiFlow.orderNo = stk.orderNo;
jiFlow.flowNo = toFlowNo;
jiFlow.type = (int)EnumFlowTaskType.;
jiFlow.typeName = EnumFlowTaskType..ToString();
jiFlow.task = jiFlow.orderNo + toFlowNo; ;
jiFlow.taskCnt = 1;
jiFlow.Add();
}
}
if (WmsConstants.AUTO_LOAD_TRUCK)
{
new lWmsPlate(operId).loadTruck(toFlowNo, "000");
}
scope.Complete();
}
logOut.Debug("直通分货结束");
return enumRepResult.;
}
internal enumRepResult stackDone(string preInNo, string flowNo)
{
throw new NotImplementedException();
}
internal DataTable getSeedsPickDetail(string flowNo, bool isOrderByCust)
{
// return getWmsOutPickPort.getSeedsOutDetail(flowNo, isOrderByCust);
return getWmsOutPickPort.getSeedsOutPickDetail(flowNo, isOrderByCust);
}
/*
* 取消拣货任务
*
*/
public int taskRessign(int taskBy, int partion, int lineId, bool batchOnly = true, enumOrderType orderType = enumOrderType.)
{
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;
}
public DataTable getAssignedTasks4Wince(int taskBy, int partion = 0, int lineId = -1, bool batchOnly = true,enumOrderType orderType = enumOrderType.)
{
return getWmsOutPickPort.getAssignedTasks4Wince(taskBy, partion, lineId, batchOnly, orderType);
}
public DataTable getAssignedOutTasks(int taskBy,string locationid ="",int partion = 0, int lineId = -1, bool batchOnly = false, enumOrderType orderType = enumOrderType.,int taskId=0, int state = -1)
{
// logTest.Debug(string.Format(" taskBy {0}, locationId {1}, partion {2},lineId {3},batchOnly {4},orderType {5},taskId {6}, state {7}", taskBy, locationid , partion , lineId , batchOnly , orderType.ToString(), taskId , state));
if (taskId > 0 && havePermission(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();
}
}
}
bool isWholePickOrder = !string.IsNullOrEmpty(locationid) && locationid.StartsWith("PK");
if ( partion == 0 && !string.IsNullOrEmpty(locationid) && !isWholePickOrder)
{
WmsLocation loc = new WmsLocation(locationid);
partion = loc.partion;
}
// partion = 0;
// logTest.Debug(string.Format(" getAssignedOutTasks taskBy {0}, locationId {1}, partion {2},lineId {3},batchOnly {4},orderType {5},taskId {6}, state {7}", taskBy, locationid, /partion, lineId, batchOnly, orderType.ToString(), taskId, state));
DataTable dt = getWmsOutPickPort.getAssignedTasks(taskBy, partion, lineId, batchOnly, orderType, state);
if (dt.Rows.Count == 0 && partion>0) //指定区域没有分配的任务,不指定区域获取任务
{
dt = getWmsOutPickPort.getAssignedTasks(taskBy, 0, lineId, batchOnly, orderType, state);
}
if (state == 1 || isWholePickOrder ) //分拣的历史记录 或 整单分拣
{
return dt;
}
bool isWeightOut=false;
foreach(DataRow dr in dt.Rows)
{
try
{
if (WmsConstants.GOODS_WEIGHT_UNITS.Contains(dr["pickUnit"].ToString()))
{
// isWeightOut = true;
isWeightOut = Convert.ToInt32(dr["recType"].ToString()) == (int)enumStockRecordType.;
if (isWeightOut)
{
break;
}
}
}
catch
{
}
}
if (isWeightOut )
{
DataView dv = dt.DefaultView;
// dv.Sort = "goodsId,lineId,lineorder,[count] desc"; //称重的,路远的,重量高的先出
dv.Sort = "goodsId,linePriority desc, [count] desc"; //路远的,重量大的先出
return dv.ToTable("sorted");
}
return dt;
}
// internal DataTable getAssignedOutTasks(int taskBy)
// {
// return getWmsOutPickPort.getAssignedTasks(taskBy);
// }
public DataTable getPartions(int userID)
{
return getWmsOutPickPort.getPartions(userID);
}
internal DataTable getRepTasks(int takeBy, int taskPartion )
{
return getWmsOutPickPort.getRepTasks(takeBy, taskPartion );
}
internal DataTable getFlows4SeedsOut()
{
return getWmsOutPickPort.getFlows4SeedsOut() ;
}
internal DataTable getFlows4ZhitongSeedsOut()
{
return getWmsInRequestDetail.getFlows4ZhitongSeedsOut();
}
}
}