diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index 5052eca9..05e30c47 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -285,9 +285,13 @@ public class ModuleConsts /// public const string MODULE_WMSPRDINSTOCK_ID = "34467501190677"; /// - /// 模块标识-委外收货 todo + /// 模块标识-委外收货 /// - public const string MODULE_WMSOUTSOURCEORDER_ID = "MODULE_WMSOUTSOURCEORDER_ID";// + public const string MODULE_WMSOUTSOURCE_ID = "36207808903445"; + /// + /// 模块标识-委外收货子表 + /// + public const string MODULE_WMSOUTSOURCED_ID = "36677621116949"; /// /// 模块标识-原材料调拨入库 todo /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceD.cs index bc1d618a..b6999b4f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceD.cs @@ -18,7 +18,7 @@ public partial class WmsOutsourceD : BaseEntity /// 主表id /// public string? fk_wms_outsource_order_id { get; set; } - + /// /// 物料id /// @@ -39,6 +39,17 @@ public partial class WmsOutsourceD : BaseEntity /// public string? unit { get; set; } + /// + /// 质检结果 + /// + public string? qc_res { get; set; } + + + /// + /// 单位 + /// + public string? unit_id { get; set; } + /// /// 委外数量 /// @@ -129,4 +140,18 @@ public partial class WmsOutsourceD : BaseEntity /// public string? auxprop_gys { get; set; } + /// + /// erp仓库类型 + /// + public string? erp_wh_type { get; set; } + + /// + /// 单价 + /// + public decimal? price { get; set; } + + /// + /// erp到货单子表pk + /// + public string erp_arriveorder_b_pk { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceH.cs index 4cc02641..e4b09bd5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsOutsourceH.cs @@ -14,6 +14,15 @@ public partial class WmsOutsourceH : BaseEntity { id = SnowflakeIdHelper.NextId(); } + + /// + /// 交易类型 + /// + public string? transaction_type { get; set; } + /// + /// + /// + public string? erp_bill_code { get; set; } /// /// 委外订单号 /// @@ -109,4 +118,19 @@ public partial class WmsOutsourceH : BaseEntity /// public DateTime? ship_date { get; set; } + /// + /// erp到货单主表pk + /// + public string erp_arriveorder_pk { get; set; } + + /// + /// 制单方式(自制 同步) + /// + public string make_method { get; set; } + + /// + /// erp流水号 + /// + public string service_num { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index b36bde32..816edd99 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -3180,7 +3180,7 @@ namespace Tnb.WarehouseMgr }).Where(r => r.id == dt.carry_id).ExecuteCommandAsync(); //自动签收投料更新载具状态 - WmsCarryH carry = await _db.Queryable().SingleAsync(x => x.id == dt.carry_id); + WmsCarryH carry = await db.Queryable().SingleAsync(x => x.id == dt.carry_id); List clearCarryIds = new List(); clearCarryIds.Add(carry.id); List memberCarryIds = new List(); @@ -3190,17 +3190,17 @@ namespace Tnb.WarehouseMgr } else { - memberCarryIds = await _db.Queryable().Where(x=>x.carry_id==carry.id).Select(x=>x.membercarry_id).ToListAsync(); + memberCarryIds = await db.Queryable().Where(x=>x.carry_id==carry.id).Select(x=>x.membercarry_id).ToListAsync(); clearCarryIds.AddRange(memberCarryIds); } - await _db.Updateable() + await db.Updateable() .SetColumns(x => x.carry_status == carryStatus) .Where(x => clearCarryIds.Contains(x.id)) .ExecuteCommandAsync(); Logger.Information($"【TaskComplate】 更新载具状态 {JsonConvert.SerializeObject(clearCarryIds)}成功"); - await _db.Updateable() + await db.Updateable() .SetColumns(x => x.is_check == isCheck) .Where(x => clearCarryIds.Contains(x.id)) .ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceDService.cs new file mode 100644 index 00000000..f22cd249 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceDService.cs @@ -0,0 +1,305 @@ +using System.Collections; +using JNPF.Common.Core.Manager; +using JNPF.Common.Security; +using JNPF.DependencyInjection; +using JNPF.DynamicApiController; +using JNPF.EventBus; +using JNPF.Logging; +using JNPF.Systems.Entitys.System; +using JNPF.Systems.Interfaces.System; +using JNPF.VisualDev; +using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using SqlSugar; +using Tnb.WarehouseMgr.Entities; +using Tnb.ProductionMgr; +using Tnb.WarehouseMgr.Entities.Entity; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.BasicData.Entities; +using Tnb.BasicData; +using Tnb.ProductionMgr.Entities.Entity; +using ModuleConst = Tnb.ProductionMgr.ModuleConst; +using JNPF.Common.Dtos.VisualDev; +using JNPF.Common.Extension; +using JNPF.FriendlyException; +using JNPF.VisualDev.Entitys; +using Tnb.BasicData.Interfaces; + +namespace Tnb.WarehouseMgr +{ + /// + /// 采购收货子表 + /// + [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] + [Route("api/[area]/[controller]/[action]")] + [OverideVisualDev(ModelId)] + // [OverideVisualDev(ModuleId)] + public class WmsOutsourceDService : IOverideVisualDevService, IDynamicApiController, ITransient + { + + public const string ModelId = ModuleConsts.MODULE_WMSOUTSOURCED_ID; + private readonly ISqlSugarRepository _repository; + private readonly DataBaseManager _dbManager; + private readonly ISqlSugarClient _db; + private readonly IUserManager _userManager; + private readonly IDictionaryDataService _dictionaryDataService; + private readonly IThirdApiRecordService _thirdApiRecordService; + public static SemaphoreSlim s_SaveCheckResult = new(1); + public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); + + public WmsOutsourceDService( + ISqlSugarRepository repository, + DataBaseManager dbManager, + IUserManager userManager, + IThirdApiRecordService thirdApiRecordService, + IDictionaryDataService dictionaryDataService) + { + _repository = repository; + _db = repository.AsSugarClient(); + _dbManager = dbManager; + _userManager = userManager; + _thirdApiRecordService = thirdApiRecordService; + _dictionaryDataService = dictionaryDataService; + } + + public async Task SaveCheckResult(Dictionary dic) + { + try + { + await s_SaveCheckResult.WaitAsync(); + string id = dic["id"]; + string qcRes = dic["qc_res"]; + WmsOutsourceD wmsOutsourceD = await _db.Queryable().SingleAsync(x => x.id == id); + string outsourceHId = wmsOutsourceD?.fk_wms_outsource_order_id ?? ""; + WmsOutsourceH wmsOutsourceH = await _db.Queryable().SingleAsync(x => x.id == outsourceHId); + + #region 插入质检记录 + if (!string.IsNullOrEmpty(wmsOutsourceD.qc_res) && wmsOutsourceD.qc_res != "await") + { + throw Oops.Bah("当前收货明细行已操作过质检"); + } + // 待检 + if (string.IsNullOrEmpty(qcRes) || qcRes == "await") + { + return "保存成功"; + } + + + string? create_id = _userManager.User.Id; + + if (qcRes != (wmsOutsourceD.qc_res ?? "")) + { + BasMaterial basMaterial = await _db.Queryable().Where(r => r.id == wmsOutsourceD.matcode_id).FirstAsync(); + WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord(); + wmsPurchaseQcrecord.create_id = create_id; + wmsPurchaseQcrecord.create_time = DateTime.Now; + wmsPurchaseQcrecord.type = "委外收货"; + wmsPurchaseQcrecord.ori_bill_code = wmsOutsourceH.outsource_order; + wmsPurchaseQcrecord.ori_detail_id = wmsOutsourceD.id; + wmsPurchaseQcrecord.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + wmsPurchaseQcrecord.material_id = basMaterial.id; + wmsPurchaseQcrecord.material_code = basMaterial.code; + wmsPurchaseQcrecord.material_name = basMaterial.name; + wmsPurchaseQcrecord.material_spec = basMaterial.material_specification; + wmsPurchaseQcrecord.unit_id = wmsOutsourceD.unit; + wmsPurchaseQcrecord.batchno = wmsOutsourceD.code_batch; + wmsPurchaseQcrecord.purchase_qty = wmsOutsourceD.outsource_quantity; + wmsPurchaseQcrecord.purchase_prqty = wmsOutsourceD.actual_quantity; + wmsPurchaseQcrecord.purchase_arriveqty = wmsOutsourceD.actual_quantity; + wmsPurchaseQcrecord.result = qcRes; + + await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync(); + } + + #endregion + //自制的采购入库 不在质检保存里调用erp接口 + if (string.IsNullOrEmpty(wmsOutsourceH.erp_bill_code)) + { + return "保存成功"; + } + + // 托盘对应入库单 + List instock_mains = await _db.Queryable().Where(x => x.source_id == wmsOutsourceD.fk_wms_outsource_order_id).ToListAsync(); + + List allInstockDetails = await _db.Queryable().Where(it => instock_mains.Select(r => r.id).Contains(it.bill_id) && it.material_id == wmsOutsourceD.matcode_id && it.code_batch == wmsOutsourceD.code_batch).OrderBy(x=>x.id).ToListAsync(); + + List> requestData = new List>(); + List carryIds = instock_mains.Select(x => x.carry_id).ToList(); + string wmsPurchaseOrderHId = wmsOutsourceH?.erp_bill_code ?? ""; + WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable().SingleAsync(x => x.id == wmsPurchaseOrderHId); + WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId); + + { + List materialIds = allInstockDetails.Select(x => x.material_id).Distinct().ToList(); + List unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList(); + List unitDatas = await _db.Queryable() + .LeftJoin((x, y) => x.Id == y.DictionaryTypeId) + .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && unitCodes.Contains(y.EnCode)) + .Select((x, y) => y) + .ToListAsync(); + List erpWarehouserelaHs = await _db.Queryable().Where(x=>x.id!=null).ToListAsync(); + + DictionaryDataEntity tranType = await _db.Queryable().Where(x=>x.DictionaryTypeId=="25043925951909" && x.EnCode== wmsOutsourceH.transaction_type).FirstAsync(); + string tranTypeId = tranType?.Id ?? ""; + string supplierId = wmsPurchaseOrderH?.supplier_id ?? ""; + List tableIds = new List(); + // tableIds.Add(_userManager.UserId); + // tableIds.Add(wmsPurchaseH.create_id); + tableIds.Add(WmsWareHouseConst.AdministratorOrgId); + tableIds.Add(instock_mains[0].warehouse_id);// 1001A11000000002OOGU + tableIds.AddRange(materialIds); + tableIds.Add(supplierId); + tableIds.Add(tranTypeId); + tableIds.AddRange(unitDatas.Select(x => x.Id).ToList()); + + string userId = wmsOutsourceH.create_id ?? WmsWareHouseConst.AdministratorUserId; + tableIds.Add(userId); + List erpExtendFields = await _db.Queryable().Where(x => tableIds.Contains(x.table_id)).ToListAsync(); + // 暂时传 1001A110000000003NBJ 陈书会 + //string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? ""; + //string erpCreateId = "1001A110000000003NBJ"; + //string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? WmsWareHouseConst.ERPUSERID; + string erpCreateId = WmsWareHouseConst.ERPUSERID; + ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId)); + string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + Dictionary erpRequestData = new Dictionary(); + erpRequestData.Add("approver", erpCreateId); + erpRequestData.Add("billmaker", erpCreateId); + erpRequestData.Add("cbiztype", wmsOutsourceH?.transaction_type ?? ""); + erpRequestData.Add("bitinbill", false); + erpRequestData.Add("cgeneralhid", null); + erpRequestData.Add("corpoid", erpOrg.corpoid); + erpRequestData.Add("corpvid", erpOrg.corpvid); + erpRequestData.Add("creationtime", nowStr); + erpRequestData.Add("creator", erpCreateId); + erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? ""); + erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? ""); + erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? ""); + // erpRequestData.Add("cwarehouseid", erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "");//类型视图里取 + // erpWarehouserelaHs.Find(x => x.erp_warehousecode == wmsPurchaseD.erp_wh_type)?.erp_warehouseid ?? "" + // erpRequestData.Add("cwarehouseid", "1001A11000000002OOGU"); + erpRequestData.Add("cwarehouseid", wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU"); + erpRequestData.Add("dbilldate", nowStr); + erpRequestData.Add("dmakedate", nowStr); + erpRequestData.Add("fbillflag", 2); + erpRequestData.Add("fbuysellflag", 2); + erpRequestData.Add("ntotalnum", allInstockDetails.Sum(x => x.qty)); + erpRequestData.Add("pk_org", erpOrg.pk_org); + erpRequestData.Add("pk_org_v", erpOrg.pk_org_v); + erpRequestData.Add("pk_group", erpOrg.pk_group); + erpRequestData.Add("vbillcode", wmsOutsourceH.outsource_order); + erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? ""); + erpRequestData.Add("csourcebillhid", wmsOutsourceH?.erp_arriveorder_pk ?? ""); + erpRequestData.Add("vdef3", wmsOutsourceH?.service_num ?? ""); + + List> erpRequestDataDetails = new List>(); + foreach (WmsInstockD item in allInstockDetails) + { + erpRequestDataDetails.Add(new Dictionary() + { + ["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "", + ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "", + // ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", + //["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "", + // ["cbodywarehouseid"] = "1001A11000000002OOGU", + ["cbodywarehouseid"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU", + ["cgeneralbid"] = null, + ["cgeneralhid"] = null, + ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "", + ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? "", + ["corpoid"] = erpOrg.corpoid, + ["corpvid"] = erpOrg.corpvid, + ["crowno"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10, + ["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "", + ["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "", + ["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? "", + ["dbizdate"] = wmsOutsourceH.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss"), + ["nnum"] = item.qty, + ["nshouldnum"] = item.pr_qty, + // ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", + // ["pk_creqwareid"] = "1001A11000000002OOGU", + ["pk_creqwareid"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU", + ["pk_group"] = erpOrg.pk_group, + ["pk_org"] = erpOrg.pk_org, + ["pk_org_v"] = erpOrg.pk_org_v, + ["pseudocolumn"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10, + ["vbatchcode"] = item.code_batch, + ["csourcebillhid"] = wmsOutsourceH?.erp_arriveorder_pk ?? "", + ["csourcebillbid"] = wmsOutsourceD?.erp_arriveorder_b_pk ?? "", + ["vsourcebillcode"] = wmsOutsourceH?.outsource_order ?? "", + ["lineno"] = wmsPurchaseOrderDs?.lineno ?? "", + ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "", + //["flargess"] = wmsOutsourceD.gift==1, + ["ntaxprice"] = wmsOutsourceD.price, + + }); + } + erpRequestData.Add("dtls", erpRequestDataDetails); + requestData.Add(erpRequestData); + } + + await _db.Ado.BeginTranAsync(); + await _db.Updateable() + .SetColumns(x => x.qc_res == qcRes) + .Where(x => x.id == id) + .ExecuteCommandAsync(); + + Dictionary dic2 = new() + { + { "ok", 1 }, + { "no", 2 }, + { "barelyOk", 4 }, + { "await", 8 }, + { "temporarily", 16 }, + { "checking", 32 }, + }; + string isCheck = dic2[qcRes].ToString(); + //await _db.Updateable() + // .SetColumns(x => x.is_check == isCheck) + // .Where(x => carryIds.Contains(x.id)) + // .ExecuteCommandAsync(); + + if (requestData.IsEmpty()) + { + throw Oops.Bah("没有请求数据"); + } + + BasFactoryConfig config = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL); + + ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord(); + thirdWebapiRecord.id = SnowflakeIdHelper.NextId(); + thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; + thirdWebapiRecord.name = "委外入库"; + thirdWebapiRecord.method = "POST"; + // thirdWebapiRecord.url = config.value + "uapws/rest/purchaseIn/save"; + thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/purchaseIn/save"; + thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData); + thirdWebapiRecord.create_time = DateTime.Now; + thirdWebapiRecord.remark = "【WmsPurchaseDService SaveCheckResult】委外收货单号:" + (wmsOutsourceH?.outsource_order ?? "")+ ",erp委外订单号:" + (wmsPurchaseOrderH?.erp_bill_code ?? ""); + + await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); + + BasFactoryConfig callErp = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CALLERP); + if(callErp.value=="1"){ + await _thirdApiRecordService.Send(new List { thirdWebapiRecord }, "自动", _db); + } + + await _db.Ado.CommitTranAsync(); + } + catch (Exception e) + { + await _db.Ado.RollbackTranAsync(); + Log.Error(e.Message,e); + throw Oops.Bah(e.Message); + } + finally + { + s_SaveCheckResult.Release(); + } + + return "保存成功"; + } + } +} \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs index 711ae5db..ffda02bf 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs @@ -8,6 +8,7 @@ using JNPF.Common.Extension; using JNPF.Common.Security; using JNPF.FriendlyException; using JNPF.Logging; +using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Interfaces; @@ -15,10 +16,14 @@ using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; +using Newtonsoft.Json; using Npgsql; using SqlSugar; +using Tnb.BasicData; using Tnb.BasicData.Entities; +using Tnb.BasicData.Interfaces; using Tnb.Common.Utils; +using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; @@ -33,20 +38,23 @@ namespace Tnb.WarehouseMgr /// /// 委外收货订单 /// - [OverideVisualDev(ModuleConsts.MODULE_WMSOUTSOURCEORDER_ID)] + [OverideVisualDev(ModuleConsts.MODULE_WMSOUTSOURCE_ID)] public class WmsOutsourceService : BaseWareHouseService { + private const string ModuleId = ModuleConsts.MODULE_WMSOUTSOURCE_ID; private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IWareHouseService _wareHouseService; + private readonly IThirdApiRecordService _thirdApiRecordService; public WmsOutsourceService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, + IThirdApiRecordService thirdApiRecordService, IVisualDevService visualDevService, IWareHouseService wareHouseService) { _db = repository.AsSugarClient(); @@ -55,6 +63,7 @@ namespace Tnb.WarehouseMgr _runService = runService; _visualDevService = visualDevService; _wareHouseService = wareHouseService; + _thirdApiRecordService = thirdApiRecordService; } public override async Task ModifyAsync(WareHouseUpInput input) @@ -171,5 +180,237 @@ namespace Tnb.WarehouseMgr throw; } } + + + /// + /// 采购收货 + /// + /// + /// + [HttpPost] + public async Task Purchase(PurchaseAndReceiveUpInput input) + { + var blFlag = true; + try + { + WmsPurchaseH wmsPurchaseH = await _db.Queryable().Where(r => r.bill_code == input.bill_code).FirstAsync(); + if (wmsPurchaseH.make_method == "自制") + { + throw Oops.Bah("自制采购收货单不能操作此按钮"); + } + await _db.Ado.BeginTranAsync(); + WmsInstockH? instock = null; + var purchaseDs = await PurchaseAndSaleUpdate(input); + List instockDs = new(); + if (purchaseDs?.Count > 0) + { + instock = input.Adapt(); + instock.id = SnowflakeIdHelper.NextId(); + instock.bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_INSTOCK_ENCODE); + instock.create_id = _userManager.UserId; + instock.create_time = DateTime.Now; + instock.org_id = _userManager.User.OrganizeId; + if (instock.source_code != null) + { + instock.sync_status = WmsWareHouseConst.SYNC_STATUS__NOTSYNC; + } + else + { + instock.sync_status = WmsWareHouseConst.SYNC_STATUS_NONEEDSYNC; + } + instock.audit_status = 0; + instock.print_status = "0"; + instock.is_check = 0; + await _db.Insertable(instock).ExecuteCommandAsync(); + + instockDs = purchaseDs.Adapt>(); + instockDs.ForEach(instockD => + { + instockD.bill_id = instock.id; + instockD.create_id = _userManager.UserId; + instockD.create_time = DateTime.Now; + instockD.org_id = _userManager.User.OrganizeId; + }); + await _db.Insertable(instockDs).ExecuteCommandAsync(); + + var purchase = await _db.Queryable().FirstAsync(it => it.id == purchaseDs.First().bill_id); + + if (string.IsNullOrEmpty(purchase.supplier_id)) + { + BasSupplier basSupplier = await _db.Queryable().Where(x => x.supplier_code == purchase.supplier_code).FirstAsync(); + if (basSupplier != null) + { + await _db.Updateable() + .SetColumns(x => x.supplier_id == basSupplier.id) + .Where(x => x.id == purchase.id) + .ExecuteCommandAsync(); + + purchase.supplier_id = basSupplier.id; + } + } + + //purchase.supplier_code + + + + List dList = await _db.Queryable().Where(x => x.bill_id == purchaseDs.First().bill_id).OrderBy(x => x.id).ToListAsync(); + List materialIds = purchaseDs.Select(x => x.material_id).Distinct().ToList(); + List unitCodes = purchaseDs.Select(x => x.unit_id).Distinct().ToList(); + List unitDatas = await _db.Queryable() + .LeftJoin((x, y) => x.Id == y.DictionaryTypeId) + .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && (unitCodes.Contains(y.EnCode) || unitCodes.Contains(y.Id))) + .Select((x, y) => y) + .ToListAsync(); + List erpWarehouserelaHs = await _db.Queryable().Where(x => x.id != null).ToListAsync(); + WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable().SingleAsync(x => x.id == purchase.erp_bill_code); + //todo 先取采购订单第一条 + //WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable().FirstAsync(x=>x.fk_wms_purchase_order_id==purchase.erp_bill_code); + + //自制的不调erp接口 + if (!string.IsNullOrEmpty(wmsPurchaseOrderH.erp_bill_code)) + { + List ids = new List(); + // ids.Add(_userManager.UserId); + // ids.Add(WmsWareHouseConst.AdministratorUserId); + ids.Add(WmsWareHouseConst.AdministratorOrgId); + ids.Add(purchase.warehouse_id); + ids.AddRange(materialIds); + ids.Add(wmsPurchaseOrderH.supplier_id); + ids.AddRange(unitDatas.Select(x => x.Id).ToList()); + + string userId = _userManager.UserId ?? WmsWareHouseConst.AdministratorUserId; + ids.Add(userId); + List erpExtendFields = await _db.Queryable().Where(x => ids.Contains(x.table_id)).ToListAsync(); + // string erpCreateId = erpExtendFields.Find(x=>x.table_id==userId)?.user_id ?? WmsWareHouseConst.ERPUSERID; + string erpCreateId = WmsWareHouseConst.ERPUSERID; + ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId)); + string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + List> requestData = new List>(); + Dictionary erpRequestData = new Dictionary(); + erpRequestData.Add("approver", erpCreateId); + erpRequestData.Add("billmaker", erpCreateId); + erpRequestData.Add("creationtime", nowStr); + erpRequestData.Add("creator", erpCreateId); + erpRequestData.Add("dbilldate", purchase.create_time.ToString("yyyy-MM-dd HH:mm:ss")); + erpRequestData.Add("dmakedate", nowStr); + erpRequestData.Add("ntotalastnum", purchaseDs.Sum(x => x.purchase_arriveqty)); + erpRequestData.Add("pk_arriveorder", null); + // erpRequestData.Add("pk_dept","1001A1100000001JFOPQ"); + // erpRequestData.Add("pk_dept_v","0001A1100000000AOMIQ"); + erpRequestData.Add("Pk_receivepsndoc", erpCreateId); + erpRequestData.Add("pk_org", erpOrg.pk_org); + erpRequestData.Add("pk_org_v", erpOrg.pk_org_v); + erpRequestData.Add("pk_group", erpOrg.pk_group); + erpRequestData.Add("pk_pupsndoc", ""); + erpRequestData.Add("csourceid", wmsPurchaseOrderH?.erp_pk ?? ""); + erpRequestData.Add("pk_purchaseorg", erpOrg.pk_org); + erpRequestData.Add("pk_purchaseorg_v", erpOrg.pk_org_v); + erpRequestData.Add("pk_supplier", erpExtendFields.Find(x => x.table_id == purchase.supplier_id)?.supplier_id ?? "");//先写死 + erpRequestData.Add("pk_supplier_v", erpExtendFields.Find(x => x.table_id == purchase.supplier_id)?.supplier_vid ?? "");//先写死 + erpRequestData.Add("vbillcode", purchase.bill_code); + erpRequestData.Add("vmemo", purchase.remark); + erpRequestData.Add("vtrantypecode", ""); + + List> erpRequestDataDetails = new List>(); + foreach (WmsPurchaseD item in dList) + { + erpRequestDataDetails.Add(new Dictionary() + { + ["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id || x.Id == item.unit_id)?.Id ?? ""))?.cunitid ?? "", + ["cfirstbid"] = wmsPurchaseOrderH?.erp_pk ?? "", + ["cfirstid"] = item.erp_purchase_order_d_pk, + ["cfirsttypecode"] = "", + ["crececountryid"] = "0001Z010000000079UJJ", + ["crowno"] = item.erp_purchase_order_d_lineno, + ["csendcountryid"] = "0001Z010000000079UJJ", + ["csourcetypecode"] = "", + ["ctaxcountryid"] = "0001Z010000000079UJJ", + ["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id || x.Id == item.unit_id)?.Id ?? ""))?.cunitid ?? "", + ["dbilldate"] = purchase.create_time.ToString("yyyy-MM-dd HH:mm:ss"), + ["dplanreceivedate"] = purchase.create_time.ToString("yyyy-MM-dd HH:mm:ss"), + ["dproducedate"] = purchase.create_time.ToString("yyyy-MM-dd HH:mm:ss"), + // ["fbuysellflag"] = 2, + ["fproductclass"] = 1, + // ["naccumchecknum"] = 0, + // ["nastnum"] = item.purchase_arriveqty, + ["nnum"] = item.purchase_arriveqty, + // ["nplanastnum"] = 0, + ["nplannum"] = item.purchase_qty, + ["pk_apfinanceorg"] = erpOrg.corpoid, + ["pk_apfinanceorg_v"] = erpOrg.corpvid, + ["pk_arriveorder"] = null, + ["pk_arriveorder_b"] = null, + ["pk_group"] = erpOrg.pk_group, + ["pk_material"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "", + ["pk_order"] = wmsPurchaseOrderH?.erp_pk ?? "", + ["pk_order_b"] = item.erp_purchase_order_d_pk, + ["pk_org"] = erpOrg.pk_org, + ["pk_org_v"] = erpOrg.pk_org_v, + ["pk_psfinanceorg"] = erpOrg.corpoid, + ["pk_psfinanceorg_v"] = erpOrg.corpvid, + // ["pk_receivestore"] = erpExtendFields.Find(x=>x.table_id==purchase.warehouse_id)?.cotherwhid ?? "", + // ["pk_receivestore"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == item.erp_wh_type)?.erp_warehouseid ?? "", + ["pk_receivestore"] = item.erp_wh_type, + ["pk_reqstoorg"] = erpOrg.pk_org, + ["pk_reqstoorg_v"] = erpOrg.pk_org_v, + ["pk_srcmaterial"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "", + ["vbatchcode"] = item.code_batch, + ["Vfree1"] = item.code_batch, + ["mes_detail_id"] = item.id, + ["bpresent"] = item.gift == 1, + ["csourceid"] = wmsPurchaseOrderH?.erp_pk ?? "", + ["vsourcecode"] = wmsPurchaseOrderH.erp_bill_code, + ["csourcebid"] = item.erp_purchase_order_d_pk, + ["IsType"] = 0, + ["csourcetypecode"] = null, + ["vsourcerowno"] = null, + ["vsourcetrantype"] = null, + ["cproductorid"] = item.production_unit, + }); + } + erpRequestData.Add("dtls", erpRequestDataDetails); + requestData.Add(erpRequestData); + BasFactoryConfig config = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.BIPURL); + + ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord(); + thirdWebapiRecord.id = SnowflakeIdHelper.NextId(); + thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; + thirdWebapiRecord.name = "采购到货"; + thirdWebapiRecord.method = "POST"; + // thirdWebapiRecord.url = config.value+"uapws/rest/purarrvial/save"; + thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/purarrvial/save"; + thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData); + thirdWebapiRecord.create_time = DateTime.Now; + thirdWebapiRecord.remark = $"【WmsPurchaseService Purchase】erp采购订单:{wmsPurchaseOrderH.erp_bill_code}"; + + await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); + BasFactoryConfig callErp = await _db.Queryable().FirstAsync(x => x.enabled == 1 && x.key == FactoryConfigConst.CALLERP); + if (callErp.value == "1") + { + await _thirdApiRecordService.Send(new List { thirdWebapiRecord }, "自动", _db); + } + } + + + } + //通知Mes接口 + //_ = SyncMesData(instock.id, instockDs.Select(x => x.material_id).ToList(), EnumTriggerEvent.入厂检按物料编号); + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + blFlag = false; + await _db.Ado.RollbackTranAsync(); + Log.Error("采购收货失败", ex); + throw; + } + return await Task.FromResult(blFlag); + } + + + + + } } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs index 8a369f5f..a3d406a9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs @@ -49,7 +49,7 @@ namespace Tnb.WarehouseMgr [OverideVisualDev(ModuleConsts.MODULE_WMSPURCHASE_ID)] public class WmsPurchaseService : WmsPurchaseAndSaleCommonService, IWmsPurchaseService { - private const string ModuleId = "29975280336405"; + private const string ModuleId = ModuleConsts.MODULE_WMSPURCHASE_ID; private readonly IBillRullService _billRullService; private readonly ISqlSugarClient _db; private readonly IUserManager _userManager;