ÏîÄ¿´úÂë/WIDESEA_WMSClient/public/webconfig.js
@@ -1,4 +1,4 @@ window.webConfig = { "webApiBaseUrl": "http://localhost:9291/", "webApiProduction":"http://localhost:9291/" "webApiBaseUrl": "http://172.19.69.152:9291/", "webApiProduction":"http://172.19.69.152:9291/" } ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue
@@ -14,7 +14,7 @@ <!-- æçä¿¡æ¯æ¾ç¤º --> <div class="tray-info" v-if="trayBarcode"> <i class="el-icon-s-management"></i> å½åæç: {{ trayBarcode }} <i class="el-icon-s-management"></i> å½åæç®±: {{ trayBarcode }} <!-- <el-button class="small-button" type="text" @@ -49,7 +49,7 @@ class="custom-input" > <template slot="prepend"> <span>æç®±ãç </span> <span> æç®±æ¡ç </span> </template> <template slot="append"> <el-button @@ -95,7 +95,7 @@ </div> <div class="input-tips"> <p>æç¤ºï¼å è¾å ¥æçæ¡ç ï¼ç¶åè¾å ¥ç©ææ¡ç </p> <p>æç¤ºï¼å è¾å ¥æç®±ç ï¼ç¶åè¾å ¥ç©ææ¡ç </p> </div> @@ -147,7 +147,7 @@ <div v-if="materials.length === 0" class="empty-state"> <i class="el-icon-document"></i> <p v-if="!trayBarcode">请å è¾å ¥æçæ¡ç </p> <p v-if="!trayBarcode">请å è¾å ¥æç®±æ¡ç </p> <p v-else>ææ ç©ææ°æ®ï¼è¯·æ«ææè¾å ¥ç©ææ¡ç </p> </div> ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/Login.vue
@@ -1,6 +1,6 @@ <template> <div class="login-container"> <div class="project-name">WIDESEA_WMS</div> <div class="project-name">WMS</div> <div class="login-form"> <div class="form-user" @keypress="loginPress"> <div class="login-text"> ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.dbBinary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-walBinary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.dbBinary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-walBinary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs
@@ -28,24 +28,24 @@ _logger = logger; } public async Task FeedbackInbound( FeedbackInboundRequestModel model) public async Task<ResponseModel> FeedbackInbound( FeedbackInboundRequestModel model) { string json = JsonConvert.SerializeObject(model); var content = new StringContent(json, Encoding.UTF8, "application/json"); var _client = _httpClientFactory.CreateClient("MESUrl"); _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("Accept", "application/json"); _logger.LogInformation("InvokeMESService FeedbackInbound : " + json); var response = await _client.PostAsync("AldMaterialWarehousing/MaterialWarehousing", content); string body = await response.Content.ReadAsStringAsync(); _logger.LogInformation("InvokeMESService FeedbackInbound body: " + body); if (!response.IsSuccessStatusCode) { throw new HttpRequestException(body); } // JsonConvert.DeserializeObject<ResponseModel>(body); return JsonConvert.DeserializeObject<ResponseModel>(body); } public async Task FeedbackOutbound( FeedbackOutboundRequestModel model) @@ -73,15 +73,15 @@ string json = JsonConvert.SerializeObject(model); string userDataEncoded = Uri.EscapeDataString(json); //string baseUrl = "http://mestest.ald.com//OrBitWCFServiceR15/orbitwebapi.ashx?"; string userTicket = await GetToken(UserName, Password); string api = "WMS_BarcodeInformation"; //string userDataEncoded = Uri.EscapeDataString(json); ////string baseUrl = "http://mestest.ald.com//OrBitWCFServiceR15/orbitwebapi.ashx?"; //string userTicket = await GetToken(UserName, Password); //string api = "WMS_BarcodeInformation"; var client = _httpClientFactory.CreateClient("MESUrl"); // æ¼æ¥ URL åæ° string url = $"{client.BaseAddress}UserTicket={userTicket}&API={api}&UserData={userDataEncoded}"; // string url = $"{client.BaseAddress}UserTicket={userTicket}&API={api}&UserData={userDataEncoded}"; client.DefaultRequestHeaders.Clear(); @@ -91,7 +91,7 @@ var content = new StringContent(json, Encoding.UTF8, "application/json"); using var response = await client.PostAsync(url, content); using var response = await client.PostAsync("", content); var responseText = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MaterialUnitService.cs
@@ -1,4 +1,6 @@ using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.JsonPatch.Internal; using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; @@ -6,9 +8,11 @@ using System.Threading.Tasks; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_DTO.Basic; using WIDESEA_IBasicService; using WIDESEA_Model.Models; using WIDESEA_Model.Models.Basic; namespace WIDESEA_BasicService { @@ -23,10 +27,72 @@ _logger = logger; _materielInfoRepository = materielInfoRepository; } /// <summary> /// è·åç©æåå ¶ææåä½è½¬æ¢å ³ç³»ï¼ä½¿ç¨MaterialUnitå·¦è¿æ¥Materialï¼ /// </summary> private async Task<MaterialWithUnits> GetMaterialWithUnitsAsync(string materialCode) { var unitConversions = await Repository.Db.Queryable<Dt_MaterialUnit>() .LeftJoin<Dt_MaterielInfo>((u, m) => u.ItemNo == m.MaterielCode) .Where((u, m) => u.ItemNo == materialCode) .Select((u, m) => new { MaterialCode = u.ItemNo, FromUom = u.FromUom, ToUom = u.ToUom, Ratio = u.Ratio, IssueUnit = m.usageUOM, PurchaseUnit = m.purchaseUOM, StockUnit = m.inventoryUOM }) .ToListAsync(); if (!unitConversions.Any()) { // å¦ææ²¡ææ¾å°åä½è½¬æ¢è®°å½ï¼å°è¯ç´æ¥è·åç©æä¿¡æ¯ var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>() .Where(m => m.MaterielCode == materialCode) .FirstAsync(); if (material == null) { throw new ArgumentException($"æªæ¾å°ç©æç¼å·: {materialCode}"); } return new MaterialWithUnits { MaterialCode = materialCode, IssueUnit = material.usageUOM, PurchaseUnit = material.purchaseUOM, StockUnit = material.inventoryUOM }; } // ä»ç¬¬ä¸æ¡è®°å½ä¸è·åç©æä¿¡æ¯ï¼ææè®°å½é½æç¸åçç©æä¿¡æ¯ï¼ var firstRecord = unitConversions.First(); return new MaterialWithUnits { MaterialCode = materialCode, IssueUnit = firstRecord.IssueUnit, PurchaseUnit = firstRecord.PurchaseUnit, StockUnit = firstRecord.StockUnit, UnitConversions = unitConversions.Select(u => new UnitConversion { FromUom = u.FromUom, ToUom = u.ToUom, Ratio = u.Ratio }).ToList() }; } /// <summary> /// åä½è½¬æ¢ /// </summary> public async Task<decimal> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit) public async Task<MaterialWithUnitConversionResult> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit) { if (string.IsNullOrEmpty(materialCode)) throw new ArgumentException("ç©æç¼å·ä¸è½ä¸ºç©º"); @@ -34,11 +100,12 @@ if (string.IsNullOrEmpty(fromUnit) || string.IsNullOrEmpty(toUnit)) throw new ArgumentException("åä½ä¸è½ä¸ºç©º"); // 妿åä½ç¸åï¼ç´æ¥è¿å // 妿åä½ç¸åï¼ç´æ¥è¿åï¼ä¸è¿è¡è½¬æ¢ if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase)) return quantity; return new MaterialWithUnitConversionResult(quantity, toUnit, false); var ratio = await GetConversionRatioAsync(materialCode, fromUnit, toUnit); var materialData = await GetMaterialWithUnitsAsync(materialCode); var ratio = GetConversionRatioFromData(materialData, fromUnit, toUnit); if (ratio == null) { @@ -46,141 +113,291 @@ throw new InvalidOperationException($"æªæ¾å°ç©æ {materialCode} ä» {fromUnit} å° {toUnit} çåä½è½¬æ¢å ³ç³»"); } return quantity * ratio.Value; var convertedQuantity = quantity * ratio.Value; return new MaterialWithUnitConversionResult(convertedQuantity, toUnit, true); } private MaterialWithUnitConversionResult ConvertAsync(MaterialWithUnits materialData, decimal quantity, string fromUnit, string toUnit) { if(materialData==null) throw new ArgumentException("ç©æä¸åå¨"); if (string.IsNullOrEmpty(fromUnit) || string.IsNullOrEmpty(toUnit)) throw new ArgumentException("åä½ä¸è½ä¸ºç©º"); // 妿åä½ç¸åï¼ç´æ¥è¿åï¼ä¸è¿è¡è½¬æ¢ if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase)) return new MaterialWithUnitConversionResult(quantity, toUnit, false); var ratio = GetConversionRatioFromData(materialData, fromUnit, toUnit); if (ratio == null) { _logger.LogWarning($"æªæ¾å°ç©æ {materialData.MaterialCode} ä» {fromUnit} å° {toUnit} çåä½è½¬æ¢å ³ç³»"); throw new InvalidOperationException($"æªæ¾å°ç©æ {materialData.MaterialCode} ä» {fromUnit} å° {toUnit} çåä½è½¬æ¢å ³ç³»"); } var convertedQuantity = quantity * ratio.Value; return new MaterialWithUnitConversionResult(convertedQuantity, toUnit, true); } /// <summary> /// éè´åä½è½¬åºååä½ /// </summary> public async Task<decimal> ConvertPurchaseToStockAsync(string materialCode, decimal quantity) public async Task<MaterialWithUnitConversionResult> ConvertPurchaseToStockAsync(string materialCode, decimal quantity) { // è·åç©æä¿¡æ¯ var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>() .Where(x => x.MaterielCode == materialCode) .FirstAsync(); var materialData = await GetMaterialWithUnitsAsync(materialCode); if (material == null) { throw new ArgumentException($"æªæ¾å°ç©æç¼å·: {materialCode}"); } // 妿éè´åä½ååºååä½ç¸åï¼ç´æ¥è¿å if (materialData.PurchaseUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase)) return new MaterialWithUnitConversionResult(quantity, materialData.StockUnit, false); return await ConvertAsync(materialCode, quantity, material.purchaseUOM, material.inventoryUOM); return ConvertAsync(materialData, quantity, materialData.PurchaseUnit, materialData.StockUnit); } /// <summary> /// 颿åä½è½¬åºååä½ /// </summary> public async Task<decimal> ConvertIssueToStockAsync(string materialCode, decimal quantity) public async Task<MaterialWithUnitConversionResult> ConvertIssueToStockAsync(string materialCode, decimal quantity) { // è·åç©æä¿¡æ¯ var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>() .Where(x => x.MaterielCode == materialCode) .FirstAsync(); var materialData = await GetMaterialWithUnitsAsync(materialCode); if (material == null) { throw new ArgumentException($"æªæ¾å°ç©æç¼å·: {materialCode}"); // 妿颿åä½ååºååä½ç¸åï¼ç´æ¥è¿å if (materialData.IssueUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase)) return new MaterialWithUnitConversionResult(quantity, materialData.StockUnit, false); return ConvertAsync(materialData, quantity, materialData.IssueUnit, materialData.StockUnit); } return await ConvertAsync(materialCode, quantity, material.usageUOM, material.inventoryUOM); } /// <summary> /// è·ååä½è½¬æ¢æ¯ç /// </summary> public async Task<decimal?> GetConversionRatioAsync(string materialCode, string fromUnit, string toUnit) { // å°è¯ç´æ¥æ¥æ¾è½¬æ¢å ³ç³» var conversion = await Repository.Db.Queryable<Dt_MaterialUnit>() .Where(x => x.ItemNo == materialCode && x.FromUom == fromUnit && x.ToUom == toUnit) .FirstAsync(); // 妿åä½ç¸åï¼æ¯ç为1 if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase)) return 1m; if (conversion != null) { return conversion.Ratio; var materialData = await GetMaterialWithUnitsAsync(materialCode); return GetConversionRatioFromData(materialData, fromUnit, toUnit); } // å°è¯æ¥æ¾åå转æ¢å ³ç³»ï¼ååæ°ï¼ var reverseConversion = await Repository.Db.Queryable<Dt_MaterialUnit>() .Where(x => x.ItemNo == materialCode && x.FromUom == toUnit && x.ToUom == fromUnit) .FirstAsync(); /// <summary> /// ä»å åæ°æ®ä¸è·åè½¬æ¢æ¯ç /// </summary> private decimal? GetConversionRatioFromData(MaterialWithUnits materialData, string fromUnit, string toUnit) { // ç´æ¥æ¥æ¾è½¬æ¢å ³ç³» var directConversion = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase)); if (directConversion != null) { return directConversion.Ratio; } // æ¥æ¾åå转æ¢å ³ç³»ï¼ååæ°ï¼ var reverseConversion = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase)); if (reverseConversion != null) { return 1 / reverseConversion.Ratio; } // å°è¯éè¿ä¸é´åä½ï¼åºååä½ï¼è¿è¡è½¬æ¢ var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>() .Where(x => x.MaterielCode == materialCode) .FirstAsync(); // éè¿åºååä½è¿è¡é´æ¥è½¬æ¢ var stockUnit = materialData.StockUnit; if (material != null) { var stockUnit = material.inventoryUOM; // æ¥æ¾ fromUnit -> stockUnit çè½¬æ¢ var fromToStock = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)); var stockToFrom = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase)); // å¦æç®æ åä½å·²ç»æ¯åºååä½ï¼ç´æ¥æ¥æ¾æºåä½å°åºååä½çè½¬æ¢ if (toUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)) // æ¥æ¾ stockUnit -> toUnit çè½¬æ¢ var stockToTo = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase)); var toToStock = materialData.UnitConversions .FirstOrDefault(x => x.FromUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase) && x.ToUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)); decimal? ratioFromToStock = null; decimal? ratioStockToTo = null; // è®¡ç® fromUnit -> stockUnit çæ¯ç if (fromToStock != null) { var toStockRatio = await GetDirectRatioAsync(materialCode, fromUnit, stockUnit); if (toStockRatio != null) return toStockRatio; ratioFromToStock = fromToStock.Ratio; } else if (stockToFrom != null) { ratioFromToStock = 1 / stockToFrom.Ratio; } else if (fromUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)) { ratioFromToStock = 1; // 妿æºåä½å°±æ¯åºååä½ï¼æ¯ç为1 } // 妿æºå使¯åºååä½ï¼ç´æ¥æ¥æ¾åºååä½å°ç®æ åä½çè½¬æ¢ if (fromUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)) // è®¡ç® stockUnit -> toUnit çæ¯ç if (stockToTo != null) { var fromStockRatio = await GetDirectRatioAsync(materialCode, stockUnit, toUnit); if (fromStockRatio != null) return fromStockRatio; ratioStockToTo = stockToTo.Ratio; } else if (toToStock != null) { ratioStockToTo = 1 / toToStock.Ratio; } else if (toUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase)) { ratioStockToTo = 1; // å¦æç®æ åä½å°±æ¯åºååä½ï¼æ¯ç为1 } // éè¿åºååä½è¿è¡é´æ¥è½¬æ¢ï¼fromUnit -> stockUnit -> toUnit var ratio1 = await GetDirectRatioAsync(materialCode, fromUnit, stockUnit); var ratio2 = await GetDirectRatioAsync(materialCode, stockUnit, toUnit); if (ratio1 != null && ratio2 != null) // 妿æ¾å°äºä¸¤æ¡è·¯å¾ï¼è¿åä¹ç§¯ if (ratioFromToStock != null && ratioStockToTo != null) { return ratio1 * ratio2; } return ratioFromToStock * ratioStockToTo; } return null; } /// <summary> /// è·åç´æ¥è½¬æ¢æ¯çï¼å 嫿£ååå忥æ¾ï¼ /// æ¹é转æ¢ï¼ä¼åæ§è½ï¼ä¸æ¬¡æ¥è¯¢å¤çå¤ä¸ªç©æï¼ /// </summary> private async Task<decimal?> GetDirectRatioAsync(string materialCode, string fromUnit, string toUnit) public async Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertAsync(List<BatchConversionRequest> requests) { // æ£åæ¥æ¾ var conversion = await Repository.Db.Queryable<Dt_MaterialUnit>() .Where(x => x.ItemNo == materialCode && x.FromUom == fromUnit && x.ToUom == toUnit) .FirstAsync(); if (requests == null || !requests.Any()) return new Dictionary<string, MaterialWithUnitConversionResult>(); if (conversion != null) // æç©æç¼å·åç» var materialGroups = requests.GroupBy(x => x.MaterialCode); var results = new Dictionary<string, MaterialWithUnitConversionResult>(); foreach (var group in materialGroups) { return conversion.Ratio; var materialCode = group.Key; var materialData = await GetMaterialWithUnitsAsync(materialCode); foreach (var request in group) { try { // 妿åä½ç¸åï¼ç´æ¥è¿å if (request.FromUnit.Equals(request.ToUnit, StringComparison.OrdinalIgnoreCase)) { results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false); continue; } // ååæ¥æ¾ var reverseConversion = await Repository.Db.Queryable<Dt_MaterialUnit>() .Where(x => x.ItemNo == materialCode && x.FromUom == toUnit && x.ToUom == fromUnit) .FirstAsync(); if (reverseConversion != null) var ratio = GetConversionRatioFromData(materialData, request.FromUnit, request.ToUnit); if (ratio != null) { return 1 / reverseConversion.Ratio; var convertedQuantity = request.Quantity * ratio.Value; results[request.RequestId] = new MaterialWithUnitConversionResult(convertedQuantity, request.ToUnit, true); } else { _logger.LogWarning($"æªæ¾å°ç©æ {materialCode} ä» {request.FromUnit} å° {request.ToUnit} çåä½è½¬æ¢å ³ç³»"); results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false); } } catch (Exception ex) { _logger.LogError(ex, $"æ¹é转æ¢ç©æ {materialCode} æ¶åçé误"); results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false); } } } return null; return results; } /// <summary> /// æ¹ééè´åä½è½¬åºååä½ /// </summary> public async Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertPurchaseToStockAsync(List<BatchConversionRequest> requests) { if (requests == null || !requests.Any()) return new Dictionary<string, MaterialWithUnitConversionResult>(); // æç©æç¼å·åç» var materialGroups = requests.GroupBy(x => x.MaterialCode); var results = new Dictionary<string, MaterialWithUnitConversionResult>(); foreach (var group in materialGroups) { var materialCode = group.Key; var materialData = await GetMaterialWithUnitsAsync(materialCode); foreach (var request in group) { try { // 妿éè´åä½ååºååä½ç¸åï¼ç´æ¥è¿å if (materialData.PurchaseUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase)) { results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false); continue; } var ratio = GetConversionRatioFromData(materialData, materialData.PurchaseUnit, materialData.StockUnit); if (ratio != null) { var convertedQuantity = request.Quantity * ratio.Value; results[request.RequestId] = new MaterialWithUnitConversionResult(convertedQuantity, materialData.StockUnit, true); } else { _logger.LogWarning($"æªæ¾å°ç©æ {materialCode} ä»éè´åä½å°åºååä½ç转æ¢å ³ç³»"); results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false); } } catch (Exception ex) { _logger.LogError(ex, $"æ¹é转æ¢ç©æ {materialCode} éè´åä½å°åºåå使¶åçé误"); results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false); } } } return results; } /// <summary> /// è·åç©æçåºååä½ /// </summary> public async Task<string> GetStockUnitAsync(string materialCode) { var materialData = await GetMaterialWithUnitsAsync(materialCode); return materialData.StockUnit; } /// <summary> /// è·åç©æçéè´åä½ /// </summary> public async Task<string> GetPurchaseUnitAsync(string materialCode) { var materialData = await GetMaterialWithUnitsAsync(materialCode); return materialData.PurchaseUnit; } /// <summary> /// è·åç©æç颿åä½ /// </summary> public async Task<string> GetIssueUnitAsync(string materialCode) { var materialData = await GetMaterialWithUnitsAsync(materialCode); return materialData.IssueUnit; } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielInfoService.cs
@@ -20,5 +20,6 @@ public IRepository<Dt_MaterielInfo> Repository => BaseDal; } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs
@@ -23,18 +23,18 @@ /// </summary> [Description("ä¸è¯ååº")] Defective = 1, /// <summary> /// PCBAåº /// </summary> [Description("PCBAåº")] PCBA = 2, /// <summary> /// ä¿ç¨åº /// </summary> [Description("ä¿ç¨åº")] Bonded = 2, Bonded = 3, /// <summary> /// PCBAåº /// </summary> [Description("PCBAåº")] PCBA = 3, } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs
@@ -43,7 +43,7 @@ /// æ¯å¦åæ¹ /// </summary> [JsonProperty("isBatch")] public bool IsBatch { get; set; } public int IsBatch { get; set; } /// <summary> /// ååºä»£ç ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Basic/MaterialUnitDto.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WIDESEA_DTO.Basic { public class MaterialWithUnits { public string MaterialCode { get; set; } public string IssueUnit { get; set; } public string PurchaseUnit { get; set; } public string StockUnit { get; set; } public List<UnitConversion> UnitConversions { get; set; } = new List<UnitConversion>(); } public class UnitConversion { public string FromUom { get; set; } public string ToUom { get; set; } public decimal Ratio { get; set; } } public class MaterialWithUnitConversionResult { public decimal Quantity { get; set; } public string Unit { get; set; } public bool Converted { get; set; } // æ è®°æ¯å¦å®é è¿è¡äºè½¬æ¢ public MaterialWithUnitConversionResult(decimal quantity, string unit, bool converted = true) { Quantity = quantity; Unit = unit; Converted = converted; } public override string ToString() { return $"{Quantity} {Unit}"; } } public class BatchConversionRequest { public string RequestId { get; set; } public string MaterialCode { get; set; } public decimal Quantity { get; set; } public string FromUnit { get; set; } public string ToUnit { get; set; } } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/InboundOrderAddDTO.cs
@@ -125,7 +125,7 @@ public string business_type { get; set; } public bool isBatch { get; set; } public int isBatch { get; set; } public string factoryArea { get; set; } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderAddDTO.cs
@@ -67,7 +67,7 @@ public string business_type { get; set; } public bool isBatch { get; set; } public int isBatch { get; set; } public string factoryArea { get; set; } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs
@@ -12,7 +12,7 @@ { public interface IInvokeMESService : IDependency { Task FeedbackInbound(FeedbackInboundRequestModel model); Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model); Task FeedbackOutbound(FeedbackOutboundRequestModel model); ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterialUnitService.cs
@@ -1,10 +1,12 @@ using System; using Microsoft.AspNetCore.JsonPatch.Internal; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_DTO.Basic; using WIDESEA_Model.Models; using WIDESEA_Model.Models.Basic; @@ -14,10 +16,14 @@ { IRepository<Dt_MaterialUnit> Repository { get; } Task<decimal> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit); Task<decimal> ConvertPurchaseToStockAsync(string materialCode, decimal quantity); Task<decimal> ConvertIssueToStockAsync(string materialCode, decimal quantity); Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertAsync(List<BatchConversionRequest> requests); Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertPurchaseToStockAsync(List<BatchConversionRequest> requests); Task<MaterialWithUnitConversionResult> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit); Task<MaterialWithUnitConversionResult> ConvertIssueToStockAsync(string materialCode, decimal quantity); Task<MaterialWithUnitConversionResult> ConvertPurchaseToStockAsync(string materialCode, decimal quantity); Task<decimal?> GetConversionRatioAsync(string materialCode, string fromUnit, string toUnit); Task<string> GetIssueUnitAsync(string materialCode); Task<string> GetPurchaseUnitAsync(string materialCode); Task<string> GetStockUnitAsync(string materialCode); } } ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs
@@ -16,7 +16,7 @@ { IRepository<Dt_InboundOrder> Repository { get; } WebResponseContent ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType); Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType); WebResponseContent BarcodeMaterielGroup(BarcodeMaterielGroupDTO materielGroupDTO); ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -1,5 +1,6 @@ using AutoMapper; using SqlSugar; using System.Threading.Tasks; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; @@ -29,12 +30,12 @@ private readonly IRepository<Dt_Task> _taskRepository; private IStockService _stockService; private readonly IMaterialUnitService _materialUnitService; private readonly IInboundOrderDetailService _inboundOrderDetailService; private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository; public IRepository<Dt_InboundOrder> Repository => BaseDal; public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService) : base(BaseDal) public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; @@ -42,16 +43,17 @@ _taskRepository = taskRepository; _stockService = stockService; _inboundOrderDetailService = inboundOrderDetailService; _materialUnitService = materialUnitService; } public WebResponseContent ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType) public async Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType) { try { return operateType switch { 1 => AddInboundOrder(models), 2 => UpdateInboundOrder(models), 1 =>await AddInboundOrder(models), 2 => await UpdateInboundOrder(models), 3 => DeleteInboundOrder(models), _ => WebResponseContent.Instance.OK(), @@ -63,7 +65,7 @@ } } public WebResponseContent AddInboundOrder(List<Dt_InboundOrder> models) public async Task<WebResponseContent> AddInboundOrder(List<Dt_InboundOrder> models) { try { @@ -77,6 +79,13 @@ foreach (var model in models) { foreach (var item in model.Details) { var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty); item.Unit= purchaseToStockResult.Unit; item.OrderQuantity=purchaseToStockResult.Quantity; } model.InboundOrderNo = CreateCodeByRule(nameof(RuleCodeEnum.InboundOrderRule)); Db.InsertNav(model).Include(x => x.Details).ExecuteCommand(); } @@ -87,7 +96,7 @@ return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent UpdateInboundOrder(List<Dt_InboundOrder> models) public async Task<WebResponseContent> UpdateInboundOrder(List<Dt_InboundOrder> models) { try { @@ -131,6 +140,10 @@ BarcodeQty = item.BarcodeQty, OrderQuantity = item.OrderQuantity }; var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty); inboundOrderDetail.Unit = purchaseToStockResult.Unit; inboundOrderDetail.OrderQuantity = purchaseToStockResult.Quantity; inboundOrderDetails.Add(inboundOrderDetail); } else @@ -304,7 +317,8 @@ var dbinboundOrderDetails = _inboundOrderDetailService.GetByBarcode(materielGroupDTO.Barcodes); if (dbinboundOrderDetails != null && !dbinboundOrderDetails.Any()) { if (dbinboundOrderDetails != null && !dbinboundOrderDetails.Any()) { return content = WebResponseContent.Instance.Error($"忮䏿²¡æè¯¥{materielGroupDTO.Barcodes}æ¡ç æ°æ®ã"); } @@ -332,11 +346,11 @@ Barcode = item.Barcode, MaterielCode = item.MaterielCode, BatchNo = item.BatchNo, Unit = item.BarcodeUnit, Unit = item.Unit, InboundOrderRowNo = item.lineNo, SupplyCode = item.SupplyCode, WarehouseCode = item.WarehouseCode, StockQuantity = item.BarcodeQty, StockQuantity = item.OrderQuantity, Status = 0, OrderNo = inboundOrder.InboundOrderNo, BusinessType=inboundOrder.BusinessType, @@ -351,7 +365,7 @@ stockInfo.PalletCode = materielGroupDTO.PalletCode; stockInfo.StockStatus = StockStatusEmun.ç»çæå.ObjToInt(); } stockInfo.PalletType = (int)PalletTypeEnum.None; List<int> updateDetailIds = dbinboundOrderDetails.Select(x => x.Id).ToList(); if (inboundOrder.OrderStatus == InOrderStatusEnum.æªå¼å§.ObjToInt()) ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Allocate/Dt_ AllocateOrder.cs
@@ -87,7 +87,7 @@ /// æ¯å¦æ¹æ¬¡ /// </summary> [SugarColumn(IsNullable = false, ColumnDescription = "æ¯å¦æ¹æ¬¡")] public bool? IsBatch { get; set; } public int IsBatch { get; set; } /// <summary> /// ååº ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrder.cs
@@ -78,7 +78,7 @@ /// é»è®¤å¼: ///</summary> [SugarColumn(ColumnName = "isBatch", ColumnDescription = "æ¯å¦åæ¹")] public bool? IsBatch { get; set; } public int IsBatch { get; set; } /// <summary> /// å¤ æ³¨:ååº ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail.cs
@@ -45,9 +45,9 @@ public string BatchNo { get; set; } /// <summary> /// åæ®æ°é /// åæ®åä½è½¬æ¢åçæ°é /// </summary> [SugarColumn(IsNullable = false, ColumnDescription = "åæ®æ°é")] [SugarColumn(IsNullable = false, ColumnDescription = "åæ®åä½è½¬æ¢åçæ°é")] public decimal OrderQuantity { get; set; } /// <summary> ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs
@@ -84,7 +84,7 @@ /// é»è®¤å¼: ///</summary> [SugarColumn(ColumnName = "isBatch", ColumnDescription = "æ¯å¦åæ¹")] public bool? IsBatch { get; set; } public int IsBatch { get; set; } /// <summary> /// å¤ æ³¨:ååº ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -156,7 +156,7 @@ decimal beforeQuantity = 0; //æ¥åºå Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First(); Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"æªæ¾å°æç对åºçç»çä¿¡æ¯"); @@ -264,7 +264,7 @@ supplyCode = group.Key.SupplyCode, batchNo = group.Key.BatchNo, lineNo = group.Key.lineNo, warehouseCode = group.Key.WarehouseCode, warehouseCode = group.Key.WarehouseCode=="0"?"1072": group.Key.WarehouseCode, unit= group.Key.BarcodeUnit, barcodes = group.Select(row => new FeedbackBarcodesModel { @@ -359,7 +359,7 @@ return content.Error($"æªæ¾å°å¯¹åºçç»ç¹è´§ä½ä¿¡æ¯"); } _stockRepository.Db.Deleteable(stockInfo); // _stockRepository.Db.Deleteable(stockInfo); int beforeStatus = locationInfo.LocationStatus; ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs
@@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using System.Net; using System.Threading.Tasks; @@ -33,18 +34,25 @@ private readonly IESSApiService _eSSApiService; private readonly ILocationInfoService _locationInfoService; private readonly IDailySequenceService _dailySequenceService; public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService) : base(service) private readonly IMaterialUnitService _materialUnitService; private readonly ILogger<InboundOrderController> _logger; public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService, ILogger<InboundOrderController> logger, IMaterialUnitService materialUnitService) : base(service) { this.erpApiService = erpApiService; _invokeMESService = invokeMESService; _eSSApiService = eSSApiService; _dailySequenceService = dailySequenceService; _locationInfoService = locationInfoService; _logger = logger; _materialUnitService = materialUnitService; } [HttpPost, Route("Test"), AllowAnonymous, MethodParamsValidate] public async Task<WebResponseContent> Test() { var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("101001-00002", 10); var pdddurchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("100513-00210", 10); var sddd = _locationInfoService.AssignLocation(); var code = sddd.LocationCode; @@ -88,10 +96,10 @@ /// <param name="model"></param> /// <returns></returns> [HttpPost, Route("ReceiveInboundOrder"), AllowAnonymous, MethodParamsValidate] public WebResponseContent ReceiveInboundOrder([FromBody] InboundRequestModel model) public async Task<WebResponseContent> ReceiveInboundOrder([FromBody] InboundRequestModel model) { _logger.LogInformation("InboundOrderController ReceiveInboundOrder: " + JsonConvert.SerializeObject(model)); List<Dt_InboundOrder> inboundOrders = new List<Dt_InboundOrder>(); foreach (var item in model.inBounds) @@ -133,7 +141,9 @@ BatchNo = detailitem.batchNo, Unit = detailitem.unit, WarehouseCode = detailitem.warehouseCode, OrderQuantity = detailitem.qty OrderQuantity = detailitem.qty, BarcodeUnit = detailitem.unit, BarcodeQty = detailitem.qty, }; dt_InboundOrder.Details.Add(inboundOrderDetail); } @@ -147,7 +157,7 @@ inboundOrders.Add(dt_InboundOrder); } var content = Service.ReceiveInboundOrder(inboundOrders, model.operationType); var content =await Service.ReceiveInboundOrder(inboundOrders, model.operationType); if (content.Status) return WebResponseContent.Instance.OK(200); else return WebResponseContent.Instance.Error(content.Message); ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -27,6 +27,8 @@ [HttpPost, Route("Test"), AllowAnonymous, MethodParamsValidate] public async Task<WebResponseContent> PalletOutboundTask(string endStation, string palletCode = "") { var ssd = Service.TaskCompleted("93"); var result=await Service.PalletOutboundTask(endStation, palletCode); return result;