| | |
| | | </view> |
| | | |
| | | <!-- 刀具目录弹窗 --> |
| | | <!-- 刀具目录弹窗 --> |
| | | <view v-if="showToolDialog" class="dialog-overlay"> |
| | | <view class="dialog"> |
| | | <!-- 搜索框区域 --> |
| | | <view class="search-section"> |
| | | <input v-model="searchKey" placeholder="输入刀具编码、名称模糊搜索" class="search-input" @input="onSearchKeyInput" /> |
| | | <button class="search-btn" @click="searchTool" :disabled="loadingTools">搜索</button> |
| | | </view> |
| | | |
| | | <!-- 刀具列表区域 --> |
| | | <view class="tool-list-section"> |
| | | <view class="dialog"> |
| | | <view class="form-group"> |
| | | <input v-model="searchKey" placeholder="输入刀具编码、名称模糊搜索" class="input" @input="onSearchKeyInput" /> |
| | | <button class="btn-blue" @click="searchTool" :disabled="loadingTools">搜索</button> |
| | | </view> |
| | | <view class="tool-list"> |
| | | <button v-for="tool in filteredTools" |
| | | :key="tool.no" |
| | | class="tool-item" |
| | | class="tool-btn" |
| | | :class="{ active: activeToolNo === tool.no }" |
| | | @click="selectTool(tool)"> |
| | | <view class="tool-info"> |
| | | <text class="tool-no">{{ tool.no }}</text> |
| | | <text class="tool-name">{{ tool.name }}</text> |
| | | </view> |
| | | {{ tool.no }} | {{ tool.name }} |
| | | </button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 底部操作区域 --> |
| | | <view class="dialog-footer"> |
| | | <view class="pagination"> |
| | | <button class="page-btn" @click="prevPage" :disabled="pageIndex === 1 || loadingTools">上一页</button> |
| | | <text class="page-info">第{{ pageIndex }}页 / 共{{ totalPages }}页</text> |
| | | <button class="page-btn" @click="nextPage" :disabled="pageIndex === totalPages || loadingTools">下一页</button> |
| | | </view> |
| | | <view class="action-buttons"> |
| | | <button class="confirm-btn" @click="confirmTool">确定</button> |
| | | <button class="cancel-btn" @click="closeToolDialog">取消</button> |
| | | <view class="dialog-actions"> |
| | | <div style="display: flex; align-items: center;"> |
| | | <button class="btn-blue" @click="prevPage" :disabled="pageIndex === 1 || loadingTools">上一页</button> |
| | | <span style="margin: 0 12px;">第{{ pageIndex }}页 / 共{{ totalPages }}页</span> |
| | | <button class="btn-blue" @click="nextPage" :disabled="pageIndex === totalPages || loadingTools">下一页</button> |
| | | </div> |
| | | <div style="display: flex; gap: 18px; align-items: center;"> |
| | | <button class="btn-blue" @click="confirmTool">确定</button> |
| | | <button class="btn-disabled" @click="closeToolDialog">取消</button> |
| | | </div> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 刀具使用记录表格 --> |
| | | <view class="table-section"> |
| | | <table class="styled-table"> |
| | | <thead> |
| | | <tr> |
| | | <th style="width:8%">刀具编号</th> |
| | | <th style="width:14%">刀具名称</th> |
| | | <th style="width:12%">上刀时间</th> |
| | | <th class="num" style="width:8%">上刀计数</th> |
| | | <th style="width:12%">下刀时间</th> |
| | | <th class="num" style="width:8%">下刀计数</th> |
| | | <th class="num" style="width:8%">使用次数</th> |
| | | <th class="num" style="width:8%">使用上限</th> |
| | | <th class="num" style="width:8%">寿命比%</th> |
| | | <th class="num" style="width:8%">寿命比预警值</th> |
| | | <th style="width:8%">预警状态</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | <tr v-for="(item, idx) in toolRecords" :key="item.id" :class="{'row-odd': idx % 2 === 0}"> |
| | | <td>{{ item.no }}</td> |
| | | <td class="left">{{ item.name }}</td> |
| | | <td>{{ item.upTime }}</td> |
| | | <td class="num">{{ item.upCount != null ? item.upCount : '' }}</td> |
| | | <td>{{ item.downTime }}</td> |
| | | <td class="num">{{ item.downCount != null ? item.downCount : '' }}</td> |
| | | <td class="num">{{ item.useCount != null ? item.useCount : '' }}</td> |
| | | <td class="num">{{ item.useLimit != null ? item.useLimit : '' }}</td> |
| | | <td class="num">{{ item.lifePercent }}</td> |
| | | <td class="num">{{ item.lifeWarn }}</td> |
| | | <td :class="item.warnStatus === '预警' ? 'warn-cell' : (item.warnStatus === '正常' ? 'ok-cell' : '')"> |
| | | <span v-if="item.warnStatus === '预警'" class="warn-badge">警告</span> |
| | | <span v-else>{{ item.warnStatus }}</span> |
| | | </td> |
| | | </tr> |
| | | <tr v-if="!toolRecords.length"> |
| | | <td colspan="11">暂无数据</td> |
| | | </tr> |
| | | </tbody> |
| | | </table> |
| | | <table class="styled-table"> |
| | | <thead> |
| | | <tr> |
| | | <th style="width:8%">刀具编号</th> |
| | | <th style="width:14%">刀具名称</th> |
| | | <th style="width:12%">上刀时间</th> |
| | | <th class="num" style="width:8%">上刀计数</th> |
| | | <th style="width:12%">下刀时间</th> |
| | | <th class="num" style="width:8%">下刀计数</th> |
| | | <th class="num" style="width:8%">使用次数</th> |
| | | <th class="num" style="width:8%">使用上限</th> |
| | | <th class="num" style="width:8%">寿命比%</th> |
| | | <th class="num" style="width:8%">寿命比预警值</th> |
| | | <th style="width:8%">预警状态</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | <tr v-for="(item, idx) in toolRecords" :key="item.id" :class="{'row-odd': idx % 2 === 0}"> |
| | | <td>{{ item.no }}</td> |
| | | <td class="left">{{ item.name }}</td> |
| | | <td>{{ item.upTime }}</td> |
| | | <td class="num">{{ item.upCount != null ? item.upCount : '' }}</td> |
| | | <td>{{ item.downTime }}</td> |
| | | <td class="num">{{ item.downCount != null ? item.downCount : '' }}</td> |
| | | <td class="num">{{ item.useCount != null ? item.useCount : '' }}</td> |
| | | <td class="num">{{ item.useLimit != null ? item.useLimit : '' }}</td> |
| | | <td class="num">{{ item.lifePercent }}</td> |
| | | <td class="num">{{ item.lifeWarn }}</td> |
| | | <td :class="item.warnStatus === '预警' ? 'warn-cell' : (item.warnStatus === '正常' ? 'ok-cell' : '')"> |
| | | <span v-if="item.warnStatus === '预警'" class="warn-badge">警告</span> |
| | | <span v-else>{{ item.warnStatus }}</span> |
| | | </td> |
| | | </tr> |
| | | <tr v-if="!toolRecords.length"> |
| | | <td colspan="11">暂无数据</td> |
| | | </tr> |
| | | </tbody> |
| | | </table> |
| | | </view> |
| | | |
| | | <!-- 说明 --> |
| | | <!--<view class="tool-desc"> |
| | | <!-- 说明 --> |
| | | <!--<view class="tool-desc"> |
| | | <p style="color:red;">'使用上限'以下刀时的'使用上限'为计算标准</p> |
| | | <p style="color:red;">寿命比预警值默认为90%</p> |
| | | </view>--> |
| | |
| | | align-items: center; |
| | | flex: 1; |
| | | margin: 0 8px; |
| | | min-height: 40px; |
| | | min-height: 44px; |
| | | } |
| | | |
| | | .form-label { |
| | |
| | | color: #333; |
| | | white-space: nowrap; |
| | | margin-right: 8px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .input { |
| | |
| | | font-size: 16px; |
| | | border: 1px solid #dcdfe6; |
| | | flex: 1; |
| | | margin-right: 8px; |
| | | margin-right: 0; |
| | | border-radius: 4px; |
| | | background: #fff; |
| | | min-width: 0; |
| | |
| | | height: 36px; |
| | | box-sizing: border-box; |
| | | transition: all 0.3s; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .btn-blue:hover { |
| | |
| | | |
| | | /* 新增大按钮样式 */ |
| | | .btn-blue.large-btn { |
| | | padding: 12px 24px; |
| | | font-size: 18px; |
| | | height: 44px; |
| | | min-width: 120px; |
| | | padding: 8px 24px; |
| | | font-size: 16px; |
| | | height: 36px; |
| | | min-width: 100px; |
| | | } |
| | | |
| | | /* 调整表单单元格布局以适应大按钮 */ |
| | | .form-cell:last-child { |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | /* 弹窗样式优化 */ |
| | | .dialog-overlay { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: rgba(0,0,0,0.5); |
| | | display: flex; |
| | | /* 调整表单单元格布局以适应按钮 */ |
| | | .form-row .form-cell:last-child { |
| | | justify-content: center; |
| | | align-items: center; |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .dialog { |
| | | background: #fff; |
| | | border-radius: 12px; |
| | | width: 90vw; |
| | | max-width: 800px; |
| | | height: 70vh; |
| | | display: flex; |
| | | flex-direction: column; |
| | | box-shadow: 0 10px 40px rgba(0,0,0,0.2); |
| | | } |
| | | |
| | | /* 搜索区域 */ |
| | | .search-section { |
| | | display: flex; |
| | | padding: 20px; |
| | | border-bottom: 1px solid #e8e8e8; |
| | | background: #fafafa; |
| | | border-radius: 12px 12px 0 0; |
| | | } |
| | | |
| | | .search-input { |
| | | flex: 1; |
| | | padding: 12px 16px; |
| | | border: 1px solid #dcdfe6; |
| | | border-radius: 6px; |
| | | font-size: 16px; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .search-btn { |
| | | background: #1890ff; |
| | | color: white; |
| | | border: none; |
| | | padding: 12px 24px; |
| | | border-radius: 6px; |
| | | font-size: 16px; |
| | | cursor: pointer; |
| | | min-width: 80px; |
| | | } |
| | | |
| | | .search-btn:disabled { |
| | | background: #bae7ff; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | /* 刀具列表区域 */ |
| | | .tool-list-section { |
| | | flex: 1; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .tool-list { |
| | | display: grid; |
| | | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); |
| | | gap: 12px; |
| | | padding: 20px; |
| | | max-height: calc(70vh - 160px); |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .tool-item { |
| | | background: #f8f9fa; |
| | | border: 2px solid #e9ecef; |
| | | border-radius: 8px; |
| | | padding: 16px; |
| | | cursor: pointer; |
| | | transition: all 0.2s; |
| | | text-align: left; |
| | | } |
| | | |
| | | .tool-item:hover { |
| | | border-color: #1890ff; |
| | | background: #f0f7ff; |
| | | } |
| | | |
| | | .tool-item.active { |
| | | border-color: #1890ff; |
| | | background: #e6f7ff; |
| | | box-shadow: 0 2px 8px rgba(24, 144, 255, 0.2); |
| | | } |
| | | |
| | | .tool-info { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | } |
| | | |
| | | .tool-no { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | |
| | | .tool-name { |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | /* 底部操作区域 */ |
| | | .dialog-footer { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 20px; |
| | | border-top: 1px solid #e8e8e8; |
| | | background: #fafafa; |
| | | border-radius: 0 0 12px 12px; |
| | | } |
| | | |
| | | .pagination { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .page-btn { |
| | | background: #fff; |
| | | border: 1px solid #dcdfe6; |
| | | padding: 8px 16px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .page-btn:disabled { |
| | | background: #f5f5f5; |
| | | color: #ccc; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .page-info { |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .confirm-btn { |
| | | background: #1890ff; |
| | | color: white; |
| | | border: none; |
| | | padding: 10px 24px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | background: #fff; |
| | | border: 1px solid #dcdfe6; |
| | | padding: 10px 24px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | color: #333; |
| | | } |
| | | |
| | | /* 响应式调整 */ |
| | | @media (max-width: 768px) { |
| | | .dialog { |
| | | width: 95vw; |
| | | height: 80vh; |
| | | } |
| | | |
| | | .tool-list { |
| | | grid-template-columns: 1fr; |
| | | padding: 12px; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | flex-direction: column; |
| | | gap: 16px; |
| | | align-items: stretch; |
| | | } |
| | | |
| | | .pagination { |
| | | justify-content: center; |
| | | } |
| | | |
| | | .action-buttons { |
| | | justify-content: center; |
| | | } |
| | | flex: 0 0 auto; |
| | | min-width: 120px; |
| | | } |
| | | |
| | | </style> |