Files
shgx_tz_mes_backend_sync/ZR.Service/mes/wms/WmGoodsActionService.cs

370 lines
16 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 SqlSugar;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using ZR.Model;
using ZR.Model.Dto;
using ZR.Model.MES.wms;
using ZR.Repository;
using ZR.Service.Business.IBusinessService;
using System.Linq;
using ZR.Service.mes.wms.IService;
using ZR.Model.MES.wms.Dto;
using System.Text.Json;
using MimeKit.Utils;
using System.Collections.Generic;
using Org.BouncyCastle.Crypto;
namespace ZR.Service.Business
{
/// <summary>
/// 仓库操作日志Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IWmGoodsActionService), ServiceLifetime = LifeTime.Transient)]
public class WmGoodsActionService : BaseService<WmGoodsChangeLog>, IWmGoodsActionService
{
public WmGoodsChangeLog doConsolidationGoods(WmGoodsConsolidationDto parm)
{
List<ResultionPackageCodeDto> list = parm.PackageList;
string description = "";
// 拼箱计数器
int num = 0;
int? quantityCount = 0;
// 第二箱录入数量(限制只能输入两箱)
int secondNum = parm.secondNum;
int? secondHas = 0;
bool isDelete = false;
string secondId = "";
// 箱验证
foreach (ResultionPackageCodeDto package in list)
{
num++;
// 有第二箱录入数量的情况下只能两箱拼
if (num == 3)
{
return null;
}
WmGoodsNowProduction check1 = Context.Queryable<WmGoodsNowProduction>().Where(it => it.PackageCodeClient == package.PatchCode).First();
if (check1 == null)
{
return null;
}
if (num == 1)
{
description = "\n主箱:" + package.PatchCode+" 数量:"+ package.Quantity + ",\n次箱:";
quantityCount += package.Quantity;
continue;
}
if(num==2)
{
secondId = check1.Id;
description += package.PatchCode + " 数量:" + package.Quantity + ",";
}
// 第二箱数量为正数且比箱子总数量小
if (num == 2 && secondNum < package.Quantity && secondNum > 0)
{
isDelete = false;
secondHas = package.Quantity - secondNum;
quantityCount += secondNum;
description += "\n移动数量" + secondNum;
}
else
{
isDelete = true;
secondHas = 0;
quantityCount += package.Quantity;
description += "\n移动数量" + package.Quantity;
}
}
ResultionPackageCodeDto mainPackage = list[0];
// 短批次
string shortPatchCode = mainPackage.PatchCode.Split('_')[0];
// 该批次最后一个拼箱记录
WmGoodsNowProduction lastConsolidationPackage = Context.Queryable<WmGoodsNowProduction>()
.Where(it => it.PackageCodeClient.Contains(shortPatchCode + "_4"))
.OrderBy(it => it.PackageCodeClient, OrderByType.Desc)
.First();
string newPatchCode = shortPatchCode;
int lastCode = 400;
// 检测包装是否已打印4XX标签
// 该工单标签最大一个
var packingrecordExp = Expressionable.Create<WmPackingrecord>()
.And(it => it.WorkOrderNum == mainPackage.WorkoderID)
.And(it => it.Machine == "4")
.And(it => !it.PackingCode.Contains("Iminate"))
.ToExpression();
WmPackingrecord lastPackingrecord = Context.Queryable<WmPackingrecord>()
.Where(packingrecordExp)
.OrderBy(it=>it.PackingCode, OrderByType.Desc)
.First();
if (lastConsolidationPackage == null && lastPackingrecord == null)
{
newPatchCode += "_401";
}
else
{
int lastPackingrecordCode = 0;
// 优先处理箱打印有历史数据情况
if (lastPackingrecord != null)
{
int subIndex = lastPackingrecord.PackingCode.Length - 5;
// XXX 此代码中 AsSpan 方法 .NET Framework 4.7.2 不支持需要更高版本 或替换为 Substring
if (int.TryParse(lastPackingrecord.PackingCode.AsSpan(subIndex).TrimStart('0'), out lastPackingrecordCode))
{
}
}
if (int.TryParse(lastConsolidationPackage.PackageCodeClient.Split('_')[1], out lastCode))
{
// 取最大值
if (lastPackingrecordCode > lastCode)
{
lastCode = lastPackingrecordCode;
}
if (lastCode > 400)
{
newPatchCode += "_" + (lastCode + 1);
}
else
{
newPatchCode += "_401";
}
}
}
description += "\n拼箱结果:" + newPatchCode + " 总数量:" + quantityCount;
DateTime nowTime = DateTime.Now.ToLocalTime();
var jsonObject = new
{
packageList = list,
newPatchCode = newPatchCode,
newQuantityCount = quantityCount,
time = DateUtils.FormatDate(nowTime)
};
// 日志记录
WmGoodsChangeLog log = new()
{
CreatedBy = parm.CreateBy,
CreatedTime = nowTime,
Description = description,
JsonMsg = JsonSerializer.Serialize(jsonObject),
Type = 1
};
Context.Insertable(log).ExecuteReturnEntity();
// 执行修改
// 1.主箱查出并修改参数
WmGoodsNowProduction nowProduction = Context.Queryable<WmGoodsNowProduction>()
.Where(it => it.PackageCodeClient == mainPackage.PatchCode).First();
if (nowProduction == null)
{
return null;
}
nowProduction.UpdatedBy = parm.CreateBy;
nowProduction.UpdatedTime = nowTime;
nowProduction.PackageCodeClient = newPatchCode;
nowProduction.PackageCodeOriginal = "Code=" + newPatchCode
+ "^ItemNumber=" + nowProduction.Partnumber
+ "^Order=" + newPatchCode.Split('_')[0].Substring(2)
+ "^Qty=" + quantityCount;
nowProduction.GoodsNumLogic = quantityCount;
nowProduction.GoodsNumAction = quantityCount;
nowProduction.Remark = "拼箱整箱";
//TODO 20240422开会讨论结果拼箱完需要重新扫码入库原数据删除
Context.Deleteable<WmGoodsNowProduction>().Where(it => it.Id == nowProduction.Id).ExecuteCommand();
Context.Deleteable<WmGoodsNowProduction>().Where(it => it.Id == secondId).ExecuteCommand();
return log;
// 修改主箱
Context.Updateable(nowProduction).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
// 次箱操作
if (isDelete)
{
// 删除次箱
Context.Deleteable<WmGoodsNowProduction>().Where(it=>it.Id == secondId).ExecuteCommand();
}
else
{
// 修改次箱子
WmGoodsNowProduction nowProduction2 = Context.Queryable<WmGoodsNowProduction>()
.Where(it => it.Id == secondId).First();
if (nowProduction2 == null)
{
return null;
}
nowProduction2.UpdatedBy = parm.CreateBy;
nowProduction2.UpdatedTime = nowTime;
nowProduction2.PackageCodeOriginal = "Code=" + nowProduction2.PackageCodeClient
+ "^ItemNumber=" + nowProduction2.Partnumber
+ "^Order=" + nowProduction2.PackageCodeClient.Split('_')[0].Substring(2)
+ "^Qty=" + secondHas;
nowProduction2.GoodsNumLogic = secondHas;
nowProduction2.GoodsNumAction = secondHas;
nowProduction2.LocationCode = "LS";
nowProduction2.Remark = "拼箱零头箱";
Context.Updateable(nowProduction2).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
}
return log;
}
public WmGoodsChangeLog doUnpackingGoods(WmGoodsUnpackingDto parm)
{
string description = "";
// 待拆箱
ResultionPackageCodeDto mainPackage = parm.Package;
// 验证
WmGoodsNowProduction mainNowProduction = Context.Queryable<WmGoodsNowProduction>().Where(it => it.PackageCodeClient == mainPackage.PatchCode).First();
if (mainNowProduction == null)
{
return null;
}
description += "\n由主箱:" + mainPackage.PatchCode + " 数量:" + mainPackage.Quantity + "拆分:";
// 短批次
string shortPatchCode = mainPackage.PatchCode.Split('_')[0];
// 该批次最后一个拼箱记录
WmGoodsNowProduction lastConsolidationPackage = Context.Queryable<WmGoodsNowProduction>().Where(it => it.PackageCodeClient.Contains(shortPatchCode + "_4")).OrderBy(it => it.PackageCodeClient, OrderByType.Desc).First();
string newPatchCode1 = shortPatchCode;
string newPatchCode2 = shortPatchCode;
// 检测包装是否已打印4XX标签
// 该工单标签最大一个
var packingrecordExp = Expressionable.Create<WmPackingrecord>()
.And(it => it.WorkOrderNum == mainPackage.WorkoderID)
.And(it => it.Machine == "4")
.And(it => !it.PackingCode.Contains("Iminate"))
.ToExpression();
WmPackingrecord lastPackingrecord = Context.Queryable<WmPackingrecord>()
.Where(packingrecordExp)
.OrderBy(it => it.PackingCode, OrderByType.Desc)
.First();
int lastCode = 400;
if (lastConsolidationPackage == null && lastPackingrecord == null)
{
newPatchCode1 += "_401";
newPatchCode2 += "_402";
}
else
{
int lastPackingrecordCode = 0;
// 优先处理箱打印有历史数据情况
if (lastPackingrecord != null)
{
int subIndex = lastPackingrecord.PackingCode.Length - 5;
// XXX 此代码中 AsSpan 方法 .NET Framework 4.7.2 不支持需要更高版本 或替换为 Substring
if (int.TryParse(lastPackingrecord.PackingCode.AsSpan(subIndex).TrimStart('0'), out lastPackingrecordCode))
{
}
}
if (int.TryParse(lastConsolidationPackage.PackageCodeClient.Split('_')[1], out lastCode))
{
if(lastPackingrecordCode > lastCode)
{
lastCode = lastPackingrecordCode;
}
if (lastCode > 400)
{
newPatchCode1 += "_" + (lastCode + 1);
newPatchCode2 += "_" + (lastCode + 2);
}
else
{
newPatchCode1 += "_401";
newPatchCode2 += "_402";
}
}
}
int firstNum = parm.firstNum;
int? secondNum = mainNowProduction.GoodsNumAction - firstNum;
if (secondNum <= 0)
{
return null;
}
description += "\n拆箱结果1:" + newPatchCode1 + "数量为" + firstNum + "个";
description += "\n拆箱结果2:" + newPatchCode2 + "数量为" + secondNum + "个";
DateTime nowTime = DateTime.Now.ToLocalTime();
var jsonObject = new
{
mainPackage = mainPackage,
newPatchCode1 = newPatchCode1,
newPatchCode2 = newPatchCode2,
firstNum = firstNum,
secondNum = secondNum,
time = DateUtils.FormatDate(nowTime)
};
// 日志记录
WmGoodsChangeLog log = new()
{
CreatedBy = parm.CreateBy,
CreatedTime = nowTime,
Description = description,
JsonMsg = JsonSerializer.Serialize(jsonObject),
Type = 2
};
Context.Insertable(log).ExecuteReturnEntity();
//TODO 20240422开会讨论结果拆箱完需要重新扫码入库原主箱数据删除
Context.Deleteable<WmGoodsNowProduction>().Where(it => it.Id == mainNowProduction.Id).ExecuteCommand();
return log;
// 执行修改
// 1.主箱修改为1号分箱参数
WmGoodsNowProduction newPackage1 = mainNowProduction;
newPackage1.UpdatedBy = parm.CreateBy;
newPackage1.UpdatedTime = nowTime;
newPackage1.PackageCodeClient = newPatchCode1;
newPackage1.PackageCodeOriginal = "Code=" + newPatchCode1
+ "^ItemNumber=" + newPackage1.Partnumber
+ "^Order=" + newPatchCode1.Split('_')[0].Substring(2)
+ "^Qty=" + firstNum;
newPackage1.GoodsNumLogic = firstNum;
newPackage1.GoodsNumAction = firstNum;
newPackage1.Remark = "拆箱";
// 修改主箱
Context.Updateable(newPackage1).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
// 2.添加一个分箱
WmGoodsNowProduction newPackage2 = mainNowProduction;
newPackage2.CreatedBy = parm.CreateBy;
newPackage2.CreatedTime = nowTime;
newPackage2.PackageCodeClient = newPatchCode2;
newPackage2.PackageCodeOriginal = "Code=" + newPatchCode2
+ "^ItemNumber=" + newPackage2.Partnumber
+ "^Order=" + newPatchCode2.Split('_')[0].Substring(2)
+ "^Qty=" + secondNum;
newPackage2.GoodsNumLogic = secondNum;
newPackage2.GoodsNumAction = secondNum;
newPackage2.Remark = "拆箱";
newPackage2.Id = SnowFlakeSingle.Instance.NextId().ToString();
// 添加分箱
Context.Insertable(newPackage2).ExecuteCommand();
return log;
}
// 添加包装箱标签记录(暂不使用)
public void AddPackingrecord(WmGoodsNowProduction production,string workOrderId, bool isFill = false)
{
try
{
if(int.TryParse(production.PackageCodeClient.Split('_')[1], out int packageNum)) {
WmPackingrecord packingrecord = new()
{
PartNum = production.Partnumber,
Machine = "4",
ProductCode = "Iminate_P_0",
PackingCode = workOrderId + packageNum.ToString("00000"),
ScannerContent = production.PackageCodeOriginal,
WorkOrderNum = workOrderId,
BFilled = isFill,
CreateTime = DateTime.Now,
};
Context.Insertable(packingrecord).ExecuteCommand();
}
else
{
throw new Exception("包装箱标签批次号数量解析失败!");
}
}
catch (Exception ex)
{
throw new Exception("包装箱标签插入失败!" + ex);
}
}
}
}