| | |
| | | <input class="input small-font" v-model="selectedToolNo" placeholder="请通过刀具目录选择" disabled /> |
| | | </view> |
| | | <view class="form-cell"> |
| | | <label class="form-label">设置使用上限:</label> |
| | | <input class="input small-font" type="number" v-model="useLimitInput" placeholder="每次换刀后手填" :disabled="!selectedToolNo || loadingForm" /> |
| | | <label class="form-label highlight-label">使用上限:</label> |
| | | <input class="input small-font input-use-limit" type="number" v-model="useLimitInput" placeholder="每次下刀后手填上限" :disabled="!selectedToolNo || loadingForm" /> |
| | | </view> |
| | | <view class="form-cell"> |
| | | <label class="form-label">寿命比预警值:</label> |
| | | <view class="input-with-unit"> |
| | | <input class="input small-font" |
| | | <input class="input small-font input-life-warn" |
| | | v-model="lifeWarnInput" |
| | | placeholder="如0.9或90" |
| | | :disabled="!selectedToolNo || loadingForm" /> |
| | |
| | | |
| | | <!-- 第二行:在最后添加刀具目录按钮 --> |
| | | <view class="form-row"> |
| | | <!-- 刀具名称 --> |
| | | <view class="form-cell"> |
| | | <label class="form-label">刀具名称:</label> |
| | | <input class="input small-font" v-model="toolName" placeholder="刀具带出" disabled /> |
| | | <input class="input small-font input-tool-name" v-model="toolName" placeholder="刀具带出" disabled /> |
| | | </view> |
| | | <!-- 规格型号 --> |
| | | <view class="form-cell"> |
| | | <label class="form-label">规格型号:</label> |
| | | <input class="input small-font" v-model="toolModel" placeholder="刀具带出" disabled /> |
| | | <input class="input small-font input-tool-model" v-model="toolModel" placeholder="刀具带出" disabled /> |
| | | </view> |
| | | <!-- 新增的刀具目录按钮 --> |
| | | <view class="form-cell"> |
| | |
| | | |
| | | <!-- 刀具目录弹窗 --> |
| | | <view v-if="showToolDialog" class="dialog-overlay"> |
| | | <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-btn" |
| | | :class="{ active: activeToolNo === tool.no }" |
| | | @click="selectTool(tool)"> |
| | | {{ tool.no }} | {{ tool.name }} |
| | | </button> |
| | | </view> |
| | | <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 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-btn" |
| | | :class="{ active: activeToolNo === tool.no }" |
| | | @click="selectTool(tool)"> |
| | | {{ tool.no }} | {{ tool.name }} |
| | | </button> |
| | | </view> |
| | | <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 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"> |
| | | <p style="color:red;">'使用上限'以下刀时的'使用上限'为计算标准</p> |
| | | <p style="color:red;">寿命比预警值默认为90%</p> |
| | | </view>--> |
| | | <!-- 说明 --> |
| | | <!--<view class="tool-desc"> |
| | | <p style="color:red;">'使用上限'以下刀时的'使用上限'为计算标准</p> |
| | | <p style="color:red;">寿命比预警值默认为90%</p> |
| | | </view>--> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | /* 优化顶部表单区域样式 */ |
| | | .top-section-grid { |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | align-items: center; |
| | | align-items: flex-start; |
| | | gap: 12px; |
| | | margin-bottom: 2vh; |
| | | width: 95vw; |
| | | max-width: 1600px; |
| | | width: 99vw; |
| | | max-width: 1920px; |
| | | margin-left: auto; |
| | | margin-right: auto; |
| | | padding: 12px; |
| | |
| | | border: 1px solid #e9ecef; |
| | | } |
| | | |
| | | /* 表单行样式优化 */ |
| | | .form-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-direction: row; |
| | | justify-content: flex-start; |
| | | align-items: center; |
| | | width: 100%; |
| | | margin-bottom: 8px; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .form-row:last-child { |
| | |
| | | .form-cell { |
| | | display: flex; |
| | | align-items: center; |
| | | flex: 1; |
| | | margin: 0 8px; |
| | | min-height: 44px; |
| | | min-width: 0; |
| | | margin-right: 0; |
| | | } |
| | | |
| | | .form-cell:nth-child(1) { |
| | | flex: 0 0 28%; |
| | | min-width: 180px; |
| | | } |
| | | |
| | | .form-cell:nth-child(2) { |
| | | flex: 0 0 32%; |
| | | min-width: 180px; |
| | | justify-content: flex-start; |
| | | } |
| | | |
| | | .form-cell:nth-child(3) { |
| | | flex: 1 1 0; |
| | | min-width: 180px; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .form-label { |
| | | width: 100px; |
| | | width: 120px; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #333; |
| | | white-space: nowrap; |
| | | margin-right: 8px; |
| | | margin-right: 12px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .input { |
| | | padding: 8px 12px; |
| | | font-size: 16px; |
| | | padding: 14px 20px; |
| | | border: 1px solid #dcdfe6; |
| | | flex: 1; |
| | | margin-right: 0; |
| | | border-radius: 4px; |
| | | background: #fff; |
| | | min-width: 0; |
| | | height: 36px; |
| | | height: 56px !important; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .input.small-font { |
| | | font-size: 15px; |
| | | /* 不设置字体大小 */ |
| | | } |
| | | |
| | | .input:disabled { |
| | |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .btn-blue { |
| | | .input, .input-with-unit { |
| | | width: 100%; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .input-with-unit { |
| | | display: flex; |
| | | align-items: center; |
| | | flex: 1; |
| | | } |
| | | |
| | | .input-with-unit .input { |
| | | flex: 1; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .unit-text { |
| | | color: #666; |
| | | white-space: nowrap; |
| | | width: 28px; |
| | | } |
| | | |
| | | .btn-blue, .btn-blue.large-btn { |
| | | background-color: #1890ff; |
| | | color: white; |
| | | border: none; |
| | | padding: 8px 16px; |
| | | padding: 14px 32px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | white-space: nowrap; |
| | | height: 36px; |
| | | height: 70px !important; |
| | | box-sizing: border-box; |
| | | transition: all 0.3s; |
| | | flex-shrink: 0; |
| | | min-width: 140px; |
| | | margin-left: 24px; |
| | | } |
| | | |
| | | .btn-blue.large-btn { |
| | | margin-left: 24px; |
| | | } |
| | | |
| | | .btn-blue:hover { |
| | | background-color: #40a9ff; |
| | |
| | | padding: 1.5vh; |
| | | background-color: #00A2E9; |
| | | color: white; |
| | | font-size: 1.2vw; |
| | | border: none; |
| | | text-align: center; |
| | | border-radius: 6px; |
| | |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .form-group .input { |
| | | flex: 1; |
| | | min-width: 300px; |
| | | border-radius: 6px; |
| | | background: #f8f8f8; |
| | | } |
| | | .form-group .input { |
| | | flex: 1; |
| | | min-width: 300px; |
| | | border-radius: 6px; |
| | | background: #f8f8f8; |
| | | } |
| | | |
| | | .tool-list { |
| | | display: flex; |
| | |
| | | cursor: pointer; |
| | | color: #333; |
| | | text-align: left; |
| | | font-size: 13px; |
| | | min-height: 50px; |
| | | transition: background 0.15s, color 0.15s; |
| | | overflow: hidden; |
| | |
| | | |
| | | .dialog-actions .btn-blue { |
| | | padding: 10px 24px; |
| | | font-size: 16px; |
| | | min-width: 100px; |
| | | min-width: 120px; |
| | | } |
| | | |
| | | .btn-disabled { |
| | |
| | | border: none; |
| | | padding: 10px 24px; |
| | | border-radius: 4px; |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | cursor: not-allowed; |
| | | box-shadow: none; |
| | | min-width: 100px; |
| | | min-width: 120px; |
| | | } |
| | | |
| | | /* 表格样式 */ |
| | |
| | | border-bottom: 2px solid #bfbfbf; |
| | | padding: 16px 10px; |
| | | font-weight: bold; |
| | | font-size: 1.2vw; |
| | | text-align: center; |
| | | } |
| | | |
| | | table.styled-table tbody td { |
| | | border-bottom: 1px solid #e8e8e8; |
| | | padding: 14px 10px; |
| | | font-size: 1.1vw; |
| | | vertical-align: middle; |
| | | text-align: center; |
| | | } |
| | |
| | | padding: 2px 6px; |
| | | border-radius: 3px; |
| | | font-weight: bold; |
| | | font-size: 0.9vw; |
| | | } |
| | | |
| | | /* 带单位的输入框样式 */ |
| | | .input-with-unit { |
| | | display: flex; |
| | | align-items: center; |
| | | flex: 1; |
| | | } |
| | | |
| | | .input-with-unit .input { |
| | | flex: 1; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .unit-text { |
| | | color: #666; |
| | | font-size: 14px; |
| | | white-space: nowrap; |
| | | width: 20px; |
| | | } |
| | | |
| | | /* 响应式调整 */ |
| | |
| | | |
| | | .form-label { |
| | | width: 90px; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .input { |
| | | font-size: 14px; |
| | | padding: 6px 10px; |
| | | padding: 10px 14px; |
| | | } |
| | | |
| | | .btn-blue { |
| | | padding: 6px 12px; |
| | | font-size: 14px; |
| | | padding: 10px 18px; |
| | | } |
| | | } |
| | | |
| | | /* 新增大按钮样式 */ |
| | | .btn-blue.large-btn { |
| | | padding: 8px 24px; |
| | | font-size: 16px; |
| | | height: 36px; |
| | | min-width: 100px; |
| | | /* 让“使用上限”“寿命比预警值”输入框变窄 */ |
| | | .input-life-warn { |
| | | width: 120px !important; |
| | | min-width: 0 !important; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | /* 调整表单单元格布局以适应按钮 */ |
| | | .form-row .form-cell:last-child { |
| | | justify-content: center; |
| | | flex: 0 0 auto; |
| | | min-width: 120px; |
| | | .input-use-limit { |
| | | width: 100px !important; |
| | | min-width: 0 !important; |
| | | margin-right: 16px; |
| | | color: #1890ff !important; |
| | | border-color: #1890ff !important; |
| | | } |
| | | |
| | | .input-tool-model { |
| | | width: 100px !important; |
| | | min-width: 0 !important; |
| | | margin-right: 16px; |
| | | } |
| | | |
| | | .input-tool-name { |
| | | width: 120px !important; |
| | | min-width: 0 !important; |
| | | margin-right: 16px; |
| | | } |
| | | |
| | | .highlight-label { |
| | | color: #1890ff !important; |
| | | } |
| | | </style> |