´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/router/viewGird.js
@@ -42,6 +42,10 @@ name: 'locationInfo', component: () => import('@/views/basic/locationInfo.vue') }, { path: '/locationInfoRow', name: 'locationInfoRow', component: () => import('@/views/basic/locationInfoRow.vue') }, { path: '/materielInfo', name: 'materielInfo', component: () => import('@/views/basic/materielInfo.vue') ´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/basic/locationInfoRow.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,385 @@ <template> <div class="container"> <div class="header"> <h2 class="title">è´§ä½æå¾</h2> </div> <div class="content-wrapper"> <!-- æ§å¶é¢æ¿åºå --> <div class="control-panel"> <div class="form-group"> <label>åºåï¼</label> <el-select size="mini" filterable v-model="Area.shelf_code" placeholder="è¯·éæ©" class="full-width" > <el-option v-for="item in slectData" :value="item.shelf_code" :label="item.house_name" :key="item.house_name" ></el-option> </el-select> </div> <div class="form-group"> <label>æï¼</label> <el-select size="mini" clearable filterable @change="SCChange" v-model="Area.tunnel" placeholder="è¯·éæ©" class="full-width" > <el-option v-for="item in scList" :value="item" :label="item" :key="item" ></el-option> </el-select> </div> <el-button type="success" class="refresh-btn" @click="GetViewData"> å·æ° </el-button> <div class="legend-section"> <h4>说æ</h4> <div class="legend-grid"> <div class="legend-item" v-for="item in infoMsg" :key="item.bgcolor" > <span class="color-box" :style="{ 'background-color': item.bgcolor }" ></span> <span class="legend-label">{{ item.msg }}</span> </div> </div> </div> </div> <!-- è´§ä½å±ç¤ºåºå --> <div class="location-view"> <div class="layer-container" v-for="layer in locationData" :key="layer.index" > <h3 class="layer-title">第{{ layer.index }}å±</h3> <div class="row" v-for="row in layer.rows" :key="row.index"> <div class="location-cell" :style="{ 'background-color': GetBgColor(col) }" v-for="col in row.cols" :key="col.index" @mouseenter="showTooltip(col, $event)" @mouseleave="hideTooltip" > {{ row.index }}-{{ col.index }}-{{ layer.index }} </div> </div> </div> </div> <!-- æ¬æµ®æç¤ºæ¡ --> <div v-if="showTooltipFlag" class="location-tooltip" :style="{ left: tooltipPosition.x + 'px', top: tooltipPosition.y + 'px', }" > <div v-if="currentLocation"> <p><strong>è´§ä½å·:</strong>{{ currentLocation.locationCode }}</p> <p> <strong>è´§ä½æåå±:</strong> {{ currentLocation.row }}æ{{ currentLocation.layer }}å{{ currentLocation.index }}å± </p> <p><strong>ç¶æ:</strong> {{ getStatusText(currentLocation) }}</p> <p> <strong>ç¦ç¨:</strong> {{ currentLocation.location_lock == 3 ? "æ¯" : "å¦" }} </p> <!-- <p v-if="currentLocation.location_state > 0"> <strong>ç©æç¼ç :</strong> {{ currentLocation.material_code || "æ " }} </p> <p v-if="currentLocation.location_state > 0"> <strong>æ°é:</strong> {{ currentLocation.quantity || "æ " }} </p> --> </div> </div> </div> </div> </template> <script> import { ElButton } from "element-plus"; export default { data() { return { slectData: [], scList: [], Area: { house_name: "", tunnel: "", shelf_code: "" }, mian_height: "", infoMsg: [ { bgcolor: "lightgreen", msg: "空货ä½", state: 0 }, { bgcolor: "orange", msg: "æè´§", state: 100 }, { bgcolor: "#2BB3D5", msg: "éå®", state: "InAssigned" }, { bgcolor: "#ccc", msg: "ç¦ç¨", state: 3 }, // { bgcolor: "red", msg: "ç¦ç¨", state: 3 }, { bgcolor: "#b7ba6b", msg: "å ¶å®", state: "else" }, ], locationData: [], showTooltipFlag: false, currentLocation: null, tooltipPosition: { x: 0, y: 0 }, }; }, computed: { GetBgColor() { return (col) => { var bgColor = "#b7ba6b"; //ä¼å æ¾ç¤ºç¦ç¨ç¶æ if (col.location_lock == 3) { this.infoMsg.forEach((el) => { if (el.state == col.location_lock) { bgColor = el.bgcolor; } }); } else { this.infoMsg.forEach((el) => { if (col.location_state > 0 && col.location_state < 100) { if (el.state == "InAssigned") { bgColor = el.bgcolor; } } else if (el.state == col.location_state) { bgColor = el.bgcolor; } }); } return bgColor; }; }, }, watch: { //忢åºåº "Area.shelf_code"(newValue, oldValue) { this.scList = []; this.slectData.forEach((e) => { if (e.shelf_code == newValue) { this.Area.tunnel = e.tunnel[0]; this.scList = e.tunnel; } }); this.GetViewData(); }, }, methods: { GetViewData() { var _this = this; this.http .post("/api/LocationInfoRow/GetLocationStatu", _this.Area, "æ¥è¯¢ä¸") .then((x) => { _this.locationData = x; console.log("å端è¿å:", x); }); }, // 忢æ SCChange() { this.GetViewData(); }, showTooltip(location, event) { this.currentLocation = location; this.showTooltipFlag = true; // 设置æç¤ºæ¡ä½ç½®ï¼ç¨å¾®åç§»é¿å 鮿¡é¼ æ this.tooltipPosition = { x: event.clientX + 10, y: event.clientY + 10, }; }, hideTooltip() { this.showTooltipFlag = false; this.currentLocation = null; }, getStatusText(location) { // if (location.location_lock === 3) return "ç¦ç¨"; if (location.location_state === 0) return "空货ä½"; if (location.location_state === 1) return "éå®"; if (location.location_state === 10) return "æè´§éå®"; if (location.location_state === 20) return "空é²éå®"; if (location.location_state === 99) return "大æçéå®"; if (location.location_state === 100) return "æè´§"; // if (location.location_state > 0 && location.location_state < 100) // return "éå®"; return "å ¶ä»"; }, }, mounted() { var mainHeight = document.getElementById("vol-main"); this.mian_height = mainHeight.offsetHeight - 40 + "px"; var _this = this; //å è½½ä¸æé项 this.http.get("/api/LocationInfoRow/GetArea", {}, "æ¥è¯¢ä¸").then((x) => { _this.slectData = x; //å 载第ä¸ä¸ªåºåï¼ç¬¬ä¸æ _this.Area.shelf_code = _this.slectData[0].shelf_code; _this.scList = _this.slectData[0].tunnel; }); }, components: { ElButton }, }; </script> <style scoped> .container { display: flex; flex-direction: column; height: 100%; padding: 10px; } .header { text-align: center; margin-bottom: 20px; } .title { font-size: 20px; font-weight: bold; margin: 0; } .content-wrapper { display: flex; flex: 1; min-height: 0; } .control-panel { width: 220px; padding: 15px; background-color: #f5f7fa; border-radius: 4px; margin-right: 15px; display: flex; flex-direction: column; } .form-group { margin-bottom: 15px; } .full-width { width: 100%; } .refresh-btn { margin-top: 10px; width: 100%; } .legend-section { margin-top: 30px; } .legend-section h4 { margin-bottom: 10px; } .legend-grid { display: grid; grid-template-columns: 1fr; gap: 8px; } .legend-item { display: flex; align-items: center; } .color-box { display: inline-block; width: 20px; height: 20px; margin-right: 8px; border-radius: 3px; } .legend-label { font-size: 13px; } .location-view { flex: 1; overflow: auto; padding: 10px; background-color: white; border-radius: 4px; } .layer-container { margin-bottom: 25px; } .layer-title { margin: 0 0 10px 0; font-size: 16px; color: #333; } .row { display: flex; flex-wrap: wrap; margin-bottom: 8px; } .location-cell { width: 66px; height: 38px; margin: 3px; text-align: center; font-size: 14px; border-radius: 3px; line-height: 38px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .location-tooltip { position: fixed; z-index: 9999; background-color: white; border: 1px solid #ddd; border-radius: 4px; padding: 10px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); pointer-events: none; max-width: 250px; } .location-tooltip p { margin: 5px 0; font-size: 13px; line-height: 1.4; } .location-tooltip strong { display: inline-block; width: 70px; color: #666; } </style> ´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/0e979b6f-9ff2-47ad-99d3-7cc8a7e6a04e.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/19d5ae45-3a83-4410-845f-c9171efb0b93.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5c317bcb-c94b-4bed-9f83-e46eb803dadb.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/64543623-d20f-4ad8-bb49-9a281bd1f5fd.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/652a771c-a3ae-42e9-830b-5ed6ccfb1711.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/75693363-5582-43f5-be32-c05f8e59864c.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/9528bf53-2d7f-4000-b6f7-8c81cee17136.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/98f0b9d5-ff15-4c89-a627-e626a260486c.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d49d81fa-65e0-4032-aa26-ddf7a5143c09.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d85656c6-7405-43eb-91ab-044d483b115b.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/dd599f2b-2dfa-4770-8051-fa2d6b46372d.vsidxBinary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Basic/LocationArea.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WIDESEA_DTO.Basic { public class LocationArea { /// <summary> /// åºåºåç§° /// </summary> public string house_name { get; set; } /// <summary> /// åºåºç¼å· /// </summary> public int shelf_code { get; set; } /// <summary> /// /// </summary> public int tunnel { get; set; } } public class LocationLayer { public int index { get; set; } public List<LocationRow> rows { get; set; } } public class LocationRow { public int index { get; set; } public List<LocationCol> cols { get; set; } } public class LocationCol { public string locationCode { get; set; } public int row { get; set; } public int layer { get; set; } public int index { get; set; } /// <summary> /// æ£æµæç¶æ /// </summary> public string remark { get; set; } /// <summary> /// è´§ä½ç¶æ /// </summary> public int location_state { get; set; } /// <summary> /// éå®ç¶æ /// </summary> public int location_lock { get; set; } } } ´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoRowController.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,111 @@ using HslCommunication.WebSocket; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.LocationEnum; using WIDESEA_Core; using WIDESEA_Core.BaseController; using WIDESEA_Core.Enums; using WIDESEA_DTO.Basic; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_ISystemRepository; using WIDESEA_Model.Models; namespace WIDESEA_WMSServer.Controllers.Basic { /// <summary> /// è´§ä½ /// </summary> [Route("api/LocationInfoRow")] [ApiController] public class LocationInfoRowController : ApiBaseController<ILocationInfoService, Dt_LocationInfo> { private readonly ILocationInfoRepository _repository; private readonly ISys_RoleDataPermissionRepository _permissionRepository; private readonly ILocationInfoRepository _locationInfoRepository; public LocationInfoRowController(ILocationInfoService service, ILocationInfoRepository repository, ISys_RoleDataPermissionRepository permissionRepository, ILocationInfoRepository locationInfoRepository) : base(service) { _repository = repository; _permissionRepository = permissionRepository; _locationInfoRepository = locationInfoRepository; } /// <summary> /// è·ååºåºæé /// </summary> /// <returns></returns> [HttpGet, HttpPost, Route("GetArea"), AllowAnonymous] public object GetArea() { List<object> list = new List<object>(); List<Dt_LocationInfo>? locations = null; List<Sys_RoleDataPermission> permissions = _permissionRepository.QueryData(x => x.RoleId == App.User.RoleId); if (permissions.Count > 0) locations = _locationInfoRepository.QueryData(x => permissions.Select(k => k.WarehouseId).ToList().Contains(x.WarehouseId)); foreach (var permission in permissions) { var Rows = locations.Where(x => x.WarehouseId == permission.WarehouseId).GroupBy(x => x.Row).Select(x => x.Key).OrderBy(x => x).ToList(); var obj = new { house_name = permission.WarehouseName, shelf_code = permission.WarehouseId, tunnel = Rows }; list.Add(obj); } return list; } /// <summary> /// è·åè´§ä½ä¿¡æ¯ /// </summary> /// <param name="area"></param> /// <returns></returns> [HttpPost, Route("GetLocationStatu"), AllowAnonymous] public object GetLocationStatu([FromBody] LocationArea area) { List<LocationLayer> layers = new List<LocationLayer>(); var data = _locationInfoRepository.QueryData(x => x.WarehouseId == area.shelf_code && x.Row == area.tunnel); foreach (var layer in data.GroupBy(t => t.Layer)) { var rows = new List<LocationRow>(); var data_rows = layer.GroupBy(t => t.Row); foreach (var data_row in data_rows) { var cols = new List<LocationCol>(); foreach (var data_col in data_row) { cols.Add(new LocationCol() { //å row = data_col.Row, layer = data_col.Layer, index = data_col.Column, locationCode = data_col.LocationCode, location_state = data_col.LocationStatus, location_lock = data_col.EnableStatus, remark = data_col.Remark }); } cols = cols.OrderBy(t => t.index).ToList(); rows.Add(new LocationRow() { //è¡ index = data_row.Key, cols = cols }); } rows = rows.OrderBy(t => t.index).ToList(); layers.Add(new LocationLayer() { //å± index = layer.Key, rows = rows }); } layers = layers.OrderBy(t => t.index).ToList(); return layers; } } } ´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -13,7 +13,7 @@ //è¿æ¥å符串 //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=", //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", //æ§WMSæ°æ®åºè¿æ¥ //"TeConnectionString": "Data Source=10.30.4.92;Initial Catalog=TeChuang;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",