Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/HostedService/ApiRouteCacheWarmupHostedService.cs
@@ -55,7 +55,7 @@ warmedCount++; } _logger.LogInformation("��API·�ɻ���Ԥ����ɡ�����={Count}", warmedCount); _logger.LogInformation("APIè·¯ç±ç¼åé¢çå®æãæ°é={Count}", warmedCount); return Task.CompletedTask; } Code/WMS/WIDESEA_WMSClient/public/webconfig.js
@@ -1,4 +1,4 @@ window.webConfig = { "webApiBaseUrl": "http://localhost:9291/", "webApiProduction":"http://localhost:9291/" "webApiProduction":"http://192.168.60.30:9291/" } Code/WMS/WIDESEA_WMSClient/src/api/http.js
@@ -15,7 +15,7 @@ axios.defaults.baseURL = window.webConfig.webApiBaseUrl; } else if (process.env.NODE_ENV == 'debug') { axios.defaults.baseURL = 'http://127.0.0.1:8098/'; axios.defaults.baseURL = window.webConfig.webApiBaseUrl; } else if (process.env.NODE_ENV == 'production') { Code/WMS/WIDESEA_WMSClient/src/extension/basic/extend/GetLocationStatus.vue
@@ -200,6 +200,7 @@ open(row) { this.row = row; this.showDetialBox = true; this.tableData = []; this.getDetailData(); this.getDictionaryData(); }, Code/WMS/WIDESEA_WMSClient/src/views/Home.vue
@@ -104,6 +104,7 @@ async loadOverview() { try { const res = await this.http.get("/api/Dashboard/Overview"); console.log("æ»è§æ°æ®", res.Data); if (res.Status && res.Data) { this.overviewData = res.Data; this.updateTodayChart(); Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue
@@ -81,7 +81,7 @@ field: "locationCode", title: "è´§ä½ç¼å·", type: "string", width: 200, width: 120, align: "left", }, { Code/WMS/WIDESEA_WMSClient/src/views/stock/stockChat.vue
@@ -1,12 +1,8 @@ <template> <div class="stock-chat-container"> <el-tabs v-model="activeWarehouse" @tab-change="onWarehouseChange"> <el-tab-pane v-for="wh in warehouseList" :key="wh.warehouseId || wh.id" :label="wh.warehouseName" :name="wh.warehouseId || wh.id" /> <el-tab-pane v-for="wh in warehouseList" :key="wh.warehouseId || wh.id" :label="wh.warehouseName" :name="wh.warehouseId || wh.id" /> </el-tabs> <div class="toolbar"> @@ -57,11 +53,15 @@ <div v-if="selectedLocation" class="detail-content"> <el-descriptions :column="2" border> <el-descriptions-item label="è´§ä½ç¼å·">{{ selectedLocation.locationCode }}</el-descriptions-item> <el-descriptions-item label="è´§ä½ç¶æ">{{ getLocationStatusText(selectedLocation.locationStatus) }}</el-descriptions-item> <el-descriptions-item label="è´§ä½ç¶æ">{{ getLocationStatusText(selectedLocation.locationStatus) }}</el-descriptions-item> <el-descriptions-item label="æçç¼å·">{{ selectedLocation.palletCode || 'æ ' }}</el-descriptions-item> <el-descriptions-item label="åºåç¶æ">{{ getStockStatusText(selectedLocation.stockStatus) }}</el-descriptions-item> <el-descriptions-item label="æ»åºå">{{ selectedLocation.stockQuantity }}{{ selectedLocation.unit || '' }}</el-descriptions-item> <el-descriptions-item label="åºåºæ¥æ">{{ selectedLocation.outboundDate }}{{ selectedLocation.unit || '' }}</el-descriptions-item> <el-descriptions-item label="åºåç¶æ">{{ getStockStatusText(selectedLocation.stockStatus) }}</el-descriptions-item> <el-descriptions-item label="æ»åºå">{{ selectedLocation.stockQuantity }}{{ selectedLocation.unit || '' }}</el-descriptions-item> <el-descriptions-item label="åºåºæ¥æ">{{ selectedLocation.outboundDate }}{{ selectedLocation.unit || '' }}</el-descriptions-item> </el-descriptions> <div v-if="selectedLocation.details && selectedLocation.details.length > 0" class="detail-table"> @@ -766,6 +766,16 @@ async function loadWarehouseData(warehouseId) { try { // æ¸ é¤é«äº®æ¡ if (selectionOutline) { selectionOutline.visible = false } selectedLocation.value = null // æ¸ ç©ºç鿡件 filterStockStatus.value = null filterMaterielCode.value = null filterBatchNo.value = null const res = await proxy.http.get(`/api/StockInfo/Get3DLayout?warehouseId=${warehouseId}`) if (res.status && res.data) { const data = res.data @@ -1139,9 +1149,25 @@ } async function onWarehouseChange(warehouseId) { // æ¸ é¤éä¸çé«äº®æ¡ if (selectionOutline) { selectionOutline.visible = false } // æ¸ é¤éä¸çè´§ä½æ°æ® selectedLocation.value = null // æ¸ ç©ºææç鿡件 filterStockStatus.value = null filterMaterielCode.value = null filterBatchNo.value = null // æ¸ ç©ºçéé项å表 materielCodeList.value = [] batchNoList.value = [] // å è½½æ°ä»åºæ°æ® await loadWarehouseData(warehouseId) } function onWindowResize() { if (!canvasContainer.value || !camera || !renderer) { return Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue
@@ -110,14 +110,14 @@ field: "sourceAddress", title: "èµ·å§å°å", type: "int", width: 220, width: 120, align: "left", }, { field: "targetAddress", title: "ç®æ å°å", type: "string", width: 220, width: 120, align: "left", }, { @@ -141,13 +141,13 @@ width: 90, align: "left", }, { field: "grade", title: "ä¼å 级", type: "int", width: 80, align: "left", }, // { // field: "grade", // title: "ä¼å 级", // type: "int", // width: 80, // align: "left", // }, { field: "depth", title: "深度", Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue
@@ -110,14 +110,14 @@ field: "sourceAddress", title: "èµ·å§å°å", type: "int", width: 220, width: 120, align: "left", }, { field: "targetAddress", title: "ç®æ å°å", type: "string", width: 220, width: 120, align: "left", }, // { @@ -142,13 +142,13 @@ align: "left", hidden: true, }, { field: "grade", title: "ä¼å 级", type: "int", width: 80, align: "left", }, // { // field: "grade", // title: "ä¼å 级", // type: "int", // width: 80, // align: "left", // }, { field: "depth", title: "深度", Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs
@@ -1,4 +1,5 @@ using WIDESEA_Core.BaseRepository; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_DTO.Stock; using WIDESEA_Model.Models; @@ -56,5 +57,12 @@ /// <param name="warehouseId">ä»åºID</param> /// <returns>3Då¸å±DTO</returns> Task<Stock3DLayoutDTO> Get3DLayoutAsync(int warehouseId); /// <summary> /// 使ç¨äºå¡å é¤åºååæç»ä¿¡æ¯ï¼å æ¥è¯¢åå é¤ï¼ /// </summary> /// <param name="stockId">åºåID</param> /// <returns>å é¤ç»æ</returns> Task<WebResponseContent> DeleteStockWithDetailsAsync(int stockId); } } Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -30,6 +30,8 @@ /// </summary> private readonly IWarehouseService _warehouseService; private readonly IRecordService _recordService; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IStockInfoDetailService _stockInfoDetailService; /// <summary> /// æé 彿° @@ -39,11 +41,15 @@ IRepository<Dt_StockInfo> baseDal, ILocationInfoService locationInfoService, IWarehouseService warehouseService, IRecordService recordService) : base(baseDal) IRecordService recordService, IUnitOfWorkManage unitOfWorkManage, IStockInfoDetailService stockInfoDetailService) : base(baseDal) { _locationInfoService = locationInfoService; _warehouseService = warehouseService; _recordService = recordService; _unitOfWorkManage = unitOfWorkManage; _stockInfoDetailService = stockInfoDetailService; } /// <summary> @@ -316,5 +322,64 @@ Locations = locationItems }; } /// <summary> /// 使ç¨äºå¡å é¤åºååæç»ä¿¡æ¯ï¼å æ¥è¯¢åå é¤ï¼ /// </summary> /// <param name="stockId">åºåID</param> /// <returns>å é¤ç»æ</returns> public async Task<WebResponseContent> DeleteStockWithDetailsAsync(int stockId) { if (stockId <= 0) return WebResponseContent.Instance.Error("åºåIDæ æ"); _unitOfWorkManage.BeginTran(); try { // å æ¥è¯¢åºåä¿¡æ¯ï¼å 嫿ç»ï¼ var stockInfo = await BaseDal.QueryDataNavFirstAsync(x => x.Id == stockId); if (stockInfo == null) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error("åºåè®°å½ä¸åå¨"); } // æ¥è¯¢å¹¶å é¤åºåæç»è®°å½ var existingDetails = await _stockInfoDetailService.Repository.QueryDataAsync(x => x.StockId == stockId); if (existingDetails != null && existingDetails.Any()) { var deleteDetailResult = await _stockInfoDetailService.Repository.DeleteDataAsync(existingDetails); if (!deleteDetailResult) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error("å é¤åºåæç»è®°å½å¤±è´¥"); } } // å é¤åºåä¸»è®°å½ var deleteStockResult = await BaseDal.DeleteDataAsync(stockInfo); if (!deleteStockResult) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error("å é¤åºå主记å½å¤±è´¥"); } _unitOfWorkManage.CommitTran(); // è®°å½åºååæ´æ¥å¿ var saveRecordResult = await _recordService.AddStockChangeRecordAsync(stockInfo, null, StockChangeTypeEnum.Outbound, remark: "åºåå é¤"); if (!saveRecordResult) { return WebResponseContent.Instance.Error("åºååæ´è®°å½ä¿å失败"); } return WebResponseContent.Instance.OK("åºåå 餿å"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error($"å é¤åºååæç»æ¶åçå¼å¸¸: {ex.Message}"); } } } } Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_AGV.cs
@@ -1,5 +1,6 @@ using Mapster; using System.Text.Json; using WIDESEA_Common.Constants; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; @@ -8,6 +9,7 @@ using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Task; using WIDESEA_IStockService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService @@ -168,7 +170,7 @@ return response.OK(); if (task.TaskStatus == (int)TaskInStatusEnum.InNew) return CancelAgvInboundTask(task); return await CancelAgvInboundTask(task); if (task.TaskStatus == (int)TaskOutStatusEnum.OutNew) return await CancelAgvOutboundTaskAsync(task); @@ -300,35 +302,117 @@ return response.Error($"å½åæç{dto.TrayNumber}å·²ç»å ¥åºäº"); // å建åºåæç» var details = new Dt_StockInfoDetail { MaterielCode = dto.ProductNo, MaterielName = dto.ProductName, StockQuantity = int.TryParse(dto.Quantity, out int quantity) ? quantity : 0, Unit = dto.UomCode, OrderNo = dto.ProductNo, ProductionDate =dto.ProductionDate, EffectiveDate = dto.LowerLimitTime, SerialNumber = dto.TrayNumber, Status = (int)StockStatusEmun.å ¥åºç¡®è®¤, InboundOrderRowNo = 1, Creater = StockConstants.AGV_USER, CreateDate = DateTime.Now, Remark = $"AGVå ¥åºä»»å¡å建ï¼ä»»å¡å·ï¼{dto.TaskId}" }; // å建åºåä¸»è®°å½ var stock = new Dt_StockInfo { PalletCode = dto.TrayNumber, PalletType = dto.Floor, WarehouseId = dto.YinYang == 1 ? (int)WarehouseEnum.FJ1 : (int)WarehouseEnum.ZJ1, StockStatus = (int)StockStatusEmun.å ¥åºç¡®è®¤, Creater = StockConstants.AGV_USER, CreateDate = DateTime.Now, Remark = $"AGVå ¥åºä»»å¡å建ï¼ä»»å¡å·ï¼{dto.TaskId}", Details = new List<Dt_StockInfoDetail> { details } }; task.TaskType = (int)TaskInboundTypeEnum.Inbound; task.TaskStatus = (int)TaskInStatusEnum.InNew; task.CurrentAddress = task.SourceAddress; var addResult = await BaseDal.AddDataAsync(task) > 0; return addResult ? null : response.Error("å ¥åºä»»å¡å建失败"); _unitOfWorkManage.BeginTran(); try { // å åå»ºä»»å¡ var taskResult = await BaseDal.AddDataAsync(task) > 0; if (!taskResult) { _unitOfWorkManage.RollbackTran(); return response.Error("å ¥åºä»»å¡å建失败"); } var result = _stockInfoService.Repository.AddData(stock, x => x.Details); if (result) { _unitOfWorkManage.CommitTran(); return null; } else { _unitOfWorkManage.RollbackTran(); return response.Error("åºåä¿¡æ¯å建失败"); } // 使ç¨åºåæå¡æ·»å åºå主记å½åæç» //var stockResult = await _stockInfoService.AddStockWithDetailsUsingTransactionAsync(stock); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return response.Error($"å ¥åºä»»å¡å建å¼å¸¸ï¼{ex.Message}"); } } // åºåºå建 private async Task<AGVResponse?> CreateAgvOutboundTaskAsync(Dt_Task task, ApplyInOutDto dto) { AGVResponse response = new AGVResponse(); // æ£æ¥åºåæ¯å¦åå¨ var stockInfo = await _stockInfoService.GetStockInfoAsync(dto.TrayNumber); if (stockInfo == null) return response.Error($"æªæ¾å°æç{dto.TrayNumber}çåºåä¿¡æ¯"); //if (stockInfo.WarehouseId != dto.YinYang) // return response.Error($"æç{dto.TrayNumber}ä¸å±äºå½å{(dto.YinYang == 1 ? "é´æ" : "鳿")}"); // æ£æ¥åºåæ¯å¦ææç»ï¼å³æ¯å¦ççæåºåï¼ if (stockInfo.Details == null || !stockInfo.Details.Any()) return response.Error($"æç{dto.TrayNumber}没æåºåæç»ï¼æ æ³åºåº"); // æ£æ¥åºåæ»æ°éæ¯å¦å¤§äº0 var totalQuantity = stockInfo.Details.Sum(d => d.StockQuantity); if (totalQuantity <= 0) return response.Error($"æç{dto.TrayNumber}åºåæ°éä¸è¶³ï¼æ æ³åºåº"); // æ ¹æ®dtoåæ°è¿ä¸æ¥éªè¯åºåä¿¡æ¯ if (!string.IsNullOrEmpty(dto.ProductNo)) { // æ£æ¥åºåæç»ä¸æ¯å¦å 嫿å®çç©æç¼ç var hasMatchingMaterial = stockInfo.Details.Any(d => d.MaterielCode == dto.ProductNo); if (!hasMatchingMaterial) return response.Error($"æç{dto.TrayNumber}䏿²¡æç©æç¼ç 为{dto.ProductNo}çåºåï¼æ æ³åºåº"); } // æ£æ¥åºåç¶ææ¯å¦å 许åºåº if (stockInfo.StockStatus != (int)StockStatusEmun.å ¥åºå®æ) return response.Error($"æç{dto.TrayNumber}æ£å¨ç§»å¨ä¸ï¼è¯·ç¨åï¼"); // æ£æ¥è´§ä½ä¿¡æ¯ var locationInfo = await _locationInfoService.GetLocationInfo(stockInfo.LocationCode); if (locationInfo == null) return response.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); // æ£æ¥è´§ä½ç¶ææ¯å¦å 许åºåº if (locationInfo.LocationStatus != (int)LocationStatusEnum.InStock) return response.Error($"å½åè´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); // éªè¯ä»åºIDæ¯å¦å¹é ï¼æ ¹æ®dtoçé´é³æåæ°ï¼ var expectedWarehouseId = dto.YinYang == 1 ? (int)WarehouseEnum.FJ1 : (int)WarehouseEnum.ZJ1; if (stockInfo.WarehouseId != expectedWarehouseId) return response.Error($"æç{dto.TrayNumber}ä¸å¨é¢æçä»åºä¸ï¼æ æ³åºåº"); task.TaskType = (int)TaskOutboundTypeEnum.Outbound; task.TaskStatus = (int)TaskOutStatusEnum.OutNew; @@ -454,7 +538,8 @@ task.TaskStatus = (int)TaskOutStatusEnum.OutFinish; _unitOfWorkManage.BeginTran(); var deleteStockResult = _stockInfoService.DeleteData(stockInfo); //var deleteStockResult = _stockInfoService.DeleteData(stockInfo) var deleteStockResult = await _stockInfoService.DeleteStockWithDetailsAsync(stockInfo.Id); var updateLocationResult = _locationInfoService.UpdateData(locationInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); if (!deleteStockResult.Status || !updateLocationResult.Status) @@ -499,23 +584,23 @@ if (existingStock != null) return response.Error($"æç{task.PalletCode}çåºåä¿¡æ¯å·²åå¨ï¼è¯·å¿éå¤å ¥åº"); Dt_StockInfo stockInfo = new Dt_StockInfo { PalletCode = task.PalletCode, StockStatus = (int)StockStatusEmun.å ¥åºç¡®è®¤, LocationCode = locationInfo.LocationCode, WarehouseId = task.WarehouseId, Creater = "AGV", CreateDate = DateTime.Now }; //Dt_StockInfo stockInfo = new Dt_StockInfo //{ // PalletCode = task.PalletCode, // StockStatus = (int)StockStatusEmun.å ¥åºç¡®è®¤, // LocationCode = locationInfo.LocationCode, // WarehouseId = task.WarehouseId, // Creater = "AGV", // CreateDate = DateTime.Now //}; locationInfo.LocationStatus = (int)LocationStatusEnum.FreeLock; _unitOfWorkManage.BeginTran(); var updateTaskResult = BaseDal.UpdateData(task); var updateLocationResult = _locationInfoService.UpdateData(locationInfo); var addStockResult = _stockInfoService.AddData(stockInfo); if (!updateTaskResult || !updateLocationResult.Status || !addStockResult.Status) //var addStockResult = _stockInfoService.AddData(stockInfo); if (!updateTaskResult || !updateLocationResult.Status /*|| !addStockResult.Status*/) { _unitOfWorkManage.RollbackTran(); return response.Error("å ¥åºå®æåï¼æ¬å°ä»»å¡ãåºåæè´§ä½æ´æ°å¤±è´¥"); @@ -526,16 +611,36 @@ } // AGVå ¥åºåæ¶ private AGVResponse CancelAgvInboundTask(Dt_Task task) private async Task<AGVResponse> CancelAgvInboundTask(Dt_Task task) { AGVResponse response = new AGVResponse(); task.TaskStatus = (int)TaskInStatusEnum.InCancel; _unitOfWorkManage.BeginTran(); try { var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo != null) { var deleteResult = await _stockInfoService.DeleteStockWithDetailsAsync(stockInfo.Id); if (!deleteResult.Status) { _unitOfWorkManage.RollbackTran(); return response.Error($"å é¤åºå失败: {deleteResult.Message}"); } } BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); return response.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return response.Error($"åæ¶å ¥åºä»»å¡æ¶åçå¼å¸¸: {ex.Message}"); } } // AGVåºåºåæ¶ Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
@@ -1,3 +1,4 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; using WIDESEA_Core; @@ -22,7 +23,7 @@ /// <summary> /// æ»è§æ°æ® /// </summary> [HttpGet("Overview")] [HttpGet("Overview"), AllowAnonymous] public async Task<WebResponseContent> Overview() { try @@ -76,7 +77,7 @@ /// SqlSugar ç GroupBy 䏿¯æå¯¹ .Date è¿æ ·ç计ç®åç´æ¥çæ SQL GROUP BYï¼ /// å æ¤éç¨æ¤æ¹å¼ä»¥ç¡®ä¿è·¨æ°æ®åºå ¼å®¹æ§ã /// </remarks> [HttpGet("DailyStats")] [HttpGet("DailyStats"), AllowAnonymous] public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30) { try @@ -117,7 +118,7 @@ /// 注æï¼æ°æ®å¨ SQL å±è¿æ»¤åï¼å¨åºç¨å±æ ISO 8601 å¨é®åç»ã /// å¨é®ä¸º "YYYY-Www" æ ¼å¼ï¼æ æ³ç´æ¥å¨ SQL å±ç¨ GROUP BY å®ç°ã /// </remarks> [HttpGet("WeeklyStats")] [HttpGet("WeeklyStats"), AllowAnonymous] public async Task<WebResponseContent> WeeklyStats([FromQuery] int weeks = 12) { try @@ -168,7 +169,7 @@ /// SqlSugar ç GroupBy 䏿¯æå¿å对象 (Year, Month) ç´æ¥æ å°å° SQL GROUP BYï¼ /// å æ¤éç¨æ¤æ¹å¼ä»¥ç¡®ä¿è·¨æ°æ®åºå ¼å®¹æ§ã /// </remarks> [HttpGet("MonthlyStats")] [HttpGet("MonthlyStats"), AllowAnonymous] public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12) { try @@ -205,7 +206,7 @@ /// <summary> /// åºååºé¾åå¸ /// </summary> [HttpGet("StockAgeDistribution")] [HttpGet("StockAgeDistribution"), AllowAnonymous] public async Task<WebResponseContent> StockAgeDistribution() { try @@ -235,7 +236,7 @@ /// <remarks> /// ä½¿ç¨ SQL GROUP BY 卿°æ®åºå±é¢èåï¼é¿å å è½½å ¨é¨åºåè®°å½å°å åã /// </remarks> [HttpGet("StockByWarehouse")] [HttpGet("StockByWarehouse"), AllowAnonymous] public async Task<WebResponseContent> StockByWarehouse() { try Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Record/LocationStatusChangeRecordController.cs
@@ -18,6 +18,29 @@ public LocationStatusChangeRecordController(ILocationStatusChangeRecordService service) : base(service) { } /// <summary> /// æ ¹æ®IDè·åè´§ä½ç¶æåå¨è®°å½ /// </summary> /// <param name="id">è´§ä½ç¶æåå¨è®°å½ID</param> /// <returns>è´§ä½ç¶æåå¨è®°å½ä¿¡æ¯</returns> [HttpPost("GetLocationState"), AllowAnonymous] public WebResponseContent GetLocationState(int id) { try { if (id <= 0) return WebResponseContent.Instance.Error("IDåæ°æ æ"); var records = Service.Repository.QueryData(x => x.LocationId == id); if (records == null || records.Count == 0) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½ç¶æåå¨è®°å½"); return WebResponseContent.Instance.OK(null, records); } catch (Exception ex) { return WebResponseContent.Instance.Error($"è·åè´§ä½ç¶æåå¨è®°å½å¤±è´¥: {ex.Message}"); } } } } ÏîÄ¿×ÊÁÏ/¼«¾í¿âAGV½Ó¿Ú/~$¼«¾í¿â³öÈë¿â.docxBinary files differ