4843 lines
190 KiB
C#
4843 lines
190 KiB
C#
|
|
|||
|
/// <summary>
|
|||
|
///LOGIC CLASS FOR TABLE t_wmsOutPickRequest
|
|||
|
///By wm with codesmith.
|
|||
|
///on 05/22/2017
|
|||
|
/// </summary>
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using DeiNiu.wms.Data.Model;
|
|||
|
using System.Data;
|
|||
|
using System.Transactions;
|
|||
|
using DeiNiu.Utils;
|
|||
|
using System.Threading;
|
|||
|
using DeiNiu.Data.BaseObject;
|
|||
|
|
|||
|
namespace DeiNiu.wms.Logical
|
|||
|
{
|
|||
|
[Serializable]
|
|||
|
public class lWmsOutPickRequest : lbase
|
|||
|
{
|
|||
|
WmsOutPickRequest _obj;
|
|||
|
private WmsOutDesk _desk;
|
|||
|
private WmsOutDesk _seedsDesk;
|
|||
|
private WmsOutPickDetail_tmp _outPickTmp;
|
|||
|
private WmsPlate _plate;
|
|||
|
|
|||
|
WmsPlate plate
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if ( _plate == null)
|
|||
|
{
|
|||
|
_plate = new WmsPlate();
|
|||
|
_plate.operater = operId;
|
|||
|
}
|
|||
|
return _plate;
|
|||
|
}
|
|||
|
}
|
|||
|
WmsOutPickRequest outRequest
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_outRequest == null)
|
|||
|
{
|
|||
|
_outRequest = new WmsOutPickRequest();
|
|||
|
_outRequest.operater = operId;
|
|||
|
}
|
|||
|
return _outRequest;
|
|||
|
}
|
|||
|
}
|
|||
|
public WmsOutPickDetail_tmp outPickTmp
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_outPickTmp == null)
|
|||
|
{
|
|||
|
_outPickTmp = new WmsOutPickDetail_tmp();
|
|||
|
_outPickTmp.operater = operId;
|
|||
|
}
|
|||
|
return _outPickTmp;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
WmsStockRecord stkRecord
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if(_stkRecord == null){
|
|||
|
_stkRecord = new WmsStockRecord();
|
|||
|
_stkRecord.operater = operId;
|
|||
|
}
|
|||
|
return _stkRecord;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
WmsOutPickLable pickLabelDetail {
|
|||
|
|
|||
|
get
|
|||
|
{
|
|||
|
if (_pickLabelDetail == null)
|
|||
|
{
|
|||
|
_pickLabelDetail = new WmsOutPickLable();
|
|||
|
_pickLabelDetail.operater = operId;
|
|||
|
}
|
|||
|
return _pickLabelDetail;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
WmsOutPickPort outPickPort
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_outPickPort == null)
|
|||
|
{
|
|||
|
_outPickPort = new WmsOutPickPort();
|
|||
|
_outPickPort.operater = operId;
|
|||
|
}
|
|||
|
return _outPickPort;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
WmsOutPickPort _outPickPort;
|
|||
|
|
|||
|
WmsOutPickRequest _outRequest ;
|
|||
|
WmsStockRecord _stkRecord ;
|
|||
|
WmsOutPickLable _pickLabelDetail ;
|
|||
|
|
|||
|
WmsOutDesk desk {
|
|||
|
get
|
|||
|
{
|
|||
|
if (_desk == null)
|
|||
|
{
|
|||
|
_desk = new WmsOutDesk();
|
|||
|
_desk.operater = operId;
|
|||
|
}
|
|||
|
return _desk;
|
|||
|
}
|
|||
|
}
|
|||
|
WmsOutDesk seedsDesk
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_seedsDesk == null)
|
|||
|
{
|
|||
|
_seedsDesk = new WmsOutDesk();
|
|||
|
}
|
|||
|
return _seedsDesk;
|
|||
|
}
|
|||
|
}
|
|||
|
public lWmsOutPickRequest()
|
|||
|
{
|
|||
|
initialize();
|
|||
|
}
|
|||
|
|
|||
|
public lWmsOutPickRequest(int p) :base(p)
|
|||
|
{
|
|||
|
initialize();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public WmsOutPickRequest getWmsOutPickRequest
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_obj == null)
|
|||
|
{
|
|||
|
_obj = new WmsOutPickRequest();
|
|||
|
}
|
|||
|
return _obj;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// get all data
|
|||
|
/// </summary>
|
|||
|
public DataSet getAllData()
|
|||
|
{
|
|||
|
return _obj.Query();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
///get pick details
|
|||
|
///if no pick data,return order details
|
|||
|
/// </summary>
|
|||
|
public DataSet getPickDetails(string orderNo,bool isPickdetail)
|
|||
|
{
|
|||
|
DataSet ds = ds = _obj.getPickDetailByOrder(orderNo, isPickdetail);
|
|||
|
/*if (orderType == enumOutOrderType.销售订单)
|
|||
|
{
|
|||
|
DataTable dt = ds.Tables[0];
|
|||
|
if (dt.Rows.Count > 0)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(dt.Rows[0]["pickOrderNo"].ToString()))
|
|||
|
{
|
|||
|
WmsOutRequest ord = new WmsOutRequest();
|
|||
|
ord.orderNo = orderNo;
|
|||
|
return ord.getOutDetail();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}*/
|
|||
|
|
|||
|
return ds ;
|
|||
|
}
|
|||
|
/// <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 WmsOutPickRequest(id) : new WmsOutPickRequest();
|
|||
|
}
|
|||
|
|
|||
|
/// <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 WmsOutPickRequest(dr);
|
|||
|
}
|
|||
|
|
|||
|
protected override DeiNiu.Data.BaseObject.BaseModel getModel()
|
|||
|
{
|
|||
|
return _obj;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//begin cust db operation, query, excute sql etc.
|
|||
|
|
|||
|
|
|||
|
//private static bool _canNewWave = false;
|
|||
|
////Int64 lastWave =0;
|
|||
|
//DateTime lastWave;
|
|||
|
// public bool canNewWave
|
|||
|
// {
|
|||
|
// get
|
|||
|
// {
|
|||
|
|
|||
|
// _canNewWave = _canNewWave || outRequest.canNewWave();
|
|||
|
|
|||
|
// if (_canNewWave)
|
|||
|
// {
|
|||
|
// lastWave = DateTime.Now ;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// TimeSpan ts = DateTime.Now - lastWave;
|
|||
|
// if (ts.TotalMilliseconds > WmsConstants.MAX_SECONDS_BETWEEN_WAVES) //强制开始新波次,有可能会有再次发送亮灯数据时
|
|||
|
// {
|
|||
|
// _canNewWave = true;
|
|||
|
// lastWave = DateTime.Now;
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
// return _canNewWave ;//|| outRequest.canNewWave() ;//|| true;
|
|||
|
// // return _canNewWave; // pickLabelDetail.getCurrentPickList(enumLabelPickState.notPicked).Tables[0].Rows.Count > 0;
|
|||
|
// }
|
|||
|
// }
|
|||
|
|
|||
|
//static Dictionary<int, List<int>> comLables = new Dictionary<int, List<int>>();
|
|||
|
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.ToInt16(s.Trim())] = Convert.ToInt16(node.name.Trim());
|
|||
|
lblist.Add(Convert.ToInt16(s.Trim()));
|
|||
|
}
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private string waveOrder ="";
|
|||
|
private List<WmsOutPickRequest> bulkRequests;
|
|||
|
private static Dictionary<string, DateTime> seedsWaiting = new Dictionary<string, DateTime>();
|
|||
|
private static List<String> noSeeds = new List<string>();
|
|||
|
// public static bool isProcessWaveing = false;
|
|||
|
private static int waveCnt= 0 ;
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 开始新波次
|
|||
|
/// </summary>
|
|||
|
|
|||
|
public void newBulkDPSandSeedsPickWave()
|
|||
|
{
|
|||
|
waveCnt++;
|
|||
|
//播种筛选,
|
|||
|
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
|||
|
//1. 单个订单的品种少 、数量少
|
|||
|
//2. 订单数量多
|
|||
|
|
|||
|
//只处理订单零货部分
|
|||
|
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
|||
|
//1.播种点数量可配置, 分别用不同颜色区分
|
|||
|
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
|||
|
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
|||
|
//4.
|
|||
|
|
|||
|
|
|||
|
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
|||
|
|
|||
|
|
|||
|
|
|||
|
bool isSeedsEnabled = WmsConstants.OUT_BULK_SEEDS_PICK_ON;
|
|||
|
|
|||
|
if (!WmsConstants.OUT_BULK_DESK_CONTROLL)
|
|||
|
{//播种复核台完成复核任务前,复核台不可用,拆零波次不分配给复核台任务
|
|||
|
//播种复核台复位
|
|||
|
desk.restDeskStatus(enumDeskState.空闲);
|
|||
|
desk.restDeskStatus(enumDeskState.空闲, enumDeskType.播种); //播种台状态复位到空闲,
|
|||
|
}
|
|||
|
|
|||
|
_desk = getRandomFreeDesk();
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
if (desk.ID == 0) // no free pick desk
|
|||
|
{
|
|||
|
if (isSeedsEnabled)
|
|||
|
{
|
|||
|
|
|||
|
if (seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
|||
|
|
|||
|
// List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
|||
|
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
|||
|
WaveRule wr = new WaveRule().getCurrentActiveRule(enumWaveRuleType.DPS灯光波次);
|
|||
|
|
|||
|
DataSet ds = outRequest.getRequests4DpsWave(enumOutOrderType.销售出库, wr);
|
|||
|
|
|||
|
DataTable dtSeeds = ds.Tables[1];
|
|||
|
DataTable dtOne = ds.Tables[0];
|
|||
|
|
|||
|
List<WmsOutPickRequest> requests = new List<WmsOutPickRequest>();
|
|||
|
|
|||
|
foreach (DataRow dr in dtSeeds.Rows)//播种订单
|
|||
|
{
|
|||
|
WmsOutPickRequest wo = new WmsOutPickRequest(dr);
|
|||
|
if (!noSeeds.Contains(wo.pickOrderNo))
|
|||
|
{
|
|||
|
requests.Add(wo);
|
|||
|
}
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 SEEDS 订单数量:{0}",dtSeeds.Rows.Count));
|
|||
|
|
|||
|
foreach (string order in noSeeds) // 等待播种订单转入摘果
|
|||
|
{
|
|||
|
WmsOutPickRequest wo = new WmsOutPickRequest(order);
|
|||
|
wo.seedsLabelId = 0;
|
|||
|
requests.Add(wo);
|
|||
|
}
|
|||
|
|
|||
|
foreach (DataRow dr in dtOne.Rows) //摘果订单
|
|||
|
{
|
|||
|
requests.Add(new WmsOutPickRequest(dr));
|
|||
|
}
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 摘果 订单数量:{0}", dtOne.Rows.Count));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 等待Seeds 订单数量:{0}", noSeeds.Count));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
|||
|
|
|||
|
if (requests.Count == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
|||
|
checkRepAndNoStockOrders();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
|||
|
|
|||
|
#if DEBUG
|
|||
|
// if (lblist.Count == 0)
|
|||
|
{
|
|||
|
lblist.Clear();
|
|||
|
initialDebugSetting();
|
|||
|
}
|
|||
|
lblist.Sort();
|
|||
|
// int minId = lblist[0];
|
|||
|
// int maxId = lblist[lblist.Count - 1];
|
|||
|
// labelMaxInWave = 2;
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
// List<WmsStockRecord> strecs = null;
|
|||
|
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("new waveNo {0}", waveOrder));
|
|||
|
|
|||
|
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
|||
|
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
|||
|
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;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
|
|||
|
|
|||
|
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>();
|
|||
|
List<WmsStockRecord> lstSeedsBulk = new List<WmsStockRecord>(); ;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//订单充足的情况下,每个波次的拣货负载均衡化,每个波次每个复核台都要最大负载,不空转
|
|||
|
//先满足播种数据,再进行摘果
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int bulkCnt = 0;
|
|||
|
|
|||
|
|
|||
|
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
|||
|
|
|||
|
//开始处理有零货的订单
|
|||
|
DateTime d0 = DateTime.Now;
|
|||
|
double totoalTime = 0d;
|
|||
|
string lastAddress = "";
|
|||
|
foreach (WmsOutPickRequest request in requests)
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
|||
|
|
|||
|
_desk = getRandomFreeDesk();
|
|||
|
if (desk.ID == 0) // no free pick desk
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), " no pick desk available.....");
|
|||
|
if (isSeedsEnabled)
|
|||
|
{
|
|||
|
if (seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), "no pick no seeds desk ,break 1");
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (request.seedsLabelId != WmsConstants.SEEDS_LABLEID_MARK_VALUE)//仅剩下摘果的订单
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), "no pick no seeds order ,break 2");
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (request.seedsLabelId == WmsConstants.SEEDS_LABLEID_MARK_VALUE)//播种的订单
|
|||
|
{
|
|||
|
|
|||
|
if (isSeedsEnabled)
|
|||
|
{
|
|||
|
if (seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), " no seed desk available.....,continue");
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//确保每个pick order 都进入波次 ,不空耗资源
|
|||
|
|
|||
|
DateTime d00 = DateTime.Now;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (request.bulkCnt == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细,
|
|||
|
// lstPort = new List<WmsOutPickPort>();
|
|||
|
lstLabel = new List<WmsOutPickLable_tmp>();
|
|||
|
|
|||
|
//开始处理零货出库
|
|||
|
|
|||
|
|
|||
|
DataView dvBulk = new DataView(dt);
|
|||
|
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
|||
|
|
|||
|
if (bulkCnt + dvBulk.Count >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DateTime d1 = DateTime.Now;
|
|||
|
|
|||
|
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
|||
|
bulkCnt += dvBulk.Count;
|
|||
|
|
|||
|
|
|||
|
lstBulk = new List<WmsStockRecord>();
|
|||
|
sumBulkCnt = 0;
|
|||
|
int lastId = 0;
|
|||
|
foreach (DataRowView drv in dvBulk)
|
|||
|
{
|
|||
|
WmsStockRecord sr = new WmsStockRecord();
|
|||
|
|
|||
|
sr.ID = Convert.ToInt32(drv["id"].ToString());
|
|||
|
sr.locationId = drv["locationID"].ToString();
|
|||
|
sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
|||
|
}
|
|||
|
#if DEBUG
|
|||
|
if (lblist.Count > 0)
|
|||
|
{
|
|||
|
int id = new Random().Next(lblist.Count);
|
|||
|
//#if DEBUG
|
|||
|
sr.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
|||
|
|
|||
|
while (lblist.Count > 1 && lastId == sr.location.elabId)
|
|||
|
{
|
|||
|
id = new Random().Next(lblist.Count);
|
|||
|
sr.location.elabId = lblist[id];
|
|||
|
}
|
|||
|
|
|||
|
lastId = sr.location.elabId;
|
|||
|
//#endif
|
|||
|
}
|
|||
|
#endif
|
|||
|
sumBulkCnt += sr.count;
|
|||
|
lstBulk.Add(sr);
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#region checklabellimit
|
|||
|
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
|||
|
{
|
|||
|
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId]++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (tmpcomCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (labelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
|||
|
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmplabelCnt.Keys)
|
|||
|
{
|
|||
|
if (labelCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
labelCnt[k] -= tmplabelCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (comCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
|||
|
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmpcomCnt.Keys)
|
|||
|
{
|
|||
|
if (comCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
comCnt[k] -= tmpcomCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//TimeSpan ts11 = DateTime.Now - d11;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
|||
|
|
|||
|
if (isReachLimit)
|
|||
|
{
|
|||
|
isReachLimit = false;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
//tsss = DateTime.Now - d2;
|
|||
|
|
|||
|
|
|||
|
tmplabelCnt.Clear();
|
|||
|
tmpcomCnt.Clear();
|
|||
|
|
|||
|
|
|||
|
//DateTime d11 = DateTime.Now;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
|||
|
|
|||
|
if (isSeedsEnabled && request.seedsLabelId==WmsConstants.SEEDS_LABLEID_MARK_VALUE )
|
|||
|
|
|||
|
//订单货品零货数量小
|
|||
|
/*if (isSeedsEnabled
|
|||
|
&& lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
|||
|
&& sumBulkCnt < pickGoodsCountMin
|
|||
|
&& !noSeeds.Contains(request.pickOrderNo)
|
|||
|
|
|||
|
) */
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ,_seedsDesk.ID :{1}" +
|
|||
|
",seedsRequests contains {2}: {3}", seedsRequests.Count, _seedsDesk.ID, request.pickOrderNo, seedsRequests.Contains(request)));
|
|||
|
foreach (WmsOutPickRequest wor in seedsRequests)
|
|||
|
{
|
|||
|
if (wor.pickOrderNo == request.pickOrderNo)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests.Contains(request): " + seedsRequests.Contains(request));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests contains " + request.pickOrderNo);
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
//播种筛选
|
|||
|
// if (isSeedsEnabled && seedsRequests.Count < seedsCount )//播种能力之内
|
|||
|
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
|||
|
// && sumBulkCnt < pickGoodsCountMin) //订单货品零货数量小
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (_seedsDesk.ID > 0) //exist free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
if (seedsRequests.Count < seedsCount)//播种能力之内
|
|||
|
{
|
|||
|
//符合播种条件,整合订单
|
|||
|
seedsRequests.Add(request);
|
|||
|
|
|||
|
//出库明细合并
|
|||
|
foreach (WmsStockRecord wsr in lstBulk)
|
|||
|
{
|
|||
|
if (seedsBulks.ContainsKey(wsr.locationId))
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId].count += wsr.count;
|
|||
|
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId] = wsr;
|
|||
|
}
|
|||
|
lstSeedsBulk.Add(wsr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
|||
|
{
|
|||
|
//create seeds pick request
|
|||
|
|
|||
|
//create pick detail WmsOutPickLable_tmp
|
|||
|
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);
|
|||
|
lstSeedsBulk.Clear();
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
|||
|
seedsCount = _seedsDesk.seedsCount;
|
|||
|
// continue;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else //no free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
|||
|
|
|||
|
if (!isSeedPickInSameWave) //播、摘同波次
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
else // 非播种拣选
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
|||
|
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest),
|
|||
|
string.Format("last address: {0},current address: {1}",
|
|||
|
lastAddress, request.customerName + request.custAddress));
|
|||
|
|
|||
|
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//建立零库电子拣选临时数据 ---摘果
|
|||
|
|
|||
|
if (desk.color == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " 摘果式 保存整货和零货出库分拣数据");
|
|||
|
|
|||
|
WmsOutPickLable_tmp wpl;
|
|||
|
foreach (WmsStockRecord rec in lstBulk)
|
|||
|
{
|
|||
|
// if (rec.count == 0)
|
|||
|
if (rec.count + rec.countOuting < 1) //不支持小数
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
wpl = new WmsOutPickLable_tmp();
|
|||
|
wpl.pickOrderNo = request.pickOrderNo;
|
|||
|
wpl.recordId = rec.ID;
|
|||
|
wpl.color = desk.color;
|
|||
|
|
|||
|
wpl.count = rec.count + rec.countOuting;
|
|||
|
wpl.locationId = rec.locationId;
|
|||
|
wpl.elabAddress = rec.location.elabAddress;
|
|||
|
wpl.elabId = rec.location.elabId;
|
|||
|
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
|||
|
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();
|
|||
|
|
|||
|
WmsOutPickPort wop = new WmsOutPickPort();// wp.recordId
|
|||
|
wop.getPickPortByRecordId(wp.recordId);
|
|||
|
wop.dpsOrder = waveOrder;
|
|||
|
wop.Update();
|
|||
|
// WmsOutPickDetail pd = new WmsOutPickDetail(wp.orderDetailId);
|
|||
|
// pd.updateErpSaleDetail_deng(true);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// foreach (WmsOutPickPort wop in lstPort) //建立电子拣选临时数据
|
|||
|
// {
|
|||
|
// wop.Add();
|
|||
|
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
if (lstLabel.Count > 0)
|
|||
|
{
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
|||
|
request.waveStart = request.getDateTime();
|
|||
|
|
|||
|
request.operater = this.operId;
|
|||
|
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
|||
|
request.desk = desk.color;
|
|||
|
desk.state = (int)enumDeskState.任务中;
|
|||
|
desk.Update();
|
|||
|
request.Update();
|
|||
|
bulkRequests.Add(request);
|
|||
|
int count = outRequest.saveTempData4Validation(waveOrder, request.pickOrderNo);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
|||
|
}
|
|||
|
//if (lstPort.Count > 0)
|
|||
|
// {
|
|||
|
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.待处理);
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
waveSize++;
|
|||
|
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
//TimeSpan ts2 = DateTime.Now - d12;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
// System.Diagnostics.Debug.WriteLine(e.Message);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TimeSpan ts00 = DateTime.Now - d00;
|
|||
|
totoalTime += ts00.TotalSeconds;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
|||
|
*/
|
|||
|
if (isSeedsEnabled && seedsRequests.Count > 0)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("not full seeds pool detetcted, size {0}", seedsRequests.Count));
|
|||
|
|
|||
|
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" mini seeds cnt meet for seeds desk {0} , size {1}",_seedsDesk.ID, seedsRequests.Count));
|
|||
|
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);//生成播种拣选单
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" seedsWaiting size {0} ", seedsWaiting.Count));
|
|||
|
|
|||
|
foreach (WmsOutPickRequest pr in seedsRequests)
|
|||
|
{
|
|||
|
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
|||
|
{
|
|||
|
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
DateTime dte = seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES);
|
|||
|
if (dte > System.DateTime.Now)
|
|||
|
{
|
|||
|
seedsWaiting.Remove(pr.pickOrderNo);
|
|||
|
noSeeds.Add(pr.pickOrderNo);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} waited {1},noseeds marked", pr.pickOrderNo, dte.CompareTo(DateTime.Now)));
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
|
|||
|
}
|
|||
|
//int count1 = 0;
|
|||
|
try
|
|||
|
{
|
|||
|
// count = outRequest.saveTempData4Validation(waveOrder);
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), er.Message);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
|||
|
TimeSpan ts1 = DateTime.Now - d0;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + ":" + ts1.TotalMilliseconds, totoalTime));
|
|||
|
// insert tmp data for validation
|
|||
|
//outRequest.saveTempData4Validation(waveOrder);
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
|||
|
|
|||
|
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
|||
|
|
|||
|
//检查待补货出货单状态
|
|||
|
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
|||
|
stockCheckThread.IsBackground = true;
|
|||
|
stockCheckThread.Start();
|
|||
|
|
|||
|
TimeSpan ts0 = DateTime.Now - d0;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕,耗时{1} ..", DateTime.Now, ts0.TotalSeconds + ":" + ts0.TotalMilliseconds));
|
|||
|
// TaskCallBack();
|
|||
|
try
|
|||
|
{
|
|||
|
outRequest.fixMore();
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), er.StackTrace.ToString());
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "wave cnt is " + waveCnt);
|
|||
|
foreach(int key in comCnt.Keys)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("com {0}, rec cnt {1} ", key, comCnt[key]));
|
|||
|
}
|
|||
|
foreach (int key in labelCnt.Keys)
|
|||
|
{
|
|||
|
if(labelCnt[key]>2)
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("labelid {0}, rec cnt {1}" , key, labelCnt[key]));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void newBulkDPSandSeedsPickWave2()
|
|||
|
{
|
|||
|
|
|||
|
//播种筛选,
|
|||
|
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
|||
|
//1. 单个订单的品种少 、数量少
|
|||
|
//2. 订单数量多
|
|||
|
|
|||
|
//只处理订单零货部分
|
|||
|
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
|||
|
//1.播种点数量可配置, 分别用不同颜色区分
|
|||
|
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
|||
|
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
|||
|
//4.
|
|||
|
|
|||
|
|
|||
|
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
|||
|
//
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
|||
|
|
|||
|
List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
|||
|
|
|||
|
if (requests.Count == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
|||
|
checkRepAndNoStockOrders();
|
|||
|
return;
|
|||
|
}
|
|||
|
desk.restDeskStatus(enumDeskState.空闲);
|
|||
|
if (!WmsConstants.OUT_BULK_DESK_CONTROLL)
|
|||
|
{//播种复核台完成复核任务前,复核台不可用,拆零波次不分配给复核台任务
|
|||
|
//播种复核台复位
|
|||
|
desk.restDeskStatus(enumDeskState.空闲, enumDeskType.播种); //播种台状态复位到空闲,
|
|||
|
}
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
_desk = getRandomFreeDesk();
|
|||
|
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
|||
|
|
|||
|
#if DEBUG
|
|||
|
// if (lblist.Count == 0)
|
|||
|
{
|
|||
|
lblist.Clear();
|
|||
|
initialDebugSetting();
|
|||
|
}
|
|||
|
lblist.Sort();
|
|||
|
// int minId = lblist[0];
|
|||
|
// int maxId = lblist[lblist.Count - 1];
|
|||
|
// labelMaxInWave = 2;
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
// List<WmsStockRecord> strecs = null;
|
|||
|
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
|||
|
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
|||
|
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
|||
|
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;
|
|||
|
|
|||
|
|
|||
|
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>();
|
|||
|
List<WmsStockRecord> lstSeedsBulk = new List<WmsStockRecord>();
|
|||
|
|
|||
|
//订单充足的情况下,每个波次的拣货负载均衡化,每个波次每个复核台都要最大负载,不空转
|
|||
|
//先满足播种数据,再进行摘果
|
|||
|
|
|||
|
|
|||
|
if (desk.ID == 0) // no free pick desk
|
|||
|
{
|
|||
|
if (isSeedsEnabled)
|
|||
|
{
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
if (seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int bulkCnt = 0;
|
|||
|
int requestCnt = 0;
|
|||
|
|
|||
|
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
|||
|
|
|||
|
//开始处理有零货的订单
|
|||
|
DateTime d0 = DateTime.Now;
|
|||
|
double totoalTime = 0d;
|
|||
|
string lastAddress = "";
|
|||
|
foreach (WmsOutPickRequest request in requests)
|
|||
|
{
|
|||
|
DateTime d00 = DateTime.Now;
|
|||
|
if(request.pickOrderNo== "PK23031557945")
|
|||
|
{
|
|||
|
bool HIT = true;
|
|||
|
}
|
|||
|
if (request.bulkCnt > 0)
|
|||
|
{
|
|||
|
requestCnt++;
|
|||
|
}
|
|||
|
|
|||
|
if (requestCnt >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (request.bulkCnt == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo ));
|
|||
|
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
|||
|
|
|||
|
|
|||
|
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
|||
|
// lstPort = new List<WmsOutPickPort>();
|
|||
|
lstLabel = new List<WmsOutPickLable_tmp>();
|
|||
|
|
|||
|
//开始处理零货出库
|
|||
|
|
|||
|
|
|||
|
DataView dvBulk = new DataView(dt);
|
|||
|
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
|||
|
|
|||
|
if (bulkCnt + dvBulk.Count >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//TimeSpan tssss = DateTime.Now - d00;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {0} {1},befor prepare bulklist, cost {2}", DateTime.Now, request.pickOrderNo, tssss.TotalSeconds));
|
|||
|
|
|||
|
DateTime d1 = DateTime.Now;
|
|||
|
|
|||
|
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
|||
|
bulkCnt = dvBulk.Count;
|
|||
|
|
|||
|
/*foreach (DataRowView drv in dvBulk)
|
|||
|
{
|
|||
|
bulkCnt++;
|
|||
|
lstBulk.Add(new WmsStockRecord(drv.Row));
|
|||
|
}*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// TimeSpan tsss = DateTime.Now - d1;
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} prepare bulklist count :{1}, cost {2}", request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
|||
|
// DateTime d2 = DateTime.Now;
|
|||
|
|
|||
|
lstBulk = new List<WmsStockRecord>();
|
|||
|
sumBulkCnt = 0;
|
|||
|
int lastId = 0;
|
|||
|
foreach (DataRowView drv in dvBulk)
|
|||
|
{
|
|||
|
WmsStockRecord sr = new WmsStockRecord();
|
|||
|
|
|||
|
sr.ID = Convert.ToInt32(drv["id"].ToString());
|
|||
|
sr.locationId = drv["locationID"].ToString();
|
|||
|
sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
|||
|
}
|
|||
|
#if DEBUG
|
|||
|
if (lblist.Count > 0)
|
|||
|
{
|
|||
|
int id = new Random().Next(lblist.Count);
|
|||
|
//#if DEBUG
|
|||
|
sr.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
|||
|
|
|||
|
while (lblist.Count > 1 && lastId == sr.location.elabId)
|
|||
|
{
|
|||
|
id = new Random().Next(lblist.Count);
|
|||
|
sr.location.elabId = lblist[id];
|
|||
|
}
|
|||
|
|
|||
|
lastId = sr.location.elabId;
|
|||
|
//#endif
|
|||
|
}
|
|||
|
#endif
|
|||
|
sumBulkCnt += sr.count;
|
|||
|
lstBulk.Add(sr);
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//tsss = DateTime.Now - d2;
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} {1},prepare bulklist2 count :{2}, cost {3}", DateTime.Now, request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
pickDetailMaxInWave -= strecs.Count;
|
|||
|
|
|||
|
if (pickDetailMaxInWave < 0)
|
|||
|
{
|
|||
|
//超出一个波次最大分拣数量
|
|||
|
isReachLimit = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
tmplabelCnt.Clear();
|
|||
|
tmpcomCnt.Clear();
|
|||
|
|
|||
|
|
|||
|
//DateTime d11 = DateTime.Now;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
|||
|
|
|||
|
if (isSeedsEnabled
|
|||
|
&& lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
|||
|
&& sumBulkCnt < pickGoodsCountMin
|
|||
|
&& !noSeeds.Contains(request.pickOrderNo)
|
|||
|
|
|||
|
) //订单货品零货数量小
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ,_seedsDesk.ID :{1}" +
|
|||
|
",seedsRequests contains {2}: {3}", seedsRequests.Count, _seedsDesk.ID, request.pickOrderNo, seedsRequests.Contains(request)));
|
|||
|
foreach (WmsOutPickRequest wor in seedsRequests)
|
|||
|
{
|
|||
|
if (wor.pickOrderNo == request.pickOrderNo)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests.Contains(request): " + seedsRequests.Contains(request));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests contains " + request.pickOrderNo);
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
//播种筛选
|
|||
|
// if (isSeedsEnabled && seedsRequests.Count < seedsCount )//播种能力之内
|
|||
|
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
|||
|
// && sumBulkCnt < pickGoodsCountMin) //订单货品零货数量小
|
|||
|
if (_seedsDesk.ID > 0) //exist free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
if (seedsRequests.Count < seedsCount)//播种能力之内
|
|||
|
{
|
|||
|
//符合播种条件,整合订单
|
|||
|
seedsRequests.Add(request);
|
|||
|
|
|||
|
//出库明细合并
|
|||
|
foreach (WmsStockRecord wsr in lstBulk)
|
|||
|
{
|
|||
|
if (seedsBulks.ContainsKey(wsr.locationId))
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId].count += wsr.count;
|
|||
|
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId] = wsr;
|
|||
|
}
|
|||
|
lstSeedsBulk.Add(wsr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
|||
|
{
|
|||
|
//create seeds pick request
|
|||
|
|
|||
|
//create pick detail WmsOutPickLable_tmp
|
|||
|
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);
|
|||
|
lstSeedsBulk.Clear();
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
|||
|
seedsCount = _seedsDesk.seedsCount;
|
|||
|
// continue;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else //no free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
|||
|
|
|||
|
if (!isSeedPickInSameWave) //播、摘同波次
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
else // 非播种拣选
|
|||
|
{
|
|||
|
_desk = getRandomFreeDesk();
|
|||
|
/*
|
|||
|
*一个客户在同一个波次不能有多个pickOrder,不然比较麻烦
|
|||
|
if (!lastAddress.Equals(request.customerName + request.custAddress))
|
|||
|
{
|
|||
|
_desk = getRandomFreeDesk();
|
|||
|
lastAddress = request.customerName + request.custAddress;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
if (desk.color == 0) // no exist free desk, then process bulk
|
|||
|
{
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), "摘果式拣选,无可用复核台");
|
|||
|
if (isSeedsEnabled && _seedsDesk.ID > 0) // 启用播种后,由播种台是否空闲来判断是否结束循环
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " 播种台有空,继续处理剩余订单");
|
|||
|
continue;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " 无可用复核台、播种台,波次生成结束");
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else {
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("pickorderno: {0},desk id :{1}", request.pickOrderNo, desk.ID));
|
|||
|
}
|
|||
|
|
|||
|
if (WmsConstants.OUT_LIGHT_ENABLE)
|
|||
|
{
|
|||
|
#region checklabellimit
|
|||
|
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
|||
|
{
|
|||
|
|
|||
|
/*
|
|||
|
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
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId]++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (tmpcomCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (labelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
|||
|
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmplabelCnt.Keys)
|
|||
|
{
|
|||
|
if (labelCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
labelCnt[k] -= tmplabelCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (comCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
|||
|
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmpcomCnt.Keys)
|
|||
|
{
|
|||
|
if (comCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
comCnt[k] -= tmpcomCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
//TimeSpan ts11 = DateTime.Now - d11;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
|||
|
|
|||
|
if (isReachLimit)
|
|||
|
{
|
|||
|
isReachLimit = false;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
|||
|
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest),
|
|||
|
string.Format("last address: {0},current address: {1}",
|
|||
|
lastAddress, request.customerName + request.custAddress));
|
|||
|
|
|||
|
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//建立零库电子拣选临时数据 ---摘果
|
|||
|
|
|||
|
if (desk.color == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " 摘果式 保存整货和零货出库分拣数据");
|
|||
|
|
|||
|
WmsOutPickLable_tmp wpl;
|
|||
|
foreach (WmsStockRecord rec in lstBulk)
|
|||
|
{
|
|||
|
// if (rec.count == 0)
|
|||
|
if (rec.count + rec.countOuting < 1) //不支持小数
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
wpl = new WmsOutPickLable_tmp();
|
|||
|
wpl.pickOrderNo = request.pickOrderNo;
|
|||
|
wpl.recordId = rec.ID;
|
|||
|
wpl.color = desk.color;
|
|||
|
|
|||
|
wpl.count = rec.count + rec.countOuting;
|
|||
|
wpl.locationId = rec.locationId;
|
|||
|
wpl.elabAddress = rec.location.elabAddress;
|
|||
|
wpl.elabId = rec.location.elabId;
|
|||
|
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
|||
|
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();
|
|||
|
|
|||
|
WmsOutPickPort wop = new WmsOutPickPort();// wp.recordId
|
|||
|
wop.getPickPortByRecordId(wp.recordId);
|
|||
|
wop.dpsOrder = waveOrder;
|
|||
|
wop.Update();
|
|||
|
// WmsOutPickDetail pd = new WmsOutPickDetail(wp.orderDetailId);
|
|||
|
// pd.updateErpSaleDetail_deng(true);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// foreach (WmsOutPickPort wop in lstPort) //建立电子拣选临时数据
|
|||
|
// {
|
|||
|
// wop.Add();
|
|||
|
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
if (lstLabel.Count > 0)
|
|||
|
{
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
|||
|
request.waveStart = request.getDateTime();
|
|||
|
|
|||
|
request.operater = this.operId;
|
|||
|
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
|||
|
request.desk = desk.color;
|
|||
|
desk.state = (int)enumDeskState.任务中;
|
|||
|
desk.Update();
|
|||
|
request.Update();
|
|||
|
bulkRequests.Add(request);
|
|||
|
int count= outRequest.saveTempData4Validation(waveOrder,request.pickOrderNo);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
|||
|
}
|
|||
|
//if (lstPort.Count > 0)
|
|||
|
// {
|
|||
|
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.待处理);
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
waveSize++;
|
|||
|
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
//TimeSpan ts2 = DateTime.Now - d12;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
// System.Diagnostics.Debug.WriteLine(e.Message);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TimeSpan ts00 = DateTime.Now - d00;
|
|||
|
totoalTime += ts00.TotalSeconds;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
|||
|
*/
|
|||
|
if (isSeedsEnabled && seedsRequests.Count > 0)
|
|||
|
{
|
|||
|
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
|||
|
{
|
|||
|
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);//生成播种拣选单
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// _seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
// if (seedsDesk.ID == 0) //无可用播种台
|
|||
|
{
|
|||
|
foreach (WmsOutPickRequest pr in seedsRequests)
|
|||
|
{
|
|||
|
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
|||
|
{
|
|||
|
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
DateTime dte = seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES);
|
|||
|
if (dte > System.DateTime.Now)
|
|||
|
{
|
|||
|
seedsWaiting.Remove(pr.pickOrderNo);
|
|||
|
noSeeds.Add(pr.pickOrderNo);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} waited {1},noseeds marked",pr.pickOrderNo,dte.CompareTo(DateTime.Now)));
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
|
|||
|
}
|
|||
|
//int count1 = 0;
|
|||
|
try
|
|||
|
{
|
|||
|
// count = outRequest.saveTempData4Validation(waveOrder);
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), er.Message);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
|||
|
TimeSpan ts1 = DateTime.Now - d0;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + ":" + ts1.TotalMilliseconds, totoalTime));
|
|||
|
// insert tmp data for validation
|
|||
|
//outRequest.saveTempData4Validation(waveOrder);
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
|||
|
|
|||
|
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
|||
|
|
|||
|
//点亮标签开始捡货
|
|||
|
// elelab.pick.send_data_pick(pickLabelDetail.getData4Pick(waveOrder).Tables[0], enumLabelPickType.pick);
|
|||
|
|
|||
|
|
|||
|
//检查待补货出货单状态
|
|||
|
checkRepAndNoStockOrders();
|
|||
|
|
|||
|
// isProcessWaveing = false; //TODO: check if all batch is not finished, what happend?
|
|||
|
|
|||
|
/*
|
|||
|
* Thread.CurrentThread.Join(1);
|
|||
|
|
|||
|
Thread batchPick4Bulk = new Thread(new ParameterizedThreadStart(processBatchOrdersWithBulk));
|
|||
|
batchPick4Bulk.IsBackground = true;
|
|||
|
batchPick4Bulk.Start(bulkRequests);
|
|||
|
*/
|
|||
|
// Thread.CurrentThread.Join(1);
|
|||
|
|
|||
|
// process all batch pick request
|
|||
|
// Thread batchPick = new Thread(new ParameterizedThreadStart(processBatchWithBulkOrders));
|
|||
|
// batchPick.IsBackground = true;
|
|||
|
// batchPick.Start(requests);
|
|||
|
// batchPick.Start(bulkRequests); //只处理有零货的订单,全为整的订单暂时在 GoodsBatchOutForm newBatchOnlyPDATasks
|
|||
|
// processAllBatchOrders(requests, waveOrder);
|
|||
|
TimeSpan ts0 = DateTime.Now - d0;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕,耗时{1} ..", DateTime.Now, ts0.TotalSeconds + ":" + ts0.TotalMilliseconds));
|
|||
|
// TaskCallBack();
|
|||
|
try
|
|||
|
{
|
|||
|
outRequest.fixMore();
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest),er.StackTrace.ToString());
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 取指定分区的,指定状态的亮灯数据
|
|||
|
/// 按复核台、波次号 asc 排序
|
|||
|
/// </summary>
|
|||
|
/// <param name="part"></param>
|
|||
|
/// <param name="status"></param>
|
|||
|
/// <returns></returns>
|
|||
|
internal DataTable getSeedDesksPickList(int partId, enumPickState status)
|
|||
|
{
|
|||
|
|
|||
|
DataTable dt= pickLabelDetail.getSeedDesksPickList(partId, status);
|
|||
|
|
|||
|
if (!WmsConstants.SEEDS_PARTION_DESK_COLOR_MAP)
|
|||
|
{
|
|||
|
return dt;
|
|||
|
}
|
|||
|
|
|||
|
Dictionary<int, string> currentWavePart = new Dictionary<int, string> ();
|
|||
|
Dictionary<int, int> mapColorPairs = new Dictionary<int, int> ();
|
|||
|
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
string waveNo = dr["dpsOrder"].ToString();
|
|||
|
int color = getMapColor(mapColorPairs, Convert.ToInt16(dr["color"].ToString()));
|
|||
|
dr["color"] = color;
|
|||
|
currentWavePart[color]=waveNo;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WmsWave ww = new WmsWave();
|
|||
|
ww.clearSeedsPart(partId);
|
|||
|
foreach (int color in currentWavePart.Keys)
|
|||
|
{
|
|||
|
ww.partion = partId;
|
|||
|
ww.mapColor = color;
|
|||
|
ww.waveNo= currentWavePart[color];
|
|||
|
ww.terminal = getOrigColor(mapColorPairs, color);
|
|||
|
ww.Add();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return dt;
|
|||
|
|
|||
|
}
|
|||
|
private int getMapColor(Dictionary<int, int> mapColorPairs, int color)
|
|||
|
{
|
|||
|
|
|||
|
if (mapColorPairs.ContainsKey(color))
|
|||
|
{
|
|||
|
return mapColorPairs[color];
|
|||
|
}
|
|||
|
|
|||
|
int maxColor = 0;
|
|||
|
foreach (int value in mapColorPairs.Values)
|
|||
|
{
|
|||
|
if (maxColor < value)
|
|||
|
{
|
|||
|
maxColor = value;
|
|||
|
}
|
|||
|
}
|
|||
|
maxColor++;
|
|||
|
mapColorPairs[color] = maxColor;
|
|||
|
|
|||
|
return maxColor;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private int getOrigColor(Dictionary<int, int> mapColorPairs, int color)
|
|||
|
{
|
|||
|
|
|||
|
foreach (int key in mapColorPairs.Keys)
|
|||
|
{
|
|||
|
if (color == mapColorPairs[key])
|
|||
|
{
|
|||
|
return key;
|
|||
|
}
|
|||
|
}
|
|||
|
return color;
|
|||
|
}
|
|||
|
|
|||
|
void createSeedsRequest(List<WmsOutPickRequest> seedsRequests, Dictionary<string, WmsStockRecord> seedsBulks,List<WmsStockRecord> lstBulk )
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始生成播种拣选单,seedsRequests.count :{0},seedsBulks.count:{1}",
|
|||
|
seedsRequests.Count, seedsBulks.Count));
|
|||
|
|
|||
|
List<WmsOutPickLable_tmp> lstLabel = new List<WmsOutPickLable_tmp>();
|
|||
|
|
|||
|
if (_seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
WmsOutPickRequest seedPickRequest = new WmsOutPickRequest();
|
|||
|
seedPickRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.seedsPickOrder, seedPickRequest.getNextSeq(enumCreateOrderType.seedsPickOrder));
|
|||
|
seedPickRequest.orderType = (int)enumOutOrderType.销售出库;
|
|||
|
seedPickRequest.outStoreType = (int)enumOutStoreType.播种拣货出库;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选单 :{0} ", seedPickRequest.pickOrderNo));
|
|||
|
|
|||
|
WmsWave ww = new WmsWave();
|
|||
|
ww.waveNo = waveOrder;
|
|||
|
ww.seedsNo = seedPickRequest.pickOrderNo;
|
|||
|
ww.deskColor = _seedsDesk.color;
|
|||
|
ww.state =(int) enumOutStockRequestStatus.正在分拣;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WmsOutPickLable_tmp wpl;
|
|||
|
foreach (WmsStockRecord rec in seedsBulks.Values)
|
|||
|
{
|
|||
|
if (rec.count +rec.countOuting <1)
|
|||
|
{
|
|||
|
// continue;
|
|||
|
}
|
|||
|
wpl = new WmsOutPickLable_tmp();
|
|||
|
wpl.pickOrderNo = seedPickRequest.pickOrderNo;
|
|||
|
wpl.recordId = rec.ID;
|
|||
|
wpl.color = seedsDesk.color;
|
|||
|
wpl.orderDetailId = rec.orderDetailId;//部分,不精确到一一对应
|
|||
|
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;
|
|||
|
//#if DEBUG
|
|||
|
if (comLables.Count > 0)
|
|||
|
{
|
|||
|
wpl.port = comLables[wpl.elabId]; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
|||
|
|
|||
|
}
|
|||
|
//#endif
|
|||
|
wpl.dpsOrder = waveOrder;
|
|||
|
wpl.operater = this.operId;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
lstLabel.Add(wpl);
|
|||
|
|
|||
|
}
|
|||
|
int i =0;
|
|||
|
int startId = seedsDesk.startLabelId;
|
|||
|
//保存整货和零货出库分拣数据
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
ww.Add();
|
|||
|
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
|||
|
{
|
|||
|
wp.Add();
|
|||
|
|
|||
|
}
|
|||
|
seedsDesk.state = (int)enumDeskState.任务中;
|
|||
|
seedsDesk.Update();
|
|||
|
|
|||
|
foreach (WmsOutPickRequest request in seedsRequests)
|
|||
|
{
|
|||
|
|
|||
|
if (lstLabel.Count > 0)
|
|||
|
{
|
|||
|
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
|||
|
request.waveStart = request.getDateTime();
|
|||
|
request.operater = this.operId;
|
|||
|
|
|||
|
|
|||
|
// request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
|||
|
request.bulkPickState = (int)enumOutStockPickStatus.正在分拣;
|
|||
|
request.desk = seedsDesk.color;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
request.seedsLabelId = startId > 0 ? startId++ : seedsDesk.color * 10 + ++i; //每个播种复合台的标签ID编号不重复,应对多个播种台共用一个标签控制器的情况。
|
|||
|
request.seedsPickNo = seedPickRequest.pickOrderNo; //赋值播种拣选订单单号
|
|||
|
request.seedsPort = seedsDesk.port;
|
|||
|
request.Update();
|
|||
|
bulkRequests.Add(request);
|
|||
|
|
|||
|
int count = outRequest.saveTempData4Validation(waveOrder, request.pickOrderNo);
|
|||
|
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣,operId);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//waveSize++;
|
|||
|
|
|||
|
/*
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
es.getByPickOrder(request.pickOrderNo);
|
|||
|
es.liangdeng = true;
|
|||
|
es.Update();
|
|||
|
*/
|
|||
|
|
|||
|
}
|
|||
|
WmsOutPickPort wop;
|
|||
|
foreach (WmsStockRecord wsr in lstBulk)
|
|||
|
{
|
|||
|
wop = new WmsOutPickPort();
|
|||
|
wop.getPickPortByRecordId(wsr.ID);
|
|||
|
wop.dpsOrder = waveOrder;
|
|||
|
wop.pickDetailId = wsr.orderDetailId;
|
|||
|
wop.Update();
|
|||
|
}
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
//TimeSpan ts2 = DateTime.Now - d12;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 点亮待拣选标签
|
|||
|
/// </summary>
|
|||
|
//public void lightLables()
|
|||
|
//{
|
|||
|
// lastWave = DateTime.Now;
|
|||
|
// WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Clear();
|
|||
|
// elelab.pick.send_data_pick( pickLabelDetail.getPickedData(enumLabelPickState.notPicked).Tables[0], enumLabelPickType.pick);
|
|||
|
//}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 检查补货出货单状态
|
|||
|
/// 若不再缺货则进下个波次
|
|||
|
/// </summary>
|
|||
|
|
|||
|
public void checkRepAndNoStockOrders()
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" start check stock for ...... " + enumOutStockRequestStatus.等待补货));
|
|||
|
bool isOk;
|
|||
|
List<WmsOutPickRequest> prs = outRequest.getRequestObjects( enumOutStockRequestStatus.等待补货);
|
|||
|
foreach (WmsOutPickRequest pr in prs)
|
|||
|
{
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" start check stock for pr {0} ...... ", pr.pickOrderNo));
|
|||
|
isOk = true;
|
|||
|
foreach (WmsOutPickDetail pd in pr.outDetails)
|
|||
|
{
|
|||
|
if (pd.state == (int)enumOutStockDetailStatus.等待补货)
|
|||
|
{
|
|||
|
// decimal d = pd.goods.stockBulkCount /* pd.getGoodsStockCnt(enumWhLocVol.零库)*/;
|
|||
|
decimal d = pd.goods.stockBulkAvCount /* pd.getGoodsStockCnt(enumWhLocVol.零库)*/;
|
|||
|
if (pd.bulkCount >= d)
|
|||
|
{
|
|||
|
isOk = false;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (isOk)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format( "pr {0} stock bulk available, start stock process... ",pr.pickOrderNo ) );
|
|||
|
pr.state = (int)enumOutStockRequestStatus.待定位;
|
|||
|
|
|||
|
// pr.operater = LoginInfo.UserId;
|
|||
|
// pr.lastmodified = pr.getDateTime();
|
|||
|
pr.operater = this.operId;
|
|||
|
pr.Update();
|
|||
|
|
|||
|
new lWmsOutRequest(operId).requestOutStock(pr); //在库存扣除后,将分拣单状态置为等待波次
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} stock process done...,new status {1} ", pr.pickOrderNo, pr.state));
|
|||
|
}
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" end check stock for ...... " + enumOutStockRequestStatus.等待补货));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void processBatchOrdersWithBulk(Object obs)
|
|||
|
{
|
|||
|
//开始处理整库出货部分
|
|||
|
|
|||
|
DateTime t0 = DateTime.Now;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" 整库部分出库 处理开始...................." ) );
|
|||
|
|
|||
|
|
|||
|
List<WmsOutPickRequest> requests = (List<WmsOutPickRequest>)obs;
|
|||
|
|
|||
|
|
|||
|
foreach (WmsOutPickRequest request in requests)
|
|||
|
{
|
|||
|
processPickRequest(request);
|
|||
|
}
|
|||
|
TimeSpan ts = DateTime.Now - t0;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" 整库部分出库 处理完毕 cost {0}....................", ts.TotalSeconds + " : " + ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
void processBatchWithBulkOrders(Object obs)
|
|||
|
{
|
|||
|
//开始处理全整库出货部分
|
|||
|
DateTime t0 = DateTime.Now;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format (" 整库出库 处理开始...................." ));
|
|||
|
|
|||
|
List<WmsOutPickRequest> requests = (List<WmsOutPickRequest>)obs;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
foreach (WmsOutPickRequest request in requests)
|
|||
|
{
|
|||
|
|
|||
|
if (request.bulkCnt ==0){ //亮灯波次只处理有零货也有整货的分拣单
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
processPickRequest(request);
|
|||
|
}
|
|||
|
|
|||
|
TimeSpan ts = DateTime.Now - t0;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format (" 整库部分出库 处理完毕 cost {0}....................", ts.TotalSeconds + " : " + ts.TotalMilliseconds));
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 生成手持拣货数据 //GoodsBatchOutForm.cs newBatchOnlyPDATasks
|
|||
|
/// </summary>
|
|||
|
public void createPDAPickTasks( )
|
|||
|
{
|
|||
|
List<WmsOutPickRequest> lst = outRequest.getRequestObjects( enumOutStockRequestStatus.定位完成);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("begin createPDAPickTasks...count {0}................",lst.Count));
|
|||
|
foreach (WmsOutPickRequest pr in lst)
|
|||
|
{
|
|||
|
processPickRequest(pr);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void processBatchPickOrders()
|
|||
|
{
|
|||
|
DataTable tb = outRequest.getBatchOnlyRequests(enumOutStockPickStatus.待处理);
|
|||
|
|
|||
|
foreach (DataRow dr in tb.Rows)
|
|||
|
{
|
|||
|
processPickRequest(new WmsOutPickRequest(dr));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void processPickRequest(WmsOutPickRequest request)
|
|||
|
{
|
|||
|
// DateTime t0 = DateTime.Now;
|
|||
|
// System.Diagnostics.Debug.WriteLine(string.Format("{0} 整库 {1} 处理开始..................", DateTime.Now, request.pickOrderNo));
|
|||
|
|
|||
|
// DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
|||
|
|
|||
|
DataTable dt = stkRecord.getPickStockRecodsForPDAProcess(request.pickOrderNo ).Tables[0];
|
|||
|
List<WmsOutPickPort> lstPort = new List<WmsOutPickPort>();
|
|||
|
DataView dv = new DataView(dt);
|
|||
|
dv.RowFilter = string.Format(" volType in ({0},{1},{2})", (int)enumWhLocVol.小整, (int)enumWhLocVol.中整, (int)enumWhLocVol.大整);
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_BULK_PDA_SCAN)
|
|||
|
{
|
|||
|
//零库数据也入PDA手持捡货表
|
|||
|
dv.RowFilter = "";
|
|||
|
}
|
|||
|
|
|||
|
string tranLocationId = request.tranLocationId;
|
|||
|
WmsLocation tranLoc=null;
|
|||
|
if (String.IsNullOrEmpty(tranLocationId))
|
|||
|
{
|
|||
|
tranLocationId= new TmsStock().getTranLocation(request.customerId);
|
|||
|
}
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("begin processPickRequest...prNo {0}....,records cnt {1}............",request.pickOrderNo, dv.Count));
|
|||
|
|
|||
|
if (dv.Count == 0 && request.batchPickState >0)
|
|||
|
{
|
|||
|
request.operater = this.operId;
|
|||
|
request.tranLocationId = tranLocationId;
|
|||
|
request.batchPickState =(int) enumOutStockPickStatus.已定位 ;
|
|||
|
request.Update();
|
|||
|
return;
|
|||
|
}
|
|||
|
//get tranLocationId,集货区,一条线路 共用一个整货位
|
|||
|
if (!String.IsNullOrEmpty(tranLocationId))
|
|||
|
{
|
|||
|
tranLoc = new WmsLocation(tranLocationId);
|
|||
|
}
|
|||
|
foreach (DataRowView drv in dv)
|
|||
|
{
|
|||
|
|
|||
|
WmsStockRecord stRec = new WmsStockRecord(drv.Row);
|
|||
|
WmsOutPickPort wpp = new WmsOutPickPort();
|
|||
|
if (stRec.ID == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
wpp.count = stRec.countOuting;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wpp.count = stRec.count;
|
|||
|
}
|
|||
|
|
|||
|
wpp.volType = Convert.ToInt16(drv["volType"].ToString());
|
|||
|
wpp.locationId = stRec.locationId;
|
|||
|
wpp.pickOrderNo = stRec.orderNo;
|
|||
|
wpp.recType = stRec.rectype;
|
|||
|
wpp.recordId = stRec.ID;
|
|||
|
// wpp.waveOrder = request.waveOrder;// WmsConstants.WAVE_CURRENT_ORDER; //TODO: wave order can be null
|
|||
|
wpp.pickOrderNo = request.pickOrderNo;
|
|||
|
wpp.operater = operId;
|
|||
|
wpp.tranLocationId = tranLocationId;
|
|||
|
wpp.pickDetailId = stRec.orderDetailId;
|
|||
|
if (tranLoc != null)
|
|||
|
{
|
|||
|
wpp.tranArea = tranLoc.part;
|
|||
|
}
|
|||
|
wpp.partion = stRec.partion;//part 分区flag 1,2,3,4,5 分区拣货定义
|
|||
|
lstPort.Add(wpp);
|
|||
|
|
|||
|
}
|
|||
|
// System.Diagnostics.Debug.WriteLine(string.Format("{2} {0}, 记录 count:{1}", request.pickOrderNo, dvBatch.Count,DateTime.Now));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
foreach (WmsOutPickPort wop in lstPort) //建立手持分拣数据
|
|||
|
{
|
|||
|
wop.Add();
|
|||
|
|
|||
|
}
|
|||
|
// request.waveOrder = WmsConstants.WAVE_CURRENT_ORDER;
|
|||
|
request.state = (int)enumOutStockRequestStatus.等待波次;
|
|||
|
// request.waveStart = request.getDateTime();
|
|||
|
request.operater = this.operId;
|
|||
|
request.tranLocationId = tranLocationId;
|
|||
|
if (lstPort.Count > 0)
|
|||
|
{
|
|||
|
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣,operId);
|
|||
|
}
|
|||
|
if (request.batchPickState == (int)enumOutStockPickStatus.待处理)
|
|||
|
{
|
|||
|
request.batchPickState = (int)enumOutStockPickStatus.已定位;
|
|||
|
}
|
|||
|
if (WmsConstants.OUT_STOCK_BULK_PDA_SCAN && request.bulkPickState == (int)enumOutStockPickStatus.待处理)
|
|||
|
{
|
|||
|
request.bulkPickState = (int)enumOutStockPickStatus.已定位;
|
|||
|
}
|
|||
|
request.Update();
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
throw e;
|
|||
|
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("end processPickRequest...prNo {0}....,records cnt {1}............", request.pickOrderNo, dv.Count));
|
|||
|
|
|||
|
// TimeSpan ts = DateTime.Now - t0;
|
|||
|
// System.Diagnostics.Debug.WriteLine(string.Format("{0} {2}处理完毕 cost {1}....................", DateTime.Now, ts.TotalSeconds + " : " + ts.TotalMilliseconds, request.pickOrderNo));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 随机获取摘取单订单复合台
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
private WmsOutDesk getRandomFreeDesk()
|
|||
|
{
|
|||
|
|
|||
|
// #if DEBUG
|
|||
|
// initialDesk();//TODO: remove
|
|||
|
// #endif
|
|||
|
|
|||
|
|
|||
|
return desk.getRandomDesk(enumDeskState.空闲);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 随机获取多订单播种复合台
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
private WmsOutDesk getRandomFreeSeedsDesk()
|
|||
|
{
|
|||
|
return desk.getRandomDesk(enumDeskState.空闲,enumDeskType.播种);
|
|||
|
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// seeds pick, by plate, 按灭捡货灯,更新数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="color"></param>
|
|||
|
/// <param name="elabId"></param>
|
|||
|
/// <param name="pickCount"></param>
|
|||
|
/// <param name="elabAddress"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool updateSeedsPickingStatus(int color, int elabId, decimal pickCount, int elabAddress,int partion=-1)
|
|||
|
{
|
|||
|
if(partion>-1 && WmsConstants.SEEDS_PARTION_DESK_COLOR_MAP)
|
|||
|
{
|
|||
|
WmsWave ww = new WmsWave();
|
|||
|
DataTable dt= ww.getSeedsPart(partion, color);
|
|||
|
foreach(DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
ww = new WmsWave(dr);
|
|||
|
color = ww.terminal;
|
|||
|
}
|
|||
|
}
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress); ;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (!WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
/*
|
|||
|
* seeds pick
|
|||
|
//update wmsOutPickPort
|
|||
|
WmsOutPickPort wop = new WmsOutPickPort();
|
|||
|
wop.updatePickDetailByStkrecId(wpt.recordId, enumPickState.已拣, operId);
|
|||
|
//new stockRecord //to update current rec
|
|||
|
WmsStockRecord wsr = new WmsStockRecord(wpt.recordId);
|
|||
|
wsr.count = pickCount;
|
|||
|
wsr.countOuting = 0;
|
|||
|
wsr.operater = operId;
|
|||
|
// wsr.Add();
|
|||
|
wsr.Update();
|
|||
|
*/
|
|||
|
//update stock,update label tmp
|
|||
|
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount, true);
|
|||
|
|
|||
|
//pickLabelDetail.finishCurrentPickingData(false);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//更新待复核数据状态
|
|||
|
/*
|
|||
|
WmsOutPickDetail_tmp pd = new WmsOutPickDetail_tmp(wpt.orderDetailId);
|
|||
|
pd.bulkPicked += pickCount;
|
|||
|
if (pd.bulkPicked == pd.bulkCount)
|
|||
|
{
|
|||
|
pd.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
|||
|
}
|
|||
|
pd.Update();
|
|||
|
|
|||
|
WmsOutPickDetail pd1 = new WmsOutPickDetail (wpt.orderDetailId);
|
|||
|
pd1.bulkPicked += pickCount;
|
|||
|
if (pd1.bulkPicked == pd.bulkCount)
|
|||
|
{
|
|||
|
pd1.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
|||
|
}
|
|||
|
pd1.Update();
|
|||
|
|
|||
|
* */
|
|||
|
// pickLabelDetail.updateValidPickingStatus(color, elabId, elabAddress);
|
|||
|
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// UpdateUIDelegate(); //update ui
|
|||
|
|
|||
|
//updateStockByElePick( color, elabId, pickCount, elabAddress);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 按灭拣货灯,更新数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="color"></param>
|
|||
|
/// <param name="elabId"></param>
|
|||
|
/// <param name="pickCount"></param>
|
|||
|
/// <param name="elabAddress"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool updatePickingStatus(int color, int elabId, decimal pickCount, int elabAddress)
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
// WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress,(int) pickCount); ;
|
|||
|
|
|||
|
WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress); ;
|
|||
|
|
|||
|
if (!WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//update wmsOutPickPort
|
|||
|
WmsOutPickPort wop = new WmsOutPickPort();
|
|||
|
wop.updatePickDetailByStkrecId(wpt.recordId, enumPickState.已拣, operId);
|
|||
|
|
|||
|
//new stockRecord //to update current rec
|
|||
|
|
|||
|
WmsStockRecord wsr = new WmsStockRecord(wpt.recordId);
|
|||
|
wsr.count = pickCount;
|
|||
|
wsr.countOuting = 0;
|
|||
|
wsr.operater = operId;
|
|||
|
// wsr.Add();
|
|||
|
wsr.Update();
|
|||
|
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount, true);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//更新待复核数据状态
|
|||
|
|
|||
|
WmsOutPickDetail_tmp pd = new WmsOutPickDetail_tmp(wpt.orderDetailId);
|
|||
|
pd.bulkPicked += pickCount;
|
|||
|
if (pd.bulkPicked == pd.bulkCount)
|
|||
|
{
|
|||
|
pd.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
|||
|
}
|
|||
|
pd.Update();
|
|||
|
|
|||
|
WmsOutPickDetail pd1 = new WmsOutPickDetail(wpt.orderDetailId);
|
|||
|
pd1.bulkPicked += pickCount;
|
|||
|
if (pd1.bulkPicked == pd1.bulkCount)
|
|||
|
{
|
|||
|
pd1.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
|||
|
}
|
|||
|
pd1.Update();
|
|||
|
|
|||
|
// pickLabelDetail.updateValidPickingStatus(color, elabId, elabAddress);
|
|||
|
|
|||
|
//to update erp detail
|
|||
|
// wpt.pickOrderNo
|
|||
|
|
|||
|
// pd1.updateErpSaleDetail_deng(false);
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/* public void updateStockByElePick(int color, int elabId, decimal pickCount, int elabAddress)
|
|||
|
{
|
|||
|
if (!WmsConstants.OUT_STOCK_PDA_SCAN)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
*/
|
|||
|
public delegate void UpdateUI();//声明一个更新主线程的委托
|
|||
|
public UpdateUI UpdateUIDelegate;
|
|||
|
|
|||
|
public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
|
|||
|
public AccomplishTask TaskCallBack;
|
|||
|
private int p;
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 结束当前波次
|
|||
|
/// pick.cs 在不同线程访问该方法。
|
|||
|
/// </summary>
|
|||
|
/// <param name="waveOrder"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool finishCurrentWave(string waveNo,bool isForce)
|
|||
|
{
|
|||
|
|
|||
|
{
|
|||
|
//string waveOrder = pickLabelDetail.finishCurrentPickingData();//结束当前拣选的数据
|
|||
|
// if (!string.IsNullOrEmpty(waveOrder))
|
|||
|
// {
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
// if (isForce)
|
|||
|
// {
|
|||
|
//TODO: to turn off the lights
|
|||
|
// }
|
|||
|
|
|||
|
LogHelper.debug("lwmsoutpickrequest", String.Format(" WmsConstants.WAVE_CURRENT_ORDER {0}, WmsConstants.WAVE_LAST_ORDER {1}, waveNo {2}",
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER, WmsConstants.WAVE_LAST_ORDER, waveNo));
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER = waveNo.Equals(WmsConstants.WAVE_LAST_ORDER)
|
|||
|
? WmsConstants.WAVE_CURRENT_ORDER:waveNo ;
|
|||
|
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
outRequest.completeWaveBulkPickStatus(WmsConstants.WAVE_CURRENT_ORDER,operId);
|
|||
|
pickLabelDetail.finishCurrentPickingData(isForce);//结束当前拣选的数据
|
|||
|
LogHelper.debug("lwmsoutpickrequest","end finish current picking data " +waveNo);
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER = "";
|
|||
|
|
|||
|
if (!WmsConstants.WAVE_CURRENT_ORDER.Equals(WmsConstants.WAVE_LAST_ORDER))
|
|||
|
{
|
|||
|
WmsConstants.WAVE_LAST_ORDER = WmsConstants.WAVE_CURRENT_ORDER;
|
|||
|
TimeSpan ts = DateTime.Now - WmsConstants.WAVE_LAST_TIME;
|
|||
|
WmsConstants.WAVE_TOTAL_SECONDS += ts.Seconds;
|
|||
|
WmsConstants.WAVE_CNT++;
|
|||
|
//WmsConstants.WAVE_CURRENT_ORDER = "";
|
|||
|
WmsConstants.WAVE_SECONDS = WmsConstants.WAVE_TOTAL_SECONDS / WmsConstants.WAVE_CNT;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//if (!string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER))
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
// _canNewWave = true;
|
|||
|
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
|||
|
}
|
|||
|
catch (Exception er )
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
|||
|
Thread.CurrentThread.Join(10);
|
|||
|
// finishCurrentWave(isForce);
|
|||
|
throw er;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// }
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 清理已捡完数据
|
|||
|
/// 当前分区若全部已拣完,则选取新数据开始新拣选
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="waveOrder"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool finishPartWave(int part, bool isForce)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
//TODO: 分区分拣结束,判断分区的订单不存在未拣的部分,则更新pickdetail 和pickrequest bulkPikckStatus
|
|||
|
//1. 更新每个[orderDetailId] detail picked Count and bulk pick status ---已经在每个灯灭时做 ,见 lWmsOutPickRequest.updatePickingStatus
|
|||
|
//3. 更新每个[pickOrderNo] pick status
|
|||
|
|
|||
|
DataTable dt = pickLabelDetail.getPartPickList(part).Tables[0];
|
|||
|
|
|||
|
if (dt.Rows.Count >0 ) //本区未拣完
|
|||
|
{
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
if (new WmsOutPickLable(dr).state == 0)
|
|||
|
{
|
|||
|
if( !isForce)
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//本区已拣完,查看订单明细可能在其他区或未开始拣选的情况
|
|||
|
|
|||
|
DataTable dt1= pickLabelDetail.getPartUnPickList(part) ;
|
|||
|
if (dt1.Rows.Count == 0) //本区订单不存在未捡完的情况
|
|||
|
{
|
|||
|
//更新pickorder,pickorder detail validation bulkstate,清理亮灯数据
|
|||
|
|
|||
|
string lastRequest = "";
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
if (String.IsNullOrEmpty(lastRequest)|| lastRequest != new WmsOutPickLable(dr).pickOrderNo)
|
|||
|
{
|
|||
|
lastRequest = new WmsOutPickLable(dr).pickOrderNo;
|
|||
|
|
|||
|
lastRequest = new WmsOutPickLable(dr).pickOrderNo;
|
|||
|
WmsOutPickRequest pr = new WmsOutPickRequest(lastRequest);
|
|||
|
pr.bulkPickState =(int) enumOutStockPickStatus.分拣完成;
|
|||
|
if (pr.batchPickState == -1 || pr.batchPickState >= (int)enumOutStockPickStatus.分拣完成)
|
|||
|
{
|
|||
|
pr.state = (int)enumOutStockPickStatus.分拣完成;
|
|||
|
//TODO: outrequest order status
|
|||
|
// WmsOutRequest or = new WmsOutRequest();
|
|||
|
|
|||
|
}
|
|||
|
pr.operater = operId;
|
|||
|
pr.Update();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
pickLabelDetail.finishPartPickingData(part,isForce);//结束当前拣选的数据
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
// _canNewWave = true;
|
|||
|
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
|||
|
Thread.CurrentThread.Join(10);
|
|||
|
// finishCurrentWave(isForce);
|
|||
|
// throw er;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public DataSet getPickRequest4BulkValidate(object desk)
|
|||
|
{
|
|||
|
DataSet ds = outRequest.getPickRequest4BulkVailidate(desk);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//test for barcode
|
|||
|
// #if DEBUG
|
|||
|
DataTable tmp;
|
|||
|
Int64 i = 6900000000000;
|
|||
|
for (int j = 0; j < 2; j++)
|
|||
|
{
|
|||
|
tmp = ds.Tables[j];
|
|||
|
|
|||
|
foreach (DataRow dr in tmp.Rows)
|
|||
|
{
|
|||
|
i++;
|
|||
|
if (string.IsNullOrEmpty(dr["barCode"].ToString()))
|
|||
|
{
|
|||
|
dr["barCode"] = dr["goodsId"].ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// #endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DataView dv = ds.Tables[0].DefaultView;
|
|||
|
|
|||
|
dv.Sort = "dpsOrder ASC"; //fifo
|
|||
|
// DataTable dt = dv.ToTable(true, "pickOrderNo","orderState","customerName"); // TODO: check why custid to multi custname, custid: C1ZTLQIA97N
|
|||
|
DataTable dt = dv.ToTable(true,"orderBulkPickstate","dpsOrder", "pickOrderNo", "orderState", "customerName", "custAddress", "desk", "seedsLabelId","xuhao"); // 打印封箱
|
|||
|
dt.TableName = "tablePickOrderList";
|
|||
|
|
|||
|
int kk=0;
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
kk++;
|
|||
|
dr["xuhao"] = kk + "";
|
|||
|
}
|
|||
|
ds.Tables.Add(dt);
|
|||
|
|
|||
|
// dv.RowFilter = string.Format("orderState <'{0}'",(int)enumOutStockPickStatus.复核完成);
|
|||
|
//DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk", "orderState"); // distinct pickOrderNo
|
|||
|
DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk"); // distinct seedsPickNo
|
|||
|
dt2.TableName = "tableSeedsPickOrders";
|
|||
|
ds.Tables.Add(dt2);
|
|||
|
|
|||
|
//DataView dv2 = outRequest.getValidationExceptionSolutions(desk).Tables[0].DefaultView;
|
|||
|
//dv2.RowFilter = "state =" + (int)enumOutStockDetailStatus.validatedExceptionSulution ;
|
|||
|
//DataTable dtExceptionSolution = dv.ToTable();
|
|||
|
//dtExceptionSolution.TableName = "exsolutions";
|
|||
|
//ds.Tables.Add(dtExceptionSolution);
|
|||
|
|
|||
|
//DataTable dtExceptionSolution = outRequest.getValidationExceptionSolutions(desk).Tables[0].Clone();
|
|||
|
//dtExceptionSolution.TableName = "exsolutions";
|
|||
|
//ds.Tables.Add(dtExceptionSolution);
|
|||
|
return ds;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public DataSet getPickRequest4SeedsOperation(int desk, enumOutStockRequestStatus seedsStatus, string seedsNo = "")
|
|||
|
{
|
|||
|
DataSet ds = outRequest.getPickRequest4BulkSeedsVailidate(desk,seedsStatus,seedsNo);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//test for barcode
|
|||
|
#if DEBUG
|
|||
|
|
|||
|
DataTable tmp;
|
|||
|
|
|||
|
for (int j = 0; j < 2; j++)
|
|||
|
{
|
|||
|
tmp = ds.Tables[j];
|
|||
|
|
|||
|
foreach (DataRow dr in tmp.Rows)
|
|||
|
{
|
|||
|
|
|||
|
if (string.IsNullOrEmpty(dr["barCode"].ToString()))
|
|||
|
{
|
|||
|
dr["barCode"] = dr["goodsId"].ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
DataView dv = ds.Tables[0].DefaultView;
|
|||
|
|
|||
|
dv.Sort = "seedsPickNo ASC"; //fifo
|
|||
|
// DataTable dt = dv.ToTable(true, "pickOrderNo","orderState","customerName"); // TODO: check why custid to multi custname, custid: C1ZTLQIA97N
|
|||
|
DataTable dt = dv.ToTable(true, "orderBulkPickstate", "dpsOrder", "pickOrderNo", "orderState", "customerName", "custAddress", "desk", "seedsLabelId", "xuhao"); // 打印封箱
|
|||
|
dt.TableName = "tablePickOrderList";
|
|||
|
ds.Tables.Add(dt);
|
|||
|
dv = ds.Tables[1].DefaultView;
|
|||
|
DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk","seedsstatus"); // distinct seedsPickNo
|
|||
|
dt2.TableName = "tableSeedsPickOrders";
|
|||
|
ds.Tables.Add(dt2);
|
|||
|
|
|||
|
|
|||
|
//DataView dv2 = outRequest.getValidationExceptionSolutions(desk).Tables[0].DefaultView;
|
|||
|
//dv2.RowFilter = "state =" + (int)enumOutStockDetailStatus.validatedExceptionSulution ;
|
|||
|
//DataTable dtExceptionSolution = dv.ToTable();
|
|||
|
//dtExceptionSolution.TableName = "exsolutions";
|
|||
|
//ds.Tables.Add(dtExceptionSolution);
|
|||
|
|
|||
|
//DataTable dtExceptionSolution = outRequest.getValidationExceptionSolutions(desk).Tables[0].Clone();
|
|||
|
//dtExceptionSolution.TableName = "exsolutions";
|
|||
|
//ds.Tables.Add(dtExceptionSolution);
|
|||
|
return ds;
|
|||
|
}
|
|||
|
|
|||
|
public DataTable getSeedsGoods(string seedsNo)
|
|||
|
{
|
|||
|
return outRequest.getSeedsGoods(seedsNo);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 零货分拣复核完成
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <param name="validationDetails"></param>
|
|||
|
public bool completeBulkValidation(string pickOrderNo, int bulkBox, int bulkBag,
|
|||
|
DataTable validationDetails = null)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(pickOrderNo))
|
|||
|
{
|
|||
|
if (validationDetails == null)
|
|||
|
{
|
|||
|
validationDetails = outRequest.getValidationDetail(pickOrderNo);
|
|||
|
}
|
|||
|
bool isException = false;
|
|||
|
|
|||
|
DataView dv = validationDetails.DefaultView;
|
|||
|
dv.RowFilter = "bulkPickState =" + (int)enumOutStockPickStatus.复核异常;
|
|||
|
isException = dv.Count > 0;
|
|||
|
|
|||
|
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
|||
|
po.bulkBox = bulkBox;
|
|||
|
po.bulkBag = bulkBag;
|
|||
|
lTmsStock lts = new lTmsStock(operId);
|
|||
|
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
|||
|
/* try
|
|||
|
{
|
|||
|
lTmsStock lts = new lTmsStock(operId);
|
|||
|
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
}
|
|||
|
*/
|
|||
|
po.bulkPickState = isException ? (int)enumOutStockPickStatus.复核异常 : (int)enumOutStockPickStatus.复核完成;
|
|||
|
po.operater = this.operId;
|
|||
|
if (po.bulkPickState == (int)enumOutStockPickStatus.复核完成) //both bulk and batch completed validation
|
|||
|
{
|
|||
|
if (po.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
|||
|
|| po.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
|||
|
{
|
|||
|
po.state = (int)enumOutStockRequestStatus.集货完成;
|
|||
|
updateErpSaleStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
|||
|
/*
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
if (!WmsConstants.OUT_REQUEST_MERGE)
|
|||
|
{
|
|||
|
es.getByPickOrder(po.pickOrderNo);
|
|||
|
Employee em = new Employee(operId);
|
|||
|
es.fuheren = em.em_name;
|
|||
|
es.fuhesj = es.getDateTime();
|
|||
|
es.fuhezt = true;
|
|||
|
es.Update();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
es.updatePickStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
|||
|
}
|
|||
|
*/
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
po.Update();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
foreach (DataRow dr in validationDetails.Rows)
|
|||
|
{
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
|||
|
WmsOutPickDetail_tmp pdt = new WmsOutPickDetail_tmp(dr);
|
|||
|
// isException = isException || pdt.bulkPickState == (int)enumOutStockPickStatus.复核异常;
|
|||
|
pd.operater = this.operId;
|
|||
|
pdt.operater = this.operId;
|
|||
|
|
|||
|
//check batch pick status
|
|||
|
if ( (int)pd.batchPickState ==(int)enumOutStockPickStatus.无需分拣
|
|||
|
|| (int)pd.batchPickState > (int)enumOutStockPickStatus.分拣完成 ) //batch pick completed
|
|||
|
{
|
|||
|
if (pdt.bulkPickState != (int)enumOutStockPickStatus.复核异常)
|
|||
|
{
|
|||
|
pd.state = (int)enumOutStockDetailStatus.集货完成;
|
|||
|
}
|
|||
|
}
|
|||
|
pdt.state = pd.state;
|
|||
|
pdt.orderState = po.bulkPickState;
|
|||
|
pd.UpdateNoCompare(); //所有字段,除ID外,覆盖原值
|
|||
|
pdt.Update();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
outRequest.deleteTempValidationData(pickOrderNo);
|
|||
|
}
|
|||
|
scope.Complete();
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
|||
|
Thread.CurrentThread.Join(200);
|
|||
|
// completeBulkValidation(pickOrderNo, bulkBox, bulkBag, validationDetails);
|
|||
|
throw er;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 零货分拣复核完成
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <param name="validationDetails"></param>
|
|||
|
public bool completeSeedsPack(string pickOrderNo, int bulkBox=0,int bulkBag=0, DataTable validationDetails = null)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
|||
|
if (po.bulkPickState == (int)enumOutStockPickStatus.打包完成)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(pickOrderNo))
|
|||
|
{
|
|||
|
if (validationDetails == null)
|
|||
|
{
|
|||
|
validationDetails = outRequest.getValidationDetail(pickOrderNo);
|
|||
|
}
|
|||
|
bool isException = false;
|
|||
|
|
|||
|
DataView dv = validationDetails.DefaultView;
|
|||
|
dv.RowFilter = "bulkPickState =" + (int)enumOutStockPickStatus.复核异常;
|
|||
|
isException = dv.Count > 0;
|
|||
|
po.bulkBox = bulkBox;
|
|||
|
po.bulkBag = bulkBag;
|
|||
|
|
|||
|
if (bulkBox + bulkBag == 0) //播种复核台前置打印,数量为一个包装
|
|||
|
{
|
|||
|
po.bulkBag = 1;
|
|||
|
}
|
|||
|
lTmsStock lts = new lTmsStock(operId);
|
|||
|
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
|||
|
|
|||
|
/* try
|
|||
|
{
|
|||
|
lTmsStock lts = new lTmsStock(operId);
|
|||
|
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
}
|
|||
|
*/
|
|||
|
po.bulkPickState = isException ? (int)enumOutStockPickStatus.复核异常 : (int)enumOutStockPickStatus.打包完成;
|
|||
|
po.operater = this.operId;
|
|||
|
if (po.bulkPickState == (int)enumOutStockPickStatus.打包完成) //both bulk and batch completed validation
|
|||
|
{
|
|||
|
if (po.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
|||
|
|| po.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
|||
|
{
|
|||
|
po.state = (int)enumOutStockRequestStatus.集货完成;
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
es.updatePickStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
po.Update();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
foreach (DataRow dr in validationDetails.Rows)
|
|||
|
{
|
|||
|
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
|||
|
WmsOutPickDetail_tmp pdt = new WmsOutPickDetail_tmp(dr);
|
|||
|
// isException = isException || pdt.bulkPickState == (int)enumOutStockPickStatus.复核异常;
|
|||
|
pd.operater = this.operId;
|
|||
|
pdt.operater = this.operId;
|
|||
|
|
|||
|
//check batch pick status
|
|||
|
if ((int)pd.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
|||
|
|| (int)pd.batchPickState > (int)enumOutStockPickStatus.分拣完成) //batch pick completed
|
|||
|
{
|
|||
|
if (pdt.bulkPickState != (int)enumOutStockPickStatus.复核异常)
|
|||
|
{
|
|||
|
pd.state = (int)enumOutStockDetailStatus.集货完成;
|
|||
|
}
|
|||
|
}
|
|||
|
pdt.state = pd.state;
|
|||
|
pdt.orderState = po.bulkPickState;
|
|||
|
pd.UpdateNoCompare(); //所有字段,除ID外,覆盖原值
|
|||
|
pdt.Update();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
outRequest.deleteTempValidationData(pickOrderNo);
|
|||
|
}
|
|||
|
scope.Complete();
|
|||
|
return true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
|||
|
}
|
|||
|
catch (Exception er)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
|||
|
Thread.CurrentThread.Join(200);
|
|||
|
// completeBulkValidation(pickOrderNo, bulkBox, bulkBag, validationDetails);
|
|||
|
throw er;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// batch pick orders waiting for out
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public DataSet getBatchOutPickOrders4Pick()
|
|||
|
{
|
|||
|
DataSet ds = outRequest.getBatchOutPickOrders(enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理, enumOutStockPickStatus.正在分拣);
|
|||
|
//DataTable dt = outRequest.getRepRequestDetailsLessThan(enumOutStockPickStatus.复核完成);
|
|||
|
|
|||
|
// DataTable repTable = outRequest.getRequests(enumOutOrderType.repOrderOut, enumOutStockRequestStatus.等待分拣).Tables[0];
|
|||
|
|
|||
|
DataView dv = ds.Tables[0].DefaultView;
|
|||
|
|
|||
|
dv.RowFilter = "orderType =" + (int) enumOutOrderType.补货出库;
|
|||
|
|
|||
|
DataTable dt = dv.ToTable();
|
|||
|
dt.TableName = "repOrder";
|
|||
|
ds.Tables.Add(dt);
|
|||
|
return ds;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// pick order detail
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public DataSet getBatchOutPickOrderDetails(string pickOrderNo)
|
|||
|
{
|
|||
|
|
|||
|
return outRequest.getBatchOutPickOrderDetails(pickOrderNo, enumOutStockDetailStatus.等待分拣, enumOutStockPickStatus.待处理);
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// get port pick detail by id
|
|||
|
/// </summary>
|
|||
|
/// <param name="recordId"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public DataTable getPortOutPickOrderDetail(int id)
|
|||
|
{
|
|||
|
return outPickPort.getPickDetail(id);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// batch pick order pick detail
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public DataSet getBatchOutPickOrderPickDetails(string pickOrderNo)
|
|||
|
{
|
|||
|
|
|||
|
// return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo,enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理);
|
|||
|
return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// batch pick order pick detail
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public DataTable getPickOrderTmsInfo(string pickOrderNo)
|
|||
|
{
|
|||
|
|
|||
|
// return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo,enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理);
|
|||
|
return outRequest.getPickOrderTmsInfo(pickOrderNo);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///整库开始拣货
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public bool startPickBatchPickOrder(string pickOrderNo)
|
|||
|
{
|
|||
|
bool success = false;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
|||
|
TmsLineDetail tld = new TmsLineDetail().getLineDetailByCustId(po.customerId);
|
|||
|
List<WmsLocation> locs =new TmsStock().getFreeLocation(tld.ID, Utils.enumWhLocVol.装车集货, Utils.enumWhType.集货库 );
|
|||
|
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
foreach (WmsLocation loc in locs)
|
|||
|
{
|
|||
|
po.tranLocationId = loc.locationId;
|
|||
|
po.operater = operId;
|
|||
|
po.Update(); //添加集货货位,整货出库目的地
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
success= outRequest.updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.正在分拣,operId) > 0;
|
|||
|
scope.Complete();
|
|||
|
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(this.GetType(), e);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 整库出库\复核完成
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool updateBatchPickStatus(string pickOrderNo, enumOutStockPickStatus pickStatus)
|
|||
|
{
|
|||
|
WmsOutPickRequest pickRequest = new WmsOutPickRequest(pickOrderNo);
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
//更新batchPickstatus
|
|||
|
pickRequest.updateBatchPickStatus(pickOrderNo, pickStatus,operId);
|
|||
|
|
|||
|
if (pickRequest.bulkPickState == (int)enumOutStockPickStatus.无需分拣 || pickRequest.bulkPickState >= (int)pickStatus) //no bulk or bulk finished
|
|||
|
{
|
|||
|
//更新订单明细状态
|
|||
|
enumOutStockDetailStatus detailState = pickStatus == enumOutStockPickStatus.分拣完成 ?
|
|||
|
enumOutStockDetailStatus.完成分拣 : enumOutStockDetailStatus.复核完成;
|
|||
|
//更新订单状态
|
|||
|
enumOutStockRequestStatus orderState = pickStatus == enumOutStockPickStatus.分拣完成 ?
|
|||
|
enumOutStockRequestStatus.分拣完成 : enumOutStockRequestStatus.复核完成;
|
|||
|
|
|||
|
pickRequest.updateBatchOrderStatus(pickOrderNo,orderState, detailState, operId);
|
|||
|
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
es.updatePickStatus(pickRequest.pickOrderNo, orderState);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
}catch(Exception e){
|
|||
|
LogHelper.WriteLog(this.GetType(), e);
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// finish one pick detail
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public bool finishPickItem(string flowNo,string waveOrder, string pickOrderNo , int id, decimal pickCount)
|
|||
|
{
|
|||
|
|
|||
|
_outPickPort = new WmsOutPickPort(id);
|
|||
|
string jobNo = _outPickPort.jobNo;
|
|||
|
// WmsFlow wf = new WmsFlow(jobNo, waveOrder);
|
|||
|
// wf.finishedCnt++;
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
// wf.Update();
|
|||
|
int volType = updatePortPickStateStk(id, flowNo,enumPickState.已拣,pickCount);
|
|||
|
|
|||
|
|
|||
|
if (outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.未拣, volType > 0) == 0)
|
|||
|
{
|
|||
|
if (volType > 0) //订单整货手持分拣完成
|
|||
|
{
|
|||
|
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.分拣完成)))
|
|||
|
{
|
|||
|
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.分拣完成)))
|
|||
|
{
|
|||
|
|
|||
|
outPickPort.updatePickState(id, enumPickState.未拣, operId);
|
|||
|
//twice failure then roll back status
|
|||
|
return false;
|
|||
|
};
|
|||
|
};
|
|||
|
}
|
|||
|
else //订单零货手持捡货完成
|
|||
|
{
|
|||
|
if (!(outRequest.completeBulkPickStatus(pickOrderNo, operId)))
|
|||
|
{
|
|||
|
if (!(outRequest.completeBulkPickStatus(pickOrderNo, operId)))
|
|||
|
{
|
|||
|
outPickPort.updatePickState(id, enumPickState.未拣, operId);
|
|||
|
|
|||
|
//twice failure then roll back status
|
|||
|
return false;
|
|||
|
};
|
|||
|
};
|
|||
|
//当前wave的零货全部拣选完毕,则结束当前wave
|
|||
|
if (!String.IsNullOrEmpty(waveOrder)
|
|||
|
&& outPickPort.getPickDetailsCnt(null, enumPickState.未拣, false, waveOrder) == 0)
|
|||
|
{
|
|||
|
finishCurrentWave(waveOrder,true);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// finish check one pick detail by location
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <param name="id"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool finishBatchValidateItem(string pickOrderNo, int id,int checkBy2=0)
|
|||
|
{
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
outPickPort.updatePickState(id, enumPickState.复核完成,operId);
|
|||
|
_outPickPort = new WmsOutPickPort(id);
|
|||
|
_outPickPort.checkBy2 = checkBy2;
|
|||
|
_outPickPort.checkBy = operId;
|
|||
|
_outPickPort.checkTime = outPickPort.getDateTime();
|
|||
|
_outPickPort.checkByTime2 = outPickPort.getDateTime();
|
|||
|
_outPickPort.Update();
|
|||
|
|
|||
|
//updatePickState(id, enumPickState.复核完成);
|
|||
|
|
|||
|
if (outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.未拣)
|
|||
|
+ outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.已拣) == 0)
|
|||
|
{
|
|||
|
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.复核完成)))
|
|||
|
{
|
|||
|
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.复核完成)))
|
|||
|
{
|
|||
|
outPickPort.updatePickState(id, enumPickState.已拣, operId);
|
|||
|
|
|||
|
return false;
|
|||
|
};
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
int updatePortPickStateStk(int id, string flowNo, enumPickState state, decimal pickCount = 0)
|
|||
|
{
|
|||
|
|
|||
|
_outPickPort = new WmsOutPickPort(id);
|
|||
|
|
|||
|
if (outPickPort.state == (int)state)
|
|||
|
{
|
|||
|
return _outPickPort.volType;
|
|||
|
}
|
|||
|
if (pickCount > 0)
|
|||
|
{
|
|||
|
outPickPort.pickCount = pickCount; //pickCount 仅用于校验补货入库用,不用于记录实际拣货数量
|
|||
|
}
|
|||
|
outPickPort.operater = this.operId;
|
|||
|
outPickPort.state = (int)state;
|
|||
|
outPickPort.flowNo = flowNo;
|
|||
|
outPickPort.pickBy = operId;
|
|||
|
outPickPort.pickTime = outPickPort.getDateTime();
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
//更新库存
|
|||
|
|
|||
|
WmsStockRecord sr = new WmsStockRecord(outPickPort.recordId);
|
|||
|
|
|||
|
WmsStock stk = new WmsStock( outPickPort.locationId,sr.skuId);
|
|||
|
_outRequest = new WmsOutPickRequest( outPickPort.pickOrderNo);
|
|||
|
enumStockRecordType type = enumStockRecordType.销售出库;
|
|||
|
/* if(outRequest.orderType ==(int) enumOutStoreType.补货出库){
|
|||
|
type = enumStockRecordType.补零出库;
|
|||
|
}
|
|||
|
* */
|
|||
|
if (outRequest.outStoreType == (int)enumOutStoreType.补货出库)
|
|||
|
{
|
|||
|
type = enumStockRecordType.补零出库;
|
|||
|
}
|
|||
|
string description = string.Format("\n type:{0}, 下架数量{1}, 备注:{2}",
|
|||
|
type, pickCount, "");
|
|||
|
stk.countOuting -= pickCount;
|
|||
|
stk.countOuting = stk.countOuting > 0 ? stk.countOuting : 0;
|
|||
|
stk.countOut += pickCount;
|
|||
|
|
|||
|
sr.count = pickCount;
|
|||
|
sr.countOuting = sr.countOuting - pickCount;
|
|||
|
sr.description = description;
|
|||
|
sr.operater = operId;
|
|||
|
sr.goodsId = sr.goodsId;
|
|||
|
|
|||
|
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
sr.Add();
|
|||
|
|
|||
|
stk.skuId = sr.skuId; //托盘,多sku情况
|
|||
|
stk.updateCountOut();
|
|||
|
//stk.Update();
|
|||
|
|
|||
|
|
|||
|
outPickPort.Update();
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
outPickPort.Update();
|
|||
|
}
|
|||
|
|
|||
|
return _outPickPort.volType;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public DataTable getBatchPickOrders4Validate()
|
|||
|
{
|
|||
|
DataTable dt = getWmsOutPickRequest.getBatchPickOrders4Validation();
|
|||
|
|
|||
|
return dt;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public int getPickCount4valid(string pickOrderNo)
|
|||
|
{
|
|||
|
return outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.已拣);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public DataTable repTodayDetails4Pick(int userId = 0)
|
|||
|
{
|
|||
|
DataTable dt = getWmsOutPickRequest.getBatchPickOrderRepDetail("", enumOutOrderType.补货出库, enumPickState.未拣);
|
|||
|
|
|||
|
if (userId > 0)
|
|||
|
{
|
|||
|
DataView dv = dt.DefaultView;
|
|||
|
dv.RowFilter = "takeBy="+userId;
|
|||
|
return dv.ToTable("meOnly");
|
|||
|
}
|
|||
|
/*
|
|||
|
dt.Columns.Remove("状态");
|
|||
|
//dt.Columns.Remove("pickOrderNo");
|
|||
|
dt.Columns.Remove("state");
|
|||
|
dt.Columns.Remove("orderType");
|
|||
|
dt.Columns.Remove("orderDate");
|
|||
|
dt.Columns.Remove("pickCount");
|
|||
|
dt.Columns.Remove("goodsid");
|
|||
|
*/
|
|||
|
return dt;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public DataTable repTodayDetails4In(string flowNo="")
|
|||
|
{
|
|||
|
DataTable dt = getWmsOutPickRequest.getBatchPickOrderRepDetail(flowNo, enumOutOrderType.补货出库, enumPickState.已拣);
|
|||
|
|
|||
|
/*
|
|||
|
dt.Columns.Remove("货位");
|
|||
|
dt.Columns.Remove("状态");
|
|||
|
dt.Columns.Remove("state");
|
|||
|
dt.Columns.Remove("orderType");
|
|||
|
dt.Columns.Remove("orderDate");
|
|||
|
dt.Columns.Remove("pickCount");
|
|||
|
*/
|
|||
|
return dt;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//-------------------------out logs----------------------begin---
|
|||
|
|
|||
|
|
|||
|
private WmsOutLog _outLog;
|
|||
|
|
|||
|
WmsOutLog outLog
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_outLog == null)
|
|||
|
{
|
|||
|
_outLog = new WmsOutLog();
|
|||
|
}
|
|||
|
return _outLog;
|
|||
|
}
|
|||
|
}
|
|||
|
public DataTable getOrderLogs(string orderNo, string pickOrderNo)
|
|||
|
{
|
|||
|
return outLog.getOrderLogs(orderNo,pickOrderNo);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public DataTable getOrderLogs(string orderNo, bool isSaleOrder)
|
|||
|
{
|
|||
|
|
|||
|
if (isSaleOrder)
|
|||
|
{
|
|||
|
return outLog.getOrderLogs(orderNo, "");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return outLog.getOrderLogs("",orderNo);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
internal bool updatePriority(string[] orders, int priority,int operId)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
|
|||
|
string whOrders = "";
|
|||
|
foreach (string order in orders)
|
|||
|
{
|
|||
|
whOrders += "'"+ order + "',";
|
|||
|
}
|
|||
|
|
|||
|
whOrders = whOrders.Substring(0, whOrders.Length - 1);
|
|||
|
whOrders = "(" + whOrders + ")";
|
|||
|
return _obj.updatePriority(whOrders, priority,operId);
|
|||
|
|
|||
|
|
|||
|
// scope.Complete();
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(this.GetType(), e);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//------------------light labels
|
|||
|
|
|||
|
public void lightLables()
|
|||
|
{
|
|||
|
|
|||
|
elelab.pick.init_port(enumLabelPickType.pick);
|
|||
|
DataTable dt = new WmsOutPickLable().getPickedData(enumPickState.未拣).Tables[0];
|
|||
|
elelab.pick.send_data_pick(dt, enumLabelPickType.pick);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//seeds
|
|||
|
|
|||
|
public enumOutSeedsStatus updateSeedingStatus(string seedsPickNo, string goodsId, string batch, int labId, int address, decimal count, int checkedBy2)
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), "updateSeedingStatus... operId is " + operId);
|
|||
|
LogHelper.debug(this.GetType(), "begin to update seeding pick.....>");
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("seedsPickNo:{0},goodsId:{1},batch:{2},labId:{3},address:{4},count:{5},checkBy2:{6}"
|
|||
|
,seedsPickNo, goodsId, batch, labId, address, count, checkedBy2));
|
|||
|
|
|||
|
enumOutSeedsStatus rt = enumOutSeedsStatus.状态更新成功;
|
|||
|
int cnt = outPickTmp.updateSeedingPickStatus(seedsPickNo, goodsId, batch, labId, address, count,operId,checkedBy2);
|
|||
|
|
|||
|
if (cnt == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(this.GetType(), " 更新失败,。。。。。。。return failure");
|
|||
|
return enumOutSeedsStatus.处理失败;
|
|||
|
}
|
|||
|
|
|||
|
int color = 0;
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
if (outRequest.getUnSeedsCnt(seedsPickNo, goodsId, batch) == 0)
|
|||
|
{ //该商品播种完毕
|
|||
|
|
|||
|
outPickTmp.completeSeeding(seedsPickNo, goodsId, batch);
|
|||
|
rt = enumOutSeedsStatus.商品完成分播;
|
|||
|
}
|
|||
|
LogHelper.debug(this.GetType(), " " + rt);
|
|||
|
|
|||
|
if (outRequest.getUnSeedsCnt(seedsPickNo, labId) == 0) // LabId对应的分拣单播种完毕
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
DataTable dtSeeds = outRequest.getSeedsData(seedsPickNo, labId);
|
|||
|
|
|||
|
DataView dv = dtSeeds.DefaultView;
|
|||
|
DataTable dtPickOrders = dv.ToTable(true, "pickOrderNo");
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
|
|||
|
foreach (DataRow dr in dtPickOrders.Rows)
|
|||
|
{
|
|||
|
string pickOrderNo = dr[0].ToString();
|
|||
|
WmsOutPickRequest pr = new WmsOutPickRequest(pickOrderNo);
|
|||
|
//分拣明细状态 更新为 零货复核完成(enumOutStockPickStatus.复核完成) 和 全部完成分拣(enumOutStockDetailStatus.完成分拣)
|
|||
|
foreach (WmsOutPickDetail pd in pr.outDetails)
|
|||
|
{
|
|||
|
if (pd.bulkCount > 0)
|
|||
|
{
|
|||
|
pd.bulkPickState = (int)enumOutStockPickStatus.复核完成;
|
|||
|
|
|||
|
|
|||
|
if (pd.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pd.batchPickState > (int)enumOutStockPickStatus.分拣完成)
|
|||
|
{
|
|||
|
pd.state = (int)enumOutStockDetailStatus.复核完成; ;
|
|||
|
}
|
|||
|
pd.operater = this.operId;
|
|||
|
pd.Update();
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
pr.bulkPickState = (int)enumOutStockPickStatus.复核完成;
|
|||
|
if (pr.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pr.batchPickState >= (int)enumOutStockPickStatus.分拣完成)
|
|||
|
{
|
|||
|
|
|||
|
enumOutStockRequestStatus state = enumOutStockRequestStatus.分拣完成;
|
|||
|
|
|||
|
if (pr.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pr.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
|||
|
{
|
|||
|
state = enumOutStockRequestStatus.复核完成;
|
|||
|
}
|
|||
|
|
|||
|
pr.state = (int)state;
|
|||
|
|
|||
|
|
|||
|
updateErpSaleStatus( pr.pickOrderNo,state);
|
|||
|
|
|||
|
}
|
|||
|
pr.operater = this.operId;
|
|||
|
pr.Update();
|
|||
|
|
|||
|
outPickPort.updateBulkPickStateByPickOrder(pr.pickOrderNo, operId, checkedBy2); //update pickport
|
|||
|
|
|||
|
// outRequest.completeValidation(pr.pickOrderNo);//打包后,再从临时表删除
|
|||
|
color = pr.desk;
|
|||
|
}
|
|||
|
rt = enumOutSeedsStatus.分拣单完成分播;
|
|||
|
LogHelper.debug(this.GetType(), " " + rt);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(this.GetType(), e);
|
|||
|
return enumOutSeedsStatus.处理失败;
|
|||
|
}
|
|||
|
|
|||
|
// pk order is finished, to print code, can be packed.
|
|||
|
}
|
|||
|
if (outRequest.getUnSeedsCnt(seedsPickNo) == 0)//是否播种单订单全部分播完毕
|
|||
|
{
|
|||
|
outPickTmp.completeSeeding(seedsPickNo);
|
|||
|
if (WmsConstants.OUT_BULK_DESK_CONTROLL)
|
|||
|
{
|
|||
|
setDeskFree(color);
|
|||
|
LogHelper.debug(typeof(lWmsOutRequest), color +"播种台播种完毕,设置状态为空闲,参与下个波次");
|
|||
|
}
|
|||
|
WmsWave ww = new WmsWave();
|
|||
|
ww.QueryBySeedsNo(seedsPickNo);
|
|||
|
ww.state = (int)enumOutStockRequestStatus.复核完成;
|
|||
|
ww.Update();
|
|||
|
|
|||
|
rt = enumOutSeedsStatus.播种单完成分播;
|
|||
|
LogHelper.debug(this.GetType(), " " + rt);
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " 测试日志输出");
|
|||
|
}
|
|||
|
scope.Complete();
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), " return value is " + rt.ToString());
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "end update seeding pick.....>");
|
|||
|
return rt; //elabid pk order is not finished.
|
|||
|
}
|
|||
|
|
|||
|
private void updateErpSaleStatus(string pickOrderNo, enumOutStockRequestStatus state)
|
|||
|
{
|
|||
|
Erp_sale es = new Erp_sale();
|
|||
|
if (1==2 &&!WmsConstants.OUT_REQUEST_MERGE)
|
|||
|
{
|
|||
|
es.getByPickOrder( pickOrderNo);
|
|||
|
Employee em = new Employee(operId);
|
|||
|
es.fuheren = em.em_name;
|
|||
|
es.fuhesj = es.getDateTime();
|
|||
|
es.fuhezt = true;
|
|||
|
es.Update();
|
|||
|
es.updatePickStatus(pickOrderNo, enumOutStockRequestStatus.复核完成);
|
|||
|
}else
|
|||
|
es.updatePickStatus( pickOrderNo, state);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public void createBoxes(int color,int volume,int lengh=0,int width=0,int height=0,int number =1){
|
|||
|
|
|||
|
WmsPlate wob = new WmsPlate();
|
|||
|
for (int i = 1; i <= number; i++)
|
|||
|
{
|
|||
|
wob.volume = volume;
|
|||
|
wob.color = color;
|
|||
|
wob.length = lengh;
|
|||
|
wob.width = width;
|
|||
|
wob.height = height;
|
|||
|
wob.Add();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 注册箱子
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="boxId"></param>
|
|||
|
/// <param name="waveNo"></param>
|
|||
|
/// <param name="color"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool regBox(string boxId,string waveNo,int color)
|
|||
|
{
|
|||
|
|
|||
|
plate.deleteByPlateId(boxId);
|
|||
|
plate.plateId = boxId;
|
|||
|
plate.waveNo = waveNo;
|
|||
|
plate.color = color;
|
|||
|
return plate.Add() > 0;
|
|||
|
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 可注册箱子的波次号
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public DataSet getBoxWaves()
|
|||
|
{
|
|||
|
return plate.getPlateWaves() ;
|
|||
|
}
|
|||
|
|
|||
|
public DataTable getBoxsByWave(string waveOrder, int color =0)
|
|||
|
{
|
|||
|
return plate.getPlatesByWave(waveOrder, color);
|
|||
|
}
|
|||
|
|
|||
|
public string getWaveNoByBoxId(string boxId)
|
|||
|
{
|
|||
|
DataTable dt = plate.getPlateById(boxId);
|
|||
|
if (dt.Rows.Count > 0)
|
|||
|
{
|
|||
|
return dt.Rows[0]["waveNo"].ToString();
|
|||
|
}
|
|||
|
return "";
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
internal DataTable getWaveDeskByBoxId(string boxId)
|
|||
|
{
|
|||
|
return plate.getPlateById(boxId);
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getPartionPickDetailByBoxId(string boxId)
|
|||
|
{
|
|||
|
return plate.getPartionPickDetailByPlateId(boxId);
|
|||
|
}
|
|||
|
|
|||
|
internal enumRegPlateResult regPartBox(int partion, string boxId)
|
|||
|
{
|
|||
|
int id = Util.getBoxId(boxId);
|
|||
|
DataTable dt = new WmsOutPickLable().getPartPickList(partion).Tables[0];
|
|||
|
DataView dv = dt.DefaultView;
|
|||
|
if (WmsConstants.PART_ORDER_SIZE > 1) //多单拣选
|
|||
|
{ //周转箱颜色要和亮灯颜色一致
|
|||
|
int color = Util.getBoxColor(boxId);
|
|||
|
|
|||
|
|
|||
|
dv.RowFilter = "color =" + color;
|
|||
|
if (dv.Count > 0)
|
|||
|
{
|
|||
|
String pickNo = dv[0]["pickOrderNo"].ToString();
|
|||
|
WmsPlate wb = new WmsPlate(id);
|
|||
|
wb.pickOrderNo = pickNo;
|
|||
|
wb.partion = partion;
|
|||
|
wb.Update();
|
|||
|
return enumRegPlateResult.成功;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return enumRegPlateResult.箱子颜色和订单灯色不符;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (dv.Count > 0)
|
|||
|
{
|
|||
|
String pickNo = dv[0]["pickOrderNo"].ToString();
|
|||
|
WmsPlate wb = new WmsPlate(id);
|
|||
|
wb.pickOrderNo = pickNo;
|
|||
|
wb.Update();
|
|||
|
return enumRegPlateResult.成功;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return enumRegPlateResult.当前无拣货订单;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getBoxsByPickOrder(string pickOrderNo)
|
|||
|
{
|
|||
|
return plate.getPlatesByPickOrder(pickOrderNo);
|
|||
|
}
|
|||
|
|
|||
|
internal List<int> getPartsFinishIds()
|
|||
|
{
|
|||
|
DataTable dt = getWmsOutPickRequest.getPartsFinishIds();
|
|||
|
|
|||
|
List<int> lst = new List<int>();
|
|||
|
Node nd;
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
nd = new Node(dr);
|
|||
|
lst.Add(nd.flag);
|
|||
|
}
|
|||
|
return lst;
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getPartionRequests(int partion)
|
|||
|
{
|
|||
|
return pickLabelDetail.getPartionRequests(partion);
|
|||
|
}
|
|||
|
internal DataTable getLightPartions()
|
|||
|
{
|
|||
|
return getWmsOutPickRequest.getLightPartions();
|
|||
|
}
|
|||
|
|
|||
|
Dictionary<int, int> partColors = new Dictionary<int, int>();
|
|||
|
public List<int> newPartPickWave()
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
List<DataTable> lst = outRequest.getRecords4PartWave(enumOutOrderType.销售出库); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
|||
|
|
|||
|
return createPartPickWave(lst);
|
|||
|
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 按拣货单生成亮灯数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="pickOrderNo"></param>
|
|||
|
/// <param name="partion"></param>
|
|||
|
public void newPartionPick(string pickOrderNo, int partion)
|
|||
|
{
|
|||
|
List<DataTable> lst = new List<DataTable>();
|
|||
|
lst.Add( outRequest.getRecords4PickOrder(pickOrderNo, partion));
|
|||
|
createPartPickWave(lst);
|
|||
|
}
|
|||
|
|
|||
|
public List<int> createPartPickWave(List<DataTable> lst)
|
|||
|
{
|
|||
|
|
|||
|
List<int> lstParts = new List<int>();
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
// List<DataTable> lst = outRequest.getRecords4PartWave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
|||
|
List<WmsOutPickRequest> batchRequests = new List<WmsOutPickRequest>();
|
|||
|
|
|||
|
int recCnt = 0;
|
|||
|
foreach (DataTable dt in lst)
|
|||
|
{
|
|||
|
recCnt += dt.Rows.Count;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
if (recCnt == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
|||
|
checkRepAndNoStockOrders();
|
|||
|
return lstParts;
|
|||
|
}
|
|||
|
|
|||
|
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
|||
|
|
|||
|
#if DEBUG
|
|||
|
// if (lblist.Count == 0)
|
|||
|
{
|
|||
|
lblist.Clear();
|
|||
|
initialDebugSetting();
|
|||
|
}
|
|||
|
lblist.Sort();
|
|||
|
// int minId = lblist[0];
|
|||
|
// int maxId = lblist[lblist.Count - 1];
|
|||
|
// labelMaxInWave = 2;
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
// List<WmsStockRecord> strecs = null;
|
|||
|
|
|||
|
waveOrder ="WAVE_PART_PICK";
|
|||
|
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //控制器每个端口最大存储1200条
|
|||
|
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 = new List<WmsOutPickLable_tmp>();
|
|||
|
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
|||
|
|
|||
|
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 = false;
|
|||
|
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
|
|||
|
List<WmsOutPickRequest> seedsRequests = new List<WmsOutPickRequest>();
|
|||
|
Dictionary<string, WmsStockRecord> seedsBulks = new Dictionary<string, WmsStockRecord>();
|
|||
|
|
|||
|
// int bulkCnt = 0;
|
|||
|
// int requestCnt = 0;
|
|||
|
|
|||
|
//bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
|||
|
|
|||
|
//开始处理有零货的订单
|
|||
|
DateTime d0 = DateTime.Now;
|
|||
|
// double totoalTime = 0d;
|
|||
|
// string lastAddress = "";
|
|||
|
// int lastPart = -1;
|
|||
|
int color = 1;
|
|||
|
string lastRequest = "";
|
|||
|
int requestCntInPart = 0;
|
|||
|
foreach (DataTable dt1 in lst)
|
|||
|
{
|
|||
|
lastRequest = "";
|
|||
|
requestCntInPart = 0;
|
|||
|
|
|||
|
foreach (DataRow dr in dt1.Rows)
|
|||
|
{
|
|||
|
WmsStockRecord sr = new WmsStockRecord(dr);
|
|||
|
if (String.IsNullOrEmpty(lastRequest) || !sr.orderNo.Equals(lastRequest))
|
|||
|
{
|
|||
|
lastRequest = sr.orderNo;
|
|||
|
requestCntInPart++;
|
|||
|
if (requestCntInPart > WmsConstants.PART_ORDER_SIZE) //限制同区同时分拣订单的数量
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(pickDetailMaxInWave <= lstBulk.Count){
|
|||
|
break;
|
|||
|
}
|
|||
|
lstBulk.Add(new WmsStockRecord(dr));
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理拣货笔数:{0}", lstBulk.Count));
|
|||
|
#region 建立零库电子拣选临时数据
|
|||
|
int lastId = 0;
|
|||
|
WmsOutPickLable_tmp wpl;
|
|||
|
foreach( WmsStockRecord rec in lstBulk)
|
|||
|
{
|
|||
|
|
|||
|
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
|
|||
|
}
|
|||
|
|
|||
|
//建立零库电子拣选临时数据
|
|||
|
|
|||
|
if (rec.count + rec.countOuting < 1) //不支持小数
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
wpl = new WmsOutPickLable_tmp();
|
|||
|
wpl.pickOrderNo = rec.orderNo;
|
|||
|
wpl.recordId = rec.ID;
|
|||
|
// wpl.color = desk.color;
|
|||
|
wpl.count = rec.countOuting;
|
|||
|
wpl.locationId = rec.locationId;
|
|||
|
wpl.elabAddress = rec.location.elabAddress;
|
|||
|
wpl.elabId = rec.location.elabId;
|
|||
|
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
|||
|
wpl.port = rec.location.port;
|
|||
|
wpl.partion = rec.partion;
|
|||
|
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);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
|||
|
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
|||
|
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
|||
|
|
|||
|
|
|||
|
#region 保存整货和零货出库分拣数据
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WmsOutPickRequest request ;
|
|||
|
lastRequest = "";
|
|||
|
|
|||
|
int lastPartion=-1;
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
|||
|
{
|
|||
|
if (lastPartion == -1 || lastPartion != wp.partion)
|
|||
|
{
|
|||
|
lstParts.Add(wp.partion);
|
|||
|
color = 0; //每个区从红色开始分配灯色
|
|||
|
lastPartion = wp.partion;
|
|||
|
lastRequest = "";
|
|||
|
|
|||
|
if (partColors.ContainsKey(wp.partion)) //在分区一波次只有一个订单情况下,每波次颜色红绿轮替
|
|||
|
{
|
|||
|
if (partColors[wp.partion] == 1)
|
|||
|
{
|
|||
|
partColors[wp.partion] = 2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
partColors[wp.partion] = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
partColors[wp.partion] = 1;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (String.IsNullOrEmpty(lastRequest) || !wp.pickOrderNo.Equals(lastRequest))
|
|||
|
{
|
|||
|
lastRequest = wp.pickOrderNo;
|
|||
|
|
|||
|
request = new WmsOutPickRequest(wp.pickOrderNo);
|
|||
|
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
|
|||
|
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
|||
|
if(String.IsNullOrEmpty(request.waveStart)){
|
|||
|
request.waveStart = request.getDateTime();
|
|||
|
}
|
|||
|
request.operater = this.operId;
|
|||
|
|
|||
|
request.bulkPickState =(int)enumOutStockPickStatus.正在分拣;
|
|||
|
WmsOutPickDetail wd = new WmsOutPickDetail(wp.orderDetailId);
|
|||
|
if(wd.bulkPickState !=(int)enumOutStockPickStatus.正在分拣){
|
|||
|
wd.bulkPickState =(int)enumOutStockPickStatus.正在分拣;
|
|||
|
wd.operater =operId;
|
|||
|
wd.Update();
|
|||
|
}
|
|||
|
// add or update WmsOutPickDetail_tmp for validation
|
|||
|
|
|||
|
if(request.desk ==0){
|
|||
|
request.desk = getRandomFreeDesk().color;
|
|||
|
}
|
|||
|
//color = request.desk;
|
|||
|
color++;
|
|||
|
if (String.IsNullOrEmpty(request.tranLocationId))
|
|||
|
{
|
|||
|
request.tranLocationId = new TmsStock().getTranLocation(request.customerId);
|
|||
|
}
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
request.Update();
|
|||
|
request.savePartionTempData4Validation(request.pickOrderNo);
|
|||
|
if (request.batchPickState > -1)
|
|||
|
{
|
|||
|
batchRequests.Add(request);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (WmsConstants.PART_ORDER_SIZE == 1)
|
|||
|
{
|
|||
|
wp.color = partColors[wp.partion];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
wp.color = color;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
wp.Add();
|
|||
|
}
|
|||
|
waveSize++;
|
|||
|
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
//TimeSpan ts2 = DateTime.Now - d12;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
// System.Diagnostics.Debug.WriteLine(e.Message);
|
|||
|
}
|
|||
|
|
|||
|
// TimeSpan ts00 = DateTime.Now - d00;
|
|||
|
// totoalTime += ts00.TotalSeconds;
|
|||
|
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
//检查待补货出货单状态
|
|||
|
// checkRepAndNoStockOrders();
|
|||
|
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
|||
|
stockCheckThread.IsBackground = true;
|
|||
|
stockCheckThread.Start();
|
|||
|
/*
|
|||
|
Thread.CurrentThread.Join(1);
|
|||
|
|
|||
|
// process all batch pick request
|
|||
|
|
|||
|
Thread batchPick = new Thread(new ParameterizedThreadStart(processBatchWithBulkOrders));
|
|||
|
batchPick.IsBackground = true;
|
|||
|
batchPick.Start(batchRequests);
|
|||
|
*/
|
|||
|
// processAllBatchOrders(requests, waveOrder);
|
|||
|
TimeSpan ts0 = DateTime.Now - d0;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
// TaskCallBack();
|
|||
|
|
|||
|
return lstParts;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 根据销售订单或拣货单生成亮灯数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="orderNo"></param>
|
|||
|
/// <param name="orderType"></param>
|
|||
|
/// <param name="partion"></param>
|
|||
|
/// <returns></returns>
|
|||
|
internal DataTable getOrderPickList(string orderNo, bool isPickOrder, int partion)
|
|||
|
{
|
|||
|
string pickOrderNo = orderNo;
|
|||
|
if (!isPickOrder)
|
|||
|
{
|
|||
|
pickOrderNo = new lWmsOutRequest(operId).genPickOrder(orderNo);
|
|||
|
|
|||
|
}
|
|||
|
newPartionPick(pickOrderNo, partion);
|
|||
|
return outRequest.getOrderPickList(pickOrderNo, partion);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 播种式拣选
|
|||
|
/// 只有播种台一种复核台
|
|||
|
/// 每个播种台发起一组波次,当有播种台空闲时,该播种台发起新拣货任务,拣货任务分布在各个拣货区,拣货区通过几种方式实现亮灯拣货
|
|||
|
/// 1. 先注册周转箱领取任务并亮灯,每个周转箱只对应一个复核台,只亮一种颜色的灯
|
|||
|
/// 2. 先拣货后注册周转箱。 通过完成键呼叫后续任务,任务按
|
|||
|
/// 波次任务安分区注册周转箱
|
|||
|
/// 摘果拣选分区按周转箱亮灯
|
|||
|
/// 周转箱在同一个波次内可以流转到多个分拣区拣货
|
|||
|
/// </summary>
|
|||
|
public void newBulkSeedsDPSPickWave()
|
|||
|
{
|
|||
|
|
|||
|
//播种筛选,
|
|||
|
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
|||
|
//1. 单个订单的品种少 、数量少
|
|||
|
//2. 订单数量多
|
|||
|
|
|||
|
//只处理订单零货部分
|
|||
|
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
|||
|
//1.播种点数量可配置, 分别用不同颜色区分
|
|||
|
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
|||
|
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
|||
|
//4.
|
|||
|
|
|||
|
|
|||
|
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
|||
|
//
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
|||
|
|
|||
|
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
|||
|
|
|||
|
List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
|||
|
|
|||
|
if (requests.Count == 0)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
|||
|
checkRepAndNoStockOrders();
|
|||
|
return;
|
|||
|
}
|
|||
|
// desk.restDeskStatus(enumDeskState.free);
|
|||
|
// desk.restDeskStatus(enumDeskState.free, enumDeskType.播种); //播种台状态复位到空闲,是不是可以由播种员实际播种任务进度控制?
|
|||
|
//_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
// _desk = getRandomFreeDesk();
|
|||
|
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
|||
|
|
|||
|
//#if DEBUG
|
|||
|
// if (lblist.Count == 0)
|
|||
|
{
|
|||
|
lblist.Clear();
|
|||
|
initialDebugSetting();
|
|||
|
}
|
|||
|
lblist.Sort();
|
|||
|
// int minId = lblist[0];
|
|||
|
// int maxId = lblist[lblist.Count - 1];
|
|||
|
// labelMaxInWave = 2;
|
|||
|
//#endif
|
|||
|
|
|||
|
|
|||
|
// List<WmsStockRecord> strecs = null;
|
|||
|
// waveOrder = Util.getOrderNo(enumCreateOrderType.waveOrder, _obj.getNextSeq());
|
|||
|
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
|||
|
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
|||
|
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>();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
|
|||
|
seedsCount = seedsDesk.seedsCount;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int bulkCnt = 0;
|
|||
|
int requestCnt = 0;
|
|||
|
|
|||
|
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
|||
|
|
|||
|
//开始处理有零货的订单
|
|||
|
DateTime d0 = DateTime.Now;
|
|||
|
double totoalTime = 0d;
|
|||
|
string lastAddress = "";
|
|||
|
foreach (WmsOutPickRequest request in requests)
|
|||
|
{
|
|||
|
if (seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
DateTime d00 = DateTime.Now;
|
|||
|
|
|||
|
if (request.bulkCnt > 0)
|
|||
|
{
|
|||
|
requestCnt++;
|
|||
|
}
|
|||
|
|
|||
|
if (requestCnt >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (request.bulkCnt == 0)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo ));
|
|||
|
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
|||
|
|
|||
|
|
|||
|
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
|||
|
// lstPort = new List<WmsOutPickPort>();
|
|||
|
lstLabel = new List<WmsOutPickLable_tmp>();
|
|||
|
|
|||
|
//开始处理零货出库
|
|||
|
|
|||
|
|
|||
|
DataView dvBulk = new DataView(dt);
|
|||
|
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//TimeSpan tssss = DateTime.Now - d00;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {0} {1},befor prepare bulklist, cost {2}", DateTime.Now, request.pickOrderNo, tssss.TotalSeconds));
|
|||
|
|
|||
|
DateTime d1 = DateTime.Now;
|
|||
|
|
|||
|
// lstBulk = new List<WmsStockRecord>();
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// TimeSpan tsss = DateTime.Now - d1;
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} prepare bulklist count :{1}, cost {2}", request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
|||
|
// DateTime d2 = DateTime.Now;
|
|||
|
|
|||
|
lstBulk = new List<WmsStockRecord>();
|
|||
|
sumBulkCnt = 0;
|
|||
|
foreach (DataRowView drv in dvBulk)
|
|||
|
{
|
|||
|
WmsStockRecord sr = new WmsStockRecord(drv.Row);
|
|||
|
|
|||
|
// sr.ID = Convert.ToInt32(drv["id"].ToString());
|
|||
|
// sr.locationId = drv["locationID"].ToString();
|
|||
|
// sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
|||
|
|
|||
|
if (WmsConstants.OUT_STOCK_DEDUCT)
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
|||
|
}
|
|||
|
|
|||
|
sumBulkCnt += sr.count;
|
|||
|
lstBulk.Add(sr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//tsss = DateTime.Now - d2;
|
|||
|
|
|||
|
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} {1},prepare bulklist2 count :{2}, cost {3}", DateTime.Now, request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
pickDetailMaxInWave -= strecs.Count;
|
|||
|
|
|||
|
if (pickDetailMaxInWave < 0)
|
|||
|
{
|
|||
|
//超出一个波次最大分拣数量
|
|||
|
isReachLimit = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
tmplabelCnt.Clear();
|
|||
|
tmpcomCnt.Clear();
|
|||
|
|
|||
|
int lastId = 0;
|
|||
|
|
|||
|
//DateTime d11 = DateTime.Now;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
|||
|
|
|||
|
#region checkmax
|
|||
|
/*
|
|||
|
* if (WmsConstants.OUT_LIGHT_ENABLE)
|
|||
|
{
|
|||
|
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
|||
|
{
|
|||
|
|
|||
|
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
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId]++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmplabelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (tmpcomCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tmpcomCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (labelCnt.ContainsKey(rec.location.elabId))
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
|||
|
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmplabelCnt.Keys)
|
|||
|
{
|
|||
|
if (labelCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
labelCnt[k] -= tmplabelCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
labelCnt[rec.location.elabId] = 1;
|
|||
|
}
|
|||
|
|
|||
|
if (comCnt.ContainsKey(rec.location.port))
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
|||
|
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
|||
|
{
|
|||
|
isReachLimit = true;
|
|||
|
|
|||
|
foreach (int k in tmpcomCnt.Keys)
|
|||
|
{
|
|||
|
if (comCnt.ContainsKey(k))
|
|||
|
{
|
|||
|
comCnt[k] -= tmpcomCnt[k];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
comCnt[rec.location.port] = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//TimeSpan ts11 = DateTime.Now - d11;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
|||
|
|
|||
|
if (isReachLimit)
|
|||
|
{
|
|||
|
isReachLimit = false;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
* */
|
|||
|
#endregion endcheck
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
|||
|
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
|||
|
|
|||
|
if (isSeedsEnabled
|
|||
|
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
|||
|
// && sumBulkCnt < pickGoodsCountMin
|
|||
|
&& !noSeeds.Contains(request.pickOrderNo)
|
|||
|
|
|||
|
)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ", seedsRequests.Count));
|
|||
|
//播种筛选
|
|||
|
|
|||
|
if (_seedsDesk.ID > 0) //exist free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
if (seedsRequests.Count < seedsCount)//播种能力之内
|
|||
|
{
|
|||
|
//符合播种条件,整合订单
|
|||
|
seedsRequests.Add(request);
|
|||
|
|
|||
|
//出库明细合并
|
|||
|
foreach (WmsStockRecord wsr in lstBulk)
|
|||
|
{
|
|||
|
if (seedsBulks.ContainsKey(wsr.locationId))
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId].count += wsr.count;
|
|||
|
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
seedsBulks[wsr.locationId] = wsr;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
|||
|
{
|
|||
|
//create seeds pick request
|
|||
|
|
|||
|
//create pick detail WmsOutPickLable_tmp
|
|||
|
createSeedsLabelDetail(seedsRequests, seedsBulks);
|
|||
|
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
|||
|
seedsCount = seedsDesk.seedsCount;
|
|||
|
// continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else //no free seeds desk
|
|||
|
{
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
|||
|
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
|||
|
continue;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
TimeSpan ts00 = DateTime.Now - d00;
|
|||
|
totoalTime += ts00.TotalSeconds;
|
|||
|
|
|||
|
}
|
|||
|
if (seedsRequests.Count>0) //生成播种拣选单
|
|||
|
{
|
|||
|
//create seeds pick request
|
|||
|
|
|||
|
//create pick detail WmsOutPickLable_tmp
|
|||
|
createSeedsLabelDetail(seedsRequests, seedsBulks);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
|||
|
|
|||
|
if (isSeedsEnabled && seedsRequests.Count > 0)
|
|||
|
{
|
|||
|
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
|||
|
{
|
|||
|
createSeedsLabelDetail(seedsRequests, seedsBulks);//生成播种拣选单
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_seedsDesk = getRandomFreeSeedsDesk();
|
|||
|
if (seedsDesk.ID == 0) //无可用播种台
|
|||
|
{
|
|||
|
foreach (WmsOutPickRequest pr in seedsRequests)
|
|||
|
{
|
|||
|
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
|||
|
{
|
|||
|
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES) < System.DateTime.Now)
|
|||
|
{
|
|||
|
seedsWaiting.Remove(pr.pickOrderNo);
|
|||
|
noSeeds.Add(pr.pickOrderNo);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
seedsRequests.Clear();
|
|||
|
seedsBulks.Clear();
|
|||
|
|
|||
|
}*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TimeSpan ts1 = DateTime.Now - d0;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + " : " + ts1.TotalMilliseconds, totoalTime));
|
|||
|
// insert tmp data for validation
|
|||
|
/// outRequest.saveTempData4Validation(waveOrder);
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
|||
|
|
|||
|
|
|||
|
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
|||
|
|
|||
|
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
|||
|
|
|||
|
|
|||
|
//检查待补货出货单状态
|
|||
|
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
|||
|
stockCheckThread.IsBackground = true;
|
|||
|
stockCheckThread.Start();
|
|||
|
|
|||
|
TimeSpan ts0 = DateTime.Now - d0;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
|||
|
// TaskCallBack();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private void createSeedsLabelDetail(List<WmsOutPickRequest> seedsRequests, Dictionary<string, WmsStockRecord> seedsBulks)
|
|||
|
{
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始生成播种拣选单,seedsRequests.count :{0},seedsBulks.count:{1}",
|
|||
|
seedsRequests.Count, seedsBulks.Count));
|
|||
|
|
|||
|
List<WmsOutPickLable_tmp> lstLabel = new List<WmsOutPickLable_tmp>();
|
|||
|
|
|||
|
if (_seedsDesk.ID == 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
|||
|
WmsOutPickRequest seedPickRequest = new WmsOutPickRequest();
|
|||
|
seedPickRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.seedsPickOrder, seedPickRequest.getNextSeq(enumCreateOrderType.seedsPickOrder));
|
|||
|
seedPickRequest.orderType = (int)enumOutOrderType.销售出库;
|
|||
|
seedPickRequest.outStoreType = (int)enumOutStoreType.播种拣货出库;
|
|||
|
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选单 :{0} ", seedPickRequest.pickOrderNo));
|
|||
|
WmsOutPickLable_tmp wpl;
|
|||
|
foreach (WmsStockRecord rec in seedsBulks.Values)
|
|||
|
{
|
|||
|
if (rec.count + rec.countOuting <= 1)
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
wpl = new WmsOutPickLable_tmp();
|
|||
|
wpl.pickOrderNo = seedPickRequest.pickOrderNo;
|
|||
|
wpl.recordId = rec.ID; //link goods info
|
|||
|
wpl.color = seedsDesk.color;
|
|||
|
wpl.partion = rec.partion;
|
|||
|
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;
|
|||
|
//#if DEBUG
|
|||
|
|
|||
|
if (comLables.Count > 0)
|
|||
|
{
|
|||
|
int id = new Random().Next(lblist.Count);
|
|||
|
wpl.elabId = lblist[id];
|
|||
|
wpl.port = comLables[wpl.elabId];
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
//#endif
|
|||
|
wpl.dpsOrder = waveOrder;
|
|||
|
wpl.operater = this.operId;
|
|||
|
lstLabel.Add(wpl);
|
|||
|
|
|||
|
}
|
|||
|
int i = 0;
|
|||
|
int startId = seedsDesk.startLabelId;
|
|||
|
//保存分拣数据
|
|||
|
try
|
|||
|
{
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
|||
|
{
|
|||
|
wp.Add();
|
|||
|
|
|||
|
}
|
|||
|
seedsDesk.state = (int)enumDeskState.任务中;
|
|||
|
seedsDesk.Update();
|
|||
|
|
|||
|
foreach (WmsOutPickRequest request in seedsRequests)
|
|||
|
{
|
|||
|
request.waveOrder = waveOrder;
|
|||
|
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
|||
|
request.waveStart = request.getDateTime();
|
|||
|
request.operater = this.operId;
|
|||
|
if (lstLabel.Count > 0)
|
|||
|
{
|
|||
|
// request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
|||
|
request.bulkPickState = (int)enumOutStockPickStatus.正在分拣;
|
|||
|
request.desk = seedsDesk.color;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
request.seedsLabelId = startId > 0 ? startId++ : seedsDesk.color * 10 + ++i; //每个播种复合台的标签ID编号不重复,应对多个播种台共用一个标签控制器的情况。
|
|||
|
request.seedsPickNo = seedPickRequest.pickOrderNo; //赋值播种拣选订单单号
|
|||
|
request.seedsPort = seedsDesk.port;
|
|||
|
if (comLables.Count > 0)
|
|||
|
{
|
|||
|
request.seedsPort = comLables[1];
|
|||
|
}
|
|||
|
request.Update();
|
|||
|
// bulkRequests.Add(request);
|
|||
|
//waveSize++;
|
|||
|
|
|||
|
}
|
|||
|
outRequest.saveTempData4Validation(waveOrder);
|
|||
|
scope1.Complete();
|
|||
|
|
|||
|
//TimeSpan ts2 = DateTime.Now - d12;
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 播种区域周转箱任务领取注册并亮灯
|
|||
|
/// 当拣货分区有拣货任务,且空闲时,空周转箱流入
|
|||
|
/// 扫描周转箱条码,根据周转箱容积,分配拣货任务并亮灯
|
|||
|
/// 分配任务按分播台顺序依次分配
|
|||
|
/// 同一个物品尽量分配在同一个周转箱或相邻周转箱
|
|||
|
/// 周转箱专属一个分拣区,同个周转箱不跨区分配
|
|||
|
/// </summary>
|
|||
|
/// <param name="plateNo"></param>
|
|||
|
/// <param name="partion"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public enumRegPlateResult regSeedsPlate(string plateId,int partion)
|
|||
|
{
|
|||
|
decimal usedVol = 0;
|
|||
|
int lastColor = 0;
|
|||
|
DataTable dt = getWmsOutPickRequest.getPartionBulkDetailInCurrentWave();
|
|||
|
|
|||
|
DataView dv = dt.DefaultView;
|
|||
|
WmsPlate box = new WmsPlate(plateId);
|
|||
|
if (box.ID == 0)
|
|||
|
{
|
|||
|
return enumRegPlateResult.容器不存在;
|
|||
|
}
|
|||
|
if (box.state == (int)enumPlateStatus.空闲)//复核台扫描周转箱,设置状态为free.
|
|||
|
{
|
|||
|
box.waveNo = "";
|
|||
|
box.terminal = 0;
|
|||
|
box.partion = 0;
|
|||
|
}
|
|||
|
else// not free box
|
|||
|
{
|
|||
|
if (!String.IsNullOrEmpty(box.waveNo) || box.terminal > 0)
|
|||
|
{
|
|||
|
dv.RowFilter = "dpsOrder='" + box.waveNo + "' and color =" + box.terminal;
|
|||
|
if (dv.Count == 0) //周转箱历史绑定未被释放
|
|||
|
{
|
|||
|
box.waveNo = "";
|
|||
|
box.terminal = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dv.RowFilter = "plate='" + plateId + "' and partion <>" + partion;
|
|||
|
if (dv.Count > 0)
|
|||
|
{
|
|||
|
return enumRegPlateResult.容器已被其他货区占用;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dv.RowFilter = "plate='" + plateId + "' and partion =" + partion +" and dpsOrder ='" + box.waveNo +"'";
|
|||
|
foreach (DataRowView drv in dv)
|
|||
|
{
|
|||
|
WmsOutPickLable_tmp wpl = new WmsOutPickLable_tmp(drv.Row);
|
|||
|
usedVol += wpl.calVol;
|
|||
|
}
|
|||
|
if (usedVol >= box.volume)
|
|||
|
{
|
|||
|
return enumRegPlateResult.容器空间不足;
|
|||
|
}
|
|||
|
|
|||
|
dv.RowFilter = "isnull(plate,'-1')='-1' and state=0 and partion =" + partion;
|
|||
|
if (box.terminal > 0)
|
|||
|
{
|
|||
|
dv.RowFilter += " and color = " + box.terminal;
|
|||
|
}
|
|||
|
dv.Sort = "color,plate,calVol desc";
|
|||
|
if (dv.Count == 0)
|
|||
|
{
|
|||
|
return enumRegPlateResult.当前无拣货订单;
|
|||
|
}
|
|||
|
|
|||
|
bool isReged = false;
|
|||
|
using (TransactionScope scope1 = new TransactionScope())
|
|||
|
{
|
|||
|
foreach (DataRowView drv in dv)
|
|||
|
{
|
|||
|
|
|||
|
if (box.volume - usedVol <= 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
WmsOutPickLable_tmp wpl = new WmsOutPickLable_tmp(drv.Row);
|
|||
|
|
|||
|
lastColor= box.terminal;
|
|||
|
|
|||
|
if (lastColor > 0 && lastColor != wpl.color) //周转箱分配唯一的分播台
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (!String.IsNullOrEmpty(box.waveNo) && box.waveNo != wpl.dpsOrder)//周转箱分配唯一的分播台
|
|||
|
{
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
decimal sv = wpl.calVol / wpl.count;
|
|||
|
decimal osv = wpl.minOperateCount * sv;
|
|||
|
|
|||
|
decimal newCnt = 0;
|
|||
|
bool isSplitTask = false;
|
|||
|
|
|||
|
|
|||
|
if (wpl.calVol > box.volume - usedVol)
|
|||
|
{
|
|||
|
|
|||
|
newCnt = Math.Floor((box.volume - usedVol) / osv) * wpl.minOperateCount;
|
|||
|
|
|||
|
usedVol = box.volume;
|
|||
|
}
|
|||
|
else if (wpl.calVol == box.volume - usedVol)
|
|||
|
{
|
|||
|
newCnt = wpl.count;
|
|||
|
usedVol += wpl.calVol;
|
|||
|
/*
|
|||
|
wpl.plate = box.plateId;
|
|||
|
wpl.Update();
|
|||
|
box.Update();
|
|||
|
|
|||
|
break;
|
|||
|
*/
|
|||
|
}
|
|||
|
else if (wpl.calVol < box.volume - usedVol)
|
|||
|
{
|
|||
|
newCnt = wpl.count;
|
|||
|
usedVol += wpl.calVol;
|
|||
|
isSplitTask = wpl.plate == "-1";
|
|||
|
/*
|
|||
|
wpl.plate = box.plateId;
|
|||
|
wpl.Update();
|
|||
|
box.Update();
|
|||
|
|
|||
|
if (isSplitTask) //同一个品多个周转箱,剩余尾数独占一个周转箱,方便分播
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
newCnt = newCnt > WmsConstants.MAX_PICK_CNT_BULK ? WmsConstants.MAX_PICK_CNT_BULK : newCnt;
|
|||
|
|
|||
|
if (newCnt > 0)
|
|||
|
{
|
|||
|
if (lastColor == 0)
|
|||
|
{
|
|||
|
lastColor = wpl.color;
|
|||
|
box.waveNo = wpl.dpsOrder;
|
|||
|
box.terminal = wpl.color;//seeds desk
|
|||
|
box.state = (int)enumPlateStatus.摘果周转;
|
|||
|
}
|
|||
|
|
|||
|
wpl.count = newCnt;
|
|||
|
wpl.plate = box.plateId;
|
|||
|
wpl.Update();
|
|||
|
|
|||
|
// usedVol += newCnt * sv;
|
|||
|
wpl = new WmsOutPickLable_tmp(drv.Row);
|
|||
|
if (wpl.count - newCnt > 0)
|
|||
|
{
|
|||
|
wpl.count = wpl.count - newCnt;
|
|||
|
wpl.plate = "-1";
|
|||
|
wpl.calVol = 0;
|
|||
|
wpl.Add();//新增待注册周转箱任务
|
|||
|
}
|
|||
|
|
|||
|
box.Update();
|
|||
|
isReged = true;
|
|||
|
}
|
|||
|
|
|||
|
if (isSplitTask) //同一个品多个周转箱,剩余尾数独占一个周转箱,方便分播
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
scope1.Complete();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
return enumRegPlateResult.成功 ;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
internal DataTable getPlatePickList(string plateId, int part)
|
|||
|
{
|
|||
|
return pickLabelDetail.getPlateTaskPickList(plateId, part);
|
|||
|
}
|
|||
|
internal DataTable getPlatePickTaskList4wince(string plateId, int part)
|
|||
|
{
|
|||
|
return pickLabelDetail.getPlatePickTaskList4wince(plateId, part);
|
|||
|
}
|
|||
|
|
|||
|
internal DataTable getDeskList(enumDeskType deskType)
|
|||
|
{
|
|||
|
return desk.getDeskList(deskType);
|
|||
|
}
|
|||
|
|
|||
|
internal int setDeskFree(int deskId)
|
|||
|
{
|
|||
|
WmsOutDesk desk = new WmsOutDesk().getDeskObjByColor(deskId);
|
|||
|
if (desk.state != (int)enumDeskState.空闲)
|
|||
|
{
|
|||
|
desk.state =(int)enumDeskState.空闲;
|
|||
|
return desk.Update();
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
internal int setPlateFree(string plateId)
|
|||
|
{
|
|||
|
WmsPlate plate = new WmsPlate(plateId);
|
|||
|
plate.state = (int)enumPlateStatus.空闲;
|
|||
|
return plate.Update();
|
|||
|
}
|
|||
|
|
|||
|
internal bool finishBulkValidateItem(int id, int status, string remark, int reason, decimal count, int checkedBy1)
|
|||
|
{
|
|||
|
|
|||
|
WmsOutPickDetail_tmp tmp = new WmsOutPickDetail_tmp(id);
|
|||
|
|
|||
|
tmp.bulkPickState = status;
|
|||
|
tmp.validRemark = remark;
|
|||
|
tmp.validReason = reason;
|
|||
|
tmp.confirmedCount = count;
|
|||
|
tmp.operater = operId;
|
|||
|
tmp.checkedBy1 = checkedBy1;
|
|||
|
tmp.checkedBy = tmp.operater;
|
|||
|
tmp.checkedTime = tmp.getDateTime();
|
|||
|
|
|||
|
//updatePickState(id, enumPickState.复核完成);
|
|||
|
using (TransactionScope scope = new TransactionScope())
|
|||
|
{
|
|||
|
outPickPort.updatePickStateByOrderDetailId(id, enumPickState.复核完成, operId, checkedBy1);
|
|||
|
|
|||
|
tmp.Update();
|
|||
|
|
|||
|
scope.Complete();
|
|||
|
|
|||
|
}
|
|||
|
return true;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|