diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index 79e6c71d..d6bb28cd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -137,6 +137,10 @@ public class ModuleConsts /// public const string MODULE_WmsRawmatTransferoutstock_ID = "MODULE_WmsRawmatTransferoutstock_ID"; /// + /// 模块标识-材料出库单 todo + /// + public const string MODULE_WmsRawmatOutstock_ID = "MODULE_WmsRawmatOutstock_ID"; + /// /// 模块标识-物料签收记录 todo /// public const string MODULE_WmsMaterialSignH_ID = "MODULE_WmsMaterialSignH_ID"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 832e77c3..16ab2a00 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -11,6 +11,10 @@ /// public const string WAREHOUSE_YCL_ID = "1"; /// + /// 原材料仓编码 + /// + public const string WAREHOUSE_YCL_CODE = "001"; + /// /// 中储仓ID /// public const string WAREHOUSE_ZC_ID = "2"; @@ -322,6 +326,10 @@ /// public const string BIZTYPE_WmsRawmatTransferoutstock_ID = "36318854044437"; /// + /// 预任务生成业务类型-原材料仓材料出库单 + /// + public const string BIZTYPE_WmsRawmatOutstock_ID = "36340105558037"; + /// /// 预任务生成业务类型-生产退料单 /// public const string BIZTYPE_PRDRETURN_ID = "36318858573333"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/RawmatOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/RawmatOutstockInput.cs new file mode 100644 index 00000000..cb956e36 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/RawmatOutstockInput.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; + +namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs +{ + public class RawmatOutstockInput + { + /// + /// 单号 + /// + public string? outstock_order { get; set; } + + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + + /// + /// 供货日期 + /// + public DateTime? ship_date { get; set; } + + /// + /// 主表pk + /// + public string? erp_pk { get; set; } + + public List details { get; set; } + } + public class RawmatOutstockInputDetail + { + /// + /// 行号 + /// + public string? lineno { get; set; } + + /// + /// 物品代码 + /// + public string? material_code { get; set; } + + /// + /// 单位代码 + /// + public string? unit_code { get; set; } + + /// + /// 采购数量 + /// + public decimal? qty { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 交货日期 + /// + public DateTime? delivery_date { get; set; } + + /// + /// 子表主键 + /// + public string erp_line_pk { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs index 659196bd..524c7e8f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs @@ -48,6 +48,12 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// public string erp_pk { get; set; } + /// + /// erp仓库类型 + /// + public string erp_wh_type { get; set; } + + public List details { get; set; } } public class SaleShippingDetail diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatOutstockInput.cs new file mode 100644 index 00000000..e088313f --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatOutstockInput.cs @@ -0,0 +1,34 @@ +using Tnb.WarehouseMgr.Entities.Consts; + +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class RawmatOutstockInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } = WmsWareHouseConst.AdministratorOrgId; + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 来源单据id + /// + public string? source_id { get; set; } + + /// + /// 载具 + /// + public List carrys { get; set; } + } + + public class RawmatOutstockDetailInput + { + public string carry_code { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs index 64f3ebe4..088cfcb0 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs @@ -53,5 +53,10 @@ public partial class WmsCarryCode /// [SugarColumn(IsIgnore = true)] public decimal? sign_qty { get; set; } + /// + /// 业务类型 + /// + [SugarColumn(IsIgnore = true)] + public string? biz_type { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockC.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockC.cs new file mode 100644 index 00000000..290e7968 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockC.cs @@ -0,0 +1,77 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 原材料材料出库载具表 +/// +[SugarTable("wms_rawmat_outstock_c")] +public partial class WmsRawmatOutstockC : BaseEntity +{ + public WmsRawmatOutstockC() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 原材料材料出库单id + /// + public string? bill_id { get; set; } + + /// + /// 载具ID + /// + public string? carry_id { get; set; } + + /// + /// 载具编号 + /// + public string? carry_code { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 终点库位id + /// + public string? endlocation_id { get; set; } + + /// + /// 终点库位编码 + /// + public string? endlocation_code { get; set; } + + /// + /// 起点库位id + /// + public string? startlocation_id { get; set; } + + /// + /// 起点库位编码 + /// + public string? startlocation_code { get; set; } + + /// + /// 原材料材料出库明细id + /// + public string? mat_bill_id { get; set; } + + /// + /// 载具数量 + /// + public decimal? qty { get; set; } + + /// + /// 签收数量 + /// + public decimal? sign_qty { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs new file mode 100644 index 00000000..ed96575c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs @@ -0,0 +1,127 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 材料出库单(子表) +/// +[SugarTable("wms_rawmat_outstock_d")] +public partial class WmsRawmatOutstockD : BaseEntity +{ + public WmsRawmatOutstockD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 主表id + /// + public string? bill_id { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 物料id + /// + public string? material_id { get; set; } + + /// + /// 物料编码 + /// + public string? material_code { get; set; } + + /// + /// 物料名称 + /// + public string? material_name { get; set; } + + /// + /// 规格型号 + /// + public string? material_specification { get; set; } + + /// + /// 批号 + /// + public string? batchno { get; set; } + + /// + /// 数量 + /// + public decimal? qty { get; set; } + + /// + /// 抽检载具id + /// + public string? carry_id { get; set; } + + /// + /// 抽检载具编码 + /// + public string? carry_code { get; set; } + + /// + /// 抽检出库库位id + /// + public string? location_id { get; set; } + + /// + /// 抽检出库库位 + /// + public DateTime? location_code { get; set; } + + /// + /// 抽检出库时间 + /// + public DateTime? outstock_time { get; set; } + + /// + /// 抽检确认时间 + /// + public DateTime? check_time { get; set; } + + /// + /// 抽检入库时间 + /// + public DateTime? instock_time { get; set; } + + /// + /// 单位 + /// + public string? unit { get; set; } + + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// 行号 + /// + public string? lineno { get; set; } + + /// + /// 实际出库数量 + /// + public decimal? actual_outstock_qty { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockH.cs new file mode 100644 index 00000000..8d80aebe --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockH.cs @@ -0,0 +1,87 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 材料出库(主表) +/// +[SugarTable("wms_rawmat_outstock_h")] +public partial class WmsRawmatOutstockH : BaseEntity +{ + public WmsRawmatOutstockH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 材料出库单号 + /// + public string? bill_code { get; set; } + + /// + /// 出库仓库id + /// + public string? warehouse_id { get; set; } + + /// + /// 出库类型 + /// + public string? outstock_type { get; set; } + + /// + /// 领料部门 + /// + public string? department { get; set; } + + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// erp_bill_code + /// + public string? erp_bill_code { get; set; } + + /// + /// 流程任务Id + /// + public string? f_flowtaskid { get; set; } + + /// + /// 流程引擎Id + /// + public string? f_flowid { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 下发状态 + /// + public string? issuance_status { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleH.cs index 2bebb16b..f4e12e83 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleH.cs @@ -155,4 +155,9 @@ public partial class WmsSaleH : BaseEntity, IPurchaseAndSaleAuitEntity /// public string? erp_bill_code { get; set; } + /// + /// erp仓库类型 + /// + public string? erp_wh_type { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs index 81355be6..5c622694 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs @@ -104,5 +104,21 @@ public partial class WmsTransferInstockD : BaseEntity     ///      public string? pi_code { get; set; } + + + /// + /// 库存地点 + /// + public string? stock_location { get; set; } + + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// 行号 + /// + public string? lineno { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockH.cs index b1603b85..eac49c41 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockH.cs @@ -75,5 +75,46 @@ public partial class WmsTransferInstockH : BaseEntity     ///      public string? status { get; set; } + + + /// + /// 出库组织id + /// + public string? outstockorg_id { get; set; } + + /// + /// 出库组织编号 + /// + public string? outstockorg_code { get; set; } + + /// + /// 出库组织名称 + /// + public string? outstockorg_name { get; set; } + + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// erp_bill_code + /// + public string? erp_bill_code { get; set; } + + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + + /// + /// erp仓库类型 + /// + public string? erp_wh_type { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index ac71b6df..e0715b31 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -305,33 +305,51 @@ namespace Tnb.WarehouseMgr LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【PurchaseOrderInput】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - var wmsPurchaseOrdersDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - try { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【PurchaseOrderInput】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsPurchaseOrdersDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + //if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) + //{ + // _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】表体存在物料和批号重复的明细!"); + // throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + //} + await db.Ado.BeginTranAsync(); + // 判断是否为重复传输的采购订单 + WmsPurchaseOrderH wmsPurchaseOrderRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); + if (wmsPurchaseOrderRep != null) + { + // 判断收货单是否已经生成 + WmsPurchaseH wmsPurchaseH = await db.Queryable().Where(r => r.source_id == wmsPurchaseOrderRep.id).FirstAsync(); + if (wmsPurchaseH != null) + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】wms已创建收货单{wmsPurchaseH.bill_code}!"); + throw new AppFriendlyException($@"wms已创建收货单{wmsPurchaseH.bill_code}!", 500); + } + else // 删除数据重新插入 + { + await db.Deleteable().Where(r => r.id == wmsPurchaseOrderRep.id).ExecuteCommandAsync(); + await db.Deleteable().Where(r => r.fk_wms_purchase_order_id == wmsPurchaseOrderRep.id).ExecuteCommandAsync(); + } + } + WmsPurchaseOrderH wmsPurchaseOrderH = new WmsPurchaseOrderH(); string Code = await _billRuleService.GetBillNumber("Purchase"); @@ -424,32 +442,33 @@ namespace Tnb.WarehouseMgr LoggerErp2Mes.LogInformation($"【OutsourceOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【OutsourceOrderInput】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - var wmsPurchaseOrdersDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - + try { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【OutsourceOrderInput】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsPurchaseOrdersDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + await db.Ado.BeginTranAsync(); WmsOutsourceOrderH wmsOutsourceOrderH = new WmsOutsourceOrderH(); string Code = await _billRuleService.GetBillNumber("WmsOutsourceOrder"); @@ -541,80 +560,80 @@ namespace Tnb.WarehouseMgr LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == input.warehouse_outstock).FirstAsync(); - BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == input.warehouse_instock).FirstAsync(); - if (warehouse_outstock == null) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); - } - if (warehouse_instock == null) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{input.warehouse_instock}的档案记录!"); - } - - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - string transfer_type = ""; - // 中储仓到暂存仓 - if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID) - { - int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); - if (count > 0) - { - _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); - throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); - } - - transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE; - } - else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) - { - transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE; - } - else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID) - { - transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE; - } - // 暂时其他情况都算齐套出入库类型(未定) - else - { - int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); - if (count > 0) - { - _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); - throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); - } - - transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE; - } - - - var wmsMaterialTransferdsDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsMaterialTransferdsDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - try { + BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == input.warehouse_outstock).FirstAsync(); + BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == input.warehouse_instock).FirstAsync(); + if (warehouse_outstock == null) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); + throw new AppFriendlyException($"无法查询到出库仓库{input.warehouse_outstock}的档案记录!", 500); + } + if (warehouse_instock == null) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!"); + throw new AppFriendlyException($"无法查询到入库仓库{input.warehouse_instock}的档案记录!", 500); + } + + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + string transfer_type = ""; + // 中储仓到暂存仓 + if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID) + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE; + } + // 暂时其他情况都算齐套出入库类型(未定) + else + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE; + } + + + var wmsMaterialTransferdsDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsMaterialTransferdsDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + await db.Ado.BeginTranAsync(); WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer(); string Code = await _billRuleService.GetBillNumber("MaterialTransfer"); @@ -702,43 +721,51 @@ namespace Tnb.WarehouseMgr public async Task SaleShipping(SaleShippingInput input) { - LoggerErp2Mes.LogInformation($"【SaleShipping】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【SaleShipping】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【SaleShipping】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - var wmsSaleShippingsDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsSaleShippingsDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - - BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == input.warehouse_code).FirstAsync(); - if (warehouse_outstock == null) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_code}的档案记录!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_code}的档案记录!"); - } try { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【SaleShipping】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【SaleShipping】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsSaleShippingsDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsSaleShippingsDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + + WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.erp_wh_type).FirstAsync(); + if (wmsErpWarehouserelaH == null) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!", 500); + } + + string warehouse_outstock_code = wmsErpWarehouserelaH.wms_warehousecode; + + BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == warehouse_outstock_code).FirstAsync(); + if (warehouse_outstock == null) + { + _LoggerErp2Mes.LogWarning($"【TransferOrder】无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); + } await db.Ado.BeginTranAsync(); WmsSaleH wmsSaleH = new WmsSaleH(); string Code = await _billRuleService.GetBillNumber("WmsSale"); @@ -751,6 +778,7 @@ namespace Tnb.WarehouseMgr wmsSaleH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; wmsSaleH.warehouse_id = warehouse_outstock.id; wmsSaleH.customer_code = input.customer_code; + wmsSaleH.erp_wh_type = input.erp_wh_type; var customer = await db.Queryable().Where(p => p.customer_code == input.customer_code).FirstAsync(); if (customer != null) { @@ -830,39 +858,47 @@ namespace Tnb.WarehouseMgr LoggerErp2Mes.LogInformation($"【TransferOutstock】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【TransferOutstock】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == input.warehouse_instock).FirstAsync(); - if (warehouse_instock == null) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{input.warehouse_instock}的档案记录!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【TransferOutstock】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - var wmsPurchaseOrdersDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - try { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【TransferOutstock】主表主键不能为空!"); + throw new AppFriendlyException($"主表主键不能为空", 500); + } + + WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.erp_wh_type).FirstAsync(); + if (wmsErpWarehouserelaH == null) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!", 500); + } + + string warehouse_instock_code = wmsErpWarehouserelaH.wms_warehousecode; + + BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == warehouse_instock_code).FirstAsync(); + if (warehouse_instock == null) + { + _LoggerErp2Mes.LogWarning($"【TransferOrder】无法查询到入库仓库{warehouse_instock_code}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{warehouse_instock_code}的档案记录!"); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【TransferOutstock】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsPurchaseOrdersDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } await db.Ado.BeginTranAsync(); string Code = ""; switch (warehouse_instock.id) @@ -883,6 +919,7 @@ namespace Tnb.WarehouseMgr wmsRawmatTransferinstockH.dept_code = input.dept_code; wmsRawmatTransferinstockH.biller = input.biller; wmsRawmatTransferinstockH.erp_wh_type = input.erp_wh_type; + wmsRawmatTransferinstockH.org_id = WmsWareHouseConst.AdministratorOrgId; await db.Insertable(wmsRawmatTransferinstockH).ExecuteCommandAsync(); List wmsRawmatTransferinstockDs = new List(); @@ -924,6 +961,64 @@ namespace Tnb.WarehouseMgr await db.Insertable(wmsRawmatTransferinstockDs).ExecuteCommandAsync(); + break; + } + case WmsWareHouseConst.WAREHOUSE_CP_ID: + { + WmsTransferInstockH wmsTransferInstockH = new WmsTransferInstockH(); + Code = await _billRuleService.GetBillNumber("transferInstock"); + + wmsTransferInstockH.bill_code = Code; + wmsTransferInstockH.erp_bill_code = input.transfer_order; + wmsTransferInstockH.outstockorg_code = input.outstockorg_code; + wmsTransferInstockH.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsTransferInstockH.erp_pk = input.erp_pk; + wmsTransferInstockH.create_id = WmsWareHouseConst.ErpUserId; + wmsTransferInstockH.create_time = DateTime.Now; + wmsTransferInstockH.dept_code = input.dept_code; + wmsTransferInstockH.biller = input.biller; + wmsTransferInstockH.erp_wh_type = input.erp_wh_type; + await db.Insertable(wmsTransferInstockH).ExecuteCommandAsync(); + + List wmsTransferInstockDs = new List(); + foreach (var detail in input.details) + { + WmsTransferInstockD wmsTransferInstockD = new WmsTransferInstockD(); + + wmsTransferInstockD.bill_id = wmsTransferInstockH.id; + wmsTransferInstockD.material_code = detail.material_code; + + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) + { + wmsTransferInstockD.unit_code = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + wmsTransferInstockD.qty = detail.qty; + wmsTransferInstockD.stock_location = detail.stock_location; + wmsTransferInstockD.pi_code = detail.code_batch; + wmsTransferInstockD.erp_line_pk = detail.erp_line_pk; + wmsTransferInstockD.create_id = WmsWareHouseConst.ErpUserId; + wmsTransferInstockD.create_time = DateTime.Now; + wmsTransferInstockD.xf_qty = 0; + wmsTransferInstockD.pr_qty = 0; + wmsTransferInstockD.lineno = detail.lineno; + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsTransferInstockD.material_id = material.id; + wmsTransferInstockD.material_desc = material.material_specification; + } + + wmsTransferInstockDs.Add(wmsTransferInstockD); + } + + await db.Insertable(wmsTransferInstockDs).ExecuteCommandAsync(); + break; } } @@ -956,48 +1051,48 @@ namespace Tnb.WarehouseMgr LoggerErp2Mes.LogInformation($"【TransferOrder】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - if (string.IsNullOrEmpty(input.erp_pk)) - { - _LoggerErp2Mes.LogWarning($"【TransferOrder】主表主键不能为空!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); - } - - int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); - if (count_erp_line_pk > 0) - { - _LoggerErp2Mes.LogWarning($@"【TransferOrder】子表主键不能为空!"); - throw new AppFriendlyException($@"子表主键不能为空!", 500); - } - - var wmsTransferOrdersDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsTransferOrdersDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } - - WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.erp_wh_type).FirstAsync(); - if (wmsErpWarehouserelaH == null) - { - _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!"); - throw new AppFriendlyException($@"不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!", 500); - } - - string warehouse_outstock_code = wmsErpWarehouserelaH.wms_warehousecode; - - BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == warehouse_outstock_code).FirstAsync(); - if (warehouse_outstock == null) - { - _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); - } - try { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【TransferOrder】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsTransferOrdersDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsTransferOrdersDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + + WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.erp_wh_type).FirstAsync(); + if (wmsErpWarehouserelaH == null) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!", 500); + } + + string warehouse_outstock_code = wmsErpWarehouserelaH.wms_warehousecode; + + BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == warehouse_outstock_code).FirstAsync(); + if (warehouse_outstock == null) + { + _LoggerErp2Mes.LogWarning($"【TransferOrder】无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_outstock_code}的档案记录!"); + } + await db.Ado.BeginTranAsync(); WmsTransferOrderH wmsTransferOrderH = new WmsTransferOrderH(); string Code = await _billRuleService.GetBillNumber("WmsTransferOrder"); @@ -1192,6 +1287,109 @@ namespace Tnb.WarehouseMgr } } + /// + /// 材料出库单 + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task RawmatOutstock(RawmatOutstockInput input) + { + LoggerErp2Mes.LogInformation($"【RawmatOutstock】ERP传入数据:{JsonConvert.SerializeObject(input)}"); + var db = _repository.AsSugarClient(); + + try + { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【RawmatOutstock】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsRawmatOutstocksDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsRawmatOutstocksDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + + await db.Ado.BeginTranAsync(); + + WmsRawmatOutstockH wmsRawmatOutstockH = new WmsRawmatOutstockH(); + string code = await _billRuleService.GetBillNumber("rawmatoutstock"); + wmsRawmatOutstockH.bill_code = code; + wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatOutstockH.create_time = DateTime.Now; + //wmsRawmatOutstockH.biller = input.biller; + wmsRawmatOutstockH.department = input.dept_code; + wmsRawmatOutstockH.erp_pk = input.erp_pk; + wmsRawmatOutstockH.issuance_status = "0"; + List wmsRawmatOutstockDs = new List(); + foreach (var detail in input.details) + { + WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD(); + wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id; + wmsRawmatOutstockD.unit = detail.unit_code; + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) + { + wmsRawmatOutstockD.unit = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsRawmatOutstockD.qty = detail.qty; + wmsRawmatOutstockD.batchno = detail.code_batch; + wmsRawmatOutstockD.erp_line_pk = detail.erp_line_pk; + wmsRawmatOutstockD.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatOutstockD.create_time = DateTime.Now; + wmsRawmatOutstockD.lineno = detail.lineno; + wmsRawmatOutstockD.actual_outstock_qty = 0; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsRawmatOutstockD.material_id = material.id; + wmsRawmatOutstockD.material_code = material.code; + wmsRawmatOutstockD.material_name = material.name; + wmsRawmatOutstockD.material_specification = material.material_specification; + } + + wmsRawmatOutstockDs.Add(wmsRawmatOutstockD); + } + + await db.Insertable(wmsRawmatOutstockH).ExecuteCommandAsync(); + await db.Insertable(wmsRawmatOutstockDs).ExecuteCommandAsync(); + + await db.Ado.CommitTranAsync(); + + LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + catch (Exception ex) + { + LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}"); + LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + + } + } protected Task ToApiResult(HttpStatusCode statusCode, string msg) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 8323b5a7..dc2e640b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -3718,6 +3718,14 @@ namespace Tnb.WarehouseMgr qty = wmsRawmatTransferoutstockD.qty - wmsRawmatTransferoutstockD.actual_qty; break; } + case WmsWareHouseConst.BIZTYPE_WmsRawmatOutstock_ID: + { + WmsRawmatOutstockD wmsRawmatOutstockD = await _db.Queryable().Where(r => r.id == input.source_id).FirstAsync(); + if (wmsRawmatOutstockD == null) + throw new AppFriendlyException($"来源单据{input.source_id}不存在", 500); + qty = wmsRawmatOutstockD.qty - wmsRawmatOutstockD.actual_outstock_qty; + break; + } } switch (basWarehouse.id) @@ -3786,7 +3794,7 @@ namespace Tnb.WarehouseMgr decimal? remainQty = qty - sumqty; // 首次小于0则需要分拣 - if (remainQty < 0 && !isFindSortCarry) + if (qty > 0 && remainQty < 0 && !isFindSortCarry) isFindSortCarry = true; else isFindSortCarry = false; @@ -3802,7 +3810,8 @@ namespace Tnb.WarehouseMgr barcode = g.barcode, code_batch = g.code_batch, qty = sumqty, - sign_qty = isFindSortCarry ? qty : sumqty, + sign_qty = isFindSortCarry ? qty : // 签收数量 + (qty > 0 ? sumqty : 0), // qty > 0时签收数量就是载具物料数量 isSortCarry = isFindSortCarry, // 是否为分拣载具 isSelect = isFindSortCarry || remainQty > 0, // 是否勾选 }; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index fac9fbc6..78a93c9b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; +using Org.BouncyCastle.Asn1; using Senparc.Weixin.MP.AdvancedAPIs.Card; using SqlSugar; using Tnb.BasicData.Entities; @@ -199,6 +200,14 @@ namespace Tnb.WarehouseMgr { decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum(); WmsPurchaseD wmsPurchaseD = await _db.Queryable().Where(r => r.id == group.Key.require_id).FirstAsync(); + + // 收货质检之后不能绑定 + if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res)) + { + WmsPurchaseH wmsPurchaseH = await _db.Queryable().Where(r => r.id == wmsPurchaseD.bill_id).FirstAsync(); + throw new Exception($"采购收货单{wmsPurchaseH.bill_code}中物料为 {wmsPurchaseD.material_code} 批次为{wmsPurchaseD.code_batch}的明细已进行过收货质检,此明细不能再绑定物料!"); + } + decimal? bind_qty = wmsPurchaseD.bind_qty ?? 0; if (sum + bind_qty > wmsPurchaseD.purchase_arriveqty) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 658884e6..7677dda4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -338,7 +338,23 @@ namespace Tnb.WarehouseMgr } await _db.Updateable().SetColumns(r => r.carry_status == ((int)EnumCarryStatus.占用).ToString()).Where(r => r.id == input.carry_id).ExecuteCommandAsync(); - // todo 绑定记录表 + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.id == input.carry_id).FirstAsync(); + WmsCarrybindH wmsCarrybindH = new WmsCarrybindH(); + wmsCarrybindH.carry_id = input.carry_id; + wmsCarrybindH.carry_code = wmsCarryH.carry_code; + wmsCarrybindH.create_id = input.create_id; + wmsCarrybindH.create_time = DateTime.Now; + wmsCarrybindH.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsCarrybindH.location_id = wmsCarryH.location_id; + wmsCarrybindH.location_code = wmsCarryH.location_code; + + List wmsCarrybindCodes = new List(); + + var wmsCarrybindCode = input.Adapt(); + wmsCarrybindCode.carrybind_id = wmsCarrybindH.id; + + await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync(); + await _db.Insertable(wmsCarrybindCode).ExecuteCommandAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } @@ -382,12 +398,12 @@ namespace Tnb.WarehouseMgr WmsDistaskH wmsDistaskH = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).OrderByDescending(r => r.id).FirstAsync(); if (wmsDistaskH == null) { - throw new AppFriendlyException($"【MaterialSign】无法找到载具{input.carry_code}的执行任务", 500); + throw new AppFriendlyException($"【MaterialByCarry】无法找到载具{input.carry_code}的执行任务", 500); } if (string.IsNullOrEmpty(wmsDistaskH.biz_type)) { - throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}任务{wmsDistaskH.bill_code}的业务类型异常", 500); + throw new AppFriendlyException($"【MaterialByCarry】载具{input.carry_code}任务{wmsDistaskH.bill_code}的业务类型异常", 500); } List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id && r.codeqty > 0).ToList(); @@ -406,6 +422,7 @@ namespace Tnb.WarehouseMgr foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes) { wmsCarryCode.carry_code = wmsCarryH.carry_code; + wmsCarryCode.biz_type = wmsDistaskH.biz_type; if (wmsCarryCode.codeqty < wmsRawmatTransferoutstockC.sign_qty) { wmsCarryCode.sign_qty = wmsCarryCode.codeqty; @@ -419,6 +436,35 @@ namespace Tnb.WarehouseMgr } } + break; + } + case WmsWareHouseConst.BIZTYPE_WmsRawmatOutstock_ID: + { + WmsRawmatOutstockC wmsRawmatOutstockC = await _db.Queryable() + .Where(r => r.mat_bill_id == wmsDistaskH.source_id && r.carry_id == wmsCarryH.id).FirstAsync(); + if (wmsRawmatOutstockC != null) + { + // 返回默认签收数量 + if (wmsRawmatOutstockC.sign_qty > 0) + { + List _wmsCarryCodes = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).ToList(); + foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes) + { + wmsCarryCode.carry_code = wmsCarryH.carry_code; + wmsCarryCode.biz_type = wmsDistaskH.biz_type; + if (wmsCarryCode.codeqty < wmsRawmatOutstockC.sign_qty) + { + wmsCarryCode.sign_qty = wmsCarryCode.codeqty; + wmsRawmatOutstockC.sign_qty -= wmsCarryCode.codeqty; + } + else + { + wmsCarryCode.sign_qty = wmsRawmatOutstockC.sign_qty; + } + } + } + } + break; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index d1d0937d..9f4dde4c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -91,7 +91,7 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}未绑定物料", 500); } - if (string.IsNullOrEmpty(wmsCarryH.location_id)) + if (string.IsNullOrEmpty(wmsCarryH.location_id)) { throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}当前库位为空,无法签收", 500); } @@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}签收数量不能为空", 500); } - WmsCarryCode wmsCarryCode = wmsCarryCodes.Where(r => r.id == item.carry_code_id).First(); + WmsCarryCode wmsCarryCode = wmsCarryCodes.Where(r => r.id == item.carry_code_id).FirstOrDefault(); if (wmsCarryCode == null) { throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code} 载具物料明细id {item.carry_code_id}不存在", 500); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs new file mode 100644 index 00000000..dc39ff38 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Aop.Api.Domain; +using JNPF.Common.Core.Manager; +using JNPF.Common.Dtos.VisualDev; +using JNPF.Common.Enums; +using JNPF.FriendlyException; +using JNPF.Systems.Interfaces.System; +using JNPF.VisualDev; +using JNPF.VisualDev.Interfaces; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; +using NPOI.HPSF; +using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen; +using SqlSugar; +using Tnb.BasicData.Entities; +using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Entity; +using Tnb.WarehouseMgr.Interfaces; + +namespace Tnb.WarehouseMgr +{ + /// + /// 材料出库单 + /// + [OverideVisualDev(ModuleConsts.MODULE_WmsRawmatOutstock_ID)] + public class WmsRawmatOutstockService : BaseWareHouseService + { + private readonly ISqlSugarClient _db; + private readonly IUserManager _userManager; + private readonly IBillRullService _billRullService; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; + private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; + private readonly IWareHouseService _wareHouseService; + public WmsRawmatOutstockService( + ISqlSugarRepository repository, + IUserManager userManager, + IBillRullService billRullService, + IRunService runService, + IVisualDevService visualDevService, + IWmsPDAScanInStockService wmsPDAScanInStock, + IWareHouseService wareHouseService) + { + _db = repository.AsSugarClient(); + _userManager = userManager; + _billRullService = billRullService; + _runService = runService; + _visualDevService = visualDevService; + _wmsPDAScanInStock = wmsPDAScanInStock; + _wareHouseService = wareHouseService; + } + + + public override async Task ModifyAsync(WareHouseUpInput input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + + } + + + /// + /// 下发 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task Distribute(RawmatOutstockInput input) + { + try + { + await _s_taskExecuteSemaphore_YCLOutstock.WaitAsync(); + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + if (input.carrys.Count == 0) + { + throw new AppFriendlyException("至少选择一个载具", 500); + } + + WmsRawmatOutstockD wmsRawmatOutstockD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + WmsRawmatOutstockH wmsRawmatOutstockH = await _db.Queryable().FirstAsync(it => it.id == wmsRawmatOutstockD.bill_id); + + List _items = await _db.Queryable().Where(r => input.carrys.Select(c => c.carry_code).Contains(r.carry_code)).ToListAsync(); + + List wmsCarryCodes = await _db.Queryable().Where(r => _items.Select(c => c.id).Contains(r.carry_id) + && r.material_id == wmsRawmatOutstockD.material_id && r.code_batch == wmsRawmatOutstockD.batchno).ToListAsync(); + + List items = new List(); + + foreach (var carry in input.carrys.Select(c => c.carry_code)) + { + items.Add(_items.Where(r => r.carry_code == carry).First()); + } + + foreach (var item in items) + { + if (item.is_lock == 1) + { + throw new AppFriendlyException($"载具{item.carry_code}已锁定", 500); + } + BasLocation carrryLoc = await _db.Queryable().Where(r => r.id == item.location_id).FirstAsync(); + if (carrryLoc == null || carrryLoc.is_type != "0") + { + throw new Exception($"托盘{item.carry_code}已经不在存储库位中,不能出库!"); + } + } + + decimal? sign_qty = 0; + + decimal qty = wmsCarryCodes.Sum(c => c.codeqty); + if (wmsRawmatOutstockD.actual_outstock_qty + qty > wmsRawmatOutstockD.qty) + { + // 最后一个托盘的数量 + decimal lastCarryQty = wmsCarryCodes.Where(r => r.carry_id == items[items.Count - 1].id).Sum(r => r.codeqty); + // 如果最后一个托盘数量小于超出的出库数量 + if (lastCarryQty < wmsRawmatOutstockD.actual_outstock_qty + qty - wmsRawmatOutstockD.qty) + { + throw new AppFriendlyException($"本次出库数量{qty}已超过可出库数量{wmsRawmatOutstockD.qty - wmsRawmatOutstockD.actual_outstock_qty} 且无需选择{items[items.Count - 1].carry_code}", 500); + } + // 签收数量 + sign_qty = lastCarryQty - (wmsRawmatOutstockD.actual_outstock_qty + qty - wmsRawmatOutstockD.qty); + } + + await _db.Ado.BeginTranAsync(); + + List endLocations = new List(); + + endLocations = _db.Queryable().Where(r => _wareHouseService.GetFloor1YCLDBOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") + .OrderBy("is_lock, task_nums, location_code").ToList(); + + if (endLocations.Count() < items.Count) + { + throw new AppFriendlyException($@"可用的终点库位数量为{endLocations.Count()}个 下发数量为{items.Count}个 请检查终点库位的锁定和占用状态", 500); + } + + foreach (var wmsCarryH in items) + { + BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + + BasLocation endLocation = null; + + endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1YCLDBOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); + + if (endLocation == null) + { + throw new AppFriendlyException($@"没有可用的终点库位!请检查终点库位的锁定和占用状态", 500); + } + + WmsRawmatOutstockC wmsRawmatOutstockC = new WmsRawmatOutstockC(); + wmsRawmatOutstockC.bill_id = wmsRawmatOutstockH.id; + wmsRawmatOutstockC.mat_bill_id = wmsRawmatOutstockD.id; + wmsRawmatOutstockC.carry_id = wmsCarryH.id; + wmsRawmatOutstockC.carry_code = wmsCarryH.carry_code; + wmsRawmatOutstockC.create_id = input.create_id; + wmsRawmatOutstockC.create_time = DateTime.Now; + wmsRawmatOutstockC.startlocation_id = startLocation.id; + wmsRawmatOutstockC.startlocation_code = startLocation.location_code; + wmsRawmatOutstockC.endlocation_id = endLocation.id; + wmsRawmatOutstockC.endlocation_code = endLocation.location_code; + decimal carryQty = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).Sum(r => r.codeqty); + wmsRawmatOutstockC.qty = carryQty; + wmsRawmatOutstockC.sign_qty = wmsCarryH.id == items[items.Count - 1].id && sign_qty > 0 ? sign_qty : carryQty; + + await _db.Insertable(wmsRawmatOutstockC).ExecuteCommandAsync(); + + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = startLocation.id; + commonCreatePretaskInput.endlocation_id = endLocation.id; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WmsRawmatOutstock_ID; + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.isExcuteMission = false; + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + + if (res.code != HttpStatusCode.OK) + { + Logger.LogInformation($@"生成预任务失败"); + throw new AppFriendlyException($@"生成预任务失败", 500); + } + } + + // 更新子表已下发数量 + await _db.Updateable().SetColumns(r => r.actual_outstock_qty == r.actual_outstock_qty + qty).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【Distribute】" + ex.Message); + Logger.LogError("【Distribute】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + _ = _s_taskExecuteSemaphore_YCLOutstock.Release(); + InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs index 53642c0f..f1b3c164 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs @@ -73,7 +73,7 @@ namespace Tnb.WarehouseMgr /// - /// 按托下发(到集中供料或外协) + /// 下发 /// /// ///