This commit is contained in:
zpc 2026-03-29 22:29:12 +08:00
parent 32d1b68daf
commit 7653c5fe2d
7 changed files with 93 additions and 32 deletions

View File

@ -44,28 +44,30 @@
<view class="frame-card" v-for="frame in frameList" :key="frame.id">
<text class="frame-name">{{ frame.name }}</text>
<!-- 端口行 -->
<view class="port-row" v-for="(row, rowIdx) in frame.odfPortsList" :key="rowIdx">
<text class="row-name">{{ row.name }}</text>
<scroll-view class="port-scroll" scroll-x>
<view class="port-list">
<view
class="port-item"
v-for="port in row.rowList"
:key="port.id"
@click="openPortEdit(port)"
>
<!-- 端口行整框一起横向滚动 -->
<scroll-view class="port-scroll" scroll-x>
<view class="port-rows-wrapper">
<view class="port-row" v-for="(row, rowIdx) in frame.odfPortsList" :key="rowIdx">
<text class="row-name">{{ row.name }}</text>
<view class="port-list">
<view
class="port-circle"
:class="port.status === 1 ? 'port-green' : 'port-red'"
class="port-item"
v-for="port in row.rowList"
:key="port.id"
@click="openPortEdit(port)"
>
<text class="port-tips">{{ port.tips }}</text>
<view
class="port-circle"
:class="port.status === 1 ? 'port-green' : 'port-red'"
>
<text class="port-tips">{{ port.tips }}</text>
</view>
<text class="port-name">{{ port.name }}</text>
</view>
<text class="port-name">{{ port.name }}</text>
</view>
</view>
</scroll-view>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
@ -267,6 +269,16 @@ onLoad((options) => {
margin-bottom: 16rpx;
}
.port-scroll {
width: 100%;
white-space: nowrap;
}
.port-rows-wrapper {
display: inline-block;
min-width: 100%;
}
.port-row {
margin-bottom: 20rpx;
}
@ -277,11 +289,6 @@ onLoad((options) => {
margin-bottom: 12rpx;
}
.port-scroll {
width: 100%;
white-space: nowrap;
}
.port-list {
display: flex;
flex-direction: row;

View File

@ -19,6 +19,12 @@
</view>
</view>
<!-- 搜索入口栏 -->
<view class="search-bar" @click="goSearch">
<image class="search-icon" src="/static/images/ic_search.png" mode="aspectFit" />
<text class="search-placeholder">请输入要搜索的备注内容</text>
</view>
<!-- 机架列表 -->
<view class="rack-list">
<view
@ -76,6 +82,12 @@ function goCheckin() {
})
}
function goSearch() {
uni.navigateTo({
url: '/pages/search/index?roomId=' + roomIdRef.value
})
}
function goDetail(item) {
uni.navigateTo({
url: '/pages/rack-detail/index?rackId=' + item.id + '&rackName=' + encodeURIComponent(item.rackName) + '&roomName=' + encodeURIComponent(roomName.value)
@ -155,6 +167,27 @@ onReachBottom(() => {
font-size: 26rpx;
}
.search-bar {
display: flex;
align-items: center;
margin: 16rpx 24rpx;
padding: 0 24rpx;
height: 72rpx;
background-color: rgba(255, 255, 255, 0.9);
border-radius: 36rpx;
}
.search-icon {
width: 32rpx;
height: 32rpx;
margin-right: 16rpx;
}
.search-placeholder {
font-size: 26rpx;
color: #999;
}
.nav-title {
font-size: 34rpx;
font-weight: 600;

View File

@ -12,7 +12,7 @@
mode="aspectFit"
@click="goBack"
/>
<text class="nav-title">搜索</text>
<text class="nav-title">{{ roomIdRef ? '机房搜索' : '搜索' }}</text>
<view class="nav-icon-placeholder" />
</view>
</view>
@ -33,8 +33,8 @@
<!-- 搜索结果 -->
<view class="result-area" v-if="searched">
<!-- 机房区域 -->
<view class="section" v-if="rooms.length > 0">
<!-- 机房区域仅全局搜索时显示 -->
<view class="section" v-if="!roomIdRef && rooms.length > 0">
<text class="section-title">机房</text>
<view
class="room-card"
@ -111,7 +111,7 @@
<script setup>
import { ref } from 'vue'
import { onReachBottom } from '@dcloudio/uni-app'
import { onLoad, onReachBottom } from '@dcloudio/uni-app'
import { searchPorts } from '@/services/search'
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0
@ -123,6 +123,7 @@ const pageNum = ref(1)
const pageSize = 20
const totalPage = ref(0)
const loading = ref(false)
const roomIdRef = ref('')
async function doSearch() {
const key = keyword.value.trim()
@ -130,7 +131,7 @@ async function doSearch() {
pageNum.value = 1
loading.value = true
try {
const res = await searchPorts(key, 1, pageSize)
const res = await searchPorts(key, 1, pageSize, roomIdRef.value || undefined)
if (res.code === 200 && res.data) {
rooms.value = res.data.rooms || []
const portsData = res.data.ports || {}
@ -149,7 +150,7 @@ async function loadMore() {
loading.value = true
pageNum.value++
try {
const res = await searchPorts(keyword.value.trim(), pageNum.value, pageSize)
const res = await searchPorts(keyword.value.trim(), pageNum.value, pageSize, roomIdRef.value || undefined)
if (res.code === 200 && res.data) {
const portsData = res.data.ports || {}
ports.value = [...ports.value, ...(portsData.result || [])]
@ -179,6 +180,12 @@ function goPortDetail(item) {
onReachBottom(() => {
loadMore()
})
onLoad((options) => {
if (options.roomId) {
roomIdRef.value = options.roomId
}
})
</script>
<style scoped>

View File

@ -1,4 +1,7 @@
import { get } from './api'
export const searchPorts = (key, pageNum, pageSize) =>
get('/business/OdfPorts/search2', { key, pageNum, pageSize })
export const searchPorts = (key, pageNum, pageSize, roomId) => {
const params = { key, pageNum, pageSize }
if (roomId) params.roomId = roomId
return get('/business/OdfPorts/search2', params)
}

View File

@ -248,7 +248,12 @@ namespace ZR.Admin.WebApi.Controllers.Business
{
return SUCCESS(new List<OdfPortsQuDto>());
}
var room = await _OdfRoomsService.AsQueryable().Where(it => it.Remarks.Contains(key) || it.RoomAddress.Contains(key) || it.RoomName.Contains(key)).Select((it) => new
var roomQuery = _OdfRoomsService.AsQueryable().Where(it => it.Remarks.Contains(key) || it.RoomAddress.Contains(key) || it.RoomName.Contains(key));
if (dto.RoomId.HasValue)
{
roomQuery = roomQuery.Where(it => it.Id == dto.RoomId.Value);
}
var room = await roomQuery.Select((it) => new
{
RoomId = it.Id,
it.RoomName,
@ -257,7 +262,12 @@ namespace ZR.Admin.WebApi.Controllers.Business
it.DeptName
}).ToListAsync();
var predicate = Expressionable.Create<OdfPorts>();
var list = _OdfPortsService.AsQueryable().Where(it => it.Name.Contains(key) || it.Remarks.Contains(key) || it.HistoryRemarks.Contains(key) || it.OpticalAttenuation.Contains(key)).ToPage<OdfPorts, OdfPortsQuDto>(dto);
var portsQuery = _OdfPortsService.AsQueryable().Where(it => it.Name.Contains(key) || it.Remarks.Contains(key) || it.HistoryRemarks.Contains(key) || it.OpticalAttenuation.Contains(key));
if (dto.RoomId.HasValue)
{
portsQuery = portsQuery.Where(it => it.RoomId == dto.RoomId.Value);
}
var list = portsQuery.ToPage<OdfPorts, OdfPortsQuDto>(dto);
var roomId = list.Result.Select(it => it.RoomId).Distinct();
var roomList = await _OdfRoomsService.AsQueryable().Where(it => roomId.Contains(it.Id)).ToListAsync();
list.Result.ForEach(it =>

View File

@ -85,6 +85,7 @@ namespace ZR.Model.Business.Dto
public class OdfPortsSearchDto : PagerInfo
{
public string Key { get; set; }
public int? RoomId { get; set; }
}
public class OdfPortsMDto
{