477 lines
19 KiB
C#
477 lines
19 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|