1249 lines
65 KiB
C#
1249 lines
65 KiB
C#
using System.Collections.Generic;
|
||
using System.Text;
|
||
using Aop.Api.Domain;
|
||
using JNPF.Common.Enums;
|
||
using JNPF.DependencyInjection;
|
||
using JNPF.DynamicApiController;
|
||
using JNPF.FriendlyException;
|
||
using JNPF.Systems.Entitys.System;
|
||
using JNPF.Systems.Interfaces.System;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Components.Forms;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.Extensions.Logging;
|
||
using Newtonsoft.Json;
|
||
using NPOI.OpenXmlFormats;
|
||
using NPOI.SS.Formula.Functions;
|
||
using SqlSugar;
|
||
using Tnb.BasicData.Entities;
|
||
using Tnb.ProductionMgr.Entities.Entity;
|
||
using Tnb.WarehouseMgr.Entities;
|
||
using Tnb.WarehouseMgr.Entities.Consts;
|
||
using Tnb.WarehouseMgr.Entities.Dto.ErpInputs;
|
||
using Tnb.WarehouseMgr.Entities.Dto.Outputs;
|
||
using Tnb.WarehouseMgr.Entities.Entity;
|
||
using Top.Api;
|
||
|
||
namespace Tnb.WarehouseMgr
|
||
{
|
||
/// <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(PurchaseReturnInput 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();
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【PurchaseOrderInput】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
var wmsPurchaseOrdersDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsPurchaseOrdersDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
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;
|
||
wmsPurchaseOrderH.erp_wh_type = input.erp_wh_type;
|
||
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 input.details)
|
||
{
|
||
WmsPurchaseOrderD wmsPurchaseOrderD = new WmsPurchaseOrderD();
|
||
|
||
wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id;
|
||
wmsPurchaseOrderD.matcode = detail.material_code;
|
||
wmsPurchaseOrderD.unit = detail.unit_code;
|
||
var erpExtendField = await db.Queryable<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 = 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;
|
||
|
||
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
|
||
if (material != null)
|
||
{
|
||
wmsPurchaseOrderD.matcode_id = material.id;
|
||
wmsPurchaseOrderD.matspecification = material.material_specification;
|
||
}
|
||
|
||
wmsPurchaseOrderDs.Add(wmsPurchaseOrderD);
|
||
}
|
||
|
||
await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync();
|
||
|
||
await db.Ado.CommitTranAsync();
|
||
|
||
LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}");
|
||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
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();
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【OutsourceOrderInput】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
var wmsPurchaseOrdersDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsPurchaseOrdersDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
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 = 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;
|
||
}
|
||
|
||
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();
|
||
|
||
BasWarehouse warehouse_outstock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == input.warehouse_outstock).FirstAsync();
|
||
BasWarehouse warehouse_instock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == input.warehouse_instock).FirstAsync();
|
||
if (warehouse_outstock == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_outstock}的档案记录!");
|
||
}
|
||
if (warehouse_instock == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{input.warehouse_instock}的档案记录!");
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
string transfer_type = "";
|
||
// 中储仓到暂存仓
|
||
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
|
||
{
|
||
int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count();
|
||
if (count > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!");
|
||
throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500);
|
||
}
|
||
|
||
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE;
|
||
}
|
||
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
|
||
{
|
||
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE;
|
||
}
|
||
else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID)
|
||
{
|
||
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE;
|
||
}
|
||
// 暂时其他情况都算齐套出入库类型(未定)
|
||
else
|
||
{
|
||
int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count();
|
||
if (count > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!");
|
||
throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500);
|
||
}
|
||
|
||
transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE;
|
||
}
|
||
|
||
|
||
var wmsMaterialTransferdsDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsMaterialTransferdsDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer();
|
||
string Code = await _billRuleService.GetBillNumber("MaterialTransfer");
|
||
wmsMaterialTransfer.bill_code = Code;
|
||
wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
|
||
wmsMaterialTransfer.bill_date = DateTime.Now;
|
||
wmsMaterialTransfer.warehouse_outstock = warehouse_outstock.id;
|
||
wmsMaterialTransfer.warehouse_instock = warehouse_instock.id;
|
||
wmsMaterialTransfer.biller_out = input.biller_out;
|
||
wmsMaterialTransfer.depart_out = input.depart_out;
|
||
wmsMaterialTransfer.biller_in = input.biller_in;
|
||
wmsMaterialTransfer.depart_in = input.depart_in;
|
||
wmsMaterialTransfer.deliver_date = input.deliver_date;
|
||
wmsMaterialTransfer.arrival_date = input.arrival_date;
|
||
wmsMaterialTransfer.create_id = WmsWareHouseConst.ErpUserId;
|
||
wmsMaterialTransfer.create_time = DateTime.Now;
|
||
wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId;
|
||
wmsMaterialTransfer.erp_bill_code = input.bill_code;
|
||
wmsMaterialTransfer.transfer_type = transfer_type;
|
||
wmsMaterialTransfer.erp_pk = input.erp_pk;
|
||
|
||
await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync();
|
||
|
||
List<WmsMaterialTransferD> wmsMaterialTransferDs = new List<WmsMaterialTransferD>();
|
||
foreach (var detail in input.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.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();
|
||
|
||
await db.Ado.CommitTranAsync();
|
||
|
||
LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}");
|
||
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> SaleShipping(SaleShippingInput input)
|
||
{
|
||
|
||
|
||
LoggerErp2Mes.LogInformation($"【SaleShipping】ERP传入数据:{JsonConvert.SerializeObject(input)}");
|
||
var db = _repository.AsSugarClient();
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【SaleShipping】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【SaleShipping】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
var wmsSaleShippingsDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsSaleShippingsDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
BasWarehouse warehouse_outstock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == input.warehouse_code).FirstAsync();
|
||
if (warehouse_outstock == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_code}的档案记录!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_code}的档案记录!");
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
WmsSaleH wmsSaleH = new WmsSaleH();
|
||
string Code = await _billRuleService.GetBillNumber("WmsSale");
|
||
|
||
wmsSaleH.bill_code = Code;
|
||
wmsSaleH.erp_bill_code = input.bill_code;
|
||
wmsSaleH.bill_type = "25103439022357";//销售出库单
|
||
wmsSaleH.audit_status = 0;
|
||
wmsSaleH.generate_type = "1";
|
||
wmsSaleH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
|
||
wmsSaleH.warehouse_id = warehouse_outstock.id;
|
||
wmsSaleH.customer_code = input.customer_code;
|
||
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) => a.cunitid == 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;
|
||
}
|
||
|
||
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();
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【TransferOutstock】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
BasWarehouse warehouse_instock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == input.warehouse_instock).FirstAsync();
|
||
if (warehouse_instock == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{input.warehouse_instock}的档案记录!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOutstock】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
var wmsPurchaseOrdersDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsPurchaseOrdersDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOutstock】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
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;
|
||
wmsRawmatTransferinstockH.outstockorg_code = input.outstockorg_code;
|
||
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.erp_wh_type;
|
||
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) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync();
|
||
if (erpExtendField != null)
|
||
{
|
||
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.matspecification = material.material_specification;
|
||
}
|
||
|
||
wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD);
|
||
}
|
||
|
||
await db.Insertable(wmsRawmatTransferinstockDs).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();
|
||
|
||
if (string.IsNullOrEmpty(input.erp_pk))
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【TransferOrder】主表主键不能为空!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
|
||
}
|
||
|
||
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
|
||
if (count_erp_line_pk > 0)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOrder】子表主键不能为空!");
|
||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||
}
|
||
|
||
var wmsTransferOrdersDistinct = input.details.Select(r => new
|
||
{
|
||
material_id = r.material_code,
|
||
code_batch = r.code_batch,
|
||
}).Distinct();
|
||
if (wmsTransferOrdersDistinct.Count() < input.details.Count)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOrder】表体存在物料和批号重复的明细!");
|
||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||
}
|
||
|
||
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.erp_wh_type).FirstAsync();
|
||
if (wmsErpWarehouserelaH == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!");
|
||
throw new AppFriendlyException($@"不存在erp仓库类型{input.erp_wh_type}对应wms系统的映射关系!", 500);
|
||
}
|
||
|
||
string warehouse_outstock_code = wmsErpWarehouserelaH.wms_warehousecode;
|
||
|
||
BasWarehouse warehouse_outstock = await db.Queryable<BasWarehouse>().Where(r => r.whcode == warehouse_outstock_code).FirstAsync();
|
||
if (warehouse_outstock == null)
|
||
{
|
||
_LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{warehouse_outstock_code}的档案记录!");
|
||
return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_outstock_code}的档案记录!");
|
||
}
|
||
|
||
try
|
||
{
|
||
await db.Ado.BeginTranAsync();
|
||
WmsTransferOrderH wmsTransferOrderH = new WmsTransferOrderH();
|
||
string Code = await _billRuleService.GetBillNumber("WmsTransferOrder");
|
||
|
||
wmsTransferOrderH.bill_code = Code;
|
||
wmsTransferOrderH.erp_bill_code = input.transfer_order;
|
||
wmsTransferOrderH.biller = input.biller;
|
||
wmsTransferOrderH.dept_code = input.dept_code;
|
||
wmsTransferOrderH.erp_pk = input.erp_pk;
|
||
wmsTransferOrderH.create_id = WmsWareHouseConst.ErpUserId;
|
||
wmsTransferOrderH.create_time = DateTime.Now;
|
||
wmsTransferOrderH.org_id = WmsWareHouseConst.AdministratorOrgId;
|
||
wmsTransferOrderH.erp_wh_type = input.erp_wh_type;
|
||
|
||
var _erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id)
|
||
.Where((a, b) => a.transaction_type_id == 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();
|
||
|
||
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 = 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;
|
||
|
||
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();
|
||
|
||
if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID)
|
||
{
|
||
WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = new WmsRawmatTransferoutstockH();
|
||
string code = await _billRuleService.GetBillNumber("RawmatTransferoutstock");
|
||
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.warehouse_code = warehouse_outstock.whcode;
|
||
wmsRawmatTransferoutstockH.erp_pk = input.erp_pk;
|
||
wmsRawmatTransferoutstockH.transfer_order_id = wmsTransferOrderH.bill_code;
|
||
wmsRawmatTransferoutstockH.issuance_status = "0";
|
||
wmsRawmatTransferoutstockH.transaction_type = _erpExtendField.EnCode;
|
||
wmsRawmatTransferoutstockH.org_id = WmsWareHouseConst.AdministratorOrgId;
|
||
wmsRawmatTransferoutstockH.erp_wh_type = input.erp_wh_type;
|
||
List<WmsRawmatTransferoutstockD> wmsRawmatTransferoutstockDs = new List <WmsRawmatTransferoutstockD>();
|
||
foreach (var detail in input.details)
|
||
{
|
||
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 = erpExtendField.EnCode;
|
||
}
|
||
else
|
||
{
|
||
_LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!");
|
||
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500);
|
||
}
|
||
|
||
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();
|
||
}
|
||
else if(warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CP_ID)
|
||
{
|
||
WmsTransferOutstockH wmsTransferOutstockH = new WmsTransferOutstockH();
|
||
string code = await _billRuleService.GetBillNumber("WmsTransferOutstock");
|
||
wmsTransferOutstockH.bill_code = code;
|
||
wmsTransferOutstockH.create_id = WmsWareHouseConst.ErpUserId;
|
||
wmsTransferOutstockH.create_time = DateTime.Now;
|
||
wmsTransferOutstockH.warehouse_code = warehouse_outstock.whcode;
|
||
wmsTransferOutstockH.erp_pk = input.erp_pk;
|
||
wmsTransferOutstockH.transfer_order_id = wmsTransferOrderH.bill_code;
|
||
wmsTransferOutstockH.issuance_status = "0";
|
||
wmsTransferOutstockH.transaction_type = _erpExtendField.EnCode;
|
||
wmsTransferOutstockH.org_id = WmsWareHouseConst.AdministratorOrgId;
|
||
wmsTransferOutstockH.erp_wh_type = input.erp_wh_type;
|
||
List<WmsTransferOutstockD> wmsTransferOutstockDs = new List<WmsTransferOutstockD>();
|
||
foreach (var detail in input.details)
|
||
{
|
||
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.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;
|
||
|
||
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
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|