using System.Text; using System.Text.RegularExpressions; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Security; using JNPF.FriendlyException; using JNPF.Logging; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Interfaces; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; 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.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; using Tnb.BasicData; using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Attributes; using Tnb.BasicData.Interfaces; namespace Tnb.WarehouseMgr { /// /// 原材料调拨入库单 /// [OverideVisualDev(ModuleConsts.MODULE_WMSRAWMATTRANSFERINSTOCK_ID)] [ServiceModule(BizTypeId)] public class WmsRawmatTransferinstockService : BaseWareHouseService { private const string BizTypeId = WmsWareHouseConst.BIZTYPE_RAWMATTRANSFERINSTOCK_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 WmsRawmatTransferinstockService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, IThirdApiRecordService thirdApiRecordService, IVisualDevService visualDevService, IWareHouseService wareHouseService) { _db = repository.AsSugarClient(); _userManager = userManager; _billRullService = billRullService; _runService = runService; _thirdApiRecordService = thirdApiRecordService; _visualDevService = visualDevService; _wareHouseService = wareHouseService; } public override async Task ModifyAsync(WareHouseUpInput input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } Logger.Information($"进入原材料调拨入库单上传BIP逻辑"); WmsTempCode wmsTempCode = await _db.Queryable() .LeftJoin((a, b) => a.barcode == b.barcode) .Where((a, b) => a.carry_id == input.wmsDistaskH.carry_id) .Select((a, b) => b) .FirstAsync(); string rawmatTransferinstockDId = wmsTempCode?.require_id ?? ""; WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable().SingleAsync(x => x.id == rawmatTransferinstockDId); List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]) .Where(r => r.material_id == wmsRawmatTransferinstockD.matcode_id && r.code_batch == wmsRawmatTransferinstockD.code_batch).ToListAsync(); await _db.Updateable().SetColumns(it => new WmsRawmatTransferinstockD { actual_qty = it.actual_qty + wmsCarryCodes.Sum(r => r.codeqty) }) .Where(it => it.id == input.wmsDistaskH.source_id).ExecuteCommandHasChangeAsync(); WmsInstockH instock = await _db.Queryable().SingleAsync(x => x.id == input.requireId); List allInstockDetails = await _db.Queryable().Where(it => it.bill_id == input.requireId).OrderBy(x=>x.id).ToListAsync(); string rawmatTransferinstockHId = wmsRawmatTransferinstockD?.bill_id ?? ""; WmsRawmatTransferinstockH wmsRawmatTransferinstockH = await _db.Queryable().SingleAsync(x => x.id == rawmatTransferinstockHId); //自制的不调erp接口 if (string.IsNullOrEmpty(wmsRawmatTransferinstockH.erp_pk)) { return; } 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(); BasWarehouse basWarehouse = await _db.Queryable().SingleAsync(x=>x.id==instock.warehouse_id); string userAccount = wmsRawmatTransferinstockH?.biller ?? ""; string deptCode = wmsRawmatTransferinstockH?.dept_code ?? ""; UserEntity userEntity = await _db.Queryable().Where(x=>x.Account==userAccount).FirstAsync(); string userId = userEntity?.Id ?? WmsWareHouseConst.AdministratorUserId; string supplierId = WmsWareHouseConst.TIANYIGONGYINGSHANG_ID; List tableIds = new List(); tableIds.Add(userId); tableIds.Add(WmsWareHouseConst.AdministratorOrgId); tableIds.Add(instock.warehouse_id); tableIds.AddRange(materialIds); tableIds.Add(supplierId); tableIds.AddRange(unitDatas.Select(x => x.Id).ToList()); 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 ?? 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("billmaker", erpCreateId); erpRequestData.Add("cbiztype", ""); erpRequestData.Add("cdptid","1001A1100000001JFOPQ");//部门先写死 erpRequestData.Add("cdptvid","0001A1100000000AOMIQ");//部门先写死 erpRequestData.Add("corpoid", erpOrg.corpoid); erpRequestData.Add("corpvid", erpOrg.corpvid); erpRequestData.Add("creationtime", nowStr); erpRequestData.Add("creator", erpCreateId); // erpRequestData.Add("cwarehouseid", erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "");//类型视图里取 erpRequestData.Add("cwarehouseid", erpWarehouserelaHs.Find(x => x.erp_warehousecode == wmsRawmatTransferinstockH.erp_wh_type)?.erp_warehouseid ?? "");//类型视图里取 erpRequestData.Add("dbilldate", nowStr); erpRequestData.Add("dmakedate", nowStr); erpRequestData.Add("fbillflag", 1); 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("vdef1", null); erpRequestData.Add("vbillcode", instock.bill_code); erpRequestData.Add("ctrantypeid", "0001H11000000000D31E");//先写死 erpRequestData.Add("vtrantypecode", "4E-01");//先写死 erpRequestData.Add("csourcebillhid", wmsRawmatTransferinstockH?.erp_pk ?? ""); decimal qty = wmsCarryCodes.Sum(r => r.codeqty); List> erpRequestDataDetails = new List>(); foreach (WmsInstockD item in allInstockDetails) { erpRequestDataDetails.Add(new Dictionary() { ["cbodytranstypecode"] = "4E-01", // ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", ["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == wmsRawmatTransferinstockH.erp_wh_type)?.erp_warehouseid ?? "", ["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, ["csourcebillhid"] = wmsRawmatTransferinstockH?.erp_pk ?? "", ["csourcebillbid"] = wmsRawmatTransferinstockD?.erp_line_pk ?? "", ["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"] = instock.create_time.ToString("yyyy-MM-dd HH:mm:ss"), ["dplanarrivedate"] = instock.create_time.ToString("yyyy-MM-dd HH:mm:ss"), ["dplanoutdate"] = instock.create_time.ToString("yyyy-MM-dd HH:mm:ss"), // ["nnum"] = item.qty, // ["nshouldnum"] = item.pr_qty, ["nnum"] = qty, ["nshouldnum"] = qty, ["pk_group"] = erpOrg.pk_group, ["pk_org"] = erpOrg.pk_org, ["pk_org_v"] = erpOrg.pk_org_v, ["vbatchcode"] = item.code_batch, ["coutcalbodyoid"] = wmsRawmatTransferinstockH.outstockorg_code, ["coutcalbodyvid"] = wmsRawmatTransferinstockH.outstockorg_id, }); } 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/transIn/save"; thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save"; thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData); thirdWebapiRecord.create_time = DateTime.Now; thirdWebapiRecord.remark = $"【WmsRawmatTransferinstockService ModifyAsync】原材料调拨入库wms_rawmat_transferinstock_h:{wmsRawmatTransferinstockH.bill_code}"; await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); Logger.Information($"完成原材料调拨入库单上传BIP逻辑"); 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); } } [HttpPost] public async Task BarCodePrint(BarCodeInput input) { if (input == null) { throw new AppFriendlyException(nameof(input), 500); } List barcodes = new(); try { await _db.Ado.BeginTranAsync(); //if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) //{ // throw new AppFriendlyException("条码已生成", 500); //}; WmsRawmatTransferinstockD WmsRawmatTransferinstockD = await _db.Queryable().Where(it => input.BillId == it.id).FirstAsync(); WmsRawmatTransferinstockH WmsRawmatTransferinstockH = await _db.Queryable().Where(it => WmsRawmatTransferinstockD.bill_id == it.id).FirstAsync(); if (WmsRawmatTransferinstockD.qty == 0) { throw new AppFriendlyException("到货数量为0,没有物料可以打印", 500); }; List wmsTempCodes = new(); decimal? minPacking = (await _db.Queryable().FirstAsync(it => it.id == WmsRawmatTransferinstockD.matcode_id))?.minpacking; if (!minPacking.HasValue || minPacking.Value <= 0) { throw new AppFriendlyException($"物料{WmsRawmatTransferinstockD.matcode} {WmsRawmatTransferinstockD.matcode_id} 包装数量为空或者等于0,无法打印!", 500); }; int codeNum = 0; if (minPacking.HasValue && minPacking.Value > 0) { codeNum = input.barcode_qty; decimal qty = (int)(codeNum * minPacking); decimal mod = 0; decimal extra = (qty - WmsRawmatTransferinstockD.actual_qty).Value; if (extra > 0 && extra < minPacking) { mod = minPacking.Value - extra; } BasMaterial basMaterial = await _db.Queryable().Where(r => r.id == WmsRawmatTransferinstockD.matcode_id).FirstAsync(); for (int j = 0; j < codeNum; j++) { int index = j + 1; //string code = $"{WmsPurchaseD.material_code}-{WmsPurchaseD.code_batch}-{index.ToString().PadLeft(4, '0')}"; // 变更加流水号 //string watercode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TRANSFER_RAWMAT_ENCODE); //string code = $"YCLDBRK{watercode}"; string code_batch = string.IsNullOrEmpty(WmsRawmatTransferinstockD.code_batch) ? "" : WmsRawmatTransferinstockD.code_batch; string watercode = await _wareHouseService.CreateCodeRules("", WmsRawmatTransferinstockD.matcode + code_batch, 4); string code = $"{WmsRawmatTransferinstockD.matcode}-{WmsRawmatTransferinstockD.code_batch}-{watercode}"; WmsTempCode barCode = new() { material_id = WmsRawmatTransferinstockD.matcode_id, material_code = WmsRawmatTransferinstockD.matcode, barcode = code, code_batch = WmsRawmatTransferinstockD.code_batch, material_specification = basMaterial.material_specification, codeqty = minPacking, unit_id = WmsRawmatTransferinstockD.unit, is_lock = 0, is_end = 0, require_id = WmsRawmatTransferinstockD.id, require_code = WmsRawmatTransferinstockH.bill_code, create_id = _userManager.UserId, create_time = DateTime.Now, required_type = WmsWareHouseConst.BILLTYPE_RAWMATTRANSFERINSTOCK_ID, material_name = basMaterial.name }; if (index == codeNum) barCode.codeqty = mod == 0 ? minPacking : mod; wmsTempCodes.Add(barCode); } await _db.Insertable(wmsTempCodes).ExecuteCommandAsync(); } await _db.Ado.CommitTranAsync(); barcodes.AddRange(wmsTempCodes.Select(p => p.barcode).ToList()); //if (barcodes?.Count > 0) //{ // var ip = _db.Queryable().Where(p => p.key == "printerip").FirstAsync().Result.value; // base.BarCodePrint(barcodes, 1, ip); //} } catch (Exception ex) { Logger.LogError($"【BarCodePrint】" + ex.Message); Logger.LogError($"【BarCodePrint】" + ex.StackTrace); await _db.Ado.RollbackTranAsync(); throw; } } } }