diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WMentryWarehousing_productController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WMentryWarehousing_productController.cs index 94161311..d2a17bd9 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WMentryWarehousing_productController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WMentryWarehousing_productController.cs @@ -104,27 +104,35 @@ namespace ZR.Admin.WebApi.Controllers.mes.wms [Log(Title = "入库")] public IActionResult IntoProductwarehouse([FromBody] WmgoodsDto wmgoodsDto) { - if (wmgoodsDto == null) + try { - return ToResponse(new ApiResult(200, "传入为空", false)); - } - string msg = ""; + if (wmgoodsDto == null) + { + return ToResponse(new ApiResult(200, "传入参数为空", false)); + } + string msg = ""; - string createName = HttpContext.GetName(); - int num = this.wm_entryWarehousing_productService.IntoProductwarehouse(wmgoodsDto, createName); - if (num == 0) + string createName = HttpContext.GetName(); + int num = this.wm_entryWarehousing_productService.IntoProductwarehouse(wmgoodsDto, createName); + if (num == 0) + { + msg = "入库数为0!"; + + + } + else if (num >= 1) + { + msg = "成功入库" + num + "箱"; + + + } + return ToResponse(new ApiResult(200, msg, num)); + } + catch (Exception e) { - msg = "数据插入异常"; - - + return ToResponse(new ApiResult(500, e.Message, e.Message)); } - else if (num >= 1) - { - msg = "成功入库" + num + "个"; - - - } - return ToResponse(new ApiResult(200, msg, num)); + } diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsRecordController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsRecordController.cs new file mode 100644 index 00000000..cd80987f --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsRecordController.cs @@ -0,0 +1,107 @@ +using Microsoft.AspNetCore.Mvc; +using ZR.Admin.WebApi.Extensions; +using ZR.Admin.WebApi.Filters; +using ZR.Model.MES.wms; +using ZR.Model.MES.wms.Dto; +using ZR.Service.mes.wms.IService; + +//创建时间:2024-08-05 +namespace ZR.Admin.WebApi.Controllers +{ + /// + /// 成品库数据变动表 + /// + // [Verify] + [Route("/mes/wm/WmGoodsRecord")] + public class WmGoodsRecordController : BaseController + { + /// + /// 成品库数据变动表接口 + /// + private readonly IWmGoodsRecordService _WmGoodsRecordService; + + public WmGoodsRecordController(IWmGoodsRecordService WmGoodsRecordService) + { + _WmGoodsRecordService = WmGoodsRecordService; + } + + /// + /// 查询成品库数据变动表列表 + /// + /// + /// + [HttpGet("list")] + [ActionPermissionFilter(Permission = "business:wmgoodsrecord:list")] + public IActionResult QueryWmGoodsRecord([FromQuery] WmGoodsRecordQueryDto parm) + { + var response = _WmGoodsRecordService.GetList(parm); + return SUCCESS(response); + } + + /// + /// 查询成品库数据变动表详情 + /// + /// + /// + [HttpGet("{Id}")] + [ActionPermissionFilter(Permission = "business:wmgoodsrecord:query")] + public IActionResult GetWmGoodsRecord(string Id) + { + var response = _WmGoodsRecordService.GetInfo(Id); + + var info = response.Adapt(); + return SUCCESS(info); + } + + /// + /// 添加成品库数据变动表 + /// + /// + [HttpPost] + [ActionPermissionFilter(Permission = "business:wmgoodsrecord:add")] + [Log(Title = "成品库数据变动表", BusinessType = BusinessType.INSERT)] + public IActionResult AddWmGoodsRecord([FromBody] WmGoodsRecordDto parm) + { + var modal = parm.Adapt().ToCreate(HttpContext); + + var response = _WmGoodsRecordService.AddWmGoodsRecord(modal); + + return SUCCESS(response); + } + + /// + /// 更新成品库数据变动表 + /// + /// + [HttpPut] + [ActionPermissionFilter(Permission = "business:wmgoodsrecord:edit")] + [Log(Title = "成品库数据变动表", BusinessType = BusinessType.UPDATE)] + public IActionResult UpdateWmGoodsRecord([FromBody] WmGoodsRecordDto parm) + { + var modal = parm.Adapt().ToUpdate(HttpContext); + var response = _WmGoodsRecordService.UpdateWmGoodsRecord(modal); + + return ToResponse(response); + } + + /// + /// 删除成品库数据变动表 + /// + /// + [HttpDelete("{ids}")] + [ActionPermissionFilter(Permission = "business:wmgoodsrecord:delete")] + [Log(Title = "成品库数据变动表", BusinessType = BusinessType.DELETE)] + public IActionResult DeleteWmGoodsRecord(string ids) + { + int[] idsArr = Tools.SpitIntArrary(ids); + if (idsArr.Length <= 0) + { + return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); + } + + var response = _WmGoodsRecordService.Delete(idsArr); + + return ToResponse(response); + } + } +} diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmOutOrderController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmOutOrderController.cs index 14ab2c85..7ff1faff 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmOutOrderController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmOutOrderController.cs @@ -39,7 +39,6 @@ namespace ZR.Admin.WebApi.Controllers return SUCCESS(response); } - /// /// 查询出货单(物料+客户)详情 /// @@ -100,9 +99,10 @@ namespace ZR.Admin.WebApi.Controllers [Log(Title = "出货单(物料+客户)", BusinessType = BusinessType.DELETE)] public IActionResult DeleteWmOutOrder(string ids) { - - if (string.IsNullOrEmpty(ids)) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } - + if (string.IsNullOrEmpty(ids)) + { + return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); + } var response = _WmOutOrderService.Delete(ids.Split(",")); // 删除外键 物料清单 @@ -128,15 +128,12 @@ namespace ZR.Admin.WebApi.Controllers /// /// [HttpGet("getmaterial_list")] - public IActionResult QueryWmMaterial([FromQuery] WmMaterialQueryDto parm) { var response = _WmOutOrderService.GetmaterialList(parm); return SUCCESS(response); } - - /// /// 生成出货单的物料信息 /// @@ -147,13 +144,13 @@ namespace ZR.Admin.WebApi.Controllers if (shipment_num == null) { return SUCCESS(null); - } - List data = _WmOutOrderService.Queryoutoder_matrials(shipment_num); + List data = _WmOutOrderService.Queryoutoder_matrials( + shipment_num + ); return SUCCESS(data); } - /// /// 8.1根据出库单生成出库计划 /// @@ -168,7 +165,9 @@ namespace ZR.Admin.WebApi.Controllers } // TODO 1.返回值修改为 对象 返回是否可生成计划,计划结果:{canPlan:true,resultList:[]} // XXX 无计划返回空即可 - List WmOutOrderPlanList = _WmOutOrderService.Generate_outorderplan(shipment_num); + List WmOutOrderPlanList = _WmOutOrderService.Generate_outorderplan( + shipment_num + ); return SUCCESS(WmOutOrderPlanList); } @@ -219,6 +218,7 @@ namespace ZR.Admin.WebApi.Controllers int result = _WmOutOrderService.PersistenceOutorderplan(shipment_num); return SUCCESS(result); } + /// /// 8.5 PDA端 获取出库单的持久化存储出库计划并计算计划批次当前已出库数量 /// @@ -226,13 +226,19 @@ namespace ZR.Admin.WebApi.Controllers /// 物料号(零件号) /// [HttpGet("getOutOrderPlanAndOutProductionNum")] - public IActionResult GetOutOrderPlanAndOutProductionNum(string shipment_num, string partnumber) + public IActionResult GetOutOrderPlanAndOutProductionNum( + string shipment_num, + string partnumber + ) { if (shipment_num == null) { return ToResponse(new ApiResult(500, "传入工单号为空!", "传入工单号为空!")); } - var result = _WmOutOrderService.GetOutOrderPlanAndOutProductionNum(shipment_num, partnumber); + var result = _WmOutOrderService.GetOutOrderPlanAndOutProductionNum( + shipment_num, + partnumber + ); if (result == null) { return ToResponse(new ApiResult(500, "获取计划异常!", "获取计划异常!")); @@ -245,23 +251,28 @@ namespace ZR.Admin.WebApi.Controllers /// /// /// - /// + /// /// [HttpPost("doMaterialOut")] [Log(Title = "成品出库", BusinessType = BusinessType.INSERT)] public IActionResult DoMaterialOut([FromBody] WmDoMaterialOut_Dto doMaterialOut) { - if (doMaterialOut == null || doMaterialOut.ShipmentNum == null) + try { - return SUCCESS(null); + if (doMaterialOut == null || doMaterialOut.ShipmentNum == null) + { + return ToResponse(new ApiResult(500, "出库数据为空!", "出库数据为空!")); + } + string createName = HttpContext.GetName(); + (int, int) data = _WmOutOrderService.DoMaterialOut(doMaterialOut, createName); + return SUCCESS(data); + } + catch (Exception e) + { + return ToResponse(new ApiResult(500, "出库异常!" + e.Message, "出库异常!")); } - string createName = HttpContext.GetName(); - (int, int) data = _WmOutOrderService.DoMaterialOut(doMaterialOut, createName); - - return SUCCESS(data); } - /// /// 6 出库单完成 /// @@ -286,14 +297,22 @@ namespace ZR.Admin.WebApi.Controllers /// 出库单号 /// [HttpGet("checkProductionOut")] - public IActionResult CheckProductionOut(string partnumber, string production_packcode = "", string shipment_num = "") + public IActionResult CheckProductionOut( + string partnumber, + string production_packcode = "", + string shipment_num = "" + ) { if (string.IsNullOrEmpty(partnumber)) { return ToResponse(new ApiResult(200, "请选择物料号", false)); } string msg = ""; - msg = _WmOutOrderService.CheckProductionOut(partnumber, production_packcode, shipment_num); + msg = _WmOutOrderService.CheckProductionOut( + partnumber, + production_packcode, + shipment_num + ); if (msg != "ok") { return ToResponse(new ApiResult(200, msg, false)); @@ -303,6 +322,5 @@ namespace ZR.Admin.WebApi.Controllers return ToResponse(new ApiResult(200, msg, true)); } } - } -} \ No newline at end of file +} diff --git a/ZR.Model/MES/wms/Dto/WmGoodsRecordDto.cs b/ZR.Model/MES/wms/Dto/WmGoodsRecordDto.cs new file mode 100644 index 00000000..4dbd054c --- /dev/null +++ b/ZR.Model/MES/wms/Dto/WmGoodsRecordDto.cs @@ -0,0 +1,52 @@ +using System.ComponentModel.DataAnnotations; + +namespace ZR.Model.MES.wms.Dto +{ + /// + /// 成品库数据变动表查询对象 + /// + public class WmGoodsRecordQueryDto : PagerInfo { + public string FkInventoryId { get; set; } + public string Code { get; set; } + public string Partnumber { get; set; } + public int? ChangeType { get; set; } + public string CreatedBy { get; set; } + public string Remark { get; set; } + public DateTime? StartActionTime { get; set; } + public DateTime? EndActionTime { get; set; } + } + + /// + /// 成品库数据变动表输入输出对象 + /// + public class WmGoodsRecordDto + { + public string Id { get; set; } + + public string FkInventoryId { get; set; } + + public string Code { get; set; } + + public string Partnumber { get; set; } + + public string BlankNum { get; set; } + + public int? ChangeType { get; set; } + + public int? ChangeQuantity { get; set; } + + public DateTime? ActionTime { get; set; } + + public int? Status { get; set; } + + public string Remark { get; set; } + + public string CreatedBy { get; set; } + + public DateTime? CreatedTime { get; set; } + + public string UpdatedBy { get; set; } + + public DateTime? UpdatedTime { get; set; } + } +} diff --git a/ZR.Model/MES/wms/WmGoodsRecord.cs b/ZR.Model/MES/wms/WmGoodsRecord.cs new file mode 100644 index 00000000..1d12e75f --- /dev/null +++ b/ZR.Model/MES/wms/WmGoodsRecord.cs @@ -0,0 +1,89 @@ +namespace ZR.Model.MES.wms +{ + /// + /// 成品库数据变动表 + /// + [SugarTable("wm_goods_record")] + public class WmGoodsRecord + { + /// + /// 主键 + /// + [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] + public string Id { get; set; } + + /// + /// 库存主键 + /// + [SugarColumn(IsPrimaryKey = true, IsIdentity = false, ColumnName = "fk_inventory_id")] + public string FkInventoryId { get; set; } + + /// + /// 关联记录字段,识别记录字段如PDA + /// + public string Code { get; set; } + + /// + /// 零件号 + /// + public string Partnumber { get; set; } + + /// + /// 毛坯号 + /// + [SugarColumn(ColumnName = "blank_num")] + public string BlankNum { get; set; } + + /// + /// 变动类别 1-入库 2-出库 3-盘点 + /// + [SugarColumn(ColumnName = "change_type")] + public int? ChangeType { get; set; } + + /// + /// 变动数量 + /// + [SugarColumn(ColumnName = "change_quantity")] + public int? ChangeQuantity { get; set; } + + /// + /// 时间(操作时间) + /// + [SugarColumn(ColumnName = "action_time")] + public DateTime? ActionTime { get; set; } + + /// + /// 状态(暂定) + /// + public int? Status { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 创建人 + /// + [SugarColumn(ColumnName = "cREATED_BY")] + public string CreatedBy { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "cREATED_TIME")] + public DateTime? CreatedTime { get; set; } + + /// + /// 更新人 + /// + [SugarColumn(ColumnName = "uPDATED_BY")] + public string UpdatedBy { get; set; } + + /// + /// 更新时间 + /// + [SugarColumn(ColumnName = "uPDATED_TIME")] + public DateTime? UpdatedTime { get; set; } + } +} diff --git a/ZR.Service/Utils/MaterialUtils.cs b/ZR.Service/Utils/MaterialUtils.cs index 4cef6830..3bf8cdbd 100644 --- a/ZR.Service/Utils/MaterialUtils.cs +++ b/ZR.Service/Utils/MaterialUtils.cs @@ -10,7 +10,7 @@ namespace ZR.Service.Utils //解析外箱标签码 public ResultionPackageCodeDto ResolutionPackage(string code) { - if (code.Contains("^")) + if (code.Contains('^')) { // 初步进行解析检测,增加解析成功率 string[] splitstr = code.Split('^'); diff --git a/ZR.Service/mes/wms/IService/IWmGoodsRecordService.cs b/ZR.Service/mes/wms/IService/IWmGoodsRecordService.cs new file mode 100644 index 00000000..897e2d0b --- /dev/null +++ b/ZR.Service/mes/wms/IService/IWmGoodsRecordService.cs @@ -0,0 +1,21 @@ +using ZR.Model; +using ZR.Model.MES.wms; +using ZR.Model.MES.wms.Dto; + +namespace ZR.Service.mes.wms.IService +{ + /// + /// 成品库数据变动表service接口 + /// + public interface IWmGoodsRecordService : IBaseService + { + PagedInfo GetList(WmGoodsRecordQueryDto parm); + + WmGoodsRecord GetInfo(string Id); + + WmGoodsRecord AddWmGoodsRecord(WmGoodsRecord parm); + + int UpdateWmGoodsRecord(WmGoodsRecord parm); + + } +} diff --git a/ZR.Service/mes/wms/WMentryWarehousing_productService.cs b/ZR.Service/mes/wms/WMentryWarehousing_productService.cs index 4cdfe42c..0e37af2e 100644 --- a/ZR.Service/mes/wms/WMentryWarehousing_productService.cs +++ b/ZR.Service/mes/wms/WMentryWarehousing_productService.cs @@ -1,8 +1,8 @@ -using Infrastructure.Attribute; -using SqlSugar; -using System; +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; @@ -10,30 +10,66 @@ using ZR.Service.Utils; namespace ZR.Service.mes.wms { - [AppService(ServiceType = typeof(IWMentryWarehousing_productService), ServiceLifetime = LifeTime.Transient)] - public class WMentryWarehousing_productService : BaseService, IWMentryWarehousing_productService + [AppService( + ServiceType = typeof(IWMentryWarehousing_productService), + ServiceLifetime = LifeTime.Transient + )] + public class WMentryWarehousing_productService + : BaseService, + IWMentryWarehousing_productService { - private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + //货物入库 public int IntoProductwarehouse(WmgoodsDto wmgoods, string createName) { - List preparegoodsList = new List(); - if (wmgoods.packagelist != null && wmgoods.packagelist.Count() > 0) + try { - for (int i = 0; i < wmgoods.packagelist.Count(); i++) + Context.Ado.BeginTran(); + List preparegoodsList = new(); + string location = wmgoods.location; + if (string.IsNullOrEmpty(wmgoods.location)) { - - ResultionPackageCodeDto resultionPackage = ResolutionPackage(wmgoods.packagelist[i]); - // XXX 入库时查出此批次号箱已入库,则跳过 - bool hasWarehouse = Context.Queryable().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any(); + location = "LS"; + } + string[] packageArray = wmgoods.packagelist; + if (packageArray == null || packageArray.Length <= 0) + { + Context.Ado.RollbackTran(); + throw new Exception("无入库箱,请检查传入数据!"); + } + // 统计记录 + List partnumbers = new(); + int totalPackage = 0; + int totalPartnumber = 0; + List 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() + .Where(it => it.PackageCodeClient == resultionPackage.PatchCode) + .Any(); if (hasWarehouse) { - continue; + Context.Ado.RollbackTran(); + throw new Exception("箱" + resultionPackage.PatchCode + "已在库中,不可重复入库!"); } - WmGoodsNowProduction wmGood = new WmGoodsNowProduction(); - wmGood.Id = SnowFlakeSingle.Instance.NextId().ToString(); - + // 通过校验,插入入库数据 + 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 @@ -44,63 +80,89 @@ namespace ZR.Service.mes.wms { flow_num = -1; } - - wmGood.PackageCode = Getpack_no(resultionPackage.WorkoderID, flow_num.ToString("000")); - + 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 = wmgoods.location; - + wmGood.LocationCode = location; string workorder_id = resultionPackage.WorkoderID; - - - //wmGood.GoodsNumLogic = Context.Queryable() - // .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); - - } - - } - // 修改入库检验 为入库完成 WmFgentryInspect - UseTran2(() => - { - if (preparegoodsList != null && preparegoodsList.Count() > 0) + // 修改入库检验 为入库完成 WmFgentryInspect + if (preparegoodsList != null && preparegoodsList.Count > 0) { foreach (var preparegood in preparegoodsList) { if (!string.IsNullOrEmpty(preparegood.PackageCode)) { - Context.Updateable() - .SetColumns(it => it.Bitwm == 1) - .Where(it => it.Packcode == preparegood.PackageCode) - .ExecuteCommand(); - + Context + .Updateable() + .SetColumns(it => it.Bitwm == 1) + .Where(it => it.Packcode == preparegood.PackageCode) + .ExecuteCommand(); } - - } - } - - }); - - - int result = Context.Insertable(preparegoodsList).ExecuteCommand(); - return result; + 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 = "PDA_IN", + Partnumber = string.Join(',', partnumbers), + BlankNum = "", + ChangeType = 1, + ChangeQuantity = totalPartnumber, + ActionTime = DateTime.Now, + Status = 1, + Remark = + "PDA入库" + + "\n仓库号:" + + location + + "\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); + } } - - /// /// 获取mes的箱子码 /// @@ -109,14 +171,12 @@ namespace ZR.Service.mes.wms /// private string Getpack_no(string workordorid, string flow) { - - - WmPackingrecord record = Context.Queryable() + WmPackingrecord record = Context + .Queryable() .Where(it => it.WorkOrderNum == workordorid) .Where(it => it.PackingCode.EndsWith(flow)) .First(); - if (record == null) { return null; @@ -135,15 +195,13 @@ namespace ZR.Service.mes.wms } string packingCode = Identity.PatchCode.Split('_')[1]; - - bool isExist = Context.Queryable() + bool isExist = Context + .Queryable() .Where(it => it.WorkOrderNum == Identity.WorkoderID) .Where(it => it.PackingCode.EndsWith(packingCode)) .Where(it => it.BFilled == true) .Any(); - - return isExist; } @@ -154,31 +212,24 @@ namespace ZR.Service.mes.wms /// 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() + bool isExist = Context + .Queryable() .Where(it => it.WorkOrderNum == Identity.WorkoderID) .Where(it => it.PackingCode.EndsWith(packingCode)) .Any(); @@ -187,29 +238,30 @@ namespace ZR.Service.mes.wms return 0; } - return 1; - } + //1 判断是否为库位码 - bool IWMentryWarehousing_productService.IsProductionLoacation(string production_location_code) + bool IWMentryWarehousing_productService.IsProductionLoacation( + string production_location_code + ) { - - return Context.Queryable().Where(it => it.WarehouseNum == 1) - .Where(it => it.Location.Equals(production_location_code)).Any(); - + return Context + .Queryable() + .Where(it => it.WarehouseNum == 1) + .Where(it => it.Location.Equals(production_location_code)) + .Any(); } - //获取库位已经存在的货物 public List Getpackagelist(string location) { - return Context.Queryable().Where(it => it.LocationCode == location).ToList(); - + return Context + .Queryable() + .Where(it => it.LocationCode == location) + .ToList(); } - - //解析外箱标签码 public ResultionPackageCodeDto ResolutionPackage(string code) { @@ -222,7 +274,8 @@ namespace ZR.Service.mes.wms return null; } string SerialNumber = packageCodeDto.PatchCode.Split('_')[1] ?? "000"; - WmPackageLcl packageLcl = Context.Queryable() + WmPackageLcl packageLcl = Context + .Queryable() .Where(it => it.WorkOrderId == packageCodeDto.WorkoderID) .Where(it => it.SerialNumber == SerialNumber) .OrderByDescending(it => it.CreatedTime) @@ -268,7 +321,6 @@ namespace ZR.Service.mes.wms return null;*/ } - /// /// 判断箱子是否在成品库中 /// @@ -279,10 +331,12 @@ namespace ZR.Service.mes.wms { ResultionPackageCodeDto resultionPackage = ResolutionPackage(originalCode); - return Context.Queryable().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any(); + return Context + .Queryable() + .Where(it => it.PackageCodeClient == resultionPackage.PatchCode) + .Any(); } - // 检查是否可入库(返回ok 可入库,其余返回情况)【使用中接口】 public string checkWarehousing(string production_packcode, string location, bool isStrict) { @@ -299,21 +353,29 @@ namespace ZR.Service.mes.wms return "标签解析异常!"; } - // 2.1判断是否已入库 - bool isExistedWarehouse = Context.Queryable().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any(); + bool isExistedWarehouse = Context + .Queryable() + .Where(it => it.PackageCodeClient == resultionPackage.PatchCode) + .Any(); if (isExistedWarehouse) { return "该箱号已入库!"; } // 2.2判断是否有出库记录 - bool isoutWarehouse = Context.Queryable().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any(); + bool isoutWarehouse = Context + .Queryable() + .Where(it => it.PackageCodeClient == resultionPackage.PatchCode) + .Any(); if (isoutWarehouse) { return "该箱号已有出库记录,需要删除后再入库!"; } // 提取库位信息 - WmInfo wmInfo = Context.Queryable().Where(it => it.Location == location).First(); + WmInfo wmInfo = Context + .Queryable() + .Where(it => it.Location == location) + .First(); if (wmInfo == null) { return "库位参数异常"; @@ -324,11 +386,14 @@ namespace ZR.Service.mes.wms string package_no = resultionPackage.PatchCode.Split("_")[1]; // 3.1 isStrict = TRUE 时判断是否是满箱标签 - WmPackingrecord recourd = Context.Queryable() + WmPackingrecord recourd = Context + .Queryable() .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)).ToString()) + .Where(it => + package_no == int.Parse(SqlFunc.Right(it.PackingCode, 5)).ToString() + ) .Where(it => it.BFilled == true) .First(); if (recourd == null) @@ -336,11 +401,12 @@ namespace ZR.Service.mes.wms return "该标签不为满箱标签!请入临时仓库!"; } //3.2 GP12检测 - var inspect = Context.Queryable() - .Where(it => it.Workorder == resultionPackage.WorkoderID) - .Where(it => it.Packcode.EndsWith(package_no)) - .OrderByDescending(it => it.CreatedTime) - .First(); + var inspect = Context + .Queryable() + .Where(it => it.Workorder == resultionPackage.WorkoderID) + .Where(it => it.Packcode.EndsWith(package_no)) + .OrderByDescending(it => it.CreatedTime) + .First(); // XXX 添加校验,如果是编号为4号的打印机打出来的就跳过GP12,满箱与测试标签校验 if (recourd.Machine != "4") { @@ -371,7 +437,10 @@ namespace ZR.Service.mes.wms flow_num = -1; } //mes追溯码 - string PackageCode = Getpack_no(resultionPackage.WorkoderID, flow_num.ToString("000")); + string PackageCode = Getpack_no( + resultionPackage.WorkoderID, + flow_num.ToString("000") + ); if (PackageCode == null) { return "该标签可能为测试标签,不可追溯!请入临时仓库!"; @@ -383,8 +452,6 @@ namespace ZR.Service.mes.wms { return "标签存在异常!" + e.Message; } - } - } } diff --git a/ZR.Service/mes/wms/WmGoodsRecordService.cs b/ZR.Service/mes/wms/WmGoodsRecordService.cs new file mode 100644 index 00000000..a8572b77 --- /dev/null +++ b/ZR.Service/mes/wms/WmGoodsRecordService.cs @@ -0,0 +1,96 @@ +using Infrastructure.Attribute; +using SqlSugar; +using System; +using ZR.Model; +using ZR.Model.MES.wms; +using ZR.Model.MES.wms.Dto; +using ZR.Repository; +using ZR.Service.mes.wms.IService; + +namespace ZR.Service.mes.wms +{ + /// + /// 成品库数据变动表Service业务层处理 + /// + [AppService(ServiceType = typeof(IWmGoodsRecordService), ServiceLifetime = LifeTime.Transient)] + public class WmGoodsRecordService : BaseService, IWmGoodsRecordService + { + /// + /// 查询成品库数据变动表列表 + /// + /// + /// + public PagedInfo GetList(WmGoodsRecordQueryDto parm) + { + var predicate = Expressionable.Create() + .AndIF(parm.ChangeType > 0, it => it.ChangeType == parm.ChangeType) + .AndIF(!string.IsNullOrEmpty(parm.Partnumber), it => it.Partnumber.Contains(parm.Partnumber)) + .AndIF(!string.IsNullOrEmpty(parm.Code), it => it.Code.Contains(parm.Code)) + .AndIF(!string.IsNullOrEmpty(parm.Remark), it => it.Remark.Contains(parm.Remark)) + .AndIF(!string.IsNullOrEmpty(parm.CreatedBy), it => it.CreatedBy.Contains(parm.CreatedBy)) + // 当天0点 + .AndIF(parm.StartActionTime > DateTime.MinValue, it => it.ActionTime >= parm.StartActionTime.Value.ToLocalTime()) + // 当天23点59分59秒 + .AndIF(parm.EndActionTime > DateTime.MinValue, it => it.ActionTime <= parm.EndActionTime.Value.ToLocalTime()) + ; + + var response = Queryable() + .Where(predicate.ToExpression()) + .ToPage(parm); + + return response; + } + + + /// + /// 获取详情 + /// + /// + /// + public WmGoodsRecord GetInfo(string Id) + { + var response = Queryable() + .Where(x => x.Id == Id) + .First(); + + return response; + } + + /// + /// 添加成品库数据变动表 + /// + /// + /// + public WmGoodsRecord AddWmGoodsRecord(WmGoodsRecord model) + { + return Context.Insertable(model).ExecuteReturnEntity(); + } + + /// + /// 修改成品库数据变动表 + /// + /// + /// + public int UpdateWmGoodsRecord(WmGoodsRecord model) + { + //var response = Update(w => w.Id == model.Id, it => new WmGoodsRecord() + //{ + // Code = model.Code, + // Partnumber = model.Partnumber, + // BlankNum = model.BlankNum, + // ChangeType = model.ChangeType, + // ChangeQuantity = model.ChangeQuantity, + // ActionTime = model.ActionTime, + // Status = model.Status, + // Remark = model.Remark, + // CreatedBy = model.CreatedBy, + // CreatedTime = model.CreatedTime, + // UpdatedBy = model.UpdatedBy, + // UpdatedTime = model.UpdatedTime, + //}); + //return response; + return Update(model, true); + } + + } +} \ No newline at end of file diff --git a/ZR.Service/mes/wms/WmOutOrderService.cs b/ZR.Service/mes/wms/WmOutOrderService.cs index df43f13c..f8263334 100644 --- a/ZR.Service/mes/wms/WmOutOrderService.cs +++ b/ZR.Service/mes/wms/WmOutOrderService.cs @@ -1,9 +1,9 @@ -using Infrastructure.Attribute; -using Mapster; -using SqlSugar; using System; using System.Data; using System.Linq; +using Infrastructure.Attribute; +using Mapster; +using SqlSugar; using ZR.Model; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; @@ -20,12 +20,12 @@ namespace ZR.Service.mes.wms public class WmOutOrderService : BaseService, IWmOutOrderService { private NLog.Logger logger; + public WmOutOrderService() { logger = NLog.LogManager.GetCurrentClassLogger(); } - /// /// 查询出货单(物料+客户)列表 /// @@ -33,15 +33,21 @@ namespace ZR.Service.mes.wms /// public PagedInfo GetList(WmOutOrderQueryDto parm) { - var predicate = Expressionable.Create() - .AndIF(!string.IsNullOrEmpty(parm.ShipmentNum), it => it.ShipmentNum.Contains(parm.ShipmentNum)) - .AndIF(!string.IsNullOrEmpty(parm.CustomNo), it => it.CustomNo.Contains(parm.CustomNo)) + var predicate = Expressionable + .Create() + .AndIF( + !string.IsNullOrEmpty(parm.ShipmentNum), + it => it.ShipmentNum.Contains(parm.ShipmentNum) + ) + .AndIF( + !string.IsNullOrEmpty(parm.CustomNo), + it => it.CustomNo.Contains(parm.CustomNo) + ) .AndIF(parm.Type > 0, it => it.Type == parm.Type) .AndIF(parm.Status > -1, it => it.Status == parm.Status) .AndIF(parm.Year > 0, it => it.Year == parm.Year) .AndIF(parm.Week > 0, it => it.Year == parm.Week) - .AndIF(parm.Date > 0, it => it.Year == parm.Date) - ; + .AndIF(parm.Date > 0, it => it.Year == parm.Date); var response = Queryable() .Where(predicate.ToExpression()) .OrderByDescending(it => it.CreatedTime) @@ -50,7 +56,6 @@ namespace ZR.Service.mes.wms return response; } - /// /// 获取详情 /// @@ -58,10 +63,10 @@ namespace ZR.Service.mes.wms /// public WmOutOrder_material_num GetInfo(string ShipmentNum) { - - WmOutOrder WmOutOrderList = Context.Queryable() - .Where(it => it.ShipmentNum == ShipmentNum) - .First(); + WmOutOrder WmOutOrderList = Context + .Queryable() + .Where(it => it.ShipmentNum == ShipmentNum) + .First(); WmOutOrder_material_num wmOutOrderItem = null; @@ -69,31 +74,34 @@ namespace ZR.Service.mes.wms { wmOutOrderItem = WmOutOrderList.Adapt(); - List moList = Context.Queryable() - .Where(it => it.FkOutorderId == WmOutOrderList.ShipmentNum) - .ToList(); + List moList = Context + .Queryable() + .Where(it => it.FkOutorderId == WmOutOrderList.ShipmentNum) + .ToList(); if (moList != null && moList.Count > 0) { - List Material_stock = new List(); + List Material_stock = + new List(); foreach (var moItem in moList) { - WmMaterial material = Context.Queryable().Where(it => it.Id == moItem.FkMaterialId).First(); + WmMaterial material = Context + .Queryable() + .Where(it => it.Id == moItem.FkMaterialId) + .First(); if (material != null) { - WmMaterialQuery_stockQuantityDto2 dto2 = material.Adapt(); + WmMaterialQuery_stockQuantityDto2 dto2 = + material.Adapt(); dto2.requireOutNum = moItem.OuthouseNum; Material_stock.Add(dto2); } - } wmOutOrderItem.MaterialList = Material_stock; } } - - return wmOutOrderItem; } @@ -107,17 +115,24 @@ namespace ZR.Service.mes.wms try { string today_id = "EG" + DateTime.Now.ToString("yyMMdd"); - string last_outorder_ShipmentNum = Context.Queryable().Where(it => it.ShipmentNum.StartsWith(today_id)).Max(it => it.ShipmentNum); + string last_outorder_ShipmentNum = Context + .Queryable() + .Where(it => it.ShipmentNum.StartsWith(today_id)) + .Max(it => it.ShipmentNum); if (string.IsNullOrEmpty(last_outorder_ShipmentNum)) { model.ShipmentNum = today_id + "001"; - } else { - int flow = int.Parse(last_outorder_ShipmentNum.Substring(last_outorder_ShipmentNum.Length - 3, 3)) + 1; + int flow = + int.Parse( + last_outorder_ShipmentNum.Substring( + last_outorder_ShipmentNum.Length - 3, + 3 + ) + ) + 1; model.ShipmentNum = today_id + flow.ToString("000"); - } WmOutOrder wmOutOrder = model.Adapt(); @@ -126,7 +141,8 @@ namespace ZR.Service.mes.wms { if (model.MaterialList.Count > 0) { - List materialOutorderList = new List(); + List materialOutorderList = + new List(); foreach (var item in model.MaterialList) { @@ -137,10 +153,10 @@ namespace ZR.Service.mes.wms materialOutorder.CreatedBy = model.CreatedBy; materialOutorder.CreatedTime = DateTime.Now; materialOutorderList.Add(materialOutorder); - }; + } + ; int result = Context.Insertable(materialOutorderList).ExecuteCommand(); } - } return Context.Insertable(wmOutOrder).ExecuteReturnEntity(); @@ -149,8 +165,8 @@ namespace ZR.Service.mes.wms { return null; } - } + /// /// 删除出货单关联的物料出货单 /// @@ -162,12 +178,13 @@ namespace ZR.Service.mes.wms { for (int i = 0; i < primarys.Length; i++) { - Context.Deleteable().Where(it => it.FkOutorderId == primarys[i]).ExecuteCommand(); + Context + .Deleteable() + .Where(it => it.FkOutorderId == primarys[i]) + .ExecuteCommand(); } - } return 1; - } /// @@ -197,18 +214,13 @@ namespace ZR.Service.mes.wms return Update(model, true); } - - - /// /// 获取用户信息 /// - /// + /// public List GetCustominfo() { - return Context.Queryable().ToList(); - } /// @@ -216,41 +228,52 @@ namespace ZR.Service.mes.wms /// /// /// - public (List, int) GetmaterialList(WmMaterialQueryDto parm) + public (List, int) GetmaterialList( + WmMaterialQueryDto parm + ) { int total = 0; - var predicate = Expressionable.Create() + var predicate = Expressionable + .Create() .AndIF(parm.Partnumber != null, it => it.Partnumber.Contains(parm.Partnumber)) - .AndIF(parm.U8InventoryCode != null, it => it.U8InventoryCode.Contains(parm.U8InventoryCode)) + .AndIF( + parm.U8InventoryCode != null, + it => it.U8InventoryCode.Contains(parm.U8InventoryCode) + ) .AndIF(parm.ProductName != null, it => it.ProductName.Contains(parm.ProductName)) .AndIF(parm.Color != null, it => it.Color.Contains(parm.Color)) - .AndIF(parm.Specification != null, it => it.Specification.Contains(parm.Specification)) + .AndIF( + parm.Specification != null, + it => it.Specification.Contains(parm.Specification) + ) .AndIF(parm.Description != null, it => it.Description.Contains(parm.Description)) - .AndIF(parm.Search1 != null, it => it.Search1.Contains(parm.Search1) || it.Search2.Contains(parm.Search1)) + .AndIF( + parm.Search1 != null, + it => it.Search1.Contains(parm.Search1) || it.Search2.Contains(parm.Search1) + ) .AndIF(parm.Status > -1, it => it.Status == parm.Status); - - List materialList = Context.Queryable() + List materialList = Context + .Queryable() .Where(predicate.ToExpression()) .OrderByDescending(it => it.CreatedTime) .ToPageList(parm.PageNum, parm.PageSize, ref total); - - List material_stockQuantity_list = new List(); - + List material_stockQuantity_list = + new List(); if (materialList.Count > 0) { foreach (WmMaterial item in materialList) { - - WmMaterialQuery_stockQuantityDto wmMaterialQuery_Stock_item = item.Adapt(); + WmMaterialQuery_stockQuantityDto wmMaterialQuery_Stock_item = + item.Adapt(); int material_num = 0; List productioList = Context - .Queryable() - .Where(it => it.Partnumber == item.Partnumber) - .ToList(); + .Queryable() + .Where(it => it.Partnumber == item.Partnumber) + .ToList(); if (productioList.Count > 0) { @@ -261,22 +284,13 @@ namespace ZR.Service.mes.wms } } - wmMaterialQuery_Stock_item.stockQuantity = material_num; material_stockQuantity_list.Add(wmMaterialQuery_Stock_item); - - - - - } } return (material_stockQuantity_list, total); } - - - /// /// 查询出货单的物料信息 /// @@ -284,38 +298,47 @@ namespace ZR.Service.mes.wms /// public List Queryoutoder_matrials(string shipment_num) { - - List stockList = Context.Queryable() - .LeftJoin((mo, m) => mo.FkMaterialId == m.Id) - .Where(mo => mo.FkOutorderId == shipment_num) - .Select((mo, m) => new WmMaterialQuery_print() - { - //物料号 - Partnumber = m.Partnumber, - // 描述 - ProductName = m.ProductName, - //需求零件数 - RequireOutNum = mo.OuthouseNum - }).ToList(); - + List stockList = Context + .Queryable() + .LeftJoin((mo, m) => mo.FkMaterialId == m.Id) + .Where(mo => mo.FkOutorderId == shipment_num) + .Select( + (mo, m) => + new WmMaterialQuery_print() + { + //物料号 + Partnumber = m.Partnumber, + // 描述 + ProductName = m.ProductName, + //需求零件数 + RequireOutNum = mo.OuthouseNum + } + ) + .ToList(); if (stockList != null && stockList.Count > 0) { foreach (var stock in stockList) { //库存箱数 - stock.PackageNum = Context.Queryable() - .Where(it => it.Partnumber == stock.Partnumber).Count(); + stock.PackageNum = Context + .Queryable() + .Where(it => it.Partnumber == stock.Partnumber) + .Count(); //库存零件数 - int? num = Context.Queryable() + int? num = Context + .Queryable() .Where(it => it.Partnumber == stock.Partnumber) .Sum(it => it.GoodsNumAction); stock.ItemNum = num ?? 0; // 需求箱数 - List list = Context.Queryable() - .Where(it => it.Partnumber == stock.Partnumber).OrderByDescending(it => it.PackageCodeClient).ToList(); + List list = Context + .Queryable() + .Where(it => it.Partnumber == stock.Partnumber) + .OrderByDescending(it => it.PackageCodeClient) + .ToList(); int sum = 0; foreach (var item in list) @@ -326,20 +349,11 @@ namespace ZR.Service.mes.wms stock.Require_pack_num = list.IndexOf(item) + 1; break; } - } - - - } } - - return stockList; - - - } /// @@ -352,7 +366,9 @@ namespace ZR.Service.mes.wms // 最终结果 List planList = new List(); // 获取当前出货单下的物料信息 - List materialQuery_Prints = this.Queryoutoder_matrials(shipment_num); + List materialQuery_Prints = this.Queryoutoder_matrials( + shipment_num + ); if (materialQuery_Prints != null && materialQuery_Prints.Count > 0) { // 物料解析 @@ -363,11 +379,12 @@ namespace ZR.Service.mes.wms // 物料号 string partnumber = material.Partnumber; // 该物料下 ,现有货物列表,零件号相同,根据批次号从小到大排序 - List wmGoodsNowsList = Context.Queryable() - .Where(it => it.Partnumber == partnumber) - .Where(it => it.LocationCode != "Z1-01") - .OrderBy(it => it.PackageCodeClient) - .ToList(); + List wmGoodsNowsList = Context + .Queryable() + .Where(it => it.Partnumber == partnumber) + .Where(it => it.LocationCode != "Z1-01") + .OrderBy(it => it.PackageCodeClient) + .ToList(); // 判断要出多少批次的货 List wmOutOrderPlans = new List(); @@ -398,25 +415,25 @@ namespace ZR.Service.mes.wms if (wmOutOrderPlans.Count > 0) { // 根据批次号下划线前进行聚合 - List material_plan_item = wmOutOrderPlans.GroupBy(it => it.Patchcode_short).Select(g => new - WmOutOrderPlan - { - FkOutOrderId = g.Max(p => p.FkOutOrderId), - Patchcode = g.Max(p => p.Patchcode_short), - Patchcode_short = g.Max(p => p.Patchcode_short), - WarehouseCode = g.Max(p => p.WarehouseCode), - MaterialCode = g.Max(p => p.MaterialCode), - PackageNum = g.Count(), - PartnumberNum = g.Sum(p => p.PartnumberNum), - RequireNum = g.Max(p => p.RequireNum), - ReceivedPackNum = 0, - Patchtime = g.Max(p => p.Patchtime), - }).ToList(); + List material_plan_item = wmOutOrderPlans + .GroupBy(it => it.Patchcode_short) + .Select(g => new WmOutOrderPlan + { + FkOutOrderId = g.Max(p => p.FkOutOrderId), + Patchcode = g.Max(p => p.Patchcode_short), + Patchcode_short = g.Max(p => p.Patchcode_short), + WarehouseCode = g.Max(p => p.WarehouseCode), + MaterialCode = g.Max(p => p.MaterialCode), + PackageNum = g.Count(), + PartnumberNum = g.Sum(p => p.PartnumberNum), + RequireNum = g.Max(p => p.RequireNum), + ReceivedPackNum = 0, + Patchtime = g.Max(p => p.Patchtime), + }) + .ToList(); planList = planList.Concat(material_plan_item).ToList(); } - - } } // 添加序号 @@ -427,19 +444,18 @@ namespace ZR.Service.mes.wms witem.Outorder = count; count++; - witem.Inventory_pack_num = Context.Queryable() + witem.Inventory_pack_num = Context + .Queryable() .Where(it => it.PackageCodeClient.Contains(witem.Patchcode)) .Count(); - witem.Inventory_num = Context.Queryable() - .Where(it => it.PackageCodeClient.Contains(witem.Patchcode)) - .Sum(it => it.GoodsNumLogic) ?? 0; - - + witem.Inventory_num = + Context + .Queryable() + .Where(it => it.PackageCodeClient.Contains(witem.Patchcode)) + .Sum(it => it.GoodsNumLogic) ?? 0; } - return planList; - } /// @@ -449,88 +465,127 @@ namespace ZR.Service.mes.wms /// public (int, int) DoMaterialOut(WmDoMaterialOut_Dto doMaterialOut, string Createby) { - int sum_delete = 0; - int sum_insert = 0; - string shipnumber = doMaterialOut.ShipmentNum; - if (doMaterialOut.PatchCode != null && doMaterialOut.PatchCode.Length > 0) + try { + Context.Ado.BeginTran(); + List deleteList = new(); + List insertList = new(); + string shipnumber = doMaterialOut.ShipmentNum; + if (doMaterialOut.PatchCode == null || doMaterialOut.PatchCode.Length == 0) + { + Context.Ado.RollbackTran(); + throw new Exception("批次号列表为空,不可出库" + doMaterialOut.PatchCode); + } + // 统计记录 + List partnumbers = new(); + int totalPackage = 0; + int totalPartnumber = 0; + List packageCodeRemark = new(); foreach (var item in doMaterialOut.PatchCode) { - /* - * - * #region 保证 同一出货单下 同一物料下最早批次 - // 取出同一出货单下 同一物料下 未满箱的最早批次 - - string short_patch = item.Split("_")[0]; - WmOutOrderPlan plan_item = Context.Queryable() + Context + .Updateable() + .SetColumns(it => it.ReceivedPackNum == it.ReceivedPackNum + 1) .Where(it => it.FkOutOrderId == shipnumber) - .Where(it => it.Patchcode==short_patch).OrderBy(it => it.Outorder).First(); - if (plan_item != null) - { - var plan_earliest = Context.Queryable() - .Where(it => it.FkOutOrderId == shipnumber) - .Where(it => it.MaterialCode == plan_item.MaterialCode) - .Where(it => it.PackageNum > it.ReceivedPackNum) - .OrderBy(it => it.Outorder) - .First(); - //已经出库完成,没有可以出库的了 - if (plan_earliest == null) - { - return (100, 100); - } - if (plan_earliest.Id == plan_item.Id) - { - #endregion - - - */ - - - // TODO 每次出库要出库计划累加 - - Context.Updateable() - .SetColumns(it => it.ReceivedPackNum == it.ReceivedPackNum + 1) - .Where(it => it.FkOutOrderId == shipnumber) - .Where(it => it.Patchcode == item) - .ExecuteCommand(); - - - WmGoodsOutRecord record = new WmGoodsOutRecord(); - record.Id = SnowFlakeSingle.Instance.NextId().ToString(); - - WmGoodsNowProduction nowProduction = Context.Queryable() - .Where(it => it.PackageCodeClient == item).First(); - - if (nowProduction != null) - { - record.FkNowProductionId = nowProduction.Id; - record.PackageCodeClient = nowProduction.PackageCodeClient; - record.PackageCode = nowProduction.PackageCode; - record.PackageCodeOriginal = nowProduction.PackageCodeOriginal; - record.LocationCode = nowProduction.LocationCode; - record.Partnumber = nowProduction.Partnumber; - record.GoodsNumLogic = nowProduction.GoodsNumLogic; - record.GoodsNumAction = nowProduction.GoodsNumAction; - record.EntryWarehouseTime = nowProduction.EntryWarehouseTime; - record.OutTime = DateTime.Now; - record.CreatedTime = DateTime.Now; - record.CreatedBy = Createby; - record.FkOutOrderId = shipnumber; - sum_insert = Context.Insertable(record).ExecuteCommand(); - sum_delete += Context.Deleteable() - .Where(it => it.PackageCodeClient == item) + .Where(it => it.Patchcode == item) .ExecuteCommand(); + WmGoodsOutRecord record = + new() { Id = SnowFlakeSingle.Instance.NextId().ToString() }; + WmGoodsNowProduction nowProduction = Context + .Queryable() + .Where(it => it.PackageCodeClient == item) + .First(); + if (nowProduction == null) + { + Context.Ado.RollbackTran(); + throw new Exception("成品仓库未查到此货物,无法出库!" + item); } + record.FkNowProductionId = nowProduction.Id; + record.PackageCodeClient = nowProduction.PackageCodeClient; + record.PackageCode = nowProduction.PackageCode; + record.PackageCodeOriginal = nowProduction.PackageCodeOriginal; + record.LocationCode = nowProduction.LocationCode; + record.Partnumber = nowProduction.Partnumber; + record.GoodsNumLogic = nowProduction.GoodsNumLogic; + record.GoodsNumAction = nowProduction.GoodsNumAction; + record.EntryWarehouseTime = nowProduction.EntryWarehouseTime; + record.OutTime = DateTime.Now; + record.CreatedTime = DateTime.Now; + record.CreatedBy = Createby; + record.FkOutOrderId = shipnumber; + insertList.Add(record); + deleteList.Add(nowProduction.Id); + // 记录统计 + totalPackage++; + if (!partnumbers.Contains(nowProduction.Partnumber)) + { + partnumbers.Add(nowProduction.Partnumber); + } + totalPartnumber += nowProduction.GoodsNumAction ?? 0; + packageCodeRemark.Add(nowProduction.PackageCodeClient); } + int sum_insert = Context.Insertable(insertList).ExecuteCommand(); + int sum_delete = Context + .Deleteable() + .In(deleteList.ToArray()) + .ExecuteCommand(); + if (sum_insert != sum_delete) + { + Context.Ado.RollbackTran(); + throw new Exception( + "出库操作出现异常!失败原因记录不一致:添加数据" + sum_insert + "删除数据:" + sum_delete + ); + } + packageCodeRemark.Sort(); + // 插入记录 + WmGoodsRecord wmGoodsRecord = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + FkInventoryId = SnowFlakeSingle.Instance.NextId().ToString(), + Code = "PDA_OUT", + Partnumber = string.Join(',', partnumbers), + BlankNum = "", + ChangeType = 2, + ChangeQuantity = totalPartnumber, + ActionTime = DateTime.Now, + Status = 1, + Remark = + "PDA出库" + + "\n出库单:" + + shipnumber + + "\n总箱数:" + + totalPackage + + "\n总零件数:" + + totalPartnumber + + "\n涉及批次号:\n" + + string.Join(',', packageCodeRemark), + CreatedBy = Createby, + CreatedTime = DateTime.Now, + }; + int recordNum = Context.Insertable(wmGoodsRecord).ExecuteCommand(); + if (recordNum == 0) + { + Context.Ado.RollbackTran(); + throw new Exception("记录插入失败"); + } + Context.Ado.CommitTran(); + return (sum_delete, sum_insert); + } + catch (Exception e) + { + Context.Ado.RollbackTran(); + throw new Exception(e.Message); } - return (sum_delete, sum_insert); } public bool OverOutorderplan(string shipment_num) { - int reult = Context.Updateable().Where(it => it.ShipmentNum == shipment_num) - .SetColumns(it => it.Type == 2) - .ExecuteCommand(); + int reult = Context + .Updateable() + .Where(it => it.ShipmentNum == shipment_num) + .SetColumns(it => it.Type == 2) + .ExecuteCommand(); if (reult > 0) { return true; @@ -549,39 +604,48 @@ namespace ZR.Service.mes.wms private string Resolution_bath(string production_packcode) { MaterialUtils materialToos = new MaterialUtils(); - ResultionPackageCodeDto resultionPackage = materialToos.ResolutionPackage(production_packcode); + ResultionPackageCodeDto resultionPackage = materialToos.ResolutionPackage( + production_packcode + ); if (resultionPackage == null) { return "时间解析异常"; } return resultionPackage.ProductionTime; } + /// /// 8.5 PDA端 获取出库单的持久化存储出库计划并计算计划批次当前已出库数量 /// /// 出库单号 /// - public List GetOutOrderPlanAndOutProductionNum(string shipment_num, string partnumber) + public List GetOutOrderPlanAndOutProductionNum( + string shipment_num, + string partnumber + ) { try { List result = new(); // 当前工单出库计划 - var exp = Expressionable.Create() - .And(it => it.FkOutOrderId == shipment_num) - .AndIF(!string.IsNullOrEmpty(partnumber), it => it.MaterialCode == partnumber) - .ToExpression(); - List wmOutOrderPlan = Context.Queryable() - .Where(exp) - .OrderBy(it => it.Outorder) - .ToList(); + var exp = Expressionable + .Create() + .And(it => it.FkOutOrderId == shipment_num) + .AndIF(!string.IsNullOrEmpty(partnumber), it => it.MaterialCode == partnumber) + .ToExpression(); + List wmOutOrderPlan = Context + .Queryable() + .Where(exp) + .OrderBy(it => it.Outorder) + .ToList(); // 查询每个计划具体出库数据 foreach (WmOutOrderPlan item in wmOutOrderPlan) { // 库存记录 - List nowProductionList = Context.Queryable() - .Where(it => it.PackageCodeClient.Contains(item.Patchcode)) - .ToList(); + List nowProductionList = Context + .Queryable() + .Where(it => it.PackageCodeClient.Contains(item.Patchcode)) + .ToList(); int nowPackageNum = 0; int nowPartnumberNum = 0; foreach (WmGoodsNowProduction outItem in nowProductionList) @@ -590,10 +654,11 @@ namespace ZR.Service.mes.wms nowPartnumberNum += (int)outItem.GoodsNumAction; } // 出库记录 - List outPackageList = Context.Queryable() - .Where(it => it.PackageCodeClient.Contains(item.Patchcode)) - .Where(it => it.FkOutOrderId == shipment_num) - .ToList(); + List outPackageList = Context + .Queryable() + .Where(it => it.PackageCodeClient.Contains(item.Patchcode)) + .Where(it => it.FkOutOrderId == shipment_num) + .ToList(); int outPackageNum = 0; int outPartnumberNum = 0; foreach (WmGoodsOutRecord outItem in outPackageList) @@ -601,26 +666,30 @@ namespace ZR.Service.mes.wms outPackageNum += 1; outPartnumberNum += (int)outItem.GoodsNumAction; } - WmMaterial material = Context.Queryable() - .Where(it => it.Partnumber.Contains(item.MaterialCode)) - .First(); - WmOutPlanAndGoodsOutProductionNumDto newItem = new() - { - OutOrder = (int)item.Outorder, - PackageCode = item.Patchcode, - Partnumber = item.MaterialCode, - Description = !string.IsNullOrEmpty(material.Description) ? material.Description : material.ProductName, - WarehouseCode = item.WarehouseCode, - RequireNum = (int)item.RequireNum, - PackageNum = (int)nowPackageNum, - PartnumberNum = (int)nowPartnumberNum, - PackagePlanNum = (int)item.PackageNum, - PartnumberPlanNum = (int)item.PartnumberNum, - OutPackageNum = outPackageNum, - OutPartnumberNum = outPartnumberNum, - IsError = (nowPartnumberNum + outPartnumberNum) != item.PartnumberNum, - IsOver = outPartnumberNum > item.PartnumberNum - }; + WmMaterial material = Context + .Queryable() + .Where(it => it.Partnumber.Contains(item.MaterialCode)) + .First(); + WmOutPlanAndGoodsOutProductionNumDto newItem = + new() + { + OutOrder = (int)item.Outorder, + PackageCode = item.Patchcode, + Partnumber = item.MaterialCode, + Description = !string.IsNullOrEmpty(material.Description) + ? material.Description + : material.ProductName, + WarehouseCode = item.WarehouseCode, + RequireNum = (int)item.RequireNum, + PackageNum = (int)nowPackageNum, + PartnumberNum = (int)nowPartnumberNum, + PackagePlanNum = (int)item.PackageNum, + PartnumberPlanNum = (int)item.PartnumberNum, + OutPackageNum = outPackageNum, + OutPartnumberNum = outPartnumberNum, + IsError = (nowPartnumberNum + outPartnumberNum) != item.PartnumberNum, + IsOver = outPartnumberNum > item.PartnumberNum + }; result.Add(newItem); } return result; @@ -637,7 +706,11 @@ namespace ZR.Service.mes.wms /// /// /// - public string CheckProductionOut(string parnumber, string production_packcode, string shipment_num) + public string CheckProductionOut( + string parnumber, + string production_packcode, + string shipment_num + ) { try { @@ -647,7 +720,11 @@ namespace ZR.Service.mes.wms } // 1.判断工单是否处于已完成状态 - bool isOutOrderCanUse = Context.Queryable().Where(it => it.ShipmentNum == shipment_num).Where(it => it.Type == 1).Any(); + bool isOutOrderCanUse = Context + .Queryable() + .Where(it => it.ShipmentNum == shipment_num) + .Where(it => it.Type == 1) + .Any(); if (!isOutOrderCanUse) { return "出库单已完成或已弃用!请检查出库单"; @@ -655,7 +732,9 @@ namespace ZR.Service.mes.wms MaterialUtils materialToos = new MaterialUtils(); // 2.解析标签编码 - ResultionPackageCodeDto resultionPackage = materialToos.ResolutionPackage(production_packcode); + ResultionPackageCodeDto resultionPackage = materialToos.ResolutionPackage( + production_packcode + ); if (resultionPackage == null) { return "标签解析异常!请检查标签"; @@ -667,20 +746,21 @@ namespace ZR.Service.mes.wms } // 3.1判断是否已入库 - bool isExistedWarehouse = Context.Queryable().Where(it => it.PackageCodeClient == resultionPackage.PatchCode).Any(); + bool isExistedWarehouse = Context + .Queryable() + .Where(it => it.PackageCodeClient == resultionPackage.PatchCode) + .Any(); if (!isExistedWarehouse) { return "该箱号未入库!请先入库"; } // 3.2 判断是否是计划中的物料(大概率不执行) bool flag1 = false; - List materialOutorders = Context.Queryable() + List materialOutorders = Context + .Queryable() .LeftJoin((wmo, wm) => wmo.FkMaterialId == wm.Id) .Where(wmo => wmo.FkOutorderId == shipment_num) - .Select((wmo, wm) => new WmMaterial - { - Partnumber = wm.Partnumber - }) + .Select((wmo, wm) => new WmMaterial { Partnumber = wm.Partnumber }) .ToList(); foreach (WmMaterial materialOption in materialOutorders) { @@ -694,7 +774,10 @@ namespace ZR.Service.mes.wms return "该箱标签物料号不在出库单物料清单内!"; } // 4. 判断出库单是否启用出库规则 - var shipment = Context.Queryable().Where(it => it.ShipmentNum == shipment_num).First(); + var shipment = Context + .Queryable() + .Where(it => it.ShipmentNum == shipment_num) + .First(); if (shipment.Status == 0) { return "ok"; @@ -728,19 +811,21 @@ namespace ZR.Service.mes.wms return "此物料在计划中已经全部出库完成,无法继续出库"; } // 批次号是最早批次 - *//*if (plan_earliest.Id == plan_item.Id) - { - return "ok"; - }*//* - if (plan_earliest.Patchcode == short_path) - { - return "ok"; - } - else - { - return "不是此物料最早批次,无法出库"; - } - }*/ + */ + /*if (plan_earliest.Id == plan_item.Id) + { + return "ok"; + }*/ + /* + if (plan_earliest.Patchcode == short_path) + { + return "ok"; + } + else + { + return "不是此物料最早批次,无法出库"; + } + }*/ // 6 .还差一个 数量超过要出库的箱子 return "此箱标签不可出库,批次号不在出库单计划内!请检查出库单计划!"; } @@ -748,10 +833,8 @@ namespace ZR.Service.mes.wms { return "此箱标签存在异常不可出库!"; } - } - /// /// 持久化存储 /// @@ -762,11 +845,12 @@ namespace ZR.Service.mes.wms { List orderPlans = Generate_outorderplan(shipment_num); - var x = Context.Storageable(orderPlans) - .WhereColumns(it => it.FkOutOrderId) - .WhereColumns(it => it.MaterialCode) - .WhereColumns(it => it.Patchcode) - .ToStorage(); + var x = Context + .Storageable(orderPlans) + .WhereColumns(it => it.FkOutOrderId) + .WhereColumns(it => it.MaterialCode) + .WhereColumns(it => it.Patchcode) + .ToStorage(); int result = x.AsInsertable.ExecuteCommand(); //执行插入 x.AsUpdateable.ExecuteCommand(); //执行更新  return result; @@ -779,28 +863,30 @@ namespace ZR.Service.mes.wms /// 短批次号 /// "ok" 代表通过,其余返回错误提示 /// - public string CheckRuleJudgmentFirstInFirstOut(string shipment_num, string shortPackageCode, string parnumber) + public string CheckRuleJudgmentFirstInFirstOut( + string shipment_num, + string shortPackageCode, + string parnumber + ) { // 1.检查是否有记录 - var exp1 = Expressionable.Create() + var exp1 = Expressionable + .Create() .And(it => it.FkOutOrderId == shipment_num) .And(it => it.Patchcode == shortPackageCode) .ToExpression(); - bool hasRecord = Context.Queryable() - .Where(exp1) - .Any(); + bool hasRecord = Context.Queryable().Where(exp1).Any(); if (!hasRecord) { return "此批次号不在出库单计划中!"; } - - // 1.取出出库单计划 - List plans = Context.Queryable() - .Where(it => it.FkOutOrderId == shipment_num) - .OrderBy(it => it.Outorder) - .ToList(); + List plans = Context + .Queryable() + .Where(it => it.FkOutOrderId == shipment_num) + .OrderBy(it => it.Outorder) + .ToList(); foreach (WmOutOrderPlan plan in plans) { // 不是同零件号的跳过 @@ -809,14 +895,16 @@ namespace ZR.Service.mes.wms continue; } // 2.此出库单下的批次号的已出库记录 - var exp2 = Expressionable.Create() - .And(it => it.PackageCodeClient.Contains(plan.Patchcode)) - .And(it => it.Partnumber == plan.MaterialCode) - .And(it => it.FkOutOrderId == shipment_num) - .ToExpression(); - List outPackageList = Context.Queryable() - .Where(exp2) - .ToList(); + var exp2 = Expressionable + .Create() + .And(it => it.PackageCodeClient.Contains(plan.Patchcode)) + .And(it => it.Partnumber == plan.MaterialCode) + .And(it => it.FkOutOrderId == shipment_num) + .ToExpression(); + List outPackageList = Context + .Queryable() + .Where(exp2) + .ToList(); int outPackageNum = 0; int outPartnumberNum = 0; foreach (WmGoodsOutRecord outItem in outPackageList) @@ -828,10 +916,11 @@ namespace ZR.Service.mes.wms if (plan.Patchcode != shortPackageCode) { // 此批次是否还有库存 - bool hasAny = Context.Queryable() - .Where(it => it.PackageCodeClient.Contains(plan.Patchcode)) - .Where(it => it.Partnumber == plan.MaterialCode) - .Any(); + bool hasAny = Context + .Queryable() + .Where(it => it.PackageCodeClient.Contains(plan.Patchcode)) + .Where(it => it.Partnumber == plan.MaterialCode) + .Any(); // 检查此批次是否出完 if (outPartnumberNum >= plan.RequireNum || !hasAny) { @@ -854,11 +943,10 @@ namespace ZR.Service.mes.wms { // 出完了 return "此批次已在出库计划中出完! 当前已出库:" + outPartnumberNum + "个零件!"; - } } } return "经检查,此批次号不在出库单计划中!"; } } -} \ No newline at end of file +}