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.code == wmsOutsourceD.matcode).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_code == wmsOutsourceD.matcode && 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.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 = "【WmsOutsourceDService 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 "保存成功"; } } }