using System.Text; using Aop.Api.Domain; using JNPF.Common.Enums; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NPOI.OpenXmlFormats; using NPOI.SS.Formula.Functions; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto.ErpInputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Entity; using Top.Api; namespace Tnb.WarehouseMgr { /// /// erp接口模块 /// [ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)] public class ErpToWmsService : IDynamicApiController, ITransient { private readonly ISqlSugarRepository _repository; private readonly IBillRullService _billRuleService; public ErpToWmsService(ISqlSugarRepository repository, IBillRullService billRuleService) { _repository = repository; _billRuleService = billRuleService; } /// /// 采购到货单 /// public async Task PurchaseArrive(PurchaseArriveInput input) { //主表 create_time 采购收货单号 bill_code 单据类型 bill_type 单据状态 status 业务类型 biz_type 入库仓库ID warehouse_id 供应商ID supplier_id 供应商名称supplier_name 生成类型 generate_type //子表 主表id bill_id 执行状态line_status 单位id unit_id 物料id material_id var db = _repository.AsSugarClient(); WmsPurchaseH wmsPurchaseH = new WmsPurchaseH(); string Code = await _billRuleService.GetBillNumber("WmsPurchase"); wmsPurchaseH.bill_code = Code; wmsPurchaseH.bill_type = "25103333373205";//收料通知单(到货单) wmsPurchaseH.biz_type = "26191496816421";//一般入库 wmsPurchaseH.status = "25065138925589";//新增 wmsPurchaseH.generate_type = "1";//0人工 1自动 wmsPurchaseH.create_time = DateTime.Now; wmsPurchaseH.source_id = input.source_id; wmsPurchaseH.source_code = input.source_code; wmsPurchaseH.delivery_date = input.delivery_date; wmsPurchaseH.shipping_method = input.shipping_method; var warehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (warehouse != null) wmsPurchaseH.warehouse_id = warehouse.id; wmsPurchaseH.supplier_code = input.supplier_code; var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); if (supplier != null) { wmsPurchaseH.supplier_id = supplier.id; wmsPurchaseH.supplier_name = supplier.supplier_name; } List WmsPurchaseDs = new List(); foreach (var detail in input.details) { WmsPurchaseD wmsPurchased = new WmsPurchaseD(); wmsPurchased.bill_id = wmsPurchaseH.id; wmsPurchased.line_status = "25065138925589";//新增 wmsPurchased.purchase_qty = detail.purchase_qty; wmsPurchased.purchase_prqty = detail.purchase_prqty; wmsPurchased.code_batch = detail.code_batch; wmsPurchased.purchase_arriveqty = detail.purchase_arriveqty; wmsPurchased.container_no = detail.container_no; wmsPurchased.material_code = detail.material_code; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsPurchased.material_id = material.id; // wmsPurchased.material_name = material.name; wmsPurchased.unit_id = material.unit_id; } WmsPurchaseDs.Add(wmsPurchased); } await db.Insertable(wmsPurchaseH).ExecuteCommandAsync(); await db.Insertable(WmsPurchaseDs).ExecuteCommandAsync(); } /// /// 采购退货单 /// public async Task PurchaseReturn(ErpPurchaseReturnInput input) { //主表 create_time 采购收货单号 bill_code 单据类型 bill_type 单据状态 status 业务类型 biz_type 入库仓库ID warehouse_id 供应商ID supplier_id 供应商名称supplier_name 生成类型 generate_type //子表 主表id bill_id 执行状态line_status 单位id unit_id 物料id material_id var db = _repository.AsSugarClient(); WmsPurchaseH wmsPurchaseH = new WmsPurchaseH(); string Code = await _billRuleService.GetBillNumber("WmsPurchase"); wmsPurchaseH.bill_code = Code; wmsPurchaseH.bill_type = "25103345478421";//采购退料单 wmsPurchaseH.biz_type = "26191522660645";//一般出库 wmsPurchaseH.status = "25065138925589";//新增 wmsPurchaseH.generate_type = "1";//0人工 1自动 wmsPurchaseH.create_time = DateTime.Now; wmsPurchaseH.source_id = input.source_id; wmsPurchaseH.source_code = input.source_code; wmsPurchaseH.delivery_date = input.delivery_date; wmsPurchaseH.shipping_method = input.shipping_method; var warehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (warehouse != null) wmsPurchaseH.warehouse_id = warehouse.id; wmsPurchaseH.supplier_code = input.supplier_code; var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); if (supplier != null) { wmsPurchaseH.supplier_id = supplier.id; wmsPurchaseH.supplier_name = supplier.supplier_name; } List WmsPurchaseDs = new List(); foreach (var detail in input.details) { WmsPurchaseD wmsPurchased = new WmsPurchaseD(); wmsPurchased.bill_id = wmsPurchaseH.id; wmsPurchased.line_status = "25065138925589";//新增 wmsPurchased.purchase_qty = detail.purchase_qty; wmsPurchased.purchase_prqty = detail.purchase_prqty; wmsPurchased.code_batch = detail.code_batch; wmsPurchased.purchase_arriveqty = detail.purchase_arriveqty; wmsPurchased.container_no = detail.container_no; wmsPurchased.material_code = detail.material_code; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsPurchased.material_id = material.id; // wmsPurchased.material_name = material.name; wmsPurchased.unit_id = material.unit_id; } WmsPurchaseDs.Add(wmsPurchased); } await db.Insertable(wmsPurchaseH).ExecuteCommandAsync(); await db.Insertable(WmsPurchaseDs).ExecuteCommandAsync(); } /// /// 仓库调拨 /// public async Task Allot(AllotInput input) { var db = _repository.AsSugarClient(); WmsAllot wmsAllot = new WmsAllot(); string Code = await _billRuleService.GetBillNumber("WmsTransfer"); wmsAllot.bill_code = Code; wmsAllot.biz_type = "25044010525205";//仓库调拨 wmsAllot.status = "25065138925589";//新增 var warehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (warehouse != null) wmsAllot.warehouse_id = warehouse.id; var startloc = await db.Queryable().Where(p => p.location_code == input.startlocation).FirstAsync(); if (startloc != null) wmsAllot.startlocation_id = startloc.id; var endloc = await db.Queryable().Where(p => p.location_code == input.endlocation).FirstAsync(); if (endloc != null) wmsAllot.endlocation_id = endloc.id; wmsAllot.create_time = DateTime.Now; await db.Insertable(wmsAllot).ExecuteCommandAsync(); } /// /// 销售出库单 /// public async Task SaleOut(SaleOutInput input) { var db = _repository.AsSugarClient(); WmsSaleH WmsSaleH = new WmsSaleH(); string Code = await _billRuleService.GetBillNumber("WmsSale"); WmsSaleH.bill_code = Code; WmsSaleH.bill_type = "25103439022357";//销售出库单 WmsSaleH.biz_type = "26191522660645";//一般出库 WmsSaleH.status = "25065138925589";//新增 WmsSaleH.generate_type = "1";//0人工 1自动 WmsSaleH.create_time = DateTime.Now; WmsSaleH.source_id = input.source_id; WmsSaleH.source_code = input.source_code; WmsSaleH.ship_date = input.ship_date; WmsSaleH.shipping_method = input.shipping_method; var warehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (warehouse != null) WmsSaleH.warehouse_id = warehouse.id; WmsSaleH.customer_code = input.customer_code; var customer = await db.Queryable().Where(p => p.customer_code == input.customer_code).FirstAsync(); if (customer != null) { WmsSaleH.customer_id = customer.id; WmsSaleH.customer_name = customer.customer_name; } List WmsSaleDs = new List(); foreach (var detail in input.details) { WmsSaleD WmsSaleD = new WmsSaleD(); WmsSaleD.bill_id = WmsSaleH.id; WmsSaleD.line_status = "25065138925589";//新增 WmsSaleD.purchase_qty = detail.purchase_qty; WmsSaleD.purchase_prqty = detail.purchase_prqty; WmsSaleD.code_batch = detail.code_batch; WmsSaleD.purchase_arriveqty = detail.purchase_arriveqty; WmsSaleD.container_no = detail.container_no; WmsSaleD.material_code = detail.material_code; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { WmsSaleD.material_id = material.id; // WmsSaleD.material_name = material.name; WmsSaleD.unit_id = material.unit_id; } WmsSaleDs.Add(WmsSaleD); } await db.Insertable(WmsSaleH).ExecuteCommandAsync(); await db.Insertable(WmsSaleDs).ExecuteCommandAsync(); } /// /// 销售退货单 /// public async Task SaleReturn(SaleReturnInput input) { var db = _repository.AsSugarClient(); WmsInstockH WmsInstockH = new WmsInstockH(); string Code = await _billRuleService.GetBillNumber("WmsInStock"); WmsInstockH.bill_code = Code; WmsInstockH.bill_date = DateTime.Now; WmsInstockH.bill_type = "25103434001429";//销售退货单 WmsInstockH.biz_type = "26191496816421";//一般入库 WmsInstockH.status = "25065138925589";//新增 WmsInstockH.generate_type = "1";//0人工 1自动 WmsInstockH.create_time = DateTime.Now; WmsInstockH.source_id = input.source_id; WmsInstockH.source_code = input.source_code; WmsInstockH.source_line = input.source_line; WmsInstockH.source_detail_id = input.source_detail_id; WmsInstockH.is_check = 1; WmsInstockH.purchase_code = input.purchase_code; WmsInstockH.sync_status = "26191359047461";//无需同步 WmsInstockH.print_status = "26191366982437";//未打印 WmsInstockH.create_id = ""; WmsInstockH.create_time = DateTime.Now; var location = await db.Queryable().Where(p => p.location_code == input.location).FirstAsync(); if (location != null) WmsInstockH.location_id = location.id; var warehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (warehouse != null) WmsInstockH.warehouse_id = warehouse.id; WmsInstockH.supplier_code = input.supplier_code; var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); if (supplier != null) { WmsInstockH.supplier_id = supplier.id; WmsInstockH.supplier_name = supplier.supplier_name; } List WmsInstockDs = new List(); foreach (var detail in input.details) { WmsInstockD WmsInstockD = new WmsInstockD(); WmsInstockD.bill_id = WmsInstockH.id; WmsInstockD.line_status = "25065138925589";//新增 WmsInstockD.pr_qty = detail.pr_qty; WmsInstockD.qty = detail.qty; WmsInstockD.reason = detail.reason; WmsInstockD.price = detail.price; WmsInstockD.tax_price = detail.tax_price; WmsInstockD.amount = detail.amount; WmsInstockD.all_amount = detail.all_amount; WmsInstockD.print_qty = 0; WmsInstockD.scan_qty = 0; WmsInstockD.code_batch = detail.code_batch; WmsInstockD.container_no = detail.container_no; var detailwarehouse = await db.Queryable().Where(p => p.whcode == input.warehouse).FirstAsync(); if (detailwarehouse != null) WmsInstockD.warehouse_id = detailwarehouse.id; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { WmsInstockD.material_id = material.id; WmsInstockD.unit_id = material.unit_id; } WmsInstockDs.Add(WmsInstockD); } await db.Insertable(WmsInstockH).ExecuteCommandAsync(); await db.Insertable(WmsInstockDs).ExecuteCommandAsync(); } /// /// 采购订单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task PurchaseOrder(PurchaseOrderInput input) { LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); 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); //} 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(); if (details.Count > 0) { // 判断是否为重复传输的采购订单 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"); 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) { wmsPurchaseOrderH.supplier_id = supplier.id; wmsPurchaseOrderH.supplier_name = supplier.supplier_name; } await db.Insertable(wmsPurchaseOrderH).ExecuteCommandAsync(); List wmsPurchaseOrderDs = new List(); foreach (var detail in 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}"); } if (details_return.Count > 0) { // 判断是否为重复传输的采购退料订单 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 details_return) { WmsPurchaseReturnD wmsPurchaseReturnD = new WmsPurchaseReturnD(); wmsPurchaseReturnD.bill_id = wmsPurchaseReturnH.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.Ado.CommitTranAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.Message}"); LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 委外订单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task OutsourceOrder(OutsourceOrderInput input) { LoggerErp2Mes.LogInformation($"【OutsourceOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); 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 wmsOutsourceOrderHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsOutsourceOrderHRep != null) { // 判断是否已经下发 WmsOutsourceH wmsOutsourceH = await db.Queryable().Where(r => r.outsource_order == wmsOutsourceOrderHRep.outsource_order).FirstAsync(); if (wmsOutsourceH != null) { _LoggerErp2Mes.LogWarning($@"【OutsourceOrder】wms已创建收货单{wmsOutsourceH.outsource_order}!"); throw new AppFriendlyException($@"wms已创建收货单{wmsOutsourceH.outsource_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsOutsourceOrderHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.fk_wms_outsource_order_id == wmsOutsourceOrderHRep.id).ExecuteCommandAsync(); } } WmsOutsourceOrderH wmsOutsourceOrderH = new WmsOutsourceOrderH(); string Code = await _billRuleService.GetBillNumber("WmsOutsourceOrder"); wmsOutsourceOrderH.outsource_order = Code; wmsOutsourceOrderH.erp_bill_code = input.outsource_order; wmsOutsourceOrderH.contact_person = input.contact_person; wmsOutsourceOrderH.tel = input.tel; wmsOutsourceOrderH.supplier_code = input.supplier_code; wmsOutsourceOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); wmsOutsourceOrderH.ship_date = input.ship_date; wmsOutsourceOrderH.erp_pk = input.erp_pk; wmsOutsourceOrderH.create_id = WmsWareHouseConst.ErpUserId; wmsOutsourceOrderH.create_time = DateTime.Now; var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); if (supplier != null) { wmsOutsourceOrderH.supplier_id = supplier.id; wmsOutsourceOrderH.supplier_name = supplier.supplier_name; } await db.Insertable(wmsOutsourceOrderH).ExecuteCommandAsync(); List wmsOutsourceOrderDs = new List(); foreach (var detail in input.details) { WmsOutsourceOrderD wmsOutsourceOrderD = new WmsOutsourceOrderD(); 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) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsOutsourceOrderD.unit = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【OutsourceOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsOutsourceOrderD.outsource_quantity = detail.outsource_quantity; wmsOutsourceOrderD.stock_location = detail.stock_location; wmsOutsourceOrderD.code_batch = detail.code_batch; wmsOutsourceOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); wmsOutsourceOrderD.erp_line_pk = detail.erp_line_pk; wmsOutsourceOrderD.create_id = WmsWareHouseConst.ErpUserId; wmsOutsourceOrderD.create_time = DateTime.Now; wmsOutsourceOrderD.actual_quantity = 0; wmsOutsourceOrderD.lineno = detail.lineno; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsOutsourceOrderD.matcode_id = material.id; wmsOutsourceOrderD.matspecification = material.material_specification; } wmsOutsourceOrderDs.Add(wmsOutsourceOrderD); } await db.Insertable(wmsOutsourceOrderDs).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); LoggerErp2Mes.LogInformation($"【OutsourceOrderInput】成功生成单据:{Code}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【OutsourceOrderInput】{ex.Message}"); LoggerErp2Mes.LogError($"【OutsourceOrderInput】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 转库单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task MaterialTransfer(MaterialTransferInput input) { LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); try { WmsErpWarehouserelaH wmsErpWarehouserelaHout = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_outstock).FirstAsync(); if (wmsErpWarehouserelaHout == null) { _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系!"); throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系!", 500); } WmsErpWarehouserelaH wmsErpWarehouserelaHin = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_instock).FirstAsync(); if (wmsErpWarehouserelaHin == null) { _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系!"); throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系!", 500); } string warehouse_outstock_code = wmsErpWarehouserelaHout.wms_warehousecode; string warehouse_instock_code = wmsErpWarehouserelaHin.wms_warehousecode; BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == warehouse_outstock_code).FirstAsync(); BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == warehouse_instock_code).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 || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_HCC_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 wmsMaterialTransferRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsMaterialTransferRep != null) { // 判断单据是否已经下发 List _wmsMaterialTransferDs = await db.Queryable().Where(r => r.bill_id == wmsMaterialTransferRep.id).ToListAsync(); bool isxf = _wmsMaterialTransferDs.Where(r => r.yxfqty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用转库单{input.bill_code}!"); throw new AppFriendlyException($@"wms已下发使用转库单{input.bill_code}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsMaterialTransferRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsMaterialTransferRep.id).ExecuteCommandAsync(); } } List details = input.details.Where(r => r.qty > 0).ToList(); List details_return = input.details.Where(r => r.qty < 0).ToList(); if (details.Count > 0) { WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer(); string Code = await _billRuleService.GetBillNumber("MaterialTransfer"); wmsMaterialTransfer.bill_code = Code; wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; wmsMaterialTransfer.bill_date = DateTime.Now; wmsMaterialTransfer.warehouse_outstock = warehouse_outstock.id; wmsMaterialTransfer.warehouse_instock = warehouse_instock.id; wmsMaterialTransfer.biller_out = input.biller_out; wmsMaterialTransfer.depart_out = input.depart_out; wmsMaterialTransfer.biller_in = input.biller_in; wmsMaterialTransfer.depart_in = input.depart_in; wmsMaterialTransfer.deliver_date = input.deliver_date; wmsMaterialTransfer.arrival_date = input.arrival_date; wmsMaterialTransfer.create_id = WmsWareHouseConst.ErpUserId; wmsMaterialTransfer.create_time = DateTime.Now; wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId; wmsMaterialTransfer.erp_bill_code = input.bill_code; wmsMaterialTransfer.transfer_type = transfer_type; wmsMaterialTransfer.erp_pk = input.erp_pk; await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync(); List wmsMaterialTransferDs = new List(); foreach (var detail in details) { WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD(); wmsMaterialTransferD.lineno = detail.lineno; wmsMaterialTransferD.material_code = detail.material_code; wmsMaterialTransferD.code_batch = detail.code_batch; wmsMaterialTransferD.station_code = detail.station_code; wmsMaterialTransferD.qty = detail.qty; wmsMaterialTransferD.bill_id = wmsMaterialTransfer.id; wmsMaterialTransferD.yxfqty = 0; wmsMaterialTransferD.yzqty = 0; wmsMaterialTransferD.yxfqty_rk = 0; wmsMaterialTransferD.yzqty_rk = 0; wmsMaterialTransferD.erp_line_pk = detail.erp_line_pk; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsMaterialTransferD.material_id = material.id; 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(); if (erpExtendField != null) { wmsMaterialTransferD.unit_id = erpExtendField.Id; wmsMaterialTransferD.unit_code = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsMaterialTransferDs.Add(wmsMaterialTransferD); } await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync(); LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}"); } if (details_return.Count > 0) { WmsPrdReturnH wmsPrdReturnH = new WmsPrdReturnH(); string Code = await _billRuleService.GetBillNumber("WMSPRDRETURN"); wmsPrdReturnH.bill_code = Code; wmsPrdReturnH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; wmsPrdReturnH.warehouse_id = warehouse_instock.id; wmsPrdReturnH.create_id = WmsWareHouseConst.ErpUserId; wmsPrdReturnH.create_time = DateTime.Now; wmsPrdReturnH.erp_bill_code = input.bill_code; wmsPrdReturnH.transfer_type = transfer_type; wmsPrdReturnH.erp_pk = input.erp_pk; await db.Insertable(wmsPrdReturnH).ExecuteCommandAsync(); List wmsPrdReturnDs = new List(); foreach (var detail in details_return) { WmsPrdReturnD wmsPrdReturnD = new WmsPrdReturnD(); wmsPrdReturnD.lineno = detail.lineno; wmsPrdReturnD.material_code = detail.material_code; wmsPrdReturnD.code_batch = detail.code_batch; wmsPrdReturnD.qty = -detail.qty; wmsPrdReturnD.bill_id = wmsPrdReturnH.id; wmsPrdReturnD.ytqty = 0; wmsPrdReturnD.erp_line_pk = detail.erp_line_pk; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsPrdReturnD.material_id = material.id; wmsPrdReturnD.material_code = material.code; wmsPrdReturnD.material_name = material.name; } 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) { wmsPrdReturnD.unit_id = erpExtendField.Id; } else { _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsPrdReturnDs.Add(wmsPrdReturnD); } await db.Insertable(wmsPrdReturnDs).ExecuteCommandAsync(); LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}"); } await db.Ado.CommitTranAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【MaterialTransfer】{ex.Message}"); LoggerErp2Mes.LogError($"【MaterialTransfer】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 销售发货单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task SaleShipping(SaleShippingInput input) { LoggerErp2Mes.LogInformation($"【SaleShipping】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); 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.warehouse_code).FirstAsync(); if (wmsErpWarehouserelaH == null) { _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系!"); throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_code}对应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 wmsSaleHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsSaleHRep != null) { // 判断单据是否已经下发 List _wmsSaleDs = await db.Queryable().Where(r => r.bill_id == wmsSaleHRep.id).ToListAsync(); bool isxf = _wmsSaleDs.Where(r => r.purchase_arriveqty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用销售出库单{input.bill_code}!"); throw new AppFriendlyException($@"wms已下发使用销售出库单{input.bill_code}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsSaleHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsSaleHRep.id).ExecuteCommandAsync(); } } WmsSaleH wmsSaleH = new WmsSaleH(); string Code = await _billRuleService.GetBillNumber("WmsSale"); wmsSaleH.bill_code = Code; wmsSaleH.erp_bill_code = input.bill_code; wmsSaleH.bill_type = "25103439022357";//销售出库单 wmsSaleH.audit_status = 0; wmsSaleH.generate_type = "1"; wmsSaleH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; wmsSaleH.warehouse_id = warehouse_outstock.id; wmsSaleH.customer_code = input.customer_code; wmsSaleH.erp_wh_type = input.warehouse_code; var customer = await db.Queryable().Where(p => p.customer_code == input.customer_code).FirstAsync(); if (customer != null) { wmsSaleH.customer_id = customer.id; wmsSaleH.customer_name = customer.customer_name; } wmsSaleH.ship_date = input.ship_date.Value; wmsSaleH.erp_pk = input.erp_pk; wmsSaleH.create_id = WmsWareHouseConst.ErpUserId; wmsSaleH.create_time = DateTime.Now; await db.Insertable(wmsSaleH).ExecuteCommandAsync(); List wmsSaleDs = new List(); foreach (var detail in input.details) { WmsSaleD wmsSaleD = new WmsSaleD(); wmsSaleD.bill_id = wmsSaleH.id; wmsSaleD.material_code = detail.material_code; wmsSaleD.purchase_qty = detail.sale_qty.Value; wmsSaleD.code_batch = detail.code_batch; wmsSaleD.erp_line_pk = detail.erp_line_pk; 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) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsSaleD.unit_id = erpExtendField.Id; } else { _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsSaleD.material_id = material.id; wmsSaleD.material_name = material.name; wmsSaleD.material_specification = material.material_specification; } wmsSaleDs.Add(wmsSaleD); } await db.Insertable(wmsSaleDs).ExecuteCommandAsync(); await db.Ado.CommitTranAsync(); LoggerErp2Mes.LogInformation($"【SaleShipping】成功生成单据:{Code}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【SaleShipping】{ex.Message}"); LoggerErp2Mes.LogError($"【SaleShipping】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 调拨出库单同步 /// [HttpPost, NonUnify, AllowAnonymous] public async Task TransferOutstock(TransferOutstockInput input) { LoggerErp2Mes.LogInformation($"【TransferOutstock】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); 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.warehouse_instock).FirstAsync(); if (wmsErpWarehouserelaH == null) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系!"); throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_instock}对应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($"【TransferOutstock】无法查询到入库仓库{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) { case WmsWareHouseConst.WAREHOUSE_YCL_ID: { // 判断是否重复传输 WmsRawmatTransferinstockH wmsRawmatTransferinstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsRawmatTransferinstockHRep != null) { // 判断单据是否已经下发 List wmsRawmatTransferinstockHs = await db.Queryable().Where(r => r.bill_id == wmsRawmatTransferinstockHRep.id).ToListAsync(); bool isxf = wmsRawmatTransferinstockHs.Where(r => r.bind_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用调拨出库单{input.transfer_order}!"); throw new AppFriendlyException($@"wms已下发使用调拨出库单{input.transfer_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsRawmatTransferinstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsRawmatTransferinstockHRep.id).ExecuteCommandAsync(); } } WmsRawmatTransferinstockH wmsRawmatTransferinstockH = new WmsRawmatTransferinstockH(); Code = await _billRuleService.GetBillNumber("WmsRawMatTransferInstock"); wmsRawmatTransferinstockH.bill_code = Code; wmsRawmatTransferinstockH.erp_bill_code = input.transfer_order; wmsRawmatTransferinstockH.contact_person = input.contact_person; wmsRawmatTransferinstockH.tel = input.tel; var org_erpExtendField = await db.Queryable().Where(a => a.pk_org == input.outstockorg_id).FirstAsync(); if (org_erpExtendField != null) { wmsRawmatTransferinstockH.outstockorg_id = org_erpExtendField.pk_org_v; wmsRawmatTransferinstockH.outstockorg_code = org_erpExtendField.pk_org; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表头明细中组织{input.outstockorg_id}在wms系统中未找到!"); throw new AppFriendlyException($@"表头明细中组织{input.outstockorg_id}在wms系统中未找到!", 500); } wmsRawmatTransferinstockH.erp_pk = input.erp_pk; wmsRawmatTransferinstockH.create_id = WmsWareHouseConst.ErpUserId; wmsRawmatTransferinstockH.create_time = DateTime.Now; wmsRawmatTransferinstockH.dept_code = input.dept_code; wmsRawmatTransferinstockH.biller = input.biller; wmsRawmatTransferinstockH.erp_wh_type = input.warehouse_instock; wmsRawmatTransferinstockH.org_id = WmsWareHouseConst.AdministratorOrgId; await db.Insertable(wmsRawmatTransferinstockH).ExecuteCommandAsync(); List wmsRawmatTransferinstockDs = new List(); foreach (var detail in input.details) { WmsRawmatTransferinstockD msRawmatTransferinstockD = new WmsRawmatTransferinstockD(); 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) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { msRawmatTransferinstockD.unit_id = erpExtendField.Id; msRawmatTransferinstockD.unit = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } msRawmatTransferinstockD.qty = detail.qty; msRawmatTransferinstockD.stock_location = detail.stock_location; msRawmatTransferinstockD.code_batch = detail.code_batch; msRawmatTransferinstockD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); msRawmatTransferinstockD.erp_line_pk = detail.erp_line_pk; msRawmatTransferinstockD.create_id = WmsWareHouseConst.ErpUserId; msRawmatTransferinstockD.create_time = DateTime.Now; msRawmatTransferinstockD.actual_qty = 0; msRawmatTransferinstockD.lineno = detail.lineno; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { msRawmatTransferinstockD.matcode_id = material.id; msRawmatTransferinstockD.matname = material.name; msRawmatTransferinstockD.matspecification = material.material_specification; } wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD); } await db.Insertable(wmsRawmatTransferinstockDs).ExecuteCommandAsync(); break; } case WmsWareHouseConst.WAREHOUSE_CP_ID: { // 判断是否重复传输 WmsTransferInstockH wmsTransferInstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsTransferInstockHRep != null) { // 判断单据是否已经下发 List _wmsTransferInstockDs = await db.Queryable().Where(r => r.bill_id == wmsTransferInstockHRep.id).ToListAsync(); bool isxf = _wmsTransferInstockDs.Where(r => r.xf_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用调拨出库单{input.transfer_order}!"); throw new AppFriendlyException($@"wms已下发使用调拨出库单{input.transfer_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsTransferInstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsTransferInstockHRep.id).ExecuteCommandAsync(); } } WmsTransferInstockH wmsTransferInstockH = new WmsTransferInstockH(); Code = await _billRuleService.GetBillNumber("transferInstock"); wmsTransferInstockH.bill_code = Code; wmsTransferInstockH.erp_bill_code = input.transfer_order; var org_erpExtendField = await db.Queryable().Where(a => a.pk_org == input.outstockorg_id).FirstAsync(); if (org_erpExtendField != null) { wmsTransferInstockH.outstockorg_id = org_erpExtendField.pk_org_v; wmsTransferInstockH.outstockorg_code = org_erpExtendField.pk_org; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表头明细中组织{input.outstockorg_id}在wms系统中未找到!"); throw new AppFriendlyException($@"表头明细中组织{input.outstockorg_id}在wms系统中未找到!", 500); } wmsTransferInstockH.incoming_ware = warehouse_instock.id; 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.warehouse_instock; 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) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); if (erpExtendField != null) { wmsTransferInstockD.unit_id = erpExtendField.Id; wmsTransferInstockD.unit_code = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsTransferInstockD.qty = 0; 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 = detail.qty; 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_code = material.code; wmsTransferInstockD.material_desc = material.material_specification; } wmsTransferInstockDs.Add(wmsTransferInstockD); } await db.Insertable(wmsTransferInstockDs).ExecuteCommandAsync(); break; } case WmsWareHouseConst.WAREHOUSE_JXK_ID: { // 判断是否重复传输 WmsPackInstockH wmsPackInstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsPackInstockHRep != null) { // 判断单据是否已经下发 List _wmsPackInstocDs = await db.Queryable().Where(r => r.bill_id == wmsPackInstockHRep.id).ToListAsync(); bool isxf = _wmsPackInstocDs.Where(r => r.xf_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用调拨出库单{input.transfer_order}!"); throw new AppFriendlyException($@"wms已下发使用调拨出库单{input.transfer_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsPackInstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsPackInstockHRep.id).ExecuteCommandAsync(); } } WmsPackInstockH wmsPackInstockH = new WmsPackInstockH(); Code = await _billRuleService.GetBillNumber("WMSPACKINSTOCK"); wmsPackInstockH.bill_code = Code; wmsPackInstockH.erp_bill_code = input.transfer_order; var org_erpExtendField = await db.Queryable().Where(a => a.pk_org == input.outstockorg_id).FirstAsync(); if (org_erpExtendField != null) { wmsPackInstockH.outstockorg_id = org_erpExtendField.pk_org_v; wmsPackInstockH.outstockorg_code = org_erpExtendField.pk_org; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表头明细中组织{input.outstockorg_id}在wms系统中未找到!"); throw new AppFriendlyException($@"表头明细中组织{input.outstockorg_id}在wms系统中未找到!", 500); } wmsPackInstockH.incoming_ware = warehouse_instock.id; wmsPackInstockH.org_id = WmsWareHouseConst.AdministratorOrgId; wmsPackInstockH.erp_pk = input.erp_pk; wmsPackInstockH.create_id = WmsWareHouseConst.ErpUserId; wmsPackInstockH.bill_date = DateTime.Now; wmsPackInstockH.create_time = DateTime.Now; wmsPackInstockH.erp_wh_type = input.warehouse_instock; await db.Insertable(wmsPackInstockH).ExecuteCommandAsync(); List wmsPackInstockDs = new List(); foreach (var detail in input.details) { WmsPackInstockD wmsPackInstockD = new WmsPackInstockD(); wmsPackInstockD.bill_id = wmsPackInstockH.id; wmsPackInstockD.material_code = detail.material_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) { wmsPackInstockD.unit_id = erpExtendField.Id; wmsPackInstockD.unit_code = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsPackInstockD.pr_qty = detail.qty; wmsPackInstockD.pi_code = detail.code_batch; wmsPackInstockD.erp_line_pk = detail.erp_line_pk; wmsPackInstockD.create_id = WmsWareHouseConst.ErpUserId; wmsPackInstockD.create_time = DateTime.Now; wmsPackInstockD.xf_qty = 0; wmsPackInstockD.qty = 0; wmsPackInstockD.lineno = detail.lineno; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsPackInstockD.material_id = material.id; wmsPackInstockD.material_code = material.code; wmsPackInstockD.material_desc = material.material_specification; } wmsPackInstockDs.Add(wmsPackInstockD); } await db.Insertable(wmsPackInstockDs).ExecuteCommandAsync(); break; } } await db.Ado.CommitTranAsync(); LoggerErp2Mes.LogInformation($"【TransferOutstock】成功生成单据:{Code}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【TransferOutstock】{ex.Message}"); LoggerErp2Mes.LogError($"【TransferOutstock】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 调拨订单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task TransferOrder(TransferOrderInput input) { LoggerErp2Mes.LogInformation($"【TransferOrder】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); 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); //} await db.Ado.BeginTranAsync(); WmsTransferOrderH wmsTransferOrderH = new WmsTransferOrderH(); string Code = await _billRuleService.GetBillNumber("WmsTransferOrder"); wmsTransferOrderH.bill_code = Code; wmsTransferOrderH.erp_bill_code = input.transfer_order; wmsTransferOrderH.biller = input.biller; wmsTransferOrderH.dept_code = input.dept_code; wmsTransferOrderH.erp_pk = input.erp_pk; wmsTransferOrderH.create_id = WmsWareHouseConst.ErpUserId; wmsTransferOrderH.create_time = DateTime.Now; wmsTransferOrderH.org_id = WmsWareHouseConst.AdministratorOrgId; var org_erpExtendField = await db.Queryable().Where(a => a.pk_org == input.instockorg_id).FirstAsync(); if (org_erpExtendField != null) { wmsTransferOrderH.instockorg_id = org_erpExtendField.pk_org_v; wmsTransferOrderH.instockorg_code = org_erpExtendField.pk_org; } else { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】表头明细中组织{input.instockorg_id}在wms系统中未找到!"); throw new AppFriendlyException($@"表头明细中组织{input.instockorg_id}在wms系统中未找到!", 500); } var _erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id) .Where((a, b) => b.EnCode == input.transaction_type).Select((a, b) => b).FirstAsync(); if (_erpExtendField != null) { wmsTransferOrderH.transaction_type = _erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOrder】表头交易类型{input.transaction_type}在wms系统中未找到!"); throw new AppFriendlyException($@"表头交易类型{input.transaction_type}在wms系统中未找到!", 500); } await db.Insertable(wmsTransferOrderH).ExecuteCommandAsync(); Dictionary dic_WmsErpWarehouseidrelaH = await db.Queryable() .LeftJoin((a, b) => a.wms_warehousecode == b.whcode) .Select((a, b) => new { a.erp_warehousecode, b.id, b.whcode }) .ToDictionaryAsync(k => k.erp_warehousecode, v => v.id); foreach (var detail in input.details) { if (!dic_WmsErpWarehouseidrelaH.ContainsKey(detail.warehouse_outstock)) { _LoggerErp2Mes.LogWarning($"【TransferOrder】无法查询到出库仓库{detail.warehouse_outstock}的档案记录!"); throw new AppFriendlyException($"无法查询到出库仓库{detail.warehouse_outstock}的档案记录!", 500); } } Dictionary dic_WmsErpWarehousecoderelaH = await db.Queryable() .LeftJoin((a, b) => a.wms_warehousecode == b.whcode) .Select((a, b) => new { a.erp_warehousecode, b.id, b.whcode }) .ToDictionaryAsync(k => k.erp_warehousecode, v => v.whcode); List details_WAREHOUSE_YCL_ID = input.details.Where(r => dic_WmsErpWarehouseidrelaH[r.warehouse_outstock].ToString() == WmsWareHouseConst.WAREHOUSE_YCL_ID).ToList(); List details_WAREHOUSE_CP_ID = input.details.Where(r => dic_WmsErpWarehouseidrelaH[r.warehouse_outstock].ToString() == WmsWareHouseConst.WAREHOUSE_CP_ID).ToList(); List wmsTransferOrderDs = new List(); foreach (var detail in input.details) { WmsTransferOrderD wmsTransferOrderD = new WmsTransferOrderD(); wmsTransferOrderD.bill_id = wmsTransferOrderD.id; wmsTransferOrderD.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) { wmsTransferOrderD.unit_id = erpExtendField.Id; wmsTransferOrderD.unit = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsTransferOrderD.qty = detail.qty; wmsTransferOrderD.batchno = detail.code_batch; wmsTransferOrderD.erp_line_pk = detail.erp_line_pk; wmsTransferOrderD.create_id = WmsWareHouseConst.ErpUserId; wmsTransferOrderD.create_time = DateTime.Now; wmsTransferOrderD.lineno = detail.lineno; wmsTransferOrderD.erp_wh_type = detail.warehouse_outstock; wmsTransferOrderD.warehouse_code = dic_WmsErpWarehousecoderelaH[detail.warehouse_outstock].ToString(); wmsTransferOrderD.warehouse_instock_code = detail.warehouse_instock_id; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsTransferOrderD.material_id = material.id; wmsTransferOrderD.material_code = material.code; wmsTransferOrderD.material_name = material.name; wmsTransferOrderD.material_specification = material.material_specification; } wmsTransferOrderDs.Add(wmsTransferOrderD); } await db.Insertable(wmsTransferOrderDs).ExecuteCommandAsync(); if (details_WAREHOUSE_YCL_ID.Count > 0) { // 判断是否重复传输 WmsRawmatTransferoutstockH wmsRawmatTransferoutstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsRawmatTransferoutstockHRep != null) { // 判断单据是否已经下发 List _wmsRawmatTransferoutstockDs = await db.Queryable().Where(r => r.bill_id == wmsRawmatTransferoutstockHRep.id).ToListAsync(); bool isxf = _wmsRawmatTransferoutstockDs.Where(r => r.actual_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用调拨订单{input.transfer_order}!"); throw new AppFriendlyException($@"wms已下发使用调拨订单{input.transfer_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsRawmatTransferoutstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsRawmatTransferoutstockHRep.id).ExecuteCommandAsync(); } } WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = new WmsRawmatTransferoutstockH(); string code = await _billRuleService.GetBillNumber("RawmatTransferoutstock"); wmsRawmatTransferoutstockH.erp_bill_code = input.transfer_order; wmsRawmatTransferoutstockH.bill_code = code; wmsRawmatTransferoutstockH.create_id = WmsWareHouseConst.ErpUserId; wmsRawmatTransferoutstockH.create_time = DateTime.Now; wmsRawmatTransferoutstockH.biller = input.biller; wmsRawmatTransferoutstockH.dept_code = input.dept_code; wmsRawmatTransferoutstockH.erp_pk = input.erp_pk; wmsRawmatTransferoutstockH.transfer_order_id = wmsTransferOrderH.id; wmsRawmatTransferoutstockH.issuance_status = "0"; wmsRawmatTransferoutstockH.transaction_type = _erpExtendField.EnCode; wmsRawmatTransferoutstockH.org_id = WmsWareHouseConst.AdministratorOrgId; wmsRawmatTransferoutstockH.instockorg_id = org_erpExtendField.pk_org_v; wmsRawmatTransferoutstockH.instockorg_code = org_erpExtendField.pk_org; List wmsRawmatTransferoutstockDs = new List (); foreach (var detail in details_WAREHOUSE_YCL_ID) { WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = new WmsRawmatTransferoutstockD(); wmsRawmatTransferoutstockD.bill_id = wmsRawmatTransferoutstockH.id; wmsRawmatTransferoutstockD.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) { wmsRawmatTransferoutstockD.unit_id = erpExtendField.Id; wmsRawmatTransferoutstockD.unit = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsRawmatTransferoutstockD.erp_wh_type = detail.warehouse_outstock; wmsRawmatTransferoutstockD.warehouse_code = dic_WmsErpWarehousecoderelaH[detail.warehouse_outstock].ToString(); wmsRawmatTransferoutstockD.warehouse_instock_code = detail.warehouse_instock_id; wmsRawmatTransferoutstockD.qty = detail.qty; wmsRawmatTransferoutstockD.code_batch = detail.code_batch; wmsRawmatTransferoutstockD.erp_line_pk = detail.erp_line_pk; wmsRawmatTransferoutstockD.create_id = WmsWareHouseConst.ErpUserId; wmsRawmatTransferoutstockD.create_time = DateTime.Now; wmsRawmatTransferoutstockD.lineno = detail.lineno; wmsRawmatTransferoutstockD.actual_qty = 0; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsRawmatTransferoutstockD.matcode_id = material.id; wmsRawmatTransferoutstockD.matcode = material.code; wmsRawmatTransferoutstockD.matspecification = material.material_specification; } wmsRawmatTransferoutstockDs.Add(wmsRawmatTransferoutstockD); } await db.Insertable(wmsRawmatTransferoutstockH).ExecuteCommandAsync(); await db.Insertable(wmsRawmatTransferoutstockDs).ExecuteCommandAsync(); } if(details_WAREHOUSE_CP_ID.Count > 0) { // 判断是否重复传输 WmsTransferOutstockH wmsTransferOutstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsTransferOutstockHRep != null) { // 判断单据是否已经下发 List _wmsTransferOutstockDs = await db.Queryable().Where(r => r.bill_id == wmsTransferOutstockHRep.id).ToListAsync(); bool isxf = _wmsTransferOutstockDs.Where(r => r.xf_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用调拨订单{input.transfer_order}!"); throw new AppFriendlyException($@"wms已下发使用调拨订单{input.transfer_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsTransferOutstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsTransferOutstockHRep.id).ExecuteCommandAsync(); } } WmsTransferOutstockH wmsTransferOutstockH = new WmsTransferOutstockH(); string code = await _billRuleService.GetBillNumber("WmsTransferOutstock"); wmsTransferOutstockH.erp_bill_code = input.transfer_order; wmsTransferOutstockH.bill_code = code; wmsTransferOutstockH.create_id = WmsWareHouseConst.ErpUserId; wmsTransferOutstockH.create_time = DateTime.Now; wmsTransferOutstockH.erp_pk = input.erp_pk; wmsTransferOutstockH.transfer_order_id = wmsTransferOrderH.id; wmsTransferOutstockH.issuance_status = "0"; wmsTransferOutstockH.transaction_type = _erpExtendField.EnCode; wmsTransferOutstockH.org_id = WmsWareHouseConst.AdministratorOrgId; wmsTransferOutstockH.instockorg_id = org_erpExtendField.pk_org_v; wmsTransferOutstockH.instockorg_code = org_erpExtendField.pk_org; List wmsTransferOutstockDs = new List(); foreach (var detail in details_WAREHOUSE_CP_ID) { WmsTransferOutstockD wmsTransferOutstockD = new WmsTransferOutstockD(); wmsTransferOutstockD.bill_id = wmsTransferOutstockH.id; 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) { wmsTransferOutstockD.unit_id = erpExtendField.Id; wmsTransferOutstockD.unit_code = erpExtendField.EnCode; } else { _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } wmsTransferOutstockD.warehouse_code = dic_WmsErpWarehousecoderelaH[detail.warehouse_outstock].ToString(); wmsTransferOutstockD.warehouse_instock_code = detail.warehouse_instock_id; wmsTransferOutstockD.pr_qty = detail.qty; wmsTransferOutstockD.xf_qty = 0; wmsTransferOutstockD.qty = 0; wmsTransferOutstockD.pi_code = detail.code_batch; wmsTransferOutstockD.erp_line_pk = detail.erp_line_pk; wmsTransferOutstockD.create_id = WmsWareHouseConst.ErpUserId; wmsTransferOutstockD.create_time = DateTime.Now; wmsTransferOutstockD.lineno = detail.lineno; wmsTransferOutstockD.erp_wh_type = detail.warehouse_outstock; var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); if (material != null) { wmsTransferOutstockD.material_id = material.id; wmsTransferOutstockD.material_code = material.code; wmsTransferOutstockD.material_desc = material.material_specification; } wmsTransferOutstockDs.Add(wmsTransferOutstockD); } await db.Insertable(wmsTransferOutstockH).ExecuteCommandAsync(); await db.Insertable(wmsTransferOutstockDs).ExecuteCommandAsync(); } await db.Ado.CommitTranAsync(); LoggerErp2Mes.LogInformation($"【TransferOrder】成功生成单据:{Code}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } catch (Exception ex) { LoggerErp2Mes.LogError($"【TransferOrder】{ex.Message}"); LoggerErp2Mes.LogError($"【TransferOrder】{ex.StackTrace}"); await db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally { } } /// /// 材料出库单 /// [HttpPost, NonUnify, AllowAnonymous] public async Task RawmatOutstock(ErpRawmatOutstockInput 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 wmsRawmatOutstockHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); if (wmsRawmatOutstockHRep != null) { // 判断单据是否已经下发 List _wmsRawmatOutstockDs = await db.Queryable().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ToListAsync(); bool isxf = _wmsRawmatOutstockDs.Where(r => r.actual_outstock_qty > 0).Any(); if (isxf) { _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】wms已下发使用材料出库单{input.outstock_order}!"); throw new AppFriendlyException($@"wms已下发使用材料出库单{input.outstock_order}!", 500); } else // 删除数据重新插入 { await db.Deleteable().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync(); await db.Deleteable().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync(); } } 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) { Entities.Dto.Outputs.Result result = new() { code = statusCode, msg = msg }; return Task.FromResult(result); } private static readonly Dictionary s_logLevelMap = new() { [LogLevel.Debug] = "DBG", [LogLevel.Information] = "INF", [LogLevel.Warning] = "WRN", [LogLevel.Error] = "ERR", }; protected string _LoggerErp2MesFileName = ""; protected ILogger _LoggerErp2Mes; protected ILogger LoggerErp2Mes { get { string newFileName = $"{AppContext.BaseDirectory}/logs/Erp2Mes{DateTime.Now:yyyyMMdd}.log"; if (_LoggerErp2MesFileName != newFileName) { ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => { //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; cfgOpts.MessageFormat = (logMsg) => { var logLevel = s_logLevelMap[logMsg.LogLevel]; var sb = new StringBuilder(); _ = sb.Append($"[{logLevel}] "); _ = sb.Append($"{logMsg.LogName} "); _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); _ = sb.Append($"#{logMsg.EventId.Id} "); _ = sb.Append(logMsg.Message + " "); _ = sb.Append(logMsg.Exception?.ToString()); return sb.ToString(); }; })); _LoggerErp2Mes = loggerFactory.CreateLogger(this.GetType()); _LoggerErp2MesFileName = newFileName; } return _LoggerErp2Mes; } } } }