采购收货,销售发货业务代码提交

This commit is contained in:
yang.lee
2023-11-07 18:01:59 +08:00
parent 143f636b21
commit ea44abf6af
22 changed files with 1201 additions and 83 deletions

View File

@@ -1,4 +1,6 @@
namespace Tnb.WarehouseMgr;
using System.CodeDom;
namespace Tnb.WarehouseMgr;
public class ModuleConsts
{
@@ -185,5 +187,8 @@ public class ModuleConsts
/// 模块标识-PDA寄存出库
/// </summary>
public const string MODULE_WMSSCANCODEINSTOCKPDA_ID = "28576495374869";
/// <summary>
/// 模块标识-采购收货
/// </summary>
public const string MODULE_WMSPURCHASE_ID = "29975280336405";
}

View File

@@ -0,0 +1,133 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.WarehouseMgr.Entities.Dto
{
/// <summary>
/// 采购收货编辑输入参数
/// </summary>
public class PurchaseAndReceiveUpInput
{
public string bill_code { get; set; } = string.Empty;
/// <summary>
/// 单据类型
/// </summary>
public string bill_type { get; set; } = string.Empty;
/// <summary>
/// 单据状态
/// </summary>
public string status { get; set; } = string.Empty;
/// <summary>
/// 业务类型
/// </summary>
public string biz_type { get; set; } = string.Empty;
/// <summary>
/// 入库仓库ID
/// </summary>
public string? warehouse_id { get; set; }
/// <summary>
/// 供应商ID
/// </summary>
public string? supplier_id { get; set; }
/// <summary>
/// 供应商代码
/// </summary>
public string? supplier_code { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
public string? supplier_name { get; set; }
/// <summary>
/// 生成类型
/// </summary>
public string generate_type { get; set; } = string.Empty;
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? time_stamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string create_id { get; set; } = string.Empty;
/// <summary>
/// 创建时间
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 来源单据ID
/// </summary>
public string? source_id { get; set; }
/// <summary>
/// 来源单据代码
/// </summary>
public string? source_code { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 供货日期
/// </summary>
public DateTime delivery_date { get; set; } = DateTime.Now;
/// <summary>
/// 审核员
/// </summary>
public string? auditor_id { get; set; }
/// <summary>
/// 运输方式
/// </summary>
public string? shipping_method { get; set; }
/// <summary>
/// 审核状态
/// </summary>
public int? audit_status { get; set; }
public List<WmsPurchaseD> details { get; set; } = new();
}
}

View File

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.WarehouseMgr.Entities.Entity.Constraints
{
/// <summary>
/// 采购收货、销售发货 接口约束
/// </summary>
public interface IPurchaseAndSaleEntity
{
public string material_id { get; set; }
/// <summary>
/// 已到货数量
/// </summary>
public decimal purchase_prqty { get; set; }
/// <summary>
/// 采购数量
/// </summary>
public decimal purchase_qty { get; set; }
/// <summary>
/// 本次到货数量
/// </summary>
public decimal purchase_arriveqty { get; set; }
/// <summary>
/// 执行状态
/// </summary>
public string line_status { get; set; }
public string modify_id { get; set; }
public DateTime? modify_time { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.WarehouseMgr.Entities.Entity.Constraints
{
public interface IPurchaseAndSaleQueryEntity
{
public string bill_id { get; set; }
public string material_name { get; set; }
public string material_id { get; set; }
}
}

View File

@@ -208,5 +208,8 @@ public partial class WmsInstockH : BaseEntity<string>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 采购单号
/// </summary>
public string purchase_code { get; set; }
}

View File

@@ -0,0 +1,102 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 采购收货明细表
/// </summary>
[SugarTable("wms_purchase_d")]
public partial class WmsPurchaseD : BaseEntity<string>
{
public WmsPurchaseD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 采购收货单ID
/// </summary>
public string bill_id { get; set; } = string.Empty;
/// <summary>
/// 执行状态
/// </summary>
public string line_status { get; set; } = string.Empty;
/// <summary>
/// 物品ID
/// </summary>
public string material_id { get; set; } = string.Empty;
/// <summary>
/// 物品代码
/// </summary>
public string material_code { get; set; } = string.Empty;
/// <summary>
/// 单位ID
/// </summary>
public string unit_id { get; set; } = string.Empty;
/// <summary>
/// 采购数量
/// </summary>
public decimal purchase_qty { get; set; }
/// <summary>
/// 已到货数量
/// </summary>
public decimal purchase_prqty { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? time_stamp { 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>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 本次到货数量
/// </summary>
public decimal purchase_arriveqty { get; set; }
}

View File

@@ -0,0 +1,20 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
using Tnb.WarehouseMgr.Entities.Entity.Constraints;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 采购收货明细表
/// </summary>
public partial class WmsPurchaseD : IPurchaseAndSaleEntity, IPurchaseAndSaleQueryEntity
{
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(IsIgnore = true)]
public string material_name { get; set; }
}

View File

@@ -0,0 +1,147 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 采购收货主表
/// </summary>
[SugarTable("wms_purchase_h")]
public partial class WmsPurchaseH : BaseEntity<string>
{
public WmsPurchaseH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 租户ID
/// </summary>
public string? tenant_id { get; set; }
/// <summary>
/// 所属组织ID
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 采购收货单号
/// </summary>
public string bill_code { get; set; } = string.Empty;
/// <summary>
/// 单据类型
/// </summary>
public string bill_type { get; set; } = string.Empty;
/// <summary>
/// 单据状态
/// </summary>
public string status { get; set; } = string.Empty;
/// <summary>
/// 业务类型
/// </summary>
public string biz_type { get; set; } = string.Empty;
/// <summary>
/// 入库仓库ID
/// </summary>
public string? warehouse_id { get; set; }
/// <summary>
/// 供应商ID
/// </summary>
public string? supplier_id { get; set; }
/// <summary>
/// 供应商代码
/// </summary>
public string? supplier_code { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
public string? supplier_name { get; set; }
/// <summary>
/// 生成类型
/// </summary>
public string generate_type { get; set; } = string.Empty;
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? time_stamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string create_id { get; set; } = string.Empty;
/// <summary>
/// 创建时间
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 来源单据ID
/// </summary>
public string? source_id { get; set; }
/// <summary>
/// 来源单据代码
/// </summary>
public string? source_code { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 供货日期
/// </summary>
public DateTime delivery_date { get; set; } = DateTime.Now;
/// <summary>
/// 审核员
/// </summary>
public string? auditor_id { get; set; }
/// <summary>
/// 运输方式
/// </summary>
public string? shipping_method { get; set; }
/// <summary>
/// 审核状态
/// </summary>
public int? audit_status { get; set; }
}

View File

@@ -0,0 +1,88 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 销售发货明细表
/// </summary>
[SugarTable("wms_sale_d")]
public partial class WmsSaleD : BaseEntity<string>
{
public WmsSaleD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 销售发货单ID
/// </summary>
public string bill_id { get; set; } = string.Empty;
/// <summary>
/// 执行状态
/// </summary>
public string line_status { get; set; } = string.Empty;
/// <summary>
/// 物品ID
/// </summary>
public string material_id { get; set; } = string.Empty;
/// <summary>
/// 物品代码
/// </summary>
public string material_code { get; set; } = string.Empty;
/// <summary>
/// 单位ID
/// </summary>
public string unit_id { get; set; } = string.Empty;
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? time_stamp { 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>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
}

View File

@@ -0,0 +1,33 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
using Tnb.WarehouseMgr.Entities.Entity.Constraints;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 销售发货明细表
/// </summary>
public partial class WmsSaleD : IPurchaseAndSaleEntity, IPurchaseAndSaleQueryEntity
{
/// <summary>
/// 物料名称
/// </summary>
[SugarColumn(IsIgnore = true)]
public string material_name { get; set; }
/// <summary>
/// 本次发货数量
/// </summary>
[SugarColumn(ColumnName = "sale_sendqty")]
public decimal purchase_arriveqty { get; set; }
/// <summary>
///已 发货数量
/// </summary>
[SugarColumn(ColumnName = "sale_prqty")]
public decimal purchase_prqty { get; set; }
/// <summary>
/// 发货数量
/// </summary>
[SugarColumn(ColumnName = "sale_qty")]
public decimal purchase_qty { get; set; }
}

View File

@@ -0,0 +1,147 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities;
/// <summary>
/// 销售发货主表
/// </summary>
[SugarTable("wms_sale_h")]
public partial class WmsSaleH : BaseEntity<string>
{
public WmsSaleH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 租户ID
/// </summary>
public string? tenant_id { get; set; }
/// <summary>
/// 所属组织ID
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 销售发货单号
/// </summary>
public string bill_code { get; set; } = string.Empty;
/// <summary>
/// 单据类型
/// </summary>
public string bill_type { get; set; } = string.Empty;
/// <summary>
/// 单据状态
/// </summary>
public string status { get; set; } = string.Empty;
/// <summary>
/// 业务类型
/// </summary>
public string biz_type { get; set; } = string.Empty;
/// <summary>
/// 出库仓库ID
/// </summary>
public string? warehouse_id { get; set; }
/// <summary>
/// 客户ID
/// </summary>
public string? customer_id { get; set; }
/// <summary>
/// 客户代码
/// </summary>
public string? customer_code { get; set; }
/// <summary>
/// 客户名称
/// </summary>
public string? customer_name { get; set; }
/// <summary>
/// 生成类型
/// </summary>
public string generate_type { get; set; } = string.Empty;
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public DateTime? time_stamp { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string create_id { get; set; } = string.Empty;
/// <summary>
/// 创建时间
/// </summary>
public DateTime create_time { get; set; } = DateTime.Now;
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 来源单据ID
/// </summary>
public string? source_id { get; set; }
/// <summary>
/// 来源单据代码
/// </summary>
public string? source_code { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// 供货日期
/// </summary>
public DateTime ship_date { get; set; } = DateTime.Now;
/// <summary>
/// 审核员
/// </summary>
public string? auditor_id { get; set; }
/// <summary>
/// 运输方式
/// </summary>
public string? shipping_method { get; set; }
/// <summary>
/// 审核状态
/// </summary>
public int? audit_status { get; set; }
}

View File

@@ -1,4 +1,5 @@
using Mapster;
using JNPF.Common.Security;
using Mapster;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Dto.Outputs;
@@ -21,6 +22,9 @@ namespace Tnb.WarehouseMgr.Entities.Mapper
.Map(dest => dest.qc_status, src => src.is_check == 0 ? "不合格" : "合格");
config.ForType<WmsCarryCode, CarryCodeQueryOutput>()
.Map(dest => dest.check_conclusion, src => GenericEnumDicionary<EnumCheckConclusion>.GetEnumDesc(src.check_conclusion));
config.ForType<WmsPurchaseD, WmsInstockD>()
.Map(dest => dest.id, src => SnowflakeIdHelper.NextId())
.Map(dest => dest.pr_qty, src => src.purchase_arriveqty);
}
}
}

View File

@@ -1,9 +1,12 @@
namespace Tnb.WarehouseMgr.Interfaces
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
namespace Tnb.WarehouseMgr.Interfaces
{
/// <summary>
/// 入库申请服务接口
/// </summary>
public interface IWmsInStockService
{
Task<dynamic> MESCreateInstock(MESCreateInstockInput input);
}
}

View File

@@ -1,4 +1,5 @@
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using JNPF.Common.Dtos.VisualDev;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
namespace Tnb.WarehouseMgr.Interfaces
{
@@ -13,5 +14,11 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <param name="input"></param>
/// <returns></returns>
Task<dynamic> MESCreateOutstock(MESCreateOutstockInput input);
/// <summary>
/// 出库申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<dynamic> OutStockApplyFor(VisualDevModelDataCrInput input);
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Dtos.VisualDev;
namespace Tnb.WarehouseMgr.Interfaces
{
public interface IWmsPDAScanInStockService
{
Task<dynamic> ScanInStock(VisualDevModelDataCrInput input);
}
}

View File

@@ -72,7 +72,7 @@ namespace Tnb.WarehouseMgr
OverideFuncs.CreateAsync = OutStockApplyFor;
}
private async Task<dynamic> OutStockApplyFor(VisualDevModelDataCrInput input)
public async Task<dynamic> OutStockApplyFor(VisualDevModelDataCrInput input)
{
try
{

View File

@@ -235,30 +235,33 @@ namespace Tnb.WarehouseMgr
List<WmsInstockCode> items = instockDetails.Adapt<List<WmsInstockCode>>();
//items.ForEach(it => it.org_id = _userManager.User.OrganizeId);
List<WmsInstockCode> instockCOdes = new();
jArr = JArray.Parse(input.data["tablefield115"].ToString()!);
if (jArr?.Children().Count() > 0)
if (input.data.ContainsKey("tablefield115"))
{
foreach (JToken jo in jArr.Children())
jArr = JArray.Parse(input.data["tablefield115"].ToString()!);
if (jArr?.Children().Count() > 0)
{
string? materialCode = jo.Value<string>(nameof(WmsInstockCode.material_code));
string? codeBatch = jo.Value<string>(nameof(WmsInstockCode.code_batch));
WmsInstockCode? b = items.Find(x => x.material_code == materialCode && x.code_batch == codeBatch);
if (b != null)
foreach (JToken jo in jArr.Children())
{
WmsInstockCode c = DeepCopyHelper<WmsInstockCode>.DeepCopy(b);
c.id = SnowflakeIdHelper.NextId();
c.bill_d_id = b.id;
c.barcode = jo.Value<string>(nameof(WmsInstockCode.barcode))!;
c.codeqty = jo.Value<int>(nameof(WmsInstockCode.codeqty));
instockCOdes.Add(c);
string? materialCode = jo.Value<string>(nameof(WmsInstockCode.material_code));
string? codeBatch = jo.Value<string>(nameof(WmsInstockCode.code_batch));
WmsInstockCode? b = items.Find(x => x.material_code == materialCode && x.code_batch == codeBatch);
if (b != null)
{
WmsInstockCode c = DeepCopyHelper<WmsInstockCode>.DeepCopy(b);
c.id = SnowflakeIdHelper.NextId();
c.bill_d_id = b.id;
c.barcode = jo.Value<string>(nameof(WmsInstockCode.barcode))!;
c.codeqty = jo.Value<int>(nameof(WmsInstockCode.codeqty));
instockCOdes.Add(c);
}
}
}
string orgId = _userManager.User.OrganizeId;
_ = await _db.Insertable(instockCOdes).CallEntityMethod(it => it.Create(orgId)).ExecuteCommandAsync();
_ = await _db.Updateable<WmsTempCode>().SetColumns(it => new WmsTempCode { is_end = 1 }).Where(it => instockCOdes.Select(x => x.barcode).Contains(it.barcode)).ExecuteCommandAsync();
}
string orgId = _userManager.User.OrganizeId;
_ = await _db.Insertable(carryCodes).ExecuteCommandAsync();
_ = await _db.Insertable(instockCOdes).CallEntityMethod(it => it.Create(orgId)).ExecuteCommandAsync();
// 更新临时条码表 状态is_end
_ = await _db.Updateable<WmsTempCode>().SetColumns(it => new WmsTempCode { is_end = 1 }).Where(it => instockCOdes.Select(x => x.barcode).Contains(it.barcode)).ExecuteCommandAsync();
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
it => new WmsCarryH { carry_code = input.data[nameof(WmsCarryH.carry_code)].ToString()!, is_lock = 1, carry_status = ((int)EnumCarryStatus.).ToString(), location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode, source_id = input.data[nameof(WmsOutstockH.source_id)].ToString(), source_code = input.data[nameof(WmsOutstockH.source_code)].ToString() },
it => new BasLocation { is_lock = 1, is_use = ((int)EnumCarryStatus.).ToString() });

View File

@@ -24,7 +24,7 @@ namespace Tnb.WarehouseMgr
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSSCANCODEINSTOCKPDA_ID)]
[ServiceModule(BizTypeId)]
public class WmsPDAScanInStockService : BaseWareHouseService, IPdaStroage
public class WmsPDAScanInStockService : BaseWareHouseService, IWmsPDAScanInStockService, IPdaStroage
{
private const string BizTypeId = "26191496816421";
private readonly ISqlSugarClient _db;
@@ -57,90 +57,126 @@ namespace Tnb.WarehouseMgr
try
{
await _db.Ado.BeginTranAsync();
WmsInstockCode item = input.data.Adapt<WmsInstockCode>();
if (item.codeqty == 0)
WmsInstockCode? item = null;
BasMaterial? mat = null;
WmsCarryH? carry = null;
BasLocation? loc = null;
string? carryCode = null;
if (input.data.ContainsKey(nameof(WmsInstockCode.barcode)))
{
throw new AppFriendlyException("请输入入库数量", 500);
item = input.data.Adapt<WmsInstockCode>();
if (item.codeqty == 0)
{
throw new AppFriendlyException("请输入入库数量", 500);
}
carryCode = item.barcode;
carry = await _db.Queryable<WmsCarryH>().FirstAsync(it => it.carry_code == carryCode);
if (carry == null)
{
throw new AppFriendlyException("载具有误", 500);
}
mat = await _db.Queryable<BasMaterial>().FirstAsync(it => it.code == item.material_code);
if (mat == null)
{
throw new AppFriendlyException("物料有误", 500);
}
loc = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == item.extras);
if (loc == null)
{
throw new AppFriendlyException("库位有误", 500);
}
}
string carryCode = item.barcode;
WmsCarryH carry = await _db.Queryable<WmsCarryH>().FirstAsync(it => it.carry_code == carryCode);
if (carry == null)
{
throw new AppFriendlyException("载具有误", 500);
}
BasMaterial mat = await _db.Queryable<BasMaterial>().FirstAsync(it => it.code == item.material_code);
if (mat == null)
{
throw new AppFriendlyException("物料有误", 500);
}
BasLocation loc = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == item.extras);
if (loc == null)
{
throw new AppFriendlyException("库位有误", 500);
}
var whId = input.data.ContainsKey(nameof(WmsPurchaseH.warehouse_id)) ? input.data[nameof(WmsPurchaseH.warehouse_id)] : null;
var billCode = input.data.ContainsKey(nameof(WmsPurchaseH.bill_code)) ? input.data[nameof(WmsPurchaseH.warehouse_id)] : null;
WmsInstockH instock = new()
{
id = SnowflakeIdHelper.NextId(),
org_id = _userManager.UserId,
carry_code = carryCode,
carry_id = carry.id,
location_id = loc.id,
carry_id = carry?.id ?? string.Empty,
location_id = loc?.id ?? string.Empty,
bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_INSTOCK_ENCODE).GetAwaiter().GetResult(),
bill_type = WmsWareHouseConst.BILLTYPE_MATERIALINSTOCK_ID,
biz_type = WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID,
bill_date = DateTime.Today,
warehouse_id = "26103372441637",
warehouse_id = whId?.ToString() ?? "26103372441637",
status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
generate_type = "0",
sync_status = WmsWareHouseConst.SYNC_STATUS_NONEEDSYNC,
print_status = WmsWareHouseConst.PRINT_STATUS_PRINTCOMPLETE,
is_check = 1,
purchase_code = billCode?.ToString() ?? string.Empty,
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
WmsInstockD instockD = new()
var instockDs = new List<WmsInstockD>();
WmsInstockD? instockD = null;
if (mat != null)
{
id = SnowflakeIdHelper.NextId(),
bill_id = instock.id,
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
material_id = mat.id,
material_code = mat.code,
unit_id = mat.unit_id,
pr_qty = item.codeqty,
qty = 0,
code_batch = item.code_batch,
warehouse_id = "26103372441637",
print_qty = item.codeqty,
scan_qty = item.codeqty,
print_id = "",
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
WmsInstockCode instockCode = new()
instockD = new()
{
id = SnowflakeIdHelper.NextId(),
bill_id = instock.id,
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
material_id = mat.id,
material_code = mat.code,
unit_id = mat.unit_id,
pr_qty = item.codeqty,
qty = 0,
code_batch = item.code_batch,
warehouse_id = "26103372441637",
print_qty = item.codeqty,
scan_qty = item.codeqty,
print_id = "",
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
instockDs.Add(instockD);
}
else
{
id = SnowflakeIdHelper.NextId(),
bill_id = instock.id,
bill_d_id = instockD.id,
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
material_id = mat.id,
material_code = mat.code,
unit_id = mat.unit_id,
barcode = carryCode,
code_batch = item.code_batch,
codeqty = item.codeqty,
is_lock = 0,
is_end = 0,
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
if (input.data.ContainsKey("details"))
{
instockDs = input.data["details"].Adapt<List<WmsInstockD>>();
}
}
WmsInstockCode? instockCode = null;
if (mat != null)
{
instockCode = new()
{
id = SnowflakeIdHelper.NextId(),
bill_id = instock.id,
bill_d_id = instockD?.id ?? string.Empty,
line_status = WmsWareHouseConst.BILLSTATUS_ADD_ID,
material_id = mat.id,
material_code = mat.code,
unit_id = mat.unit_id,
barcode = carryCode,
code_batch = item.code_batch,
codeqty = item.codeqty,
is_lock = 0,
is_end = 0,
create_id = _userManager.UserId,
create_time = DateTime.Now,
};
}
_ = await _db.Insertable(instock).ExecuteCommandAsync();
_ = await _db.Insertable(instockD).ExecuteCommandAsync();
_ = await _db.Insertable(instockCode).ExecuteCommandAsync();
_ = await _db.Insertable(instockDs).ExecuteCommandAsync();
if (instockCode != null)
{
_ = await _db.Insertable(instockCode).ExecuteCommandAsync();
}
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "26103372441637", Size = 1 };

View File

@@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Contracts;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.FriendlyException;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Entity.Constraints;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 采购收货、销售发货,通用业务类
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class WmsPurchaseAndSaleCommonService<TEntity> : BaseWareHouseService where TEntity : BaseEntity<string>, IPurchaseAndSaleEntity, IPurchaseAndSaleQueryEntity
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStockService;
private readonly IWmsOutStockService _wmsOutStockService;
private static Dictionary<string, object> s_materialMap = new();
public WmsPurchaseAndSaleCommonService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager, IWmsOutStockService? wmsOutStockService = null)
{
_db = repo.AsSugarClient();
_userManager = userManager;
_wmsOutStockService = wmsOutStockService!;
}
protected async Task<bool> PurchaseAndSaleUpdate(PurchaseAndReceiveUpInput input)
{
if (input == null) throw new ArgumentNullException("input");
if (input.details == null) throw new ArgumentNullException(nameof(input.details));
var dicMaterialPurchaseArriveQty = input.details.ToDictionary(x => x.material_id, x => x.purchase_arriveqty);
var materialIds = input.details.Select(x => x.material_id).ToList();
var purchaseDs = await _db.Queryable<TEntity>().Where(it => materialIds.Contains(it.material_id)).ToListAsync();
if (purchaseDs?.Count > 0)
{
var errMaterialTipList = new List<(string materialName, decimal purchaseArriveQty, decimal topPurchaseQty)>();
foreach (var pd in purchaseDs)
{
pd.purchase_prqty += dicMaterialPurchaseArriveQty.ContainsKey(pd.material_id) ? dicMaterialPurchaseArriveQty[pd.material_id] : 0;
var pdInput = input.details.Find(x => x.material_id == pd.material_id);
if (pdInput != null)
{
var topPurchaseQty = pd.purchase_qty - pd.purchase_prqty;
if (pdInput.purchase_arriveqty > topPurchaseQty)
{
if (s_materialMap.ContainsKey(pdInput.material_id) && s_materialMap[pdInput.material_id] != null)
{
errMaterialTipList.Add((s_materialMap[pdInput.material_id].ToString()!, pdInput.purchase_arriveqty, topPurchaseQty));
continue;
}
}
}
if (pd.purchase_prqty >= pd.purchase_qty)
{
pd.line_status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
}
else
{
pd.line_status = WmsWareHouseConst.BILLSTATUS_ON_ID;
}
}
if (errMaterialTipList.Count > 0)
{
var errMsgList = new List<string>();
if (typeof(TEntity) == typeof(WmsPurchaseD))
{
errMsgList = errMaterialTipList.Select(x => $"物料:{x.materialName},实际收货数:{x.purchaseArriveQty}已超出可收货数:{x.topPurchaseQty}").ToList();
}
else
{
errMsgList = errMaterialTipList.Select(x => $"物料:{x.materialName},实际发货数:{x.purchaseArriveQty}已超出可发货数:{x.topPurchaseQty}").ToList();
}
var errMsg = string.Join("\r\n", errMsgList);
throw new AppFriendlyException(errMsg, 500);
}
purchaseDs.ForEach(x =>
{
x.modify_id = _userManager.UserId;
x.modify_time = DateTime.Now;
});
await _db.Updateable(purchaseDs).ExecuteCommandAsync();
if (purchaseDs.All(x => x.line_status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID))
{
var purchase = await _db.Queryable<WmsPurchaseH>().FirstAsync(it => it.bill_code == input.bill_code);
if (purchase != null)
{
purchase.status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
purchase.modify_id = _userManager.UserId;
purchase.modify_time = DateTime.Now;
await _db.Updateable(purchase).UpdateColumns(it => it.status).ExecuteCommandAsync();
}
}
}
VisualDevModelDataCrInput visualDevModelDataInput = new();
visualDevModelDataInput.data = PocoToDictionary.ToDictionary(input) as Dictionary<string, object>;
if (_wmsOutStockService != null)
{
await _wmsOutStockService.OutStockApplyFor(visualDevModelDataInput);
}
return await Task.FromResult(true);
}
protected async Task<List<TEntity>> GetDetailsByPkId(string pkId)
{
if (s_materialMap.Count == 0)
{
s_materialMap = await _db.Queryable<BasMaterial>().ToDictionaryAsync(x => x.id, x => x.name);
}
var list = await _db.Queryable<TEntity>().Where(it => it.bill_id == pkId)
.Mapper(it => it.material_name = s_materialMap.ContainsKey(it.material_id) ? s_materialMap[it.material_id]?.ToString() ?? "" : "")
.ToListAsync();
return list;
}
}
}

View File

@@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.FriendlyException;
using JNPF.Logging;
using JNPF.VisualDev;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using NPOI.OpenXmlFormats;
using NPOI.OpenXmlFormats.Dml.Diagram;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 采购收货
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSPURCHASE_ID)]
public class WmsPurchaseService : WmsPurchaseAndSaleCommonService<WmsPurchaseD>
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
public WmsPurchaseService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager)
: base(repo, userManager)
{
_db = repo.AsSugarClient();
_userManager = userManager;
}
private async Task<dynamic> xxx(VisualDevModelDataCrInput input)
{
PurchaseAndReceiveUpInput input2 = new();
var input3 = input.data.ToObject<PurchaseAndReceiveUpInput>();
input3.details = input.data["tablefield177"].ToObject<List<WmsPurchaseD>>();
var sss = JsonConvert.SerializeObject(input3);
return await Task.FromResult(sss);
}
/// <summary>
/// 采购收货
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> Purchase(PurchaseAndReceiveUpInput input)
{
var blFlag = true;
try
{
await _db.Ado.BeginTranAsync();
blFlag = await PurchaseAndSaleUpdate(input);
if (blFlag)
{
var instock = input.Adapt<WmsInstockH>();
instock.id = SnowflakeIdHelper.NextId();
instock.create_id = _userManager.UserId;
instock.create_time = DateTime.Now;
instock.org_id = _userManager.User.OrganizeId;
await _db.Insertable(instock).ExecuteCommandAsync();
var instockD = input.details.Adapt<WmsInstockD>();
instockD.create_id = _userManager.UserId;
instockD.create_time = DateTime.Now;
instockD.org_id = _userManager.User.OrganizeId;
await _db.Insertable(instockD).ExecuteCommandAsync();
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
blFlag = false;
await _db.Ado.RollbackTranAsync();
Log.Error("采购收货失败", ex);
throw;
}
return await Task.FromResult(blFlag);
}
/// <summary>
/// 根据主表Id获取采购收货明细
/// </summary>
/// <param name="id">主表Id</param>
/// <returns></returns>
[HttpGet("id")]
public async Task<dynamic> GetPurchaseDetailByBillId(string id)
{
return await GetDetailsByPkId(id);
}
}
}

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 销售发货
/// </summary>
public class WmsSaleService : WmsPurchaseAndSaleCommonService<WmsSaleD>
{
public WmsSaleService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager, IWmsOutStockService wmsOutStockService)
: base(repo, userManager, wmsOutStockService: wmsOutStockService)
{
}
[HttpPost]
public async Task<dynamic> Sale(PurchaseAndReceiveUpInput input)
{
return await PurchaseAndSaleUpdate(input);
}
[HttpGet("id")]
public async Task<dynamic> GetSaleDetailsByBillId(string id)
{
return await GetDetailsByPkId(id);
}
}
}

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.Common.Utils
{
public static class PocoToDictionary
{
private static readonly MethodInfo AddToDicitonaryMethod = typeof(IDictionary<string, object>).GetMethod("Add");
private static readonly ConcurrentDictionary<Type, Func<object, IDictionary<string, object>>> Converters = new ConcurrentDictionary<Type, Func<object, IDictionary<string, object>>>();
private static readonly ConstructorInfo DictionaryConstructor = typeof(Dictionary<string, object>).GetConstructors().FirstOrDefault(c => c.IsPublic && !c.GetParameters().Any());
public static IDictionary<string, object> ToDictionary(this object obj) => obj == null ? null : Converters.GetOrAdd(obj.GetType(), o =>
{
var outputType = typeof(IDictionary<string, object>);
var inputType = obj.GetType();
var inputExpression = Expression.Parameter(typeof(object), "input");
var typedInputExpression = Expression.Convert(inputExpression, inputType);
var outputVariable = Expression.Variable(outputType, "output");
var returnTarget = Expression.Label(outputType);
var body = new List<Expression>
{
Expression.Assign(outputVariable, Expression.New(DictionaryConstructor))
};
body.AddRange(
from prop in inputType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)
where prop.CanRead //&& (prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string))
let getExpression = Expression.Property(typedInputExpression, prop.GetMethod)
let convertExpression = Expression.Convert(getExpression, typeof(object))
select Expression.Call(outputVariable, AddToDicitonaryMethod, Expression.Constant(prop.Name), convertExpression));
body.Add(Expression.Return(returnTarget, outputVariable));
body.Add(Expression.Label(returnTarget, Expression.Constant(null, outputType)));
var lambdaExpression = Expression.Lambda<Func<object, IDictionary<string, object>>>(
Expression.Block(new[] { outputVariable }, body),
inputExpression);
return lambdaExpression.Compile();
})(obj);
}
}