仓库-入库解析标签功能添加,添加一个综合判断是否能入库的接口

This commit is contained in:
赵正易 2024-03-27 14:33:11 +08:00
parent 1da4023e71
commit a980a980a0
5 changed files with 297 additions and 129 deletions

View File

@ -1,15 +1,8 @@
using Infrastructure.Extensions;
using JinianNet.JNTemplate;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using Microsoft.AspNetCore.Mvc;
using ZR.Admin.WebApi.Extensions;
using ZR.Model.Dto;
using ZR.Model.MES.qu;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
using ZR.Service.mes.wms.IService;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ZR.Admin.WebApi.Controllers.mes.wms
{
@ -26,6 +19,8 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms
this.wm_entryWarehousing_productService = wm_entryWarehousing_productService;
}
/// <summary>
/// 1. 判断是否为库位码
/// </summary>
@ -92,7 +87,8 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms
if (state)
{
msg = "满箱";
}else
}
else
{
msg = "零头箱";
}
@ -125,7 +121,7 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms
}
else if (num >= 1)
{
msg = "成功入库"+num+"个";
msg = "成功入库" + num + "个";
}
@ -164,6 +160,10 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms
return ToResponse(new ApiResult(200, "传入为空", false));
}
ResultionPackageCodeDto data = this.wm_entryWarehousing_productService.ResolutionPackage(code);
if (data == null)
{
return ToResponse(new ApiResult(500, "外标签解析异常", data));
}
return ToResponse(new ApiResult(200, "success", data));
}
@ -196,7 +196,28 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms
}
/// <summary>
/// all.判断标签扫描结果是否可入库(综合结果判断)
/// </summary>
/// <returns></returns>
[HttpGet("checkWarehousing")]
[Log(Title = "判断标签扫描结果是否可入库")]
public IActionResult CheckWarehousing(string production_packcode = "", string location = "",
bool isStrict = false)
{
string msg = this.wm_entryWarehousing_productService.checkWarehousing(production_packcode, location, isStrict);
if ("ok".Equals(msg))
{
// 可入库
return ToResponse(new ApiResult(200, msg, true));
}
else
{
// 不可入库
return ToResponse(new ApiResult(200, msg, false));
}
}
}
}

View File

@ -1,12 +1,9 @@
using Microsoft.AspNetCore.Mvc;
using ZR.Model.Dto;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Service.mes.wms.IService;
using ZR.Model.MES.wms.Dto;
using ZR.Model.MES.wms;
using Org.BouncyCastle.Crypto;
using ZR.Model.MES.wms.Dto;
using ZR.Service.mes.wms.IService;
//创建时间2024-03-16
namespace ZR.Admin.WebApi.Controllers
@ -115,7 +112,7 @@ namespace ZR.Admin.WebApi.Controllers
{
return SUCCESS(null);
}
WmGoodsNowProduction nowProduction= _WmMaterialService.GetInfoByPatchCode(patchCode);
WmGoodsNowProduction nowProduction = _WmMaterialService.GetInfoByPatchCode(patchCode);
return SUCCESS(nowProduction);
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ZR.Model.MES.wms.Dto
namespace ZR.Model.MES.wms.Dto
{
public class ResultionPackageCodeDto
{
@ -13,9 +7,14 @@ namespace ZR.Model.MES.wms.Dto
/// </summary>
public string originalCode { get; set; }
/// <summary>
/// 批次号(工单号+箱子号)
/// 批次号(工单号+箱子号+班组)
/// </summary>
public string PatchCode { get; set; }
/// <summary>
/// 班组
/// </summary>
public string Team { get; set; }
/// <summary>
/// 零件号
/// </summary>

View File

@ -1,19 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZR.Model.MES.qc.DTO;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
using static Org.BouncyCastle.Crypto.Engines.SM2Engine;
namespace ZR.Service.mes.wms.IService
{
public interface IWMentryWarehousing_productService
{
// 判断是否可以入库(入参为扫描结果)(附加参数bol 是否严格控制模式)
public string checkWarehousing(string production_packcode, string location, bool isStrict);
// 获取库位列表
public bool IsProductionLoacation(string production_location_code);

View File

@ -1,23 +1,12 @@
using Aliyun.OSS;
using Infrastructure.Attribute;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Model.DBModel;
using Infrastructure.Attribute;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using ZR.Model.mes.pro;
using ZR.Model.MES.pro;
using ZR.Model.MES.qu;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
using ZR.Service.mes.qc.IService;
using ZR.Service.mes.wms.IService;
using static Org.BouncyCastle.Crypto.Engines.SM2Engine;
namespace ZR.Service.mes.wms
{
@ -38,7 +27,7 @@ namespace ZR.Service.mes.wms
for (int i = 0; i < wmgoods.packagelist.Count(); i++)
{
ResultionPackageCodeDto resultionPackage= ResolutionPackagecode(wmgoods.packagelist[i]);
ResultionPackageCodeDto resultionPackage = ResolutionPackagecode(wmgoods.packagelist[i]);
WmGoodsNowProduction wmGood = new WmGoodsNowProduction();
wmGood.Id = SnowFlakeSingle.Instance.NextId().ToString();
@ -47,7 +36,8 @@ namespace ZR.Service.mes.wms
try
{
flow_num = Convert.ToInt32(flow);
}catch(Exception ex)
}
catch (Exception ex)
{
flow_num = -1;
}
@ -66,8 +56,8 @@ namespace ZR.Service.mes.wms
// .Where(it => it.WorkOrderNum == workorder_id)
// .Count();
wmGood.GoodsNumLogic = (resultionPackage.Quantity)??0;
wmGood.GoodsNumAction= wmGood.GoodsNumLogic;
wmGood.GoodsNumLogic = (resultionPackage.Quantity) ?? 0;
wmGood.GoodsNumAction = wmGood.GoodsNumLogic;
wmGood.EntryWarehouseTime = DateTime.Now;
wmGood.CreatedBy = createName;
wmGood.CreatedTime = DateTime.Now;
@ -191,75 +181,29 @@ namespace ZR.Service.mes.wms
}
/// <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
// ProWorklplan_v2 plan= Context.Queryable<ProWorklplan_v2>().Where(it => it.Partnumber == partnumber).First();
//if(plan != null)
// {
// resultionPackageCode.ProductionDescribe = plan.ProductName;
// }
// else
// {
// resultionPackageCode.ProductionDescribe = "生产计划无此零件号";
// }
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 resultionPackageCode;
}
//解析外箱标签码
public ResultionPackageCodeDto ResolutionPackage(string code)
{
return ResolutionPackagecode(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;
}
@ -271,9 +215,223 @@ namespace ZR.Service.mes.wms
/// <exception cref="NotImplementedException"></exception>
public bool IsExistedWarehouse(string originalCode)
{
ResultionPackageCodeDto resultionPackage= ResolutionPackagecode(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;
}
}
}
}