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