438 lines
16 KiB
C#
438 lines
16 KiB
C#
using Infrastructure.Attribute;
|
||
using SqlSugar;
|
||
using System;
|
||
using System.Linq;
|
||
using System.Text.RegularExpressions;
|
||
using ZR.Model.MES.pro;
|
||
using ZR.Model.MES.wms;
|
||
using ZR.Model.MES.wms.Dto;
|
||
using ZR.Service.mes.wms.IService;
|
||
|
||
namespace ZR.Service.mes.wms
|
||
{
|
||
[AppService(ServiceType = typeof(IWMentryWarehousing_productService), ServiceLifetime = LifeTime.Transient)]
|
||
public class WMentryWarehousing_productService : BaseService<WmInfo>, IWMentryWarehousing_productService
|
||
{
|
||
|
||
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
||
//货物入库
|
||
public int IntoProductwarehouse(WmgoodsDto wmgoods, string createName)
|
||
{
|
||
List<WmGoodsNowProduction> preparegoodsList = new List<WmGoodsNowProduction>();
|
||
|
||
|
||
|
||
if (wmgoods.packagelist != null && wmgoods.packagelist.Count() > 0)
|
||
{
|
||
for (int i = 0; i < wmgoods.packagelist.Count(); i++)
|
||
{
|
||
|
||
ResultionPackageCodeDto resultionPackage = ResolutionPackagecode(wmgoods.packagelist[i]);
|
||
WmGoodsNowProduction wmGood = new WmGoodsNowProduction();
|
||
wmGood.Id = SnowFlakeSingle.Instance.NextId().ToString();
|
||
|
||
string flow = resultionPackage.PatchCode.Split('_')[1];
|
||
int flow_num = 0;
|
||
try
|
||
{
|
||
flow_num = Convert.ToInt32(flow);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
flow_num = -1;
|
||
}
|
||
|
||
wmGood.PackageCode = Getpack_no(resultionPackage.WorkoderID, flow_num.ToString("000"));
|
||
wmGood.PackageCodeClient = resultionPackage.PatchCode;
|
||
wmGood.Partnumber = resultionPackage.PartNumner;
|
||
wmGood.PackageCodeOriginal = resultionPackage.originalCode;
|
||
|
||
wmGood.LocationCode = wmgoods.location;
|
||
|
||
string workorder_id = resultionPackage.WorkoderID;
|
||
|
||
|
||
//wmGood.GoodsNumLogic = Context.Queryable<WmPackingrecord>()
|
||
// .Where(it => it.WorkOrderNum == workorder_id)
|
||
// .Count();
|
||
|
||
wmGood.GoodsNumLogic = (resultionPackage.Quantity) ?? 0;
|
||
wmGood.GoodsNumAction = wmGood.GoodsNumLogic;
|
||
wmGood.EntryWarehouseTime = DateTime.Now;
|
||
wmGood.CreatedBy = createName;
|
||
wmGood.CreatedTime = DateTime.Now;
|
||
preparegoodsList.Add(wmGood);
|
||
|
||
|
||
}
|
||
|
||
}
|
||
|
||
int result = Context.Insertable(preparegoodsList).ExecuteCommand();
|
||
return result;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 获取mes的箱子码
|
||
/// </summary>
|
||
/// <param name="workordorid">工单</param>
|
||
/// <param name="flow">序号</param>
|
||
/// <returns></returns>
|
||
private string Getpack_no(string workordorid, string flow)
|
||
{
|
||
|
||
|
||
WmPackingrecord record = Context.Queryable<WmPackingrecord>()
|
||
.Where(it => it.WorkOrderNum == workordorid)
|
||
.Where(it => it.PackingCode.EndsWith(flow))
|
||
.First();
|
||
|
||
|
||
if (record == null)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
return record.ProductCode;
|
||
}
|
||
|
||
//3 判断箱子是否满
|
||
public bool isFullPackage(string production_packcode)
|
||
{
|
||
ResultionPackageCodeDto Identity = ResolutionPackagecode(production_packcode);
|
||
if (Identity == null)
|
||
{
|
||
return false;
|
||
}
|
||
string packingCode = Identity.PatchCode.Split('_')[1];
|
||
|
||
|
||
bool isExist = Context.Queryable<WmPackingrecord>()
|
||
.Where(it => it.WorkOrderNum == Identity.WorkoderID)
|
||
.Where(it => it.PackingCode.EndsWith(packingCode))
|
||
.Where(it => it.BFilled == true)
|
||
.Any();
|
||
|
||
|
||
|
||
return isExist;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 2 判断是否为成品箱子码
|
||
/// </summary>
|
||
/// <param name="production_packcode"></param>
|
||
/// <returns></returns>
|
||
public int isProductionPackage(string production_packcode)
|
||
{
|
||
|
||
|
||
Regex r = new Regex("Code=BNW\\d{9}_\\d{0,3}");
|
||
|
||
|
||
//todo 不是箱子
|
||
if (!r.IsMatch(production_packcode))
|
||
{
|
||
return 2;
|
||
}
|
||
|
||
|
||
ResultionPackageCodeDto Identity = ResolutionPackagecode(production_packcode);
|
||
if (Identity == null)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
string packingCode = Identity.PatchCode.Split('_')[1];
|
||
|
||
|
||
|
||
|
||
bool isExist = Context.Queryable<WmPackingrecord>()
|
||
.Where(it => it.WorkOrderNum == Identity.WorkoderID)
|
||
.Where(it => it.PackingCode.EndsWith(packingCode))
|
||
.Any();
|
||
if (!isExist)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
return 1;
|
||
|
||
}
|
||
//1 判断是否为库位码
|
||
bool IWMentryWarehousing_productService.IsProductionLoacation(string production_location_code)
|
||
{
|
||
|
||
return Context.Queryable<WmInfo>().Where(it => it.WarehouseNum == 1)
|
||
.Where(it => it.Location.Equals(production_location_code)).Any();
|
||
|
||
}
|
||
|
||
|
||
//获取库位已经存在的货物
|
||
public List<WmGoodsNowProduction> Getpackagelist(string location)
|
||
{
|
||
return Context.Queryable<WmGoodsNowProduction>().Where(it => it.LocationCode == location).ToList();
|
||
|
||
}
|
||
|
||
|
||
|
||
//解析外箱标签码
|
||
public ResultionPackageCodeDto ResolutionPackage(string code)
|
||
{
|
||
// 初步进行解析检测,增加解析成功率
|
||
string[] splitstr = code.Split('^');
|
||
if (splitstr.Length < 1)
|
||
{
|
||
return null;
|
||
}
|
||
// 第一类
|
||
if (splitstr[0].Contains("Code="))
|
||
{
|
||
return ResolutionPackagecode1(code);
|
||
}
|
||
// 第二类
|
||
if (splitstr[3].Contains("Cd="))
|
||
{
|
||
return ResolutionPackagecode2(code);
|
||
}
|
||
// 解析失败
|
||
return null;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 判断箱子是否在成品库中
|
||
/// </summary>
|
||
/// <param name="PatchCode"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="NotImplementedException"></exception>
|
||
public bool IsExistedWarehouse(string originalCode)
|
||
{
|
||
ResultionPackageCodeDto resultionPackage = ResolutionPackage(originalCode);
|
||
|
||
return Context.Queryable<WmGoodsNowProduction>().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any();
|
||
}
|
||
|
||
|
||
// 检查是否可入库(ok 可入库,其余返回情况)
|
||
public string checkWarehousing(string production_packcode, string location, bool isStrict)
|
||
{
|
||
if (string.IsNullOrEmpty(production_packcode))
|
||
{
|
||
return "扫描结果为空!";
|
||
}
|
||
// 1.判断能否解析
|
||
ResultionPackageCodeDto resultionPackage = ResolutionPackage(production_packcode);
|
||
if (resultionPackage == null)
|
||
{
|
||
return "标签解析异常!";
|
||
}
|
||
// 2.判断是否已入库
|
||
bool isExistedWarehouse = Context.Queryable<WmGoodsNowProduction>().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any();
|
||
if (isExistedWarehouse)
|
||
{
|
||
return "该箱号已入库!";
|
||
}
|
||
// 提取库位信息
|
||
WmInfo wmInfo = Context.Queryable<WmInfo>().Where(it => it.Location == location).First();
|
||
if (wmInfo == null)
|
||
{
|
||
return "库位参数异常";
|
||
}
|
||
if (isStrict && wmInfo.Remark != "临时")
|
||
{
|
||
// 3.isStrict = TRUE时判断是否是满箱标签
|
||
string packingCode = resultionPackage.PatchCode.Split('_')[1];
|
||
bool isExist = Context.Queryable<WmPackingrecord>()
|
||
.Where(it => it.WorkOrderNum == resultionPackage.WorkoderID)
|
||
.Where(it => it.PackingCode.EndsWith(packingCode))
|
||
.Where(it => it.BFilled == true)
|
||
.Any();
|
||
if (!isExist)
|
||
{
|
||
return "该标签不为满箱标签!请入临时仓库!";
|
||
}
|
||
// 4.isStrict = TRUE时判断能否追溯
|
||
string flow = resultionPackage.PatchCode.Split('_')[1];
|
||
int flow_num = 0;
|
||
try
|
||
{
|
||
flow_num = Convert.ToInt32(flow);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
flow_num = -1;
|
||
}
|
||
//mes追溯码
|
||
string PackageCode = Getpack_no(resultionPackage.WorkoderID, flow_num.ToString("000"));
|
||
if (PackageCode == null)
|
||
{
|
||
return "该标签不可追溯!请入临时仓库!";
|
||
}
|
||
}
|
||
return "ok";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 最早版本解析外箱标签码
|
||
/// </summary>
|
||
/// <param name="packagecode"></param>
|
||
/// <returns></returns>
|
||
private ResultionPackageCodeDto ResolutionPackagecode(string packagecode)
|
||
{
|
||
ResultionPackageCodeDto resultionPackageCode = new ResultionPackageCodeDto();
|
||
try
|
||
{
|
||
resultionPackageCode.originalCode = packagecode;
|
||
// todo 解析外箱标签码
|
||
string[] splitstr = packagecode.Split('^');
|
||
resultionPackageCode.PatchCode = splitstr[0].Substring(5);
|
||
//todo 解析零件号
|
||
string partnumber = splitstr[1].Substring(11);
|
||
//int length = lingshi.Length - 2;
|
||
//string partnumber = lingshi.Substring(0, length);
|
||
resultionPackageCode.PartNumner = partnumber;
|
||
//todo 解析工单号
|
||
string workoderidid = splitstr[2].Substring(7);
|
||
resultionPackageCode.WorkoderID = workoderidid;
|
||
//todo 生产时间
|
||
resultionPackageCode.ProductionTime = "20" + workoderidid.Substring(0, 6);
|
||
//todo 解析箱子中产品数量
|
||
string product_num = splitstr[3].Substring(4);
|
||
resultionPackageCode.Quantity = int.Parse(product_num);
|
||
//todo 产品描述 partnumber
|
||
ProWorkorder_v2 workorder = Context.Queryable<ProWorkorder_v2>()
|
||
.Where(it => it.FinishedPartNumber == partnumber)
|
||
.First();
|
||
if (workorder != null)
|
||
{
|
||
resultionPackageCode.ProductionDescribe = workorder.ProductDescription;
|
||
}
|
||
else
|
||
{
|
||
resultionPackageCode.ProductionDescribe = "生产工单无此零件号";
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.Error($"外箱标签码,解析失败 {ex.Message}");
|
||
return null;
|
||
}
|
||
|
||
return resultionPackageCode;
|
||
}
|
||
/// <summary>
|
||
/// 1-解析鲨鱼鳍外箱标签码
|
||
/// </summary>
|
||
/// <param name="packagecode"></param>
|
||
/// <returns></returns>
|
||
private ResultionPackageCodeDto ResolutionPackagecode1(string packagecode)
|
||
{
|
||
ResultionPackageCodeDto resultionPackageCode = new ResultionPackageCodeDto();
|
||
try
|
||
{
|
||
resultionPackageCode.originalCode = packagecode;
|
||
// 解析外箱标签码
|
||
string[] splitstr = packagecode.Split('^');
|
||
// 解析批次号
|
||
resultionPackageCode.PatchCode = splitstr[0].Substring(5);
|
||
// 解析零件号
|
||
string partnumber = splitstr[1].Substring(11);
|
||
// 有的零件号带了-FL,不是很标准
|
||
resultionPackageCode.PartNumner = partnumber;
|
||
// 解析工单号 工单号会带个W,需要去掉
|
||
string workoderidid = splitstr[2].Substring(7);
|
||
resultionPackageCode.WorkoderID = workoderidid;
|
||
// 解析生产时间 工单号生产时间提取
|
||
resultionPackageCode.ProductionTime = string.Concat("20", workoderidid.AsSpan(0, 6));
|
||
// 解析箱子中产品数量
|
||
string product_num = splitstr[3].Substring(4);
|
||
resultionPackageCode.Quantity = int.Parse(product_num);
|
||
// 解析产品描述 partnumber 从物料列表抓取数据
|
||
WmMaterial material = Context.Queryable<WmMaterial>().Where(it => it.Partnumber == partnumber).First();
|
||
if (material == null)
|
||
{
|
||
resultionPackageCode.ProductionDescribe = "物料记录未录入此零件号信息!";
|
||
return resultionPackageCode;
|
||
}
|
||
string des1 = material.Description;
|
||
string des2 = material.ProductName;
|
||
if (string.IsNullOrEmpty(des1))
|
||
{
|
||
resultionPackageCode.ProductionDescribe = des1;
|
||
}
|
||
if (string.IsNullOrEmpty(des2))
|
||
{
|
||
resultionPackageCode.ProductionDescribe = des2;
|
||
}
|
||
return resultionPackageCode;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.Error($"外箱标签码,解析失败 {ex.Message}");
|
||
return null;
|
||
}
|
||
}
|
||
// 2-解析门把手
|
||
private ResultionPackageCodeDto ResolutionPackagecode2(string packagecode)
|
||
{
|
||
ResultionPackageCodeDto resultionPackageCode = new ResultionPackageCodeDto();
|
||
try
|
||
{
|
||
// 原始编码
|
||
resultionPackageCode.originalCode = packagecode;
|
||
// 解析外箱标签码
|
||
string[] splitstr = packagecode.Split('^');
|
||
// 解析批次号
|
||
resultionPackageCode.PatchCode = splitstr[3].Substring(3);
|
||
// 解析零件号
|
||
string partnumber = splitstr[4].Substring(3);
|
||
resultionPackageCode.PartNumner = partnumber;
|
||
// 解析工单号
|
||
string workoderidid = splitstr[3].Substring(6, 6);
|
||
resultionPackageCode.WorkoderID = workoderidid;
|
||
// 生产时间
|
||
resultionPackageCode.ProductionTime = "20" + workoderidid.Substring(0, 6);
|
||
//todo 解析箱子中产品数量
|
||
string product_num = splitstr[5].Substring(3);
|
||
resultionPackageCode.Quantity = int.Parse(product_num);
|
||
// 解析产品描述 partnumber 从物料列表抓取数据
|
||
WmMaterial material = Context.Queryable<WmMaterial>().Where(it => it.Partnumber == partnumber).First();
|
||
if (material == null)
|
||
{
|
||
resultionPackageCode.ProductionDescribe = "物料记录未录入此零件号信息!";
|
||
return resultionPackageCode;
|
||
}
|
||
string des1 = material.Description;
|
||
string des2 = material.ProductName;
|
||
if (!string.IsNullOrEmpty(des1))
|
||
{
|
||
resultionPackageCode.ProductionDescribe = des1;
|
||
}
|
||
else if (!string.IsNullOrEmpty(des2))
|
||
{
|
||
resultionPackageCode.ProductionDescribe = des2;
|
||
}
|
||
else
|
||
{
|
||
resultionPackageCode.ProductionDescribe = "物料记录内未填写详情信息!";
|
||
}
|
||
return resultionPackageCode;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.Error($"外箱标签码,解析失败 {ex.Message}");
|
||
return null;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|