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 WmsPurchaseDService : IOverideVisualDevService, IDynamicApiController, ITransient { public const string ModelId = "35017584657685"; 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 WmsPurchaseDService( 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"]; WmsPurchaseD wmsPurchaseD = await _db.Queryable().SingleAsync(x => x.id == id); string purchaseHId = wmsPurchaseD?.bill_id ?? ""; WmsPurchaseH wmsPurchaseH = await _db.Queryable().SingleAsync(x => x.id == purchaseHId); #region 插入质检记录 if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res) && wmsPurchaseD.qc_res != "await") { throw Oops.Bah("当前收货明细行已操作过质检"); } // 待检 if (string.IsNullOrEmpty(qcRes) || qcRes == "await") { return "保存成功"; } string? create_id = _userManager.User.Id; if (qcRes != (wmsPurchaseD.qc_res ?? "")) { BasMaterial basMaterial = await _db.Queryable().Where(r => r.id == wmsPurchaseD.material_id).FirstAsync(); WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord(); wmsPurchaseQcrecord.create_id = create_id; wmsPurchaseQcrecord.create_time = DateTime.Now; wmsPurchaseQcrecord.type = "采购收货"; wmsPurchaseQcrecord.ori_bill_code = wmsPurchaseH.bill_code; wmsPurchaseQcrecord.ori_detail_id = wmsPurchaseD.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 = wmsPurchaseD.unit_id; wmsPurchaseQcrecord.batchno = wmsPurchaseD.code_batch; wmsPurchaseQcrecord.purchase_qty = wmsPurchaseD.purchase_qty; wmsPurchaseQcrecord.purchase_prqty = wmsPurchaseD.purchase_prqty; wmsPurchaseQcrecord.purchase_arriveqty = wmsPurchaseD.purchase_arriveqty; wmsPurchaseQcrecord.result = qcRes; wmsPurchaseQcrecord.checker = create_id; wmsPurchaseQcrecord.check_time = DateTime.Now; await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync(); List wmscarrycodes = await _db.Queryable() .InnerJoin((a, b) => a.barcode == b.barcode) .InnerJoin((a, b, c) => c.id == b.require_id) .Where((a, b, c) => c.id == wmsPurchaseD.id).ToListAsync(); foreach (var item in wmscarrycodes) item.qc_res = qcRes; await _db.Updateable(wmscarrycodes).UpdateColumns(r => r.qc_res).ExecuteCommandAsync(); } #endregion //自制的采购入库 不在质检保存里调用erp接口 if (string.IsNullOrEmpty(wmsPurchaseH.erp_bill_code)) { await _db.Updateable() .SetColumns(x => x.qc_res == qcRes) .Where(x => x.id == id) .ExecuteCommandAsync(); return "保存成功"; } // 托盘对应入库单 List instock_mains = await _db.Queryable().Where(x => x.source_id == wmsPurchaseD.bill_id).ToListAsync(); if (instock_mains.Count == 0) { throw Oops.Bah($"采购收货单{wmsPurchaseH.bill_code}不存在此明细的入库记录!可能是入库任务还未执行完成或者物料是由人工入库"); } List allInstockDetails = await _db.Queryable().Where(it => instock_mains.Select(r => r.id).Contains(it.bill_id) && it.material_id == wmsPurchaseD.material_id && it.code_batch == wmsPurchaseD.code_batch && (!string.IsNullOrEmpty(it.source_detail_id) && it.source_detail_id == wmsPurchaseD.id)).OrderBy(x=>x.id).ToListAsync(); List> requestData = new List>(); List carryIds = instock_mains.Select(x => x.carry_id).ToList(); string wmsPurchaseOrderHId = wmsPurchaseH?.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==wmsPurchaseH.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 = wmsPurchaseH.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", wmsPurchaseH?.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", wmsPurchaseD?.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", wmsPurchaseH.bill_code); erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? ""); erpRequestData.Add("csourcebillhid", wmsPurchaseH?.erp_arriveorder_pk ?? ""); erpRequestData.Add("vdef3", wmsPurchaseH?.service_num ?? ""); List> erpRequestDataDetails = new List>(); #region 老版代码,回传多条采购收货明细 //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"] = wmsPurchaseD?.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"] = wmsPurchaseH.create_time.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"] = wmsPurchaseD?.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"] = wmsPurchaseH?.erp_arriveorder_pk ?? "", // ["csourcebillbid"] = wmsPurchaseD?.erp_arriveorder_b_pk ?? "", // ["vsourcebillcode"] = wmsPurchaseH?.bill_code ?? "", // ["lineno"] = wmsPurchaseOrderDs?.lineno ?? "", // ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "", // ["flargess"] = wmsPurchaseD.gift==1, // ["ntaxprice"] = wmsPurchaseD.price, // }); //} #endregion #region 新版,只回传一条物料相同的汇总采购收货明细 erpRequestDataDetails.Add(new Dictionary() { ["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == allInstockDetails.First().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"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU", ["cgeneralbid"] = null, ["cgeneralhid"] = null, ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == allInstockDetails.First().material_id)?.cmaterialoid ?? "", ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == allInstockDetails.First().material_id)?.cmaterialvid ?? "", ["corpoid"] = erpOrg.corpoid, ["corpvid"] = erpOrg.corpvid, ["crowno"] = 10, ["cunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == allInstockDetails.First().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"] = wmsPurchaseH.create_time.ToString("yyyy-MM-dd HH:mm:ss"), ["nnum"] = allInstockDetails.Sum(r => r.qty), ["nshouldnum"] = allInstockDetails.Sum(r => r.pr_qty), // ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", // ["pk_creqwareid"] = "1001A11000000002OOGU", ["pk_creqwareid"] = wmsPurchaseD?.erp_wh_type ?? "1001A11000000002OOGU", ["pk_group"] = erpOrg.pk_group, ["pk_org"] = erpOrg.pk_org, ["pk_org_v"] = erpOrg.pk_org_v, ["pseudocolumn"] = 10, ["vbatchcode"] = allInstockDetails.First().code_batch, ["csourcebillhid"] = wmsPurchaseH?.erp_arriveorder_pk ?? "", ["csourcebillbid"] = wmsPurchaseD?.erp_arriveorder_b_pk ?? "", ["vsourcebillcode"] = wmsPurchaseH?.bill_code ?? "", ["lineno"] = wmsPurchaseOrderDs?.lineno ?? "", ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? "", ["flargess"] = wmsPurchaseD.gift == 1, ["ntaxprice"] = wmsPurchaseD.price, }); #endregion 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】采购收货单号:" + (wmsPurchaseH?.bill_code ?? "")+ ",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 "保存成功"; } } }