diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index d6bb28cd..2c165edf 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_WmsPurchaseReturn_ID = "MODULE_WmsPurchaseReturn_ID"; + /// /// 模块标识-材料出库单 todo /// public const string MODULE_WmsRawmatOutstock_ID = "MODULE_WmsRawmatOutstock_ID"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 16ab2a00..cadb7618 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -290,6 +290,14 @@ /// public const string BIZTYPE_WMSINSTOCK_ID = "26191496816421"; /// + /// 预任务生成业务类型-原材料委外入库 + /// + public const string BIZTYPE_OUTSOURCE_ID = "36366312756501"; + /// + /// 预任务生成业务类型-原材料调拨入库 + /// + public const string BIZTYPE_RAWMATTRANSFERINSTOCK_ID = "36366317804821"; + /// /// 预任务生成业务类型-一般出库 /// public const string BIZTYPE_WMSOUTSTOCK_ID = "26191522660645"; @@ -318,7 +326,7 @@ /// public const string BIZTYPE_WMSSALERELEASE_ID = "25104446664213"; /// - /// 预任务生成业务类型-原材料转库单 todo + /// 预任务生成业务类型-原材料转库单 /// public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685"; /// @@ -326,6 +334,10 @@ /// public const string BIZTYPE_WmsRawmatTransferoutstock_ID = "36318854044437"; /// + /// 预任务生成业务类型-采购退库(原材料) + /// + public const string BIZTYPE_WmsPurchaseReturn_ID = "36367919005717"; + /// /// 预任务生成业务类型-原材料仓材料出库单 /// public const string BIZTYPE_WmsRawmatOutstock_ID = "36340105558037"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PurchaseReturnInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PurchaseReturnInput.cs new file mode 100644 index 00000000..9a19ff14 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/PurchaseReturnInput.cs @@ -0,0 +1,34 @@ +using Tnb.WarehouseMgr.Entities.Consts; + +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class PurchaseReturnInput + { + /// + /// 组织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 PurchaseReturnDetailInput + { + public string carry_code { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnC.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnC.cs new file mode 100644 index 00000000..b073e4fc --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnC.cs @@ -0,0 +1,77 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 采购退货单载具表 +/// +[SugarTable("wms_purchase_return_c")] +public partial class WmsPurchaseReturnC : BaseEntity +{ + public WmsPurchaseReturnC() + { + 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/WmsPurchaseReturnD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnD.cs new file mode 100644 index 00000000..00dceb0e --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnD.cs @@ -0,0 +1,96 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 采购退货子表 +/// +[SugarTable("wms_purchase_return_d")] +public partial class WmsPurchaseReturnD : BaseEntity +{ + public WmsPurchaseReturnD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 主表id + /// + public string? bill_id { get; set; } + + /// + /// 物料id + /// + public string? matcode_id { get; set; } + + /// + /// 物料编号 + /// + public string? matcode { get; set; } + + /// + /// 物料描述 + /// + public string? matspecification { get; set; } + + /// + /// 单位 + /// + public string? unit { get; set; } + + /// + /// 退货数量 + /// + public decimal? qty { get; set; } + + /// + /// 实退数量 + /// + public decimal? actual_qty { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 扩展字段 + /// + public string? extras { 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; } + + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// 行号 + /// + public string? lineno { get; set; } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnH.cs new file mode 100644 index 00000000..5d68c29d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseReturnH.cs @@ -0,0 +1,127 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 采购退货 +/// +[SugarTable("wms_purchase_return_h")] +public partial class WmsPurchaseReturnH : BaseEntity +{ + public WmsPurchaseReturnH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 采购退货单号 + /// + public string? bill_code { get; set; } + + /// + /// 联系人 + /// + public string? contact_person { get; set; } + + /// + /// 电话 + /// + public string? tel { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 扩展字段 + /// + public string? extras { get; set; } + + /// + /// 时间戳 + /// + public string? time_stamp { get; set; } + + /// + /// 单据类型 + /// + public string? document_type { 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; } + + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 流程任务Id + /// + public string? f_flowtaskid { get; set; } + + /// + /// 流程引擎Id + /// + public string? f_flowid { get; set; } + + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + + /// + /// 下发状态 + /// + public string? issuance_status { get; set; } + + /// + /// 采购订单 + /// + public string? purchase_order { get; set; } + + /// + /// 出库类型(BIP) + /// + public string? outstock_type { get; set; } + + /// + /// 出库仓库 + /// + public string? warehouse_code { get; set; } + + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// erp_bill_code + /// + public string? erp_bill_code { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index 2d86303f..8d4c3e15 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Text; using Aop.Api.Domain; using JNPF.Common.Enums; @@ -320,104 +321,201 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"子表主键不能为空!", 500); } - var wmsPurchaseOrdersDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); + //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); //} + + List details = input.details.Where(r => r.purchase_quantity > 0).ToList(); + List details_return = input.details.Where(r => r.purchase_quantity < 0).ToList(); + // purchase_quantity 是负数作为采购退料 + await db.Ado.BeginTranAsync(); - // 判断是否为重复传输的采购订单 - WmsPurchaseOrderH wmsPurchaseOrderRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); - if (wmsPurchaseOrderRep != null) + + if (details.Count > 0) { - // 判断收货单是否已经生成 - WmsPurchaseH wmsPurchaseH = await db.Queryable().Where(r => r.source_id == wmsPurchaseOrderRep.id).FirstAsync(); - if (wmsPurchaseH != null) + // 判断是否为重复传输的采购订单 + WmsPurchaseOrderH wmsPurchaseOrderRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); + if (wmsPurchaseOrderRep != null) { - _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】wms已创建收货单{wmsPurchaseH.bill_code}!"); - throw new AppFriendlyException($@"wms已创建收货单{wmsPurchaseH.bill_code}!", 500); + // 判断收货单是否已经生成 + 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(); + } } - else // 删除数据重新插入 + + WmsPurchaseOrderH wmsPurchaseOrderH = new WmsPurchaseOrderH(); + string Code = await _billRuleService.GetBillNumber("Purchase"); + + wmsPurchaseOrderH.purchase_order = Code; + wmsPurchaseOrderH.erp_bill_code = input.purchase_order; + wmsPurchaseOrderH.contact_person = input.contact_person; + wmsPurchaseOrderH.tel = input.tel; + wmsPurchaseOrderH.supplier_code = input.supplier_code; + wmsPurchaseOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); + wmsPurchaseOrderH.ship_date = input.ship_date; + wmsPurchaseOrderH.erp_pk = input.erp_pk; + wmsPurchaseOrderH.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseOrderH.create_time = DateTime.Now; + var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); + if (supplier != null) { - 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.supplier_id = supplier.id; + wmsPurchaseOrderH.supplier_name = supplier.supplier_name; } + + await db.Insertable(wmsPurchaseOrderH).ExecuteCommandAsync(); + + List wmsPurchaseOrderDs = new List(); + foreach (var detail in input.details) + { + WmsPurchaseOrderD wmsPurchaseOrderD = new WmsPurchaseOrderD(); + + wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id; + wmsPurchaseOrderD.matcode = detail.material_code; + wmsPurchaseOrderD.unit = detail.unit_code; + + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) + { + wmsPurchaseOrderD.unit_id = erpExtendField.Id; + wmsPurchaseOrderD.unit = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity; + wmsPurchaseOrderD.stock_location = detail.stock_location; + wmsPurchaseOrderD.code_batch = detail.code_batch; + wmsPurchaseOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); + wmsPurchaseOrderD.erp_line_pk = detail.erp_line_pk; + wmsPurchaseOrderD.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseOrderD.create_time = DateTime.Now; + wmsPurchaseOrderD.actual_quantity = 0; + wmsPurchaseOrderD.lineno = detail.lineno; + wmsPurchaseOrderD.gift = detail.gift; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsPurchaseOrderD.matcode_id = material.id; + wmsPurchaseOrderD.matspecification = material.material_specification; + } + + wmsPurchaseOrderDs.Add(wmsPurchaseOrderD); + } + + await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync(); + LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}"); } - WmsPurchaseOrderH wmsPurchaseOrderH = new WmsPurchaseOrderH(); - string Code = await _billRuleService.GetBillNumber("Purchase"); - - wmsPurchaseOrderH.purchase_order = Code; - wmsPurchaseOrderH.erp_bill_code = input.purchase_order; - wmsPurchaseOrderH.contact_person = input.contact_person; - wmsPurchaseOrderH.tel = input.tel; - wmsPurchaseOrderH.supplier_code = input.supplier_code; - wmsPurchaseOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); - wmsPurchaseOrderH.ship_date = input.ship_date; - wmsPurchaseOrderH.erp_pk = input.erp_pk; - wmsPurchaseOrderH.create_id = WmsWareHouseConst.ErpUserId; - wmsPurchaseOrderH.create_time = DateTime.Now; - var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); - if (supplier != null) + if (details_return.Count > 0) { - wmsPurchaseOrderH.supplier_id = supplier.id; - wmsPurchaseOrderH.supplier_name = supplier.supplier_name; + // 判断是否为重复传输的采购退料订单 + WmsPurchaseReturnH wmsPurchaseReturnRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); + if (wmsPurchaseReturnRep != null) + { + // 判断采购退货是否已经下发 + List wmsPurchaseReturnDReps = await db.Queryable().Where(r => r.bill_id == wmsPurchaseReturnRep.id).ToListAsync(); + if (wmsPurchaseReturnDReps.Where(r => r.actual_qty > 0).Count() > 0) + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】wms采购退货单{wmsPurchaseReturnRep.bill_code}已下发,不能退回!"); + throw new AppFriendlyException($@"wms采购退货单{wmsPurchaseReturnRep.bill_code}已下发,不能退回!", 500); + } + else // 删除数据重新插入 + { + await db.Deleteable().Where(r => r.id == wmsPurchaseReturnRep.id).ExecuteCommandAsync(); + await db.Deleteable().Where(r => r.bill_id == wmsPurchaseReturnRep.id).ExecuteCommandAsync(); + } + } + + WmsPurchaseReturnH wmsPurchaseReturnH = new WmsPurchaseReturnH(); + string Code = await _billRuleService.GetBillNumber("WmsPurchaseReturn"); + + wmsPurchaseReturnH.purchase_order = Code; + wmsPurchaseReturnH.erp_bill_code = input.purchase_order; + wmsPurchaseReturnH.contact_person = input.contact_person; + wmsPurchaseReturnH.tel = input.tel; + //wmsPurchaseReturnH.supplier_code = input.supplier_code; + //wmsPurchaseReturnH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); + //wmsPurchaseReturnH.ship_date = input.ship_date; + wmsPurchaseReturnH.erp_pk = input.erp_pk; + wmsPurchaseReturnH.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseReturnH.create_time = DateTime.Now; + //var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); + //if (supplier != null) + //{ + // wmsPurchaseReturnH.supplier_id = supplier.id; + // wmsPurchaseReturnH.supplier_name = supplier.supplier_name; + //} + + await db.Insertable(wmsPurchaseReturnH).ExecuteCommandAsync(); + + List wmsPurchaseReturnDs = new List(); + foreach (var detail in input.details) + { + WmsPurchaseReturnD wmsPurchaseReturnD = new WmsPurchaseReturnD(); + + wmsPurchaseReturnD.bill_id = wmsPurchaseReturnD.id; + wmsPurchaseReturnD.matcode = detail.material_code; + wmsPurchaseReturnD.unit = detail.unit_code; + + + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) + { + wmsPurchaseReturnD.unit = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsPurchaseReturnD.qty = detail.purchase_quantity; + wmsPurchaseReturnD.code_batch = detail.code_batch; + wmsPurchaseReturnD.erp_line_pk = detail.erp_line_pk; + wmsPurchaseReturnD.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseReturnD.create_time = DateTime.Now; + wmsPurchaseReturnD.actual_qty = 0; + wmsPurchaseReturnD.lineno = detail.lineno; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsPurchaseReturnD.matcode_id = material.id; + wmsPurchaseReturnD.matspecification = material.material_specification; + } + + wmsPurchaseReturnDs.Add(wmsPurchaseReturnD); + } + + await db.Insertable(wmsPurchaseReturnDs).ExecuteCommandAsync(); + LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}"); } - await db.Insertable(wmsPurchaseOrderH).ExecuteCommandAsync(); - List wmsPurchaseOrderDs = new List(); - foreach (var detail in input.details) - { - WmsPurchaseOrderD wmsPurchaseOrderD = new WmsPurchaseOrderD(); - - wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id; - wmsPurchaseOrderD.matcode = detail.material_code; - wmsPurchaseOrderD.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) - { - wmsPurchaseOrderD.unit_id = erpExtendField.Id; - wmsPurchaseOrderD.unit = erpExtendField.EnCode; - } - else - { - _LoggerErp2Mes.LogWarning($@"【PurchaseOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); - throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); - } - - wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity; - wmsPurchaseOrderD.stock_location = detail.stock_location; - wmsPurchaseOrderD.code_batch = detail.code_batch; - wmsPurchaseOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); - wmsPurchaseOrderD.erp_line_pk = detail.erp_line_pk; - wmsPurchaseOrderD.create_id = WmsWareHouseConst.ErpUserId; - wmsPurchaseOrderD.create_time = DateTime.Now; - wmsPurchaseOrderD.actual_quantity = 0; - wmsPurchaseOrderD.lineno = detail.lineno; - wmsPurchaseOrderD.gift = detail.gift; - - var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); - if (material != null) - { - wmsPurchaseOrderD.matcode_id = material.id; - wmsPurchaseOrderD.matspecification = material.material_specification; - } - - wmsPurchaseOrderDs.Add(wmsPurchaseOrderD); - } - - await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); - LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) @@ -501,7 +599,7 @@ namespace Tnb.WarehouseMgr wmsOutsourceOrderD.fk_wms_outsource_order_id = wmsOutsourceOrderH.id; wmsOutsourceOrderD.matcode = 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(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsOutsourceOrderD.unit = erpExtendField.EnCode; @@ -679,7 +777,7 @@ namespace Tnb.WarehouseMgr wmsMaterialTransferD.material_specification = material.material_specification; } - 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(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsMaterialTransferD.unit_id = erpExtendField.Id; @@ -807,7 +905,7 @@ namespace Tnb.WarehouseMgr wmsSaleD.create_id = WmsWareHouseConst.ErpUserId; wmsSaleD.create_time = DateTime.Now; - 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(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsSaleD.unit_id = erpExtendField.Id; @@ -930,7 +1028,7 @@ namespace Tnb.WarehouseMgr msRawmatTransferinstockD.bill_id = wmsRawmatTransferinstockH.id; msRawmatTransferinstockD.matcode = 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(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { msRawmatTransferinstockD.unit = erpExtendField.EnCode; @@ -989,7 +1087,7 @@ namespace Tnb.WarehouseMgr 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(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsTransferInstockD.unit_id = erpExtendField.Id; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs index 9e45c5c9..4cecb31e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs @@ -101,8 +101,16 @@ namespace Tnb.WarehouseMgr if (minPacking.HasValue && minPacking.Value > 0) { - int mod = (int)(WmsOutsourceD.actual_quantity % minPacking.Value); - codeNum = (int)(mod > 0 ? (WmsOutsourceD.actual_quantity / minPacking.Value) + 1 : WmsOutsourceD.actual_quantity / minPacking.Value); + codeNum = input.barcode_qty; + + decimal qty = (int)(codeNum * minPacking); + + decimal mod = 0; + decimal extra = (qty - WmsOutsourceD.actual_quantity).Value; + if (extra > 0 && extra < minPacking) + { + mod = minPacking.Value - extra; + } for (int j = 0; j < codeNum; j++) { @@ -137,11 +145,11 @@ namespace Tnb.WarehouseMgr } await _db.Ado.CommitTranAsync(); barcodes.AddRange(wmsTempCodes.Select(p => p.barcode).ToList()); - if (barcodes?.Count > 0) - { - var ip = _db.Queryable().Where(p => p.key == "printerip").FirstAsync().Result.value; - base.BarCodePrint(barcodes, 1, ip); - } + //if (barcodes?.Count > 0) + //{ + // var ip = _db.Queryable().Where(p => p.key == "printerip").FirstAsync().Result.value; + // base.BarCodePrint(barcodes, 1, ip); + //} } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs index 0e09096f..a7240ff2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs @@ -396,6 +396,7 @@ namespace Tnb.WarehouseMgr var whId = input.data.ContainsKey(nameof(WmsPurchaseH.warehouse_id)) ? input.data[nameof(WmsPurchaseH.warehouse_id)] : "1"; var billCode = input.data.ContainsKey(nameof(WmsPurchaseH.bill_code)) ? input.data[nameof(WmsPurchaseH.bill_code)] : null; string bill_type = ""; + string biz_type = WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID; string required_type = (await _dbScanInStockByRedis.Queryable().FirstAsync(it => it.barcode == input.data["物料条码"])).required_type; string source_id = (await _dbScanInStockByRedis.Queryable().FirstAsync(it => it.barcode == input.data["物料条码"])).require_id; switch (required_type) @@ -407,12 +408,14 @@ namespace Tnb.WarehouseMgr } case WmsWareHouseConst.BILLTYPE_OUTSOURCE_ID: { - bill_type = WmsWareHouseConst.BILLTYPE_OUTSOURCEINSTOCK_ID; + bill_type = WmsWareHouseConst.BILLTYPE_OUTSOURCEINSTOCK_ID; + biz_type = WmsWareHouseConst.BIZTYPE_OUTSOURCE_ID; break; } case WmsWareHouseConst.BILLTYPE_RAWMATTRANSFERINSTOCK_ID: { bill_type = WmsWareHouseConst.BILLTYPE_RAWMATTRANSFERINSTOCK_ID; + biz_type = WmsWareHouseConst.BIZTYPE_RAWMATTRANSFERINSTOCK_ID; break; } } @@ -574,7 +577,7 @@ namespace Tnb.WarehouseMgr endpoint_code = ePoint?.point_code!, bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, - biz_type = WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID, + biz_type = biz_type, task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID, carry_id = carry.id, carry_code = carry.carry_code, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs index 98fc09b2..09c50af6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs @@ -198,10 +198,10 @@ namespace Tnb.WarehouseMgr { "checking", 32 }, }; string isCheck = dic2[qcRes].ToString(); - await _db.Updateable() - .SetColumns(x => x.is_check == isCheck) - .Where(x => carryIds.Contains(x.id)) - .ExecuteCommandAsync(); + //await _db.Updateable() + // .SetColumns(x => x.is_check == isCheck) + // .Where(x => carryIds.Contains(x.id)) + // .ExecuteCommandAsync(); BasFactoryConfig config = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseReturnService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseReturnService.cs new file mode 100644 index 00000000..fbbfcedc --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseReturnService.cs @@ -0,0 +1,220 @@ +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_WmsPurchaseReturn_ID)] + public class WmsPurchaseReturnService : 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 WmsPurchaseReturnService( + 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(PurchaseReturnInput 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); + } + + WmsPurchaseReturnD wmsPurchaseReturnD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + WmsPurchaseReturnH wmsPurchaseReturnH = await _db.Queryable().FirstAsync(it => it.id == wmsPurchaseReturnD.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 == wmsPurchaseReturnD.matcode_id && r.code_batch == wmsPurchaseReturnD.code_batch).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 (wmsPurchaseReturnD.actual_qty + qty > wmsPurchaseReturnD.qty) + { + // 最后一个托盘的数量 + decimal lastCarryQty = wmsCarryCodes.Where(r => r.carry_id == items[items.Count - 1].id).Sum(r => r.codeqty); + // 如果最后一个托盘数量小于超出的出库数量 + if (lastCarryQty < wmsPurchaseReturnD.actual_qty + qty - wmsPurchaseReturnD.qty) + { + throw new AppFriendlyException($"本次出库数量{qty}已超过可出库数量{wmsPurchaseReturnD.qty - wmsPurchaseReturnD.actual_qty} 且无需选择{items[items.Count - 1].carry_code}", 500); + } + // 签收数量 + sign_qty = lastCarryQty - (wmsPurchaseReturnD.actual_qty + qty - wmsPurchaseReturnD.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); + } + + WmsPurchaseReturnC wmsPurchaseReturnC = new WmsPurchaseReturnC(); + wmsPurchaseReturnC.bill_id = wmsPurchaseReturnH.id; + wmsPurchaseReturnC.mat_bill_id = wmsPurchaseReturnD.id; + wmsPurchaseReturnC.carry_id = wmsCarryH.id; + wmsPurchaseReturnC.carry_code = wmsCarryH.carry_code; + wmsPurchaseReturnC.create_id = input.create_id; + wmsPurchaseReturnC.create_time = DateTime.Now; + wmsPurchaseReturnC.startlocation_id = startLocation.id; + wmsPurchaseReturnC.startlocation_code = startLocation.location_code; + wmsPurchaseReturnC.endlocation_id = endLocation.id; + wmsPurchaseReturnC.endlocation_code = endLocation.location_code; + decimal carryQty = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).Sum(r => r.codeqty); + wmsPurchaseReturnC.qty = carryQty; + wmsPurchaseReturnC.sign_qty = wmsCarryH.id == items[items.Count - 1].id && sign_qty > 0 ? sign_qty : carryQty; + + await _db.Insertable(wmsPurchaseReturnC).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_WmsPurchaseReturn_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_qty == r.actual_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/WmsRawmatOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs index dc39ff38..3784ea49 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatOutstockService.cs @@ -58,6 +58,8 @@ namespace Tnb.WarehouseMgr _visualDevService = visualDevService; _wmsPDAScanInStock = wmsPDAScanInStock; _wareHouseService = wareHouseService; + + OverideFuncs.GetDetailsAsync = GetDetailsAsync; } @@ -68,10 +70,21 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - } - + [NonAction] + private async Task GetDetailsAsync(string id) + { + try + { + return await Task.FromResult(_db.Queryable().Where(r => r.bill_id == id).ToList()); + } + catch (Exception ex) + { + return Task.FromResult(ex); + } + } + /// /// 下发 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs index f1b3c164..007698d9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs @@ -58,6 +58,7 @@ namespace Tnb.WarehouseMgr _visualDevService = visualDevService; _wmsPDAScanInStock = wmsPDAScanInStock; _wareHouseService = wareHouseService; + OverideFuncs.GetDetailsAsync = GetDetailsAsync; } @@ -71,7 +72,19 @@ namespace Tnb.WarehouseMgr } - + [NonAction] + private async Task GetDetailsAsync(string id) + { + try + { + return await Task.FromResult(_db.Queryable().Where(r => r.bill_id == id).ToList()); + } + catch (Exception ex) + { + return Task.FromResult(ex); + } + } + /// /// 下发 ///