Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs
2024-10-11 11:05:28 +08:00

2681 lines
155 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Text;
using Aop.Api.Domain;
using JNPF.Common.Enums;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Permission;
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
{
/// <summary>
/// erp接口模块
/// </summary>
[ApiDescriptionSettings(Tag = ModuleConsts.Tag, Area = ModuleConsts.Area, Order = 800)]
public class ErpToWmsService : IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<WmsPurchaseH> _repository;
private readonly IBillRullService _billRuleService;
public ErpToWmsService(ISqlSugarRepository<WmsPurchaseH> repository, IBillRullService billRuleService)
{
_repository = repository;
_billRuleService = billRuleService;
}
/// <summary>
/// 采购到货单
/// </summary>
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<BasWarehouse>().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<BasSupplier>().Where(p => p.supplier_code == input.supplier_code).FirstAsync();
if (supplier != null)
{
wmsPurchaseH.supplier_id = supplier.id;
wmsPurchaseH.supplier_name = supplier.supplier_name;
}
List<WmsPurchaseD> WmsPurchaseDs = new List<WmsPurchaseD>();
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<BasMaterial>().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();
}
/// <summary>
/// 采购退货单
/// </summary>
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<BasWarehouse>().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<BasSupplier>().Where(p => p.supplier_code == input.supplier_code).FirstAsync();
if (supplier != null)
{
wmsPurchaseH.supplier_id = supplier.id;
wmsPurchaseH.supplier_name = supplier.supplier_name;
}
List<WmsPurchaseD> WmsPurchaseDs = new List<WmsPurchaseD>();
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<BasMaterial>().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();
}
/// <summary>
/// 仓库调拨
/// </summary>
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<BasWarehouse>().Where(p => p.whcode == input.warehouse).FirstAsync();
if (warehouse != null)
wmsAllot.warehouse_id = warehouse.id;
var startloc = await db.Queryable<BasLocation>().Where(p => p.location_code == input.startlocation).FirstAsync();
if (startloc != null)
wmsAllot.startlocation_id = startloc.id;
var endloc = await db.Queryable<BasLocation>().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();
}
/// <summary>
/// 销售出库单
/// </summary>
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<BasWarehouse>().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<BasCustomer>().Where(p => p.customer_code == input.customer_code).FirstAsync();
if (customer != null)
{
WmsSaleH.customer_id = customer.id;
WmsSaleH.customer_name = customer.customer_name;
}
List<WmsSaleD> WmsSaleDs = new List<WmsSaleD>();
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<BasMaterial>().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();
}
/// <summary>
/// 销售退货单
/// </summary>
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<BasLocation>().Where(p => p.location_code == input.location).FirstAsync();
if (location != null)
WmsInstockH.location_id = location.id;
var warehouse = await db.Queryable<BasWarehouse>().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<BasSupplier>().Where(p => p.supplier_code == input.supplier_code).FirstAsync();
if (supplier != null)
{
WmsInstockH.supplier_id = supplier.id;
WmsInstockH.supplier_name = supplier.supplier_name;
}
List<WmsInstockD> WmsInstockDs = new List<WmsInstockD>();
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<BasWarehouse>().Where(p => p.whcode == input.warehouse).FirstAsync();
if (detailwarehouse != null)
WmsInstockD.warehouse_id = detailwarehouse.id;
var material = await db.Queryable<BasMaterial>().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();
}
/// <summary>
/// 采购订单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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<PurchaseOrderDetail> details = input.details.Where(r => r.purchase_quantity > 0).ToList();
List<PurchaseOrderDetail> details_return = input.details.Where(r => r.purchase_quantity < 0).ToList();
// purchase_quantity 是负数作为采购退料
await db.Ado.BeginTranAsync();
// 判断是否为重复传输的采购订单
WmsPurchaseOrderH wmsPurchaseOrderRep = await db.Queryable<WmsPurchaseOrderH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
if (wmsPurchaseOrderRep != null)
{
// 判断收货单是否已经生成
WmsPurchaseH wmsPurchaseH = await db.Queryable<WmsPurchaseH>().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<WmsPurchaseOrderH>().Where(r => r.id == wmsPurchaseOrderRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsPurchaseOrderD>().Where(r => r.fk_wms_purchase_order_id == wmsPurchaseOrderRep.id).ExecuteCommandAsync();
}
}
// 判断是否为重复传输的采购退料订单
WmsPurchaseReturnH wmsPurchaseReturnRep = await db.Queryable<WmsPurchaseReturnH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
if (wmsPurchaseReturnRep != null)
{
// 判断采购退货是否已经下发
List<WmsPurchaseReturnD> wmsPurchaseReturnDReps = await db.Queryable<WmsPurchaseReturnD>().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<WmsPurchaseReturnH>().Where(r => r.id == wmsPurchaseReturnRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsPurchaseReturnD>().Where(r => r.bill_id == wmsPurchaseReturnRep.id).ExecuteCommandAsync();
}
}
if (details.Count > 0)
{
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<BasSupplier>().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<WmsPurchaseOrderD> wmsPurchaseOrderDs = new List<WmsPurchaseOrderD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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;
wmsPurchaseOrderD.production_unit = detail.production_unit;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsPurchaseOrderD.matcode_id = material.id;
wmsPurchaseOrderD.material_specification = material.material_specification;
wmsPurchaseOrderD.material_standard = material.material_standard;
}
wmsPurchaseOrderD.auxprop_gys = detail.auxprop_gys;
wmsPurchaseOrderDs.Add(wmsPurchaseOrderD);
}
await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync();
LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}");
}
if (details_return.Count > 0)
{
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<BasSupplier>().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<WmsPurchaseReturnD> wmsPurchaseReturnDs = new List<WmsPurchaseReturnD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == 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<BasMaterial>().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
{
}
}
/// <summary>
/// 委外订单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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<WmsOutsourceOrderH>().Where(r => r.erp_bill_code == input.outsource_order).FirstAsync();
if (wmsOutsourceOrderHRep != null)
{
// 判断是否已经下发
WmsOutsourceH wmsOutsourceH = await db.Queryable<WmsOutsourceH>().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<WmsOutsourceOrderH>().Where(r => r.id == wmsOutsourceOrderHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsOutsourceOrderD>().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<BasSupplier>().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<WmsOutsourceOrderD> wmsOutsourceOrderDs = new List<WmsOutsourceOrderD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsOutsourceOrderD.unit_id = erpExtendField.Id;
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<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsOutsourceOrderD.matcode_id = material.id;
wmsOutsourceOrderD.matspecification = material.material_specification;
}
wmsOutsourceOrderD.auxprop_gys = detail.auxprop_gys;
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
{
}
}
/// <summary>
/// 转库单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> MaterialTransfer(MaterialTransferInput input)
{
LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
try
{
WmsErpWarehouserelaH wmsErpWarehouserelaHout = await db.Queryable<WmsErpWarehouserelaH>().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<WmsErpWarehouserelaH>().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<BasWarehouse>().Where(r => r.whcode == warehouse_outstock_code).FirstAsync();
BasWarehouse warehouse_instock = await db.Queryable<BasWarehouse>().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 = "";
#region
// 齐套出入库
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID
&& (warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_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_QTCRK_CODE;
}
// 外协调拨入库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZC_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 if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CROSSLAYER_CODE;
// 包材出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_BCK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_F2BCQ_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_PACKING_CODE;
// 长管出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE;
// 外协调拨出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBOUTWAREHOUSE_CODE;
// 灭菌入库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_MJC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_SterilizationInstock_CODE;
#endregion
//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<WmsMaterialTransfer>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
if (wmsMaterialTransferRep != null)
{
// 判断单据是否已经下发
List<WmsMaterialTransferD> _wmsMaterialTransferDs = await db.Queryable<WmsMaterialTransferD>().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<WmsMaterialTransfer>().Where(r => r.id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsMaterialTransferD>().Where(r => r.bill_id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
}
}
List<MaterialTransferDetail> details = input.details.Where(r => r.qty > 0).ToList();
List<MaterialTransferDetail> 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.type = transfer_type;
wmsMaterialTransfer.erp_pk = input.erp_pk;
await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = new List<WmsMaterialTransferD>();
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<BasMaterial>().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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<WmsPrdReturnD> wmsPrdReturnDs = new List<WmsPrdReturnD>();
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<BasMaterial>().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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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
{
}
}
/// <summary>
/// 转库单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> MaterialTransferBatch(List<MaterialTransferInput> inputs)
{
LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(inputs)}");
var db = _repository.AsSugarClient();
List<string> error_erpbillcodes = new List<string>();
foreach (MaterialTransferInput input in inputs)
{
try
{
WmsErpWarehouserelaH wmsErpWarehouserelaHout = await db.Queryable<WmsErpWarehouserelaH>().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<WmsErpWarehouserelaH>().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<BasWarehouse>().Where(r => r.whcode == warehouse_outstock_code).FirstAsync();
BasWarehouse warehouse_instock = await db.Queryable<BasWarehouse>().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 = "";
#region
// 齐套出入库
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID
&& (warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_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_QTCRK_CODE;
}
// 外协调拨入库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZC_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 if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CROSSLAYER_CODE;
// 包材出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_BCK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_F2BCQ_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_PACKING_CODE;
// 长管出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE;
// 外协调拨出库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBOUTWAREHOUSE_CODE;
// 灭菌入库
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_MJC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_SterilizationInstock_CODE;
#endregion
//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<WmsMaterialTransfer>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
if (wmsMaterialTransferRep != null)
{
// 判断单据是否已经下发
List<WmsMaterialTransferD> _wmsMaterialTransferDs = await db.Queryable<WmsMaterialTransferD>().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<WmsMaterialTransfer>().Where(r => r.id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsMaterialTransferD>().Where(r => r.bill_id == wmsMaterialTransferRep.id).ExecuteCommandAsync();
}
}
List<MaterialTransferDetail> details = input.details.Where(r => r.qty > 0).ToList();
List<MaterialTransferDetail> 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.type = transfer_type;
wmsMaterialTransfer.erp_pk = input.erp_pk;
wmsMaterialTransfer.erp_warehouse_instock = input.warehouse_instock;
wmsMaterialTransfer.erp_warehouse_outstock = input.warehouse_outstock;
await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = new List<WmsMaterialTransferD>();
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<BasMaterial>().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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<WmsPrdReturnD> wmsPrdReturnDs = new List<WmsPrdReturnD>();
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<BasMaterial>().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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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();
}
catch (Exception ex)
{
error_erpbillcodes.Add($"bip单据号{input.bill_code}: {ex.Message}");
LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.Message}");
LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
}
finally
{
}
}
if (error_erpbillcodes.Count > 0)
{
LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}");
return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}");
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 销售发货单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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<WmsErpWarehouserelaH>().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<BasWarehouse>().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<WmsSaleH>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
if (wmsSaleHRep != null)
{
// 判断单据是否已经下发
List<WmsSaleD> _wmsSaleDs = await db.Queryable<WmsSaleD>().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<WmsSaleH>().Where(r => r.id == wmsSaleHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsSaleD>().Where(r => r.bill_id == wmsSaleHRep.id).ExecuteCommandAsync();
}
}
WmsSaleH wmsSaleH = new WmsSaleH();
string Code = await _billRuleService.GetBillNumber("WmsSale");
wmsSaleH.bill_code = Code;
wmsSaleH.org_id = WmsWareHouseConst.AdministratorOrgId;
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<BasCustomer>().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<WmsSaleD> wmsSaleDs = new List<WmsSaleD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
}
wmsSaleD.auxprop = detail.auxprop;
wmsSaleD.auxprop_gys = detail.auxprop_gys;
wmsSaleD.auxprop_xph = detail.auxprop_xph;
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
{
}
}
/// <summary>
/// 调拨出库单同步
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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<WmsErpWarehouserelaH>().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<BasWarehouse>().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();
// 判断是否重复传输
WmsRawmatTransferinstockH wmsRawmatTransferinstockHRep = await db.Queryable<WmsRawmatTransferinstockH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsRawmatTransferinstockHRep != null)
{
// 判断单据是否已经下发
List<WmsRawmatTransferinstockD> wmsRawmatTransferinstockHs = await db.Queryable<WmsRawmatTransferinstockD>().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<WmsRawmatTransferinstockH>().Where(r => r.id == wmsRawmatTransferinstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsRawmatTransferinstockD>().Where(r => r.bill_id == wmsRawmatTransferinstockHRep.id).ExecuteCommandAsync();
}
}
// 判断是否重复传输
WmsTransferInstockH wmsTransferInstockHRep = await db.Queryable<WmsTransferInstockH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsTransferInstockHRep != null)
{
// 判断单据是否已经下发
List<WmsTransferInstockD> _wmsTransferInstockDs = await db.Queryable<WmsTransferInstockD>().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<WmsTransferInstockH>().Where(r => r.id == wmsTransferInstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsTransferInstockD>().Where(r => r.bill_id == wmsTransferInstockHRep.id).ExecuteCommandAsync();
}
}
// 判断是否重复传输
WmsPackInstockH wmsPackInstockHRep = await db.Queryable<WmsPackInstockH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsPackInstockHRep != null)
{
// 判断单据是否已经下发
List<WmsPackInstockD> _wmsPackInstocDs = await db.Queryable<WmsPackInstockD>().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<WmsPackInstockH>().Where(r => r.id == wmsPackInstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsPackInstockD>().Where(r => r.bill_id == wmsPackInstockHRep.id).ExecuteCommandAsync();
}
}
string Code = "";
switch (warehouse_instock.id)
{
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
{
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<ErpExtendField>().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;
var OrganizeEntity = await db.Queryable<OrganizeEntity>().Where(a => a.Id == org_erpExtendField.table_id).FirstAsync();
if (OrganizeEntity != null)
{
wmsRawmatTransferinstockH.outstockorg_name = OrganizeEntity.FullName;
}
}
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<WmsRawmatTransferinstockD> wmsRawmatTransferinstockDs = new List<WmsRawmatTransferinstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
}
msRawmatTransferinstockD.auxprop = detail.auxprop;
msRawmatTransferinstockD.auxprop_gys = detail.auxprop_gys;
msRawmatTransferinstockD.auxprop_xph = detail.auxprop_xph;
wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD);
}
await db.Insertable(wmsRawmatTransferinstockDs).ExecuteCommandAsync();
break;
}
case WmsWareHouseConst.WAREHOUSE_CP_ID:
{
WmsTransferInstockH wmsTransferInstockH = new WmsTransferInstockH();
Code = await _billRuleService.GetBillNumber("transferInstock");
wmsTransferInstockH.bill_code = Code;
wmsTransferInstockH.erp_bill_code = input.transfer_order;
var org_erpExtendField = await db.Queryable<ErpExtendField>().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<WmsTransferInstockD> wmsTransferInstockDs = new List<WmsTransferInstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
}
wmsTransferInstockD.auxprop = detail.auxprop;
wmsTransferInstockD.auxprop_gys = detail.auxprop_gys;
wmsTransferInstockD.auxprop_xph = detail.auxprop_xph;
wmsTransferInstockDs.Add(wmsTransferInstockD);
}
await db.Insertable(wmsTransferInstockDs).ExecuteCommandAsync();
break;
}
case WmsWareHouseConst.WAREHOUSE_JXK_ID:
{
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<ErpExtendField>().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<WmsTransferInstockD> wmsTransferInstockDs = new List<WmsTransferInstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
//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<ErpExtendField>().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<WmsPackInstockD> wmsPackInstockDs = new List<WmsPackInstockD>();
//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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
}
case WmsWareHouseConst.WAREHOUSE_BCK_ID:
{
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<ErpExtendField>().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<WmsPackInstockD> wmsPackInstockDs = new List<WmsPackInstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
}
wmsPackInstockD.auxprop_gys = detail.auxprop_gys;
wmsPackInstockD.auxprop_xph = detail.auxprop_xph;
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
{
}
}
/// <summary>
/// 调拨订单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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 wmsTransferOrderHRep = await db.Queryable<WmsTransferOrderH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsTransferOrderHRep != null)
{
await db.Deleteable<WmsTransferOrderH>().Where(r => r.id == wmsTransferOrderHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsTransferOrderD>().Where(r => r.bill_id == wmsTransferOrderHRep.id).ExecuteCommandAsync();
}
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<ErpExtendField>().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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<string, object> dic_WmsErpWarehouseidrelaH = await db.Queryable<WmsErpWarehouserelaH>()
.LeftJoin<BasWarehouse>((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<string, object> dic_WmsErpWarehousecoderelaH = await db.Queryable<WmsErpWarehouserelaH>()
.LeftJoin<BasWarehouse>((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<TransferOrderInputDetail> details_WAREHOUSE_YCL_ID = input.details.Where(r => dic_WmsErpWarehouseidrelaH[r.warehouse_outstock].ToString() == WmsWareHouseConst.WAREHOUSE_YCL_ID).ToList();
List<TransferOrderInputDetail> details_WAREHOUSE_CP_ID = input.details.Where(r => dic_WmsErpWarehouseidrelaH[r.warehouse_outstock].ToString() == WmsWareHouseConst.WAREHOUSE_CP_ID).ToList();
List<WmsTransferOrderD> wmsTransferOrderDs = new List<WmsTransferOrderD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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();
// 判断是否重复传输
WmsRawmatTransferoutstockH wmsRawmatTransferoutstockHRep = await db.Queryable<WmsRawmatTransferoutstockH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsRawmatTransferoutstockHRep != null)
{
// 判断单据是否已经下发
List<WmsRawmatTransferoutstockD> _wmsRawmatTransferoutstockDs = await db.Queryable<WmsRawmatTransferoutstockD>().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<WmsRawmatTransferoutstockH>().Where(r => r.id == wmsRawmatTransferoutstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsRawmatTransferoutstockD>().Where(r => r.bill_id == wmsRawmatTransferoutstockHRep.id).ExecuteCommandAsync();
}
}
// 判断是否重复传输
WmsTransferOutstockH wmsTransferOutstockHRep = await db.Queryable<WmsTransferOutstockH>().Where(r => r.erp_bill_code == input.transfer_order).FirstAsync();
if (wmsTransferOutstockHRep != null)
{
// 判断单据是否已经下发
List<WmsTransferOutstockD> _wmsTransferOutstockDs = await db.Queryable<WmsTransferOutstockD>().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<WmsTransferOutstockH>().Where(r => r.id == wmsTransferOutstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsTransferOutstockD>().Where(r => r.bill_id == wmsTransferOutstockHRep.id).ExecuteCommandAsync();
}
}
if (details_WAREHOUSE_YCL_ID.Count > 0)
{
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;
wmsRawmatTransferoutstockH.warehouse_code = WmsWareHouseConst.WAREHOUSE_YCL_CODE;
List<WmsRawmatTransferoutstockD> wmsRawmatTransferoutstockDs = new List <WmsRawmatTransferoutstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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 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<WmsTransferOutstockD> wmsTransferOutstockDs = new List<WmsTransferOutstockD>();
foreach (var detail in details_WAREHOUSE_CP_ID)
{
WmsTransferOutstockD wmsTransferOutstockD = new WmsTransferOutstockD();
wmsTransferOutstockD.bill_id = wmsTransferOutstockH.id;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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
{
}
}
/// <summary>
/// 材料出库单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> 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<WmsRawmatOutstockH>().Where(r => r.erp_bill_code == input.outstock_order).FirstAsync();
if (wmsRawmatOutstockHRep != null)
{
// 判断单据是否已经下发
List<WmsRawmatOutstockD> _wmsRawmatOutstockDs = await db.Queryable<WmsRawmatOutstockD>().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<WmsRawmatOutstockH>().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsRawmatOutstockD>().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
}
}
OrganizeEntity dept = await db.Queryable<OrganizeEntity>().Where(x=>x.EnCode==input.dept_code).FirstAsync();
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.erp_bill_code = input.outstock_order;
wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
//wmsRawmatOutstockH.biller = input.biller;
wmsRawmatOutstockH.department = dept?.Id ?? input.dept_code;
wmsRawmatOutstockH.erp_pk = input.erp_pk;
wmsRawmatOutstockH.issuance_status = "0";
List<WmsRawmatOutstockD> wmsRawmatOutstockDs = new List<WmsRawmatOutstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == 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<BasMaterial>().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;
}
wmsRawmatOutstockD.auxprop = detail.auxprop;
wmsRawmatOutstockD.auxprop_gys = detail.auxprop_gys;
wmsRawmatOutstockD.auxprop_xph = detail.auxprop_xph;
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
{
}
}
/// <summary>
/// 材料出库单(批量)
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> RawmatOutstockBatch(List<ErpRawmatOutstockInput> inputs)
{
LoggerErp2Mes.LogInformation($"【RawmatOutstock】ERP传入数据:{JsonConvert.SerializeObject(inputs)}");
var db = _repository.AsSugarClient();
List<string> error_erpbillcodes = new List<string>();
foreach (ErpRawmatOutstockInput input in inputs)
{
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<WmsRawmatOutstockH>().Where(r => r.erp_bill_code == input.outstock_order).FirstAsync();
if (wmsRawmatOutstockHRep != null)
{
// 判断单据是否已经下发
List<WmsRawmatOutstockD> _wmsRawmatOutstockDs = await db.Queryable<WmsRawmatOutstockD>().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<WmsRawmatOutstockH>().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsRawmatOutstockD>().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
}
}
OrganizeEntity dept = await db.Queryable<OrganizeEntity>().Where(x=>x.EnCode==input.dept_code).FirstAsync();
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.erp_bill_code = input.outstock_order;
wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
//wmsRawmatOutstockH.biller = input.biller;
wmsRawmatOutstockH.department = dept?.Id ?? input.dept_code;
wmsRawmatOutstockH.erp_pk = input.erp_pk;
wmsRawmatOutstockH.issuance_status = "0";
List<WmsRawmatOutstockD> wmsRawmatOutstockDs = new List<WmsRawmatOutstockD>();
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == 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<BasMaterial>().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;
}
wmsRawmatOutstockD.auxprop = detail.auxprop;
wmsRawmatOutstockD.auxprop_gys = detail.auxprop_gys;
wmsRawmatOutstockD.auxprop_xph = detail.auxprop_xph;
wmsRawmatOutstockDs.Add(wmsRawmatOutstockD);
}
await db.Insertable(wmsRawmatOutstockH).ExecuteCommandAsync();
await db.Insertable(wmsRawmatOutstockDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}");
}
catch (Exception ex)
{
error_erpbillcodes.Add($"bip单据号{input.outstock_order}: {ex.Message}");
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}");
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
}
finally
{
}
}
if (error_erpbillcodes.Count > 0)
{
LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}");
return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}");
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 盘点单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> Inventorycheck(InventorycheckInput input)
{
LoggerErp2Mes.LogInformation($"【Inventorycheck】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
try
{
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【Inventorycheck】主表主键不能为空");
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($@"【Inventorycheck】子表主键不能为空");
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
//var wmsInventorychecksDistinct = input.details.Select(r => new
//{
// material_id = r.material_code,
// code_batch = r.code_batch,
//}).Distinct();
//if (wmsInventorychecksDistinct.Count() < input.details.Count)
//{
// _LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体存在物料和批号重复的明细");
// throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
//}
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync();
if (wmsErpWarehouserelaH == null)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系");
throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系", 500);
}
string warehouse_code = wmsErpWarehouserelaH.wms_warehousecode;
BasWarehouse warehouse = await db.Queryable<BasWarehouse>().Where(r => r.whcode == warehouse_code).FirstAsync();
if (warehouse == null)
{
_LoggerErp2Mes.LogWarning($"【Inventorycheck】无法查询到出库仓库{warehouse_code}的档案记录!");
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_code}的档案记录!");
}
await db.Ado.BeginTranAsync();
// 判断是否重复传输
WmsInventorycheckH wmsInventorycheckHRep = await db.Queryable<WmsInventorycheckH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
if (wmsInventorycheckHRep != null)
{
// 判断单据是否已经下发
List<WmsInventorycheckD> _wmsSaleDs = await db.Queryable<WmsInventorycheckD>().Where(r => r.bill_id == wmsInventorycheckHRep.id).ToListAsync();
bool isxf = _wmsSaleDs.Where(r => r.actual_qty > 0).Any();
if (isxf)
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】wms已下发使用盘点单{input.erp_bill_code}");
throw new AppFriendlyException($@"wms已下发使用盘点单{input.erp_bill_code}", 500);
}
else // 删除数据重新插入
{
await db.Deleteable<WmsInventorycheckH>().Where(r => r.id == wmsInventorycheckHRep.id).ExecuteCommandAsync();
await db.Deleteable<WmsInventorycheckD>().Where(r => r.bill_id == wmsInventorycheckHRep.id).ExecuteCommandAsync();
}
}
WmsInventorycheckH wmsInventorycheckH = new WmsInventorycheckH();
string Code = await _billRuleService.GetBillNumber("CheckStockCode");
wmsInventorycheckH.create_id = WmsWareHouseConst.ErpUserId;
wmsInventorycheckH.create_time = DateTime.Now;
wmsInventorycheckH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsInventorycheckH.bill_code = Code;
wmsInventorycheckH.warehouse_id = warehouse.id;
wmsInventorycheckH.warehouse_code = warehouse.whcode;
wmsInventorycheckH.warehouse_name = warehouse.whname;
wmsInventorycheckH.dept_code = input.dept_code;
wmsInventorycheckH.biller = input.biller;
wmsInventorycheckH.erp_bill_code = input.erp_bill_code;
wmsInventorycheckH.erp_pk = input.erp_pk;
wmsInventorycheckH.check_date = input.check_date;
await db.Insertable(wmsInventorycheckH).ExecuteCommandAsync();
List<WmsInventorycheckD> wmsInventorycheckDs = new List<WmsInventorycheckD>();
foreach (var detail in input.details)
{
WmsInventorycheckD wmsInventorycheckD = new WmsInventorycheckD();
wmsInventorycheckD.bill_id = wmsInventorycheckH.id;
wmsInventorycheckD.create_id = WmsWareHouseConst.ErpUserId;
wmsInventorycheckD.create_time = DateTime.Now;
wmsInventorycheckD.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsInventorycheckD.production_date = detail.production_date;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsInventorycheckD.material_id = material.id;
wmsInventorycheckD.material_code = material.code;
wmsInventorycheckD.material_name = material.name;
wmsInventorycheckD.material_specification = material.material_specification;
}
wmsInventorycheckD.qty = detail.qty;
wmsInventorycheckD.actual_qty = 0;
wmsInventorycheckD.code_batch = detail.code_batch;
wmsInventorycheckD.erp_line_pk = detail.erp_line_pk;
wmsInventorycheckD.lineno = detail.lineno;
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync();
if (erpExtendField != null)
{
wmsInventorycheckD.unit_id = erpExtendField.Id;
wmsInventorycheckD.unit_code = erpExtendField.EnCode;
}
else
{
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到");
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到", 500);
}
wmsInventorycheckD.auxprop = detail.auxprop;
wmsInventorycheckD.auxprop_gys = detail.auxprop_gys;
wmsInventorycheckD.auxprop_xph = detail.auxprop_xph;
wmsInventorycheckDs.Add(wmsInventorycheckD);
}
await db.Insertable(wmsInventorycheckDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【Inventorycheck】成功生成单据:{Code}");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
catch (Exception ex)
{
LoggerErp2Mes.LogError($"【Inventorycheck】{ex.Message}");
LoggerErp2Mes.LogError($"【Inventorycheck】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
}
}
protected Task<Entities.Dto.Outputs.Result> ToApiResult(HttpStatusCode statusCode, string msg)
{
Entities.Dto.Outputs.Result result = new()
{
code = statusCode,
msg = msg
};
return Task.FromResult(result);
}
private static readonly Dictionary<LogLevel, string> 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;
}
}
}
}