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; wmsPurchaseQcrecord.checker = create_id; wmsPurchaseQcrecord.check_time = DateTime.Now; 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(); if (instock_mains.Count == 0) { throw Oops.Bah($"委外收货单{wmsOutsourceH.bill_code}不存在此明细的入库记录!可能是入库任务还未执行完成或者物料是由人工入库"); } 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 ?? ""; string supplierId = wmsOutsourceH?.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(); #region 老版代码 //erpRequestData.Add("approver", erpCreateId); //erpRequestData.Add("billmaker", erpCreateId); //erpRequestData.Add("cbiztype", wmsOutsourceH?.transaction_type ?? null); //erpRequestData.Add("bitinbill", false); //erpRequestData.Add("cgeneralhid", null); //erpRequestData.Add("corpoid", erpOrg?.corpoid ?? null); //erpRequestData.Add("corpvid", erpOrg?.corpvid ?? null); //erpRequestData.Add("creationtime", nowStr); //erpRequestData.Add("creator", erpCreateId); //erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null); //erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null); //erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null); //// 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 ?? null); //erpRequestData.Add("pk_org_v", erpOrg?.pk_org_v ?? null); //erpRequestData.Add("pk_group", erpOrg?.pk_group ?? null); //erpRequestData.Add("vbillcode", wmsOutsourceH?.outsource_order ?? null); //erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? null); //erpRequestData.Add("csourcebillhid", wmsOutsourceH?.erp_arriveorder_pk ?? null); //erpRequestData.Add("vdef3", wmsOutsourceH?.service_num ?? null); //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 ?? null, // ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null, // // ["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 ?? null, // ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? null, // ["corpoid"] = erpOrg?.corpoid ?? null, // ["corpvid"] = erpOrg?.corpvid ?? null, // ["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 ?? null, // ["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, // ["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null, // ["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 ?? null, // ["pk_org"] = erpOrg?.pk_org ?? null, // ["pk_org_v"] = erpOrg?.pk_org_v ?? null, // ["pseudocolumn"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10, // ["vbatchcode"] = item.code_batch, // ["csourcebillhid"] = wmsOutsourceH?.erp_arriveorder_pk ?? null, // ["csourcebillbid"] = wmsOutsourceD?.erp_arriveorder_b_pk ?? null, // ["vsourcebillcode"] = wmsOutsourceH?.outsource_order ?? null, // ["lineno"] = wmsPurchaseOrderDs?.lineno ?? null, // ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, // //["flargess"] = wmsOutsourceD.gift==1, // ["ntaxprice"] = wmsOutsourceD.price ?? null, // }); //} #endregion #region 新版代码 #region erpRequestData.Add("billmaker", erpCreateId);//制单人 erpRequestData.Add("cbizid", erpOrg?.person_id ?? null);//业务员 erpRequestData.Add("cbiztype", null);//业务流程 erpRequestData.Add("cdptid", erpOrg != null ? (string.IsNullOrEmpty(erpOrg.cdptid) ? null : erpOrg.cdptid) : null);//部门id erpRequestData.Add("cdptvid", erpOrg != null ? (string.IsNullOrEmpty(erpOrg.cdptvid) ? null : erpOrg.cdptvid) : null);//部门vid erpRequestData.Add("corpoid", erpOrg?.corpoid ?? null);//公司id erpRequestData.Add("corpvid", erpOrg?.corpvid ?? null);//公司vid erpRequestData.Add("creationtime", nowStr);//创建时间 erpRequestData.Add("creator", erpCreateId);//创建人 erpRequestData.Add("cscwarehouseid", null);//委外仓 erpRequestData.Add("ctrantypeid", erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null);//出入库类型 erpRequestData.Add("cvendorid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null);//供应商 erpRequestData.Add("cvendorvid", erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null);//供应商vid erpRequestData.Add("cwarehouseid", wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU");//仓库id 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_group", erpOrg?.pk_group ?? null);//集体 erpRequestData.Add("pk_org", erpOrg?.pk_org ?? null);//组织 erpRequestData.Add("pk_org_v", erpOrg?.pk_org_v ?? null);//组织vid erpRequestData.Add("vbillcode", wmsOutsourceH?.outsource_order ?? null);//单据号 erpRequestData.Add("vtrantypecode", tranType?.EnCode ?? null);//出入库类型编码 erpRequestData.Add("csourcebillhid", wmsOutsourceH?.erp_arriveorder_pk ?? null);//来源单据主表id #endregion List> erpRequestDataDetails = new List>(); foreach (WmsInstockD item in allInstockDetails) { erpRequestDataDetails.Add(new Dictionary() { ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null, //出入库类型 ["cbodywarehouseid"] = wmsOutsourceD?.erp_wh_type ?? "1001A11000000002OOGU", //库存仓库 ["ccurrencyid"] = null, //本位币 ["cmainmaterialoid"] = null, //主产品id ["cmainvendorid"] = null, //主产品供应商id ["cmainvendorvid"] = null, //主产品供应商vid ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? null, //物料 ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? null, //物料vid ["corigcurrencyid"] = null, //币种 ["corpoid"] = erpOrg?.corpoid ?? null, //公司 ["corpvid"] = erpOrg?.corpvid ?? null, //公司vid ["cqtunitid"] = null, //报价单位 ["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 ?? null, //主单位 ["cvendorid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, //供应商 ["cvendorvid"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_vid ?? null, //供应商vid ["dbizdate"] = wmsOutsourceH.create_time.ToString("yyyy-MM-dd HH:mm:ss"), //入库日期 ["csourcebillhid"] = wmsOutsourceH?.erp_arriveorder_pk ?? null, //来源单主表id ["csourcebillbid"] = wmsOutsourceD?.erp_arriveorder_b_pk ?? null, //来源单子表id ["csourcetype"] = item.source_type ?? null, //来源单据类型 ["csourcetranstype"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? null, //来源单据交易类型 ["vsourcebillcode"] = wmsOutsourceH?.outsource_order ?? null, //来源单据号 ["vsourcerowno"] = (allInstockDetails.FindIndex(x => x.id == item.id) + 1) * 10, //来源单据行号 ["nnum"] = item.qty, //实收主数量 ["nshouldnum"] = item.pr_qty, //应收主数量 ["pk_batchcode"] = null, //批次主键 ["pk_group"] = erpOrg?.pk_group ?? null, //集团 ["pk_org"] = erpOrg?.pk_org ?? null, //组织 ["pk_org_v"] = erpOrg?.pk_org_v ?? null, //组织vid ["vbatchcode"] = item.code_batch, //批次号 ["vfree1"] = erpExtendFields.Find(x => x.table_id == supplierId)?.supplier_id ?? null, //自由辅助属性1 ["foutputtype"]=1,//产品类型:1主产品2联产品3副产品;默认传1 }); } #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/subcontIn/save"; thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/subcontIn/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 "保存成功"; } } }