using Rhea.Common;
using Tiger.Model;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using Newtonsoft.Json;
using Rhea.Common.Authorization;
using Newtonsoft.Json.Linq;
using Tiger.Model.Minsun;
using System.Globalization;
using System.Data;
using System.Text.RegularExpressions;
using System.Text;
using Dm;
using System.Reflection;
using Apache.NMS.ActiveMQ.Commands;
using Apache.NMS;
using System.Configuration;
using System.Reflection.PortableExecutable;
using Tiger.Business.WMS.Transaction;
using System.Threading;
using System.Drawing.Drawing2D;
using System.Collections;
using Tiger.IBusiness;
using Autofac;
namespace Tiger.Business.WMS
{
public partial class iWMS
{
///
///
///
///
/// 物料包装管理 物料包装层级:小包归属于哪个中包、中包归属于哪个外包 wms_barcode 有
///
///
///
public List GetPackageInfo(string sn)
{
var query = new List();
return query;
}
///
/// 物料入库信息 物料名称、物料代码、物料供应商、数量、库位、储位、批次、入库时间
///
///
///
public List GetInStoreInfo(iParams param)
{
var query = Biz.Db.Queryable((t, b, l, m) =>
new JoinQueryInfos(
JoinType.Left, t.BARCODE == b.BARCODE,
JoinType.Left, t.BARCODE == l.BARCODE,
JoinType.Left, t.MATERIALCODE == m.MCode
))
.Where((t, b, l, m) => l.INOUTTYPE == 10)
.WhereIF(!string.IsNullOrEmpty(param.sn), (t, b, l, m) => t.BARCODE == param.sn)
.WhereIF(!string.IsNullOrEmpty(param.startDate), (t, b, l, m) => l.CreationTime >= Convert.ToDateTime(param.startDate))
.WhereIF(!string.IsNullOrEmpty(param.endDate), (t, b, l, m) => l.CreationTime < Convert.ToDateTime(param.endDate))
.Select((t, b, l, m) => new iInStoreInfo
{
sn = t.BARCODE,
MaterialCode = t.MATERIALCODE,
MaterialName = m.MDesc,
VendorCode = b.SUPPLIERCODE,
WarehouseCode = t.WAREHOUSECODE,
LocationCode = t.LOCATIONCODE,
LotNo = b.LOTNO,
SourceCode = b.SOURCEBARCODE,
QTY = t.QTY,
CreateDate = l.CreationTime,
UpdateDate = l.LastModificationTime
})
.ToList();
return query;
}
///
/// 物料出库信息 领料单号、领料料号、数量、库位、储位、出库时间
///
///
///
public List GetOutStoreInfo(iParams param)
{
var query = Biz.Db.Queryable((t, m) =>
new JoinQueryInfos(
JoinType.Left, t.MATERIALCODE == m.MCode
))
.Where((t, m) => t.INOUTTYPE == 20 && !SqlFunc.IsNullOrEmpty(t.BILLCODE))
.WhereIF(!string.IsNullOrEmpty(param.sn), (t, m) => t.BARCODE == param.sn)
.WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
.WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
.Select((t, m) => new iOutStoreInfo
{
sn = t.BARCODE,
MaterialCode = t.MATERIALCODE,
MaterialName = m.MDesc,
WarehouseCode = t.WAREHOUSECODE,
LocationCode = t.LOCATIONCODE,
BillCode = t.BILLCODE,
QTY = t.QTY,
CreateDate = t.CreationTime,
UpdateDate = t.LastModificationTime
})
.ToList();
return query;
}
///
/// 物料退料信息 退料料号、退料时间、退料条码、退料库位、称重清点结果
///
///
///
public List GetReturnInfo(iParamsBase param)
{
var query = Biz.Db.Queryable((t, m) =>
new JoinQueryInfos(
JoinType.Left, t.MATERIALCODE == m.MCode
))
.Where(t => t.SOURCEBILLTYPE == 25)
.WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
.WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
.Select((t, m) => new iReturnInfo
{
sn = t.BARCODE,
MaterialCode = t.MATERIALCODE,
MaterialName = m.MDesc,
WarehouseCode = t.WAREHOUSECODE,
CreateDate = t.CreationTime
})
.ToList();
return query;
}
///
/// 物料库存信息
///
///
///
public List GetStorageInfo(iParamsBase param)
{
var query = Biz.Db.Queryable((t, b, m, v) =>
new JoinQueryInfos(
JoinType.Left, t.BARCODE == b.BARCODE,
JoinType.Left, t.MATERIALCODE == m.MCode,
JoinType.Left, b.SUPPLIERCODE == v.VenderCode
))
.WhereIF(!string.IsNullOrEmpty(param.startDate), (t, b, m, v) => t.CreationTime >= Convert.ToDateTime(param.startDate))
.WhereIF(!string.IsNullOrEmpty(param.endDate), (t, b, m, v) => t.CreationTime < Convert.ToDateTime(param.endDate))
.Select((t, b, m, v) => new iStorageInfo
{
MaterialCode = t.MATERIALCODE,
MaterialName = m.MDesc,
VenderCode = b.SUPPLIERCODE,
VenderName = v.VenderName,
Unit = m.MUom,
QTY = t.QTY,
UpdateDate = t.LastModificationTime ?? t.CreationTime
})
.ToList();
return query;
}
///
/// 备料分包装信息 拆包备料,重新组包的包装号关系:拆包编号、组包后编号、组包后数量、备领料单号、料号
///
///
///
public List GetSplitInfo(iParams param)
{
var query = Biz.Db.Queryable((t, m) =>
new JoinQueryInfos(
JoinType.Left, t.MATERIALCODE == m.MCode
))
.WhereIF(!string.IsNullOrEmpty(param.sn), (t, m) => t.BARCODE.Contains(param.sn))
.WhereIF(!string.IsNullOrEmpty(param.startDate), (t, m) => t.CreationTime >= Convert.ToDateTime(param.startDate))
.WhereIF(!string.IsNullOrEmpty(param.endDate), (t, m) => t.CreationTime < Convert.ToDateTime(param.endDate))
.Select((t, m) => new iSplitInfo
{
sn = t.BARCODE,
MaterialCode = t.MATERIALCODE,
MaterialName = m.MDesc,
ParentBoxBarcode = t.PARENTBOXBARCODE,
SourceCode = t.SOURCECODE,
QTY = t.PACKQTY,
UpdateDate = t.LastModificationTime
})
.ToList();
return query;
}
private static readonly IReceiptInfo _IReceiptInfo = BizContext.Container.Resolve();
///
/// 到货单生成接口 清点系统 --> wms, 接口需wms定义
///
///
///
public ApiAction GenerateReceipt(iReceiptInput input)
{
var action = new ApiAction();
bool isIQCOk = true;
try
{
string msg = "";
if (!input.iReceipts.Any())
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}没有可以提交的清点数据";
action.Message = msg;
return action;
}
var judian = BizConfig.Configuration["JuDian"];
var requestJson = JsonConvert.SerializeObject(input);
var response = HttpHelper.PostAsync("http://172.18.8.56:9631/api/WMS/GenerateReceiptNew/", requestJson).Result;
action = JsonConvert.DeserializeObject(response.Message);
return action;
//if (input.StrongHold != judian)
//{
// var requestJson = JsonConvert.SerializeObject(input);
// //if (input.StrongHold == "AHXC")
// //{
// // var response = HttpHelper.PostAsync("http://172.18.8.56:9529/api/WMS/GenerateReceipt", requestJson).Result;
// // action = JsonConvert.DeserializeObject(response.Message);
// // return action;
// //}
// if (input.StrongHold == "DGXC" || input.StrongHold == "AHXC")
// {
// //return _IReceiptInfo.GenerateReceipt(input);
// var response = HttpHelper.PostAsync("http://172.18.8.56:9631/api/WMS/GenerateReceiptNew/", requestJson).Result;
// action = JsonConvert.DeserializeObject(response.Message);
// return action;
// }
// if (input.StrongHold == "XCSJ")
// {
// var response = HttpHelper.PostAsync("http://172.18.8.56:9527/api/WMS/GenerateReceipt/", requestJson).Result;
// action = JsonConvert.DeserializeObject(response.Message);
// return action;
// }
//}
var usercode = "00000";
switch (input.CompanyCode)
{
case "XCQX":
usercode = "LX0001";
break;
case "XCHF":
usercode = "AA0001";
break;
case "XCTH":
//usercode = "AA0001";
break;
case "XCTX":
usercode = "TA0001";
break;
}
//待提交数据按来源单号分组(ASN/PO)
var srcBills = input.iReceipts
.Select(p => new { BillCode = p.DeliveryNo })
.GroupBy(p => p.BillCode)
.ToList();
List receiptHeaders = new List();
List receiptDetails = new List();
List receiptScans = new List();
List details = new List();
List iqcHeaders = new List();
List poDetails = new List();
int billid = 1;
foreach (var srcBill in srcBills)
{
var asnHeader = Biz.Db.Queryable().Where(x => x.DeliveryNo == srcBill.Key).First();
if (asnHeader == null)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到数据";
action.Message = msg;
return action;
}
//获取ASN行明细
var asnLines = Biz.Db.Queryable().Where(x => x.DeliveryNo == srcBill.Key).ToList();
if (asnLines == null)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到ASN行明细";
action.Message = msg;
return action;
}
var asnBarcodeList = Biz.Db.Queryable().Where(x => x.DeliveryNo == srcBill.Key).ToList();
if (asnBarcodeList == null)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}SRM中查不到ASN行明细";
action.Message = msg;
return action;
}
if (asnBarcodeList.Count > input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Count)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]还有条码未扫描清点,不能生成到货单";
action.Message = msg;
return action;
}
if (Biz.Db.Queryable().Where(x => x.BILLCODE == srcBill.Key).Any())
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]已经扫描过不能再扫描";
action.Message = msg;
return action;
}
List asnLinesNum = new List();
asnLinesNum = asnLines.Select(x => x.productCode).Distinct().ToList();
List tempBarcodesNum = new List();
tempBarcodesNum = input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Select(x => x.MaterialCode).Distinct().ToList();
if (asnLinesNum.Count > tempBarcodesNum.Count)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]还有料号未扫描清点,不能生成到货单";
return action;
}
msg += $"{msg.IsNullOrEmpty("", ";")}送货单[{srcBill.Key}]总数[{asnBarcodeList.Count}],扫描总数[{input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList().Count}]";
// 生成收料单
// 新建一个 Header
var nReceiptHeader = new WMS_RECEIPT_H
{
BILLCODE = GetBillNoByType("RECEIPT"),
BILLDATE = DateTime.Now,
STATUS = (int)WMS_RECEIPT_H.ReceiptStatus.Add,
BIZTYPE = (int)WMS_RECEIPT_H.ReceiptBizType.PO,
SUPPLIERCODE = asnHeader.innerVendorCode,
CreationTime = DateTime.Now,
CreatorUserId = 1
};
var nHeaderId = Biz.Db.Insertable(nReceiptHeader).ExecuteReturnBigIdentity();
nReceiptHeader.Id = nHeaderId;
// 生成收料单行明细
var nLineSeq = 1;
foreach (var asnLine in asnLines)
{
//订单物料行(唯一)
int poline = Convert.ToInt32(asnLine.poLineNo.Split('-')[0]);
var nOrderDetail = Biz.Db.Queryable().Where(x => x.BILLCODE.ToUpper() == asnLine.poErpNo.ToUpper() && x.BILLLINE == poline).First();
if (asnBarcodeList == null)
{
action.IsSuccessed = false;
msg += $"{msg.IsNullOrEmpty("", ";")}订单中查不到数据";
return action;
}
nOrderDetail.ARRIVALQTY = (nOrderDetail.ARRIVALQTY ?? 0) + asnLine.deliveryQty;
poDetails.Add(nOrderDetail);
//插入收料单行
var nReceiptDetail = new WMS_RECEIPT_D
{
BILLCODE = nReceiptHeader.BILLCODE,
BILLLINE = nLineSeq++,
BILLID = nHeaderId,
LINESTATUS = (int)WMS_RECEIPT_H.ReceiptLineStatus.Add,
MATERIALCODE = asnLine.productCode,
UNITCODE = "",
QTY = asnLine.deliveryQty,
QTYPASS = 0,
INSTOCKQTY = 0,
RETURNQTY = 0,
PRINTQTY = 0,
ISGIVEAWAY = false,
SOURCETYPE = (int)WMS_RECEIPT_H.SourceType.Asn,
SOURCECODE = asnLine.DeliveryNo,
SOURCELINE = string.IsNullOrEmpty(asnLine.extendN01) ? asnLine.lineNo : Convert.ToInt32(asnLine.extendN01 ?? "0"), //asnLine.lineNo,
PONO = asnLine.poErpNo,
POLINE = poline,
LastModificationTime = DateTime.Now,
CreationTime = DateTime.Now,
CreatorUserId = 1
};
receiptDetails.Add(nReceiptDetail);
details.Add(new Detail
{
pmdtseq = nLineSeq.ToString(),
pmdt001 = string.IsNullOrEmpty(nReceiptDetail.PONO) ? asnLine.DeliveryNo : asnLine.poErpNo,
pmdt002 = asnLine.lineNo.ToString(), //string.IsNullOrEmpty(nReceiptDetail.PONO) ? asnLine.lineNo.ToString() : poline.ToString(), 采购项次
pmdt003 = "1",
pmdt004 = asnLine.poLineNo.Split('-').Length > 2 ? asnLine.poLineNo.Split('-')[2] : (asnLine.poLineNo ?? "1"), //采购分批序
pmdt006 = asnLine.productCode, //"K7015AA016141",
//pmdt018 = "创米科技",
pmdt020 = asnLine.deliveryQty.ToString(), //"100.00000",
pmdtud011 = "0"
});
//创建送检单
Result result = CreateIqcHeader(nReceiptDetail, "Y", Biz.Db);
if (result.Flag != Result.Flags.Success)
{
action.IsSuccessed = false;
action.Message = result.Message;
return action;
}
iqcHeaders.Add(result.Data);
billid++;
}
//var asnScanTemp = await _tempRepository.GetAll().Where(x => x.CreatorUserId == (AbpSession.UserId ?? 0) && x.BillCode.ToUpper() == srcBill.Key.ToUpper()).ToListAsync();
foreach (var scanTemp in input.iReceipts.Where(x => x.DeliveryNo == srcBill.Key).ToList())
{
WMS_RECEIPT_SCAN scanObj = new WMS_RECEIPT_SCAN
{
Id = Guid.NewGuid().ToString(),
BILLCODE = scanTemp.DeliveryNo,
BILLLINE = 0,
SOURCETYPE = (int)WMS_RECEIPT_H.SourceType.Asn,
MATERIALCODE = scanTemp.MaterialCode,
BARCODE = scanTemp.SmallBarcode,
SCAN_BARCODE = scanTemp.SCAN_BARCODE,
CARTON = scanTemp.BigBarcode,
PALLET = scanTemp.OuterBarcode,
SUPPLIERCODE = scanTemp.innerVendorCode,
DATECODE = DateTime.Now,
//LOTNO = scanTemp.LotNo,
SCANQTY = scanTemp.SCANQTY,
//UNIT = scanTemp.Unit,
//ISGIVEAWAY = scanTemp.IsGiveAway,
RECEIPTNO = nReceiptHeader.BILLCODE,
RECEIPTLINE = 0,
STATEFLAG = WMS_RECEIPT_H.ReceiptLineStatus.PreInstock.ToString(),
LastModificationTime = DateTime.Now,
CreationTime = DateTime.Now,
CreatorUserId = 1
};
receiptScans.Add(scanObj);
}
//调用T100接口生成到货单
var ret = ErpT100.GenerateCustReceipt(new CustReceiptInputParameter
{
parameter = new Parameter
{
pmds000 = "1",
pmdsdocno = "3438",
pmdsdocdt = DateTime.Now.ToString("yyyy-MM-dd"), //"2023-04-26", //当天时间
pmds002 = usercode, // "00000", //UserCode == "admin" ? "00000" : UserCode, //"L36783", //用户ID
pmds003 = "",
pmds007 = nReceiptHeader.SUPPLIERCODE, //"C0006", //供应商代码
pmds010 = srcBill.Key, //"测试客供料无采购收货", //送货单号
//pmdsud001 = SecondVenderCode, //"CM017", //二级供应编号
detail = details
},
datakey = new Datakey
{
EntId = ApiConfig.IsTestServer ? "108" : "88",
CompanyId = input.StrongHold
}
});
if (ret.payload.std_data.execution.code == "0") //成功
{
nReceiptHeader.ERP_BILL_CODE = ret.payload.std_data.parameter.docno;
nReceiptHeader.STATUS = 3;
receiptHeaders.Add(nReceiptHeader);
action.Message += $"{action.Message.IsNullOrEmpty("", ";")}{ret.payload.std_data.execution.description},返回的收货单号:[{ret.payload.std_data.parameter.docno}]";
#region 生成送检单
foreach (var item in iqcHeaders)
{
var retIns = ErpT100.GenerateInspection(new InsInputParameter
{
parameter = new InsParameter
{
pmdsdocno = ret.payload.std_data.parameter.docno,
pmdsdocdt = DateTime.Now.ToString("yyyy-MM-dd"),
pmdtseq = item.SOURCELINE.ToString(),
pmdt020 = item.QCQTY.ToString(),
qcbadocno = "3701",
},
datakey = new Datakey
{
EntId = ApiConfig.IsTestServer ? "108" : "88",
CompanyId = input.StrongHold
}
});
if (retIns.payload.std_data.execution.code != "0")
{
isIQCOk = false;
action.IsSuccessed = false;
action.Message = $"到货单[{ret.payload.std_data.parameter.docno}],当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{retIns.payload.std_data.execution.description}"; ;
//return action;
}
else
{
action.Message += $"到货单[{ret.payload.std_data.parameter.docno}],当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{retIns.payload.std_data.execution.description}";
item.ERP_BILL_CODE = retIns.payload.std_data.parameter.docno;
}
}
#endregion
}
else //失败
{
action.IsSuccessed = false;
action.Message = $"当前用户[{usercode}],供应商编号[{nReceiptHeader.SUPPLIERCODE}],返回的信息:{ret.payload.std_data.execution.description}";
return action;
}
}
var db = Business.Biz.Db;
//保存到数据库
var dbTran = db.UseTran(() =>
{
if (receiptHeaders.Any())
{
db.Updateable(receiptHeaders, "system").ExecuteCommand();
}
if (poDetails.Any())
{
db.Updateable(poDetails, "system").ExecuteCommand();
}
if (receiptDetails.Any())
{
db.Insertable(receiptDetails, "system").ExecuteCommand();
}
if (receiptScans.Any())
{
db.Insertable(receiptScans, "system").ExecuteCommand();
}
if (action.IsSuccessed && isIQCOk)
{
db.Insertable(iqcHeaders).ExecuteCommand();
}
});
if (!dbTran.IsSuccess)
{
if (receiptHeaders.Any())
{
db.Deleteable(receiptHeaders).ExecuteCommand();
}
action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"到货单生成异常");
}
action.Message += $"{msg.IsNullOrEmpty("", ";")}到货单和送检单生成成功!";
return action;
}
catch (Exception ex)
{
return action.GetResponse().CatchExceptionWithLog(ex, $"到货单生成异常");
}
}
private static readonly IProdMaterialReq _IProdMaterialReq = BizContext.Container.Resolve();
///
/// 获取T100领料单数据
///
///
///
public ApiAction GetMaterialReq(List prd_hs)
{
var action = new ApiAction();
try
{
if (prd_hs.Count > 0)
{
Work.DoAsync(() =>
{
Logger.Interface.Info($"开始异步推送到新数据库");
_IProdMaterialReq.GetMaterialReq(prd_hs);
});
return action;
//var judian = BizConfig.Configuration["JuDian"];
//foreach (var group in prd_hs.Select(q => q.ENTERPRISECODE).Distinct())
//{
// List entity_h = new();
// List entity_d = new();
// //查询出来的列表
// List list_d = new();
// DbClient db;
// List dtls=new();
// if (group == 88)
// {
// dtls = prd_hs.Where(q=>q.STRONGHOID== judian && q.ENTERPRISECODE==group).ToList();
// db = Business.Biz.Db;
// foreach (var ju in prd_hs.Where(q=>q.STRONGHOID!=judian).Select(q => q.STRONGHOID).Distinct())
// {
// if (ju == "AHXC")
// {
// var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
// var response = HttpHelper.PostAsync("http://172.18.8.56:9529/api/WMS/GetMaterialReq", requestJson).Result;
// action = JsonConvert.DeserializeObject(response.Message);
// }
// if (ju == "DGXC")
// {
// //var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
// //var response = HttpHelper.PostAsync("http://172.18.8.56:9528/api/WMS/GetMaterialReq/", requestJson).Result;
// //action = JsonConvert.DeserializeObject(response.Message);
// }
// if (ju == "XCSJ")
// {
// var requestJson = JsonConvert.SerializeObject(prd_hs.Where(q => q.STRONGHOID == ju && q.ENTERPRISECODE == group).ToList());
// var response = HttpHelper.PostAsync("http://172.18.8.56:9527/api/WMS/GetMaterialReq/", requestJson).Result;
// action = JsonConvert.DeserializeObject(response.Message);
// }
// }
// }
// else
// {
// //dtls = prd_hs.Where(q => q.ENTERPRISECODE !=88 ).ToList();
// db = Biz.DataSource["Test"].Client;
// }
// foreach (var item_h in dtls)
// {
// var prd_h = Biz.Db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
// if (prd_h?.STATUS != "COMPLETE")
// {
// prd_h = prd_h ?? new WMS_PRDPICK_H()
// {
// STATUS = "INIT",
// BIZTYPE = "1",
// CreationTime = DateTime.Now,
// CreatorUserId = 1,
// };
// prd_h.BILLCODE = item_h.BILLCODE;
// prd_h.BILLDATE = item_h.BILLDATE;
// prd_h.SOURCETYPE = item_h.SOURCETYPE;
// prd_h.STATUS = prd_h.STATUS == "DELETE"? "INIT": prd_h.STATUS;
// prd_h.REMARK = item_h.REMARK;
// prd_h.SOURCECODE = item_h.SOURCECODE;
// prd_h.LastModificationTime = DateTime.Now;
// //prd_h.ENTERPRISECODE = item_h.ENTERPRISECODE;
// //prd_h.STRONGHOID = item_h.STRONGHOID;
// entity_h.Add(prd_h);
// }
// }
// //保存到数据库
// var dbTran = db.UseTran(() =>
// {
// db.Storageable(entity_h, "system").ExecuteCommand();
// });
// if (!dbTran.IsSuccess)
// {
// action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
// }
// //异步拉取单身列表
// Work.DoAsync(() =>
// {
// GenerateReqDetail(dtls,db);
// });
// action.Message += $"拉取领料单单头完成,调用异步拉单身。";
//}
}
return action;
}
catch (Exception ex)
{
return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
}
}
///
/// 根据领料单头拉单身
///
///
///
///
private static ApiAction GenerateReqDetail(List dtls, DbClient db)
{
Thread.Sleep(5000);
var action = new ApiAction();
try
{
var judian = BizConfig.Configuration["JuDian"];
List entity_h = new();
List entity_d = new();
List transferH = new();
List sctrwos = new();
//查询出来的列表
List list_dOld = new();
foreach (var item_h in dtls)
{
var prd_h = Biz.Db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
if (prd_h?.STATUS != "COMPLETE")
{
var list_d = Biz.Db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).ToList();
var item_h_list = new List();
var ret = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter
{
parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
datakey = new Datakey
{
EntId = item_h.ENTERPRISECODE.ToString(),
CompanyId = judian
}
});
List ret_list = new List();
if (ret.payload.std_data.execution.code != "0")
{
action.IsSuccessed = false;
action.Message = $"错误信息:[{ret.payload.std_data.execution.description}]";
Logger.Default.Info(action.Message);
var dt = DateTime.Now;
while ((dt - DateTime.Now).TotalSeconds < 10)
{
}
var ret1 = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter
{
parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
datakey = new Datakey
{
EntId = item_h.ENTERPRISECODE.ToString(),
CompanyId = judian
}
});
if (ret1.payload.std_data.execution.code != "0")
{
action.IsSuccessed = false;
action.Message = $"错误信息:[{ret1.payload.std_data.execution.description}]";
Logger.Default.Info(action.Message);
return action;
}
else
{
ret_list = ret1.payload.std_data.parameter.@return;
}
}
else
{
ret_list = ret.payload.std_data.parameter.@return;
}
foreach (var item in ret_list)
{
WMS_PRDPICK_D d = new WMS_PRDPICK_D
{
BILLCODE = item.sfdcdocno,
BILLLINE = Convert.ToInt32(item.sfdcseq),
UNITCODE = item.sfdc006,
MATERIALCODE = item.sfdc004,
PRQTY = Convert.ToDecimal(item.sfdc007),
DELIVERYDATE = Convert.ToDateTime(item.sfdareqdt),
WAREHOUSECODE = item.sfdc012,
SOURCETYPE = Convert.ToInt32(item.sfdc003),
SOURCECODE = item.sfdc001,
SOURCELINE = Convert.ToInt32(item.sfdc002),
};
item_h_list.Add(d);
}
//保存委外工单号对应关系
WMS_SCTRWO_TRANSFER sctr = new WMS_SCTRWO_TRANSFER
{
ID = Guid.NewGuid().ToString("N"),
ORIGINAL_WORKORDER = ret_list[0]?.sfdc001,
TARGET_WORKORDER = ret_list[0]?.sfdc001_1
};
sctrwos.Add(sctr);
action.Message += $",领料单明细获取成功,[{string.Join(",", item_h_list.Select(x => x.BILLCODE + ";" + x.MATERIALCODE).ToList())},获取总数[{item_h_list.Count}],数据库中总数[{list_d.Count}]";
action.Message += $",委外工单,[{string.Join(",", sctrwos.Select(x => x.ORIGINAL_WORKORDER + ";" + x.TARGET_WORKORDER).ToList())}";
if (list_d.Count != item_h_list.Count)
{
foreach (var d in list_d) { d.PRQTY = 0; } //需求数量都弄成0
}
int n = 0;
List prdDList = new List();
foreach (var item_d in item_h_list)
{
//根据单据重新到数据查找相应的单据明细
var prd_d = list_d.Where(s => s.BILLCODE == item_d.BILLCODE && s.BILLLINE == item_d.BILLLINE).FirstOrDefault();
prd_d = prd_d ?? new WMS_PRDPICK_D()
{
LINESTATUS = "INIT",
QTY = Convert.ToDecimal(0),
CreationTime = DateTime.Now,
CreatorUserId = 1,
};
prd_d.BILLCODE = item_d.BILLCODE;
prd_d.BILLLINE = item_d.BILLLINE;
prd_d.UNITCODE = item_d.UNITCODE;
prd_d.MATERIALCODE = item_d.MATERIALCODE;
prd_d.PRQTY = Convert.ToDecimal(item_d.PRQTY);
prd_d.DELIVERYDATE = Convert.ToDateTime(item_d.DELIVERYDATE);
prd_d.WAREHOUSECODE = item_d.WAREHOUSECODE;
prd_d.LINESTATUS = prd_d.PRQTY == prd_d.QTY ? "COMPLETE" : Convert.ToDecimal(item_d.PRQTY) == 0 ? "COMPLETE" : prd_d.LINESTATUS == "DELETE" ? "INIT" : prd_d.LINESTATUS;
prd_d.SOURCETYPE = item_d.SOURCETYPE;
prd_d.SOURCECODE = item_d.SOURCECODE;
prd_d.SOURCELINE = item_d.SOURCELINE;
prd_d.LastModificationTime = item_d.LastModificationTime;
list_d.RemoveAll(q => q.BILLCODE == item_d.BILLCODE && q.BILLLINE == item_d.BILLLINE);
if (prd_d.LINESTATUS == "COMPLETE") { n++; }
prdDList.Add(prd_d);
entity_d.Add(prd_d);
}
if (prdDList.Count == n) { prd_h.STATUS = "COMPLETE"; }
entity_h.Add(prd_h);
list_dOld.AddRange(list_d);
//检查有没有调拨单,有就更新状态为完成
var transferList = Biz.Db.Queryable().Where(s => s.SOURCECODE == prd_h.BILLCODE).ToList();
if (transferList.Any())
{
foreach (var item in transferList)
{
item.STATUS = "COMPLETE2";
item.LastModificationTime = DateTime.Now;
item.SOURCECODE = prd_h.BILLCODE;
transferH.Add(item);
action.Message += $",领料单[{prd_h.BILLCODE}]对应调拨单[{item.BILLCODE}]完成";
}
}
}
}
//保存到数据库
var dbTran = db.UseTran(() =>
{
db.Storageable(entity_h, "system").ExecuteCommand();
db.Storageable(entity_d, "system").ExecuteCommand();
if (transferH.Any())
{
db.Updateable(transferH).ExecuteCommand();
}
if (sctrwos.Any())
{
//db.Insertable(sctrwos).ExecuteCommand();
var y = db.Storageable(sctrwos)
.WhereColumns(t => new { t.ORIGINAL_WORKORDER, t.TARGET_WORKORDER })
.ToStorage();
y.AsInsertable.ExecuteCommand();
y.AsUpdateable.IgnoreColumns(t => t.ID).ExecuteCommand();
}
if (list_dOld.Any())
{
db.Deleteable(list_dOld).ExecuteCommand();
}
});
if (!dbTran.IsSuccess)
{
action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
}
Logger.Default.Info(action.Message);
return action;
}
catch (System.Exception ex)
{
return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
}
}
///
/// 拆解条码
///
///
///
///
public static Result SplitFullBarcode(string nFullBarcode, bool nPackageBarcode = false)
{
Result result = new(Result.Flags.Success, $"解析条码[{nFullBarcode}]成功");
//识别新的识别二维码规则,以V开头,否则按旧识别模式
if (nFullBarcode.Substring(0, 1).ToUpper() == "V")
{
return SplitFullBarcodeNew(nFullBarcode, nPackageBarcode);
}
// 旧格式条码,都是最小批次标签,非包装标签
nPackageBarcode = false;
//新条码解析
var nSplitArray = nFullBarcode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (nSplitArray.Length == 1) //一维码
{
result.Data = new InputBarcodeDto
{
Barcode = nFullBarcode
};
return result;
}
var nOrderNo = "";
var nMaterialCode = "";
var nBarcodeLotNo = "";
var nLotQty = "";
var nLotDate = "";
var nStateFlag = "";
bool isBox = false;
var nLotNo = "";
foreach (string item in nSplitArray)
{
string itemKey = item.Substring(0, 1).ToUpper();
string itemValue = item.Substring(1);
if (itemKey == "V")
{ //采购订单号
nOrderNo = itemValue;
}
else if (itemKey == "P")
{ //条码料号
nMaterialCode = itemValue;
}
else if (itemKey == "S")
{ //来料外包条码
nBarcodeLotNo = itemValue;
//nBarcodeLotNo = item;//PAG ID 解析出来的数据前缀“S”不用去掉
//if (itemValue.StartsWith("C") || itemValue.StartsWith("P")) //中箱(C)和栈板(P),需要再次去掉一位
// nBarcodeLotNo = itemValue.Substring(1);
}
else if (itemKey == "Q")
{ //条码数量
nLotQty = itemValue;
}
else if (itemKey == "D")
{ //生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
nLotDate = itemValue;
//nLotDate = itemValue.Replace("-", "");
}
else if (itemKey == "L")
{ //批号
nLotNo = itemValue;
}
}
if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码数据有误";
return result;
}
// 判断标签数量是否合法
if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码格式错误:未取到正确的条码数量";
return result;
}
// 解析DateCode
DateTime nDateCode = DateTime.MinValue;
if (nLotDate != "")
{
//string dateTimeStr = nLotDate.Substring(0, 4) + "-" + nLotDate.Substring(4, 2) + "-" + nLotDate.Substring(6, 2);
//if (!DateTime.TryParse(dateTimeStr, out nDateCode))
////if (!DateTime.TryParse(nLotDate, out DateTime nDateCode))
//{
// throw new UserFriendlyException("条码格式错误:未取到正确的批次日期");
//}
/// 原始DateCode 为日期
if (nLotDate.Length > 6)
{
var sDate = nLotDate;
if (nLotDate.Length == 7) { sDate = $"{nLotDate.Substring(0, 4)}0{nLotDate.Substring(4)}"; }
IFormatProvider ifp = new CultureInfo("zh-CN", true);
DateTime.TryParseExact(sDate, "yyyyMMdd", ifp, DateTimeStyles.None, out nDateCode);
}
/// 原始DateCode 为年、周次(YYYYWW / YYWW)
int yw = 0;
if (nLotDate.Length <= 6 && int.TryParse(nLotDate, out yw))
{
nDateCode = GetWeekStartTime(nLotDate);
}
if (nDateCode == DateTime.MinValue)
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码格式错误:未取到正确的批次日期";
return result;
}
}
// 判断物料代码是否合法
var nMaterial = Biz.Db.Queryable().Where(q => q.MCode.ToUpper() == nMaterialCode.ToUpper() || q.MCode.ToUpper() == "K" + nMaterialCode.ToUpper()).First();
if (nMaterial == null)
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码对应的物料不存在";
return result;
}
// 判断包装条码格式是否合法
if (nPackageBarcode && nBarcodeLotNo.Length != 12)
{
result.Flag = Result.Flags.Failed;
result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
return result;
}
if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
return result;
}
if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
return result;
}
if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"物料条码批次格式错误,应至少包含15位字符";
return result;
}
result.Data = new InputBarcodeDto
{
OrderNo = nOrderNo,
Barcode = nBarcodeLotNo,
MaterialCode = nMaterial?.MCode,
MaterialName = nMaterial?.MName,
MaterialStandard = nMaterial?.MDesc,
MGroupCode = nMaterial?.MGroupCode,
Unit = nMaterial?.MUom,
LotQty = nBarcodeQty,
LotDate = nDateCode,
LotDateString = nLotDate,
PeriodDays = nMaterial.PERIODDAYS,
FIFO = nMaterial.FIFO,
SafeStorageQty = nMaterial.SAFEQTY,
StateFlag = nStateFlag,
IsBox = isBox,
//SnList = snList,
LotNo = nBarcodeLotNo,
};
return result;
}
///
/// 最新解码规则,SRM 标签
/// 拆解条码
/// 依次是:
///V:PO(MO)
///P:C P/N:料号
///N:Name(物料名称)
///Q:QTY(数量)
///U:Unit(单位)
///M:Mfr P/N(供应商内部管控的物料的料号)
///D:Date Code(生产日期,物料的生产日期)
///L:Lot Code(生产的批次)
///S:PAG ID(小包批次代码,也就是来料外包条码)
///
///
///
///
public static Result SplitFullBarcodeNew(string nFullBarcode, bool nPackageBarcode = false)
{
Result result = new(Result.Flags.Success, $"解析条码[{nFullBarcode}]成功");
var nSplitArray = nFullBarcode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var nOrderNo = "";
var nMaterialCode = "";
var nBarcodeLotNo = "";
var nLotQty = "";
var nLotDate = "";
var nStateFlag = "";
bool isBox = false;
var nLotNo = "";
List> snList = new List>();
foreach (string item in nSplitArray)
{
string itemKey = item.Substring(0, 1).ToUpper();
string itemValue = item.Substring(1);
if (itemKey == "V")
{ //采购订单号
nOrderNo = itemValue;
}
else if (itemKey == "P")
{ //条码料号
nMaterialCode = itemValue;
}
else if (itemKey == "S")
{ //来料外包条码
nBarcodeLotNo = itemValue;
}
else if (itemKey == "Q")
{ //条码数量
nLotQty = itemValue;
}
else if (itemKey == "D")
{
//生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
nLotDate = Regex.Replace(itemValue, @"[^0-9]+", "");
}
else if (itemKey == "L")
{ //批号
nLotNo = itemValue;
}
}
//判断条码是否拆分过,拆分过的不判断是否为ASN 2022/12/17 Ben Lin
//if (!nBarcodeLotNo.Contains("-1") && !nBarcodeLotNo.Contains("-2"))
if (nBarcodeLotNo.Substring(nBarcodeLotNo.Length - 3, 2) != "-1" && nBarcodeLotNo.Substring(nBarcodeLotNo.Length - 3, 2) != "-2") //调整判断拆包标签的标准2023-1-2,weikaiyong
{
// 判断单据编号是否为ASN, 如果是ASN,调用ASN标签解析
if (BillIsAsn(nOrderNo))
{
return SplitFullBarcodeAsn(nSplitArray, nPackageBarcode);
}
}
if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码数据有误";
return result;
}
var nInputSnDto = Biz.Db.Queryable().Where(q => q.OuterBarcode == nBarcodeLotNo || q.BigBarcode == nBarcodeLotNo).ToList();
if (nInputSnDto.Any())
{
isBox = true;
snList = nInputSnDto.Select(t => new Tuple(t.SmallBarcode, t.IncludeQty)).ToList();
}
if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
{
//throw new UserFriendlyException("条码格式错误:未取到正确的条码数量");
result.Flag = Result.Flags.Failed;
result.Message = $"条码数据有误";
return result;
}
DateTime nDateCode = DateTime.Now;
if (nLotDate != "")
{
// 原始DateCode 为日期
if (nLotDate.Length > 6)
{
IFormatProvider ifp = new CultureInfo("zh-CN", true);
DateTime.TryParseExact(nLotDate, "yyyyMMdd", ifp, DateTimeStyles.None, out nDateCode);
}
// 原始DateCode 为年、周次(YYYYWW / YYWW)
int yw = 0;
if (nLotDate.Length <= 6 && int.TryParse(nLotDate, out yw))
{
nDateCode = GetWeekStartTime(nLotDate);
}
if (nDateCode == DateTime.MinValue)
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码[{nFullBarcode}]格式错误:未取到正确的批次日期";
return result;
}
}
var nMaterial = Biz.Db.Queryable().Where(q => q.MCode.ToUpper() == nMaterialCode.ToUpper()).First();
if (nMaterial == null)
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码对应的物料不存在";
return result;
}
if (!nPackageBarcode)
{
if (nPackageBarcode && nBarcodeLotNo.Length != 12)
{
result.Flag = Result.Flags.Failed;
result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"物料条码批次格式错误,应至少包含15位字符";
return result;
}
}
result.Data = new InputBarcodeDto
{
OrderNo = nOrderNo,
Barcode = nBarcodeLotNo,
MaterialCode = nMaterialCode,
MaterialName = nMaterial?.MName,
MaterialStandard = nMaterial?.MDesc,
MGroupCode = nMaterial?.MGroupCode,
Unit = nMaterial?.MUom,
LotQty = nBarcodeQty,
LotDateString = nLotDate,
LotDate = nDateCode,
PeriodDays = nMaterial.PERIODDAYS,
FIFO = nMaterial.FIFO,
SafeStorageQty = nMaterial.SAFEQTY,
StateFlag = nStateFlag,
IsBox = isBox,
SnList = snList,
LotNo = nBarcodeLotNo,
};
return result;
}
///
/// ASN标签条码解析
/// 拆解条码,依次是:
/// V:PO(MO)
/// P:C P/N:料号
/// N:Name(物料名称)
/// Q:QTY(数量)
/// U:Unit(单位)
/// M:Mfr P/N(供应商内部管控的物料的料号)
/// D:Date Code(生产日期,物料的生产日期)
/// L:Lot Code(生产的批次)
/// S:PAG ID(小包批次代码,也就是来料外包条码)
///
///
///
///
public static Result SplitFullBarcodeAsn(string[] nSplitArray, bool nPackageBarcode = false)
{
Result result = new(Result.Flags.Success, $"解析Asn条码成功");
#region 方法变量
// 条码变量
var nAsnNo = "";
var nVendorCode = "";
var nMaterialCode = "";
var nBarcodeLotNo = "";
var nLotQty = "";
var nLotDate = "";
var nStateFlag = "";
bool isBox = false;
var nLotNo = "";
// 最小包装条码列表
List> snList = new List>();
// 送货单行明细
List asnLineList = new List();
// 最小包装条码明细
List snBarcodeList = new List();
var nCartonNo = "";
var nPalletNo = "";
// 变量赋值
foreach (string item in nSplitArray)
{
string itemKey = item.Substring(0, 1).ToUpper();
string itemValue = item.Substring(1);
if (itemKey == "V")
{ //送货单号
nAsnNo = itemValue;
}
else if (itemKey == "P")
{ //条码料号
nMaterialCode = itemValue;
}
else if (itemKey == "S")
{ //来料外包条码
nBarcodeLotNo = itemValue;
//nBarcodeLotNo = item;//PAG ID 解析出来的数据前缀“S”不用去掉
//if(itemValue.StartsWith("C")|| itemValue.StartsWith("P")) //中箱(C)和栈板(P),需要再次去掉一位
// nBarcodeLotNo = itemValue.Substring(1);
}
else if (itemKey == "Q")
{ //条码数量
nLotQty = itemValue;
}
else if (itemKey == "D")
{ //生产日期(去掉-,兼容带-的时间格式,后面统一时间解析)
//nLotDate = itemValue.Replace("-", "");
nLotDate = Regex.Replace(itemValue, @"[^0-9]+", "");
}
else if (itemKey == "L")
{ //批号
nLotNo = itemValue;
}
}
#endregion
#region 条码数据校验
if (nMaterialCode == "" || nLotQty == "" || nBarcodeLotNo == "")
{
//throw new UserFriendlyException("条码数据有误");
result.Flag = Result.Flags.Failed;
result.Message = $"条码数据有误";
return result;
}
// 获取条码列表 snBarcodeList
snBarcodeList = GetSrmBarcodeList(nBarcodeLotNo);
// 如果最小包装标签记录数大于1,则为包装标签,否则为最小包装标签
if (BarcodeIsBox(nBarcodeLotNo))
{
isBox = true;
}
if (snBarcodeList.Any())
{
snList = snBarcodeList.Select(t => new Tuple(t.SmallBarcode, t.IncludeQty)).ToList();
snBarcodeList = snBarcodeList.Select(t => new WMS_SRMSNList
{
BILLCODE = t.BILLCODE,
MATERIALCODE = t.MATERIALCODE,
SmallBarcode = t.SmallBarcode,
BigBarcode = t.BigBarcode,
OuterBarcode = t.OuterBarcode,
IncludeQty = t.IncludeQty
}).ToList();
// 判断标签条码类型
// 是最小包装条码
var smallBarcode = snBarcodeList.Where(t => t.SmallBarcode == nBarcodeLotNo).FirstOrDefault();
if (smallBarcode != null && !smallBarcode.SmallBarcode.IsNullOrEmpty())
{
isBox = false;
nCartonNo = smallBarcode.BigBarcode;
nPalletNo = smallBarcode.OuterBarcode;
}
// 是外箱条码
var bigBarcode = snBarcodeList.Where(t => t.BigBarcode == nBarcodeLotNo).FirstOrDefault();
if (bigBarcode != null && !bigBarcode.BigBarcode.IsNullOrEmpty())
{
isBox = true;
nCartonNo = bigBarcode.BigBarcode;
nPalletNo = bigBarcode.OuterBarcode;
}
// 是栈板条码
var outerBarcode = snBarcodeList.Where(t => t.OuterBarcode == nBarcodeLotNo).FirstOrDefault();
if (outerBarcode != null && !outerBarcode.OuterBarcode.IsNullOrEmpty())
{
isBox = true;
nCartonNo = outerBarcode.BigBarcode;
nPalletNo = outerBarcode.OuterBarcode;
}
}
// 验证条码标签数量格式是否正确
if (!decimal.TryParse(nLotQty, out decimal nBarcodeQty))
{
//throw new UserFriendlyException("条码格式错误:未取到正确的条码数量");
result.Flag = Result.Flags.Failed;
result.Message = $"条码格式错误:未取到正确的条码数量";
return result;
}
// 验证条码标签数量与SRM 最小包装数量合计是否一致
decimal snQtyTotal = snBarcodeList.Sum(t => t.IncludeQty);
if (nBarcodeQty != snQtyTotal)
{
//throw new UserFriendlyException("标签数量与SRM最小包装总数量不一致");
result.Flag = Result.Flags.Failed;
result.Message = $"标签数量与SRM最小包装总数量不一致";
return result;
}
DateTime nDateCode = DateTime.Now;
if (nLotDate != "")
{
//增加判断日期的抛错提示 2022/07/27 Ben Lin, 2022/07/29 Ben Lin 再次更新
try
{
string dateTimeStr = nLotDate.Substring(0, 4) + "-" + nLotDate.Substring(4, 2) + "-" + nLotDate.Substring(6, 2);
if (nLotDate.Length < 7)
{
if (nLotDate.StartsWith("2") && nLotDate.Length == 6)
{
dateTimeStr = $"20{nLotDate.Substring(0, 2)}-{nLotDate.Substring(2, 2)}-{nLotDate.Substring(4, 2)}";
}
else
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期";
return result;
}
}
if (!DateTime.TryParse(dateTimeStr, out nDateCode))
//if (!DateTime.TryParse(nLotDate, out DateTime nDateCode))
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期";
return result;
}
}
catch (System.Exception ex)
{
//Logger.Info($"ASN标签条码解析 =>条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期,{ex.Message}");
result.Flag = Result.Flags.Failed;
result.Message = $"条条码[{nBarcodeLotNo}]格式错误:未取到正确的批次日期,{ex.Message}";
return result;
}
}
var nMaterial = Biz.Db.Queryable().Where(t => t.MCode.ToUpper() == nMaterialCode.ToUpper()).First();
if (nMaterial == null)
{
result.Flag = Result.Flags.Failed;
result.Message = $"条码对应的物料[{nMaterialCode}]不存在";
return result;
}
if (!nPackageBarcode)
{
if (nPackageBarcode && nBarcodeLotNo.Length != 12)
{
result.Flag = Result.Flags.Failed;
result.Message = $"来料外包条码格式错误,应包含12位字符的批次号";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_semimanufacture" && nBarcodeLotNo.Length < 16) //5位供应商+8位日期+3位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"半成品条码的批次格式错误,应至少包含16位字符";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_finishedproduct" && nBarcodeLotNo.Length < 17) //5位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"成品箱号批次格式错误,应至少包含17位字符";
return result;
}
else if (!nPackageBarcode && nMaterial.MtypeCode == "itemtype_rawmaterial" && nBarcodeLotNo.Length < 15)//4位供应商+8位日期+4位流水码
{
result.Flag = Result.Flags.Failed;
result.Message = $"物料条码批次格式错误,应至少包含15位字符";
return result;
}
}
#endregion
#region 获取送货单数据
// 如果标签没有送货单号,根据标签条码获取送货单号
if (nAsnNo.IsNullOrEmpty())
{
var asnList = GetSrmAsn(nBarcodeLotNo);
var asn = asnList.FirstOrDefault();
if (asn != null)
{
nAsnNo = asn.DeliveryNo;
nVendorCode = asn.VendorCode;
}
}
// 获取送货单行明细 poLineList
List asnLines = GetSrmAsnLines(nAsnNo, nMaterialCode);
if (asnLines != null && asnLines.Count > 0)
{
foreach (var line in asnLines)
{
// 分割poLineNo(1-1-1),用-分割,取第一段,获取 PoErpLine
string[] splitLineNo = line.PoLineNo.Split('-');
if (splitLineNo != null && splitLineNo.Count() > 0)
{
int erpPoLine = 0;
int.TryParse(splitLineNo[0], out erpPoLine);
line.PoErpLine = erpPoLine;
}
}
}
#endregion
result.Data = new InputBarcodeDto
{
AsnNo = nAsnNo,
Barcode = nBarcodeLotNo,
VendorCode = nVendorCode,
MaterialCode = nMaterialCode,
MaterialName = nMaterial?.MName,
MaterialStandard = nMaterial?.MDesc,
MGroupCode = nMaterial?.MGroupCode,
Unit = nMaterial?.MUom,
LotQty = nBarcodeQty,
LotDateString = nLotDate,
LotDate = nDateCode,
PeriodDays = nMaterial.PERIODDAYS,
FIFO = nMaterial.FIFO,
SafeStorageQty = nMaterial.SAFEQTY,
StateFlag = nStateFlag,
IsBox = isBox,
SnList = snList,
LotNo = nBarcodeLotNo,
AsnLineList = asnLines,
SnBarcodeList = snBarcodeList,
CartonNo = nCartonNo,
PalletNo = nPalletNo
};
return result;
}
private static bool BarcodeIsBox(string barcode)
{
bool isBox = false;
// 从WMS_SRM_ASN表查找单据编号,判断是否为ASN
if (Biz.Db.Queryable().Where(t => t.OuterBarcode == barcode || t.BigBarcode == barcode).Any())
isBox = true;
return isBox;
}
///
///
///
///
///
public static List GetSrmAsn(string inputBarcode)
{
var query = Biz.Db.Queryable((t, m) =>
new JoinQueryInfos(
JoinType.Left, t.DeliveryNo == m.DeliveryNo
))
.Where((t, m) => t.SmallBarcode == inputBarcode || t.BigBarcode == inputBarcode || t.OuterBarcode == inputBarcode)
.Select((t, m) => new SRMSNStatus
{
DeliveryNo = t.DeliveryNo,
VendorCode = m.innerVendorCode,
Status = m.status
})
.ToList();
return query;
}
///
/// 获取 SRM ASN 行
///
///
///
public static List GetSrmAsnLines(string inputAsnNo)
{
var query = Biz.Db.Queryable()
.Where(t => t.DeliveryNo == inputAsnNo)
.Select(t => new InputAsnLineDto
{
DeliveryNo = t.DeliveryNo,
LineNo = t.lineNo,
ProductCode = t.productCode,
PurchaseType = t.purchaseType,
PoErpNo = t.poErpNo,
PoLineNo = t.poLineNo,
DeliveryQty = t.deliveryQty
})
.ToList();
return query;
}
///
/// 获取 SRM ASN 行
///
///
///
///
public static List GetSrmAsnLines(string inputAsnNo, string inputMaterialCode)
{
var query = Biz.Db.Queryable()
.Where(t => t.DeliveryNo == inputAsnNo && t.productCode == inputMaterialCode)
.Select(t => new InputAsnLineDto
{
DeliveryNo = t.DeliveryNo,
LineNo = t.lineNo,
ProductCode = t.productCode,
PurchaseType = t.purchaseType,
PoErpNo = t.poErpNo,
PoLineNo = t.poLineNo,
DeliveryQty = t.deliveryQty
})
.ToList();
return query;
}
///
/// 获取 SRM 条码列表
///
///
///
public static List GetSrmBarcodeList(string inputBarcode)
{
return Biz.Db.Queryable().Where(t => t.OuterBarcode == inputBarcode || t.BigBarcode == inputBarcode || t.SmallBarcode == inputBarcode).ToList();
}
///
/// 当前周的第一天(星期一)
///
/// 周数,格式:yyyywww
///
private static DateTime GetWeekStartTime(string yearWeek)
{
//年份
int year = 0;
//周数
int weekNum = 0;
if (yearWeek.Length == 4)
{
year = 2000 + int.Parse(yearWeek.Substring(0, 2));
weekNum = int.Parse(yearWeek.Substring(2));
}
if (yearWeek.Length == 6)
{
year = int.Parse(yearWeek.Substring(0, 4));
weekNum = int.Parse(yearWeek.Substring(4));
}
//本年1月1日
DateTime firstOfYear = new DateTime(year, 1, 1);
//本年1月1日与本周星期一相差的天数
int dayDiff = (firstOfYear.DayOfWeek == DayOfWeek.Sunday ? 7 : Convert.ToInt32(firstOfYear.DayOfWeek)) - 1;
//第一周的星期一
DateTime firstDayOfFirstWeek = firstOfYear.AddDays(-dayDiff);
//当前周的星期一
DateTime firstDayOfThisWeek = firstDayOfFirstWeek.AddDays((weekNum - 1) * 7);
return firstDayOfThisWeek;
}
// 根据单据编号判断是都为 ASN
private static bool BillIsAsn(string billCode)
{
// 从WMS_SRM_ASN表查找单据编号,判断是否为ASN
return Biz.Db.Queryable().Where(q => q.DeliveryNo == billCode).Any();
}
///
/// 获取单号根据单据类型
///
///
///
public static string GetBillNoByType(string billType)
{
//根据BillType去表中找到相关前缀、日期码、流水号、长度
var billNoRule = Biz.Db.Queryable().Where(t => t.BillType.Equals(billType)).ToList();
if (billNoRule.Count == 1)
{
var nowRule = billNoRule[0];
string prefix = nowRule.BillPrefix.Trim();
string datecode = nowRule.DateCode.Trim();
string today = DateTime.Now.ToString("yyyyMMdd");
int serial = nowRule.SerialNo;
int maxSerial = GetMaxNumByLength(nowRule.SerialNoLength);
if (serial >= maxSerial)
{
return "over";
}
else
{
if (datecode != string.Empty && datecode != today)
{
serial = 0;
datecode = today;
}
string serialNo = (serial + 1).ToString().PadLeft(nowRule.SerialNoLength, '0');
//update serialNo
nowRule.DateCode = datecode;
nowRule.SerialNo = serial + 1;
Biz.Db.Updateable(nowRule).ExecuteCommand();
//返回编号
return prefix + datecode + serialNo;
}
}
else
{
return "";
}
}
private static int GetMaxNumByLength(int length)
{
if (length == 0)
{
return 0;
}
else
{
string strNum = string.Empty;
for (int i = 1; i <= length; i++)
{
strNum += "9";
}
return Convert.ToInt32(strNum);
}
}
///
/// 生成送检单
///
///
///
///
private static Result CreateIqcHeader(WMS_RECEIPT_D detail, string nUrgent, DbClient db)
{
Result result = new(Result.Flags.Success, $"生成送检单成功");
var nMaterial = Biz.Db.Queryable().Where(t => t.MCode.ToUpper() == detail.MATERIALCODE.ToUpper()).First();
var nAql = Biz.Db.Queryable().Where(t => t.MATERIALID.Equals(nMaterial.Id)).First();
var nIqcHeader = new WMS_IQC_H
{
BILLCODE = iWMS.GetBillNoByType("IQC"),
SOURCETYPE = (int)InventoryTransferSides.BillType.CustSupplyInStock,
SOURCECODE = detail.BILLCODE,
SOURCELINE = detail.BILLLINE,
PONO = detail.SOURCECODE,
POLINE = detail.POLINE ?? 0,
MEASURE = nUrgent,
QCTIMES = 0,
QCSTATUS = (int)IqcManagementSides.QCStatus.UnFinish, /*(int)IqcManagementSides.QCStatus.UnFinish,*/
QCRESULT = (int)IqcManagementSides.QCResult.Wait,
QCREVIEW = (int)IqcManagementSides.QCReview.UnReview,
CreationTime = DateTime.Now,
CreatorUserId = 1,
MATERIALCODE = detail.MATERIALCODE
//ReceiveQty = detail.Qty, //生成送检单加上接收数量 2022/07/27 Ben Lin 2022/09/03 Ben Lin 注释
};
var nIQCMaterial = Biz.Db.Queryable().Where(t => t.MATERIALID.Equals(nMaterial.Id)).First();
if (nIQCMaterial == null)
{
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalI;
}
//免检
else if (nIQCMaterial.CHECKTYPE == "Exemption")
{
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.Exemption;
}
//抽检
else if (nIQCMaterial.CHECKTYPE == "Sampling")
{
var nIQCMaterial2AQL = Biz.Db.Queryable().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
if (nIQCMaterial2AQL.Any())
{
var nIQCMaterial2CheckItem = Biz.Db.Queryable().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
if (nIQCMaterial2CheckItem.Any())
{
//高检II,抽检物料,AQL和检验项目都维护了
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.HighII;
Result result1 = GetAqlSettingAsync(nAql, nIqcHeader, detail, db);
if (result1.Flag != Result.Flags.Success)
{
result.Flag = result1.Flag;
result.Message = result1.Message;
}
else
{
nIqcHeader = result1.Data;
}
}
else
{
//高检I,抽检物料,维护了AQL、但是没有维护检验项目
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.HighI;
Result result2 = GetAqlSettingAsync(nAql, nIqcHeader, detail, db);
if (result2.Flag != Result.Flags.Success)
{
result.Flag = result2.Flag;
result.Message = result2.Message;
}
else
{
nIqcHeader = result2.Data;
}
}
}
else
{
var nIQCMaterial2CheckItem = Biz.Db.Queryable().Where(t => t.IQCMATERIALID.Equals(nIQCMaterial.Id)).ToList();
if (nIQCMaterial2CheckItem.Any())
{
//普检II,抽检物料,没有维护AQL、但是维护了检验项目
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalII;
}
else
{
//普检I,抽检物料,但是没有维护AQL和检验项目
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.NormalI;
}
}
}
//全检
else if (nIQCMaterial.CHECKTYPE == "FullInspection")
{
nIqcHeader.QCLEVEL = (int)IqcManagementSides.QCLevel.FullInspection;
nIqcHeader.SAMPLENGQTY = detail.QTY;
}
result.Data = nIqcHeader;
return result;
}
private static Result GetAqlSettingAsync(WMS_IQCMATERIAL_AQL nAql, WMS_IQC_H nIqcHeader, WMS_RECEIPT_D nDetail, DbClient db)
{
Result result = new(Result.Flags.Success, $"获取Aql成功");
if (nAql.AUTOSTRICT == true)
{
nIqcHeader.STRICTLEVEL = nAql.CURRENTSTRICT.IsNullOrEmpty() ? nAql.DEFAULTSTRICT : nAql.CURRENTSTRICT;
nIqcHeader.LEVELCODE = nIqcHeader.STRICTLEVEL.ToUpper() == "NORMAL" ? nAql.NORMALLEVEL : (nIqcHeader.STRICTLEVEL.ToUpper() == "STRICT" ? nAql.STRICTLEVEL : nAql.RELAXLEVEL);
nIqcHeader.AQL = nIqcHeader.STRICTLEVEL.ToUpper() == "NORMAL" ? nAql.NORMALAQLLEVEL : (nIqcHeader.STRICTLEVEL.ToUpper() == "STRICT" ? nAql.STRICTAQLLEVEL : nAql.RELAXAQLLEVEL);
}
else
{
nIqcHeader.STRICTLEVEL = nAql.DEFAULTSTRICT;
nIqcHeader.LEVELCODE = nAql.DEFAULTLEVEL;
nIqcHeader.AQL = nAql.DEFAULTAQL;
}
//找到该 LevelCode和AqlCode配置下,符合的批次数量范围
var nAqlDetail = Biz.Db.Queryable()
.Where(t => t.LEVELCODE.ToUpper() == nIqcHeader.LEVELCODE.ToUpper() && t.AQLCODE.ToUpper() == nIqcHeader.AQL.ToUpper())
.Where(t => t.LOTMAXQTY >= nDetail.QTY && t.LOTMAXQTY <= nDetail.QTY)
.First();
if (nAqlDetail == null)
{
result.Flag = Result.Flags.Failed;
result.Message = $"未能在水准[{nIqcHeader.LEVELCODE}]下的AQL[{nIqcHeader.AQL}]下找到符合[{nDetail.QTY}]的批次范围";
}
nIqcHeader.BEGINQTY = nAqlDetail.LOTMINQTY;
nIqcHeader.ENDQTY = nAqlDetail.LOTMAXQTY;
nIqcHeader.SAMPLEQTY = nAqlDetail.SAMPLEQTY > nDetail.QTY ? nDetail.QTY : nAqlDetail.SAMPLEQTY;
result.Data = nIqcHeader;
return result;
}
}//endClass
}