Files
shanghaigangxiangtuzhuangMES/ZR.Service/mes/wms/WMentryWarehousing_productService.cs

477 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Text.RegularExpressions;
using Infrastructure.Attribute;
using SqlSugar;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
using ZR.Service.mes.wms.IService;
using ZR.Service.Utils;
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)
{
try
{
Context.Ado.BeginTran();
List<WmGoodsNowProduction> preparegoodsList = new();
string location = wmgoods.location;
if (string.IsNullOrEmpty(wmgoods.location))
{
location = "LS";
}
string[] packageArray = wmgoods.packagelist;
if (packageArray == null || packageArray.Length <= 0)
{
Context.Ado.RollbackTran();
throw new Exception("无入库箱,请检查传入数据!");
}
// 入库去重检查
string[] newPacakgeArray = packageArray.Distinct().ToArray();
if (packageArray.Length != newPacakgeArray.Length)
{
Context.Ado.RollbackTran();
throw new Exception("入库箱有重复,实际箱数:" + newPacakgeArray.Length);
}
// 统计记录
List<string> partnumbers = new();
int totalPackage = 0;
int totalPartnumber = 0;
List<string> packageCodeRemark = new();
for (int i = 0; i < packageArray.Length; i++)
{
// 解析箱标签
ResultionPackageCodeDto resultionPackage = ResolutionPackage(packageArray[i]);
if (resultionPackage == null)
{
Context.Ado.RollbackTran();
throw new Exception("其中一箱外标签解析失败,第" + (i + 1) + "箱");
}
// 入库时查出此批次号箱已入库,则报警提示
bool hasWarehouse = Context
.Queryable<WmGoodsNowProduction>()
.Where(it => it.PackageCodeClient == resultionPackage.PatchCode)
.Any();
if (hasWarehouse)
{
Context.Ado.RollbackTran();
throw new Exception("箱" + resultionPackage.PatchCode + "已在库中,不可重复入库!");
}
// 通过校验,插入入库数据
totalPackage++;
totalPartnumber += resultionPackage.Quantity ?? 0;
packageCodeRemark.Add(resultionPackage.PatchCode);
WmGoodsNowProduction wmGood = new WmGoodsNowProduction
{
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"))
?? "Iminate";
wmGood.PackageCodeClient = resultionPackage.PatchCode;
wmGood.Partnumber = resultionPackage.PartNumner;
if (!partnumbers.Contains(wmGood.Partnumber))
{
partnumbers.Add(wmGood.Partnumber);
}
wmGood.PackageCodeOriginal = resultionPackage.originalCode;
wmGood.LocationCode = location;
string workorder_id = resultionPackage.WorkoderID;
wmGood.GoodsNumLogic = (resultionPackage.Quantity) ?? 0;
wmGood.GoodsNumAction = wmGood.GoodsNumLogic;
wmGood.EntryWarehouseTime = DateTime.Now;
wmGood.CreatedBy = createName;
wmGood.CreatedTime = DateTime.Now;
preparegoodsList.Add(wmGood);
}
// 修改入库检验 为入库完成 WmFgentryInspect
if (preparegoodsList != null && preparegoodsList.Count > 0)
{
foreach (var preparegood in preparegoodsList)
{
if (!string.IsNullOrEmpty(preparegood.PackageCode))
{
Context
.Updateable<WmFgentryInspect>()
.SetColumns(it => it.Bitwm == 1)
.Where(it => it.Packcode == preparegood.PackageCode)
.ExecuteCommand();
}
}
}
int result = Context.Insertable(preparegoodsList).ExecuteCommand();
if (result == 0)
{
Context.Ado.RollbackTran();
throw new Exception("入库记录插入失败");
}
packageCodeRemark.Sort();
// 插入记录
WmGoodsRecord record =
new()
{
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkInventoryId = SnowFlakeSingle.Instance.NextId().ToString(),
Code = "IntoProductwarehouse",
Partnumber = partnumbers[0] ?? "无零件号",
BlankNum = "",
ChangeType = 1,
ChangeQuantity = totalPartnumber,
ActionTime = DateTime.Now,
Status = 1,
Remark =
"货物入库"
+ "\n仓库号:"
+ location
+ "\n零件号:"
+ string.Join(',', partnumbers)
+ "\n总箱数:"
+ totalPackage
+ "\n总零件数:"
+ totalPartnumber
+ "\n涉及批次号:\n"
+ string.Join(',', packageCodeRemark),
CreatedBy = createName,
CreatedTime = DateTime.Now,
};
int recordNum = Context.Insertable(record).ExecuteCommand();
if (recordNum == 0)
{
Context.Ado.RollbackTran();
throw new Exception("操作记录插入失败");
}
Context.Ado.CommitTran();
return result;
}
catch (Exception e)
{
Context.Ado.RollbackTran();
throw new Exception(e.Message);
}
}
/// <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 = ResolutionPackage(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 = ResolutionPackage(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)
{
try
{
MaterialUtils materialToos = new MaterialUtils();
ResultionPackageCodeDto packageCodeDto = materialToos.ResolutionPackage(code);
if (packageCodeDto == null)
{
return null;
}
string SerialNumber = packageCodeDto.PatchCode.Split('_')[1] ?? "000";
WmPackageLcl packageLcl = Context
.Queryable<WmPackageLcl>()
.Where(it => it.WorkOrderId == packageCodeDto.WorkoderID)
.Where(it => it.SerialNumber == SerialNumber)
.OrderByDescending(it => it.CreatedTime)
.First();
if (packageLcl != null)
{
// 拼箱
if (packageLcl.Type == 1)
{
packageCodeDto.Remark = "标签最后涉及拼箱";
}
// 拆箱
else if (packageLcl.Type == 2)
{
packageCodeDto.Remark = "标签最后涉及拆箱";
}
}
return packageCodeDto;
}
catch (Exception ex)
{
throw new Exception("格式化异常:" + ex.Message);
}
/*// 初步进行解析检测,增加解析成功率
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)
{
try
{
if (string.IsNullOrEmpty(production_packcode))
{
return "扫描结果为空!";
}
// 1.判断能否解析
ResultionPackageCodeDto resultionPackage = ResolutionPackage(production_packcode);
if (resultionPackage == null)
{
return "标签解析异常!";
}
// 2.1判断是否已入库
bool isExistedWarehouse = Context
.Queryable<WmGoodsNowProduction>()
.Where(it => it.PackageCodeClient == resultionPackage.PatchCode)
.Any();
if (isExistedWarehouse)
{
return "该箱号已入库!";
}
// 2.2判断是否有出库记录
bool isoutWarehouse = Context
.Queryable<WmGoodsOutRecord>()
.Where(it => it.PackageCodeClient == resultionPackage.PatchCode)
.Any();
if (isoutWarehouse)
{
return "该箱号已有出库记录,需要删除后再入库!";
}
// 提取库位信息
WmInfo wmInfo = Context
.Queryable<WmInfo>()
.Where(it => it.Location == location)
.First();
if (wmInfo == null)
{
return "库位参数异常,库位不存在";
}
//TODO 后道标签直接跳过检查
if (resultionPackage.originalCode.Contains("LabelBy=HD"))
{
isStrict = false;
}
if (isStrict && wmInfo.Remark != "临时")
{
// 3. 提取流水号
string patchCodePart = resultionPackage.PatchCode.Split("_")[1];
// 直接在 int.TryParse 中处理转换,并在一行内完成默认值设置
int package_no = int.TryParse(patchCodePart, out var temp) ? temp : -1;
// 3.1 isStrict = TRUE 时判断是否是满箱标签
WmPackingrecord recourd = Context
.Queryable<WmPackingrecord>()
.Where(it => it.WorkOrderNum == resultionPackage.WorkoderID)
// .Where(it => it.PackingCode.EndsWith(packingCode))
// .Where(it => packingCode == int.Parse(it.PackingCode.Substring(7)).ToString())
.Where(it =>
package_no == int.Parse(SqlFunc.Right(it.PackingCode, 5))
)
.Where(it => it.BFilled == true)
.First();
if (recourd == null)
{
return "该标签不为满箱标签!请入临时仓库!";
}
//3.2 GP12检测
var inspect = Context
.Queryable<WmFgentryInspect>()
.Where(it => it.Workorder == resultionPackage.WorkoderID)
.Where(it =>
package_no == int.Parse(SqlFunc.Right(it.Packcode, 5))
)
//.Where(it => it.Packcode.EndsWith(package_no))
.OrderByDescending(it => it.CreatedTime)
.First();
// XXX 添加校验如果是编号为4号的打印机打出来的就跳过GP12满箱与测试标签校验
if (recourd.Machine != "4")
{
// 其余不变
if (inspect == null)
{
return "GP12 异常错误 GP12无此箱记录 ";
}
if (inspect.Result == 2)
{
return "该箱号GP12 检验不合格,不得入库";
}
if (inspect.Result == 0 || inspect.Result == null)
{
return "该箱号GP12 未检验,不得入库";
}
}
// 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";
}
catch (Exception e)
{
return "标签存在异常!" + e.Message;
}
}
}
}