diff --git a/src/api/maintenance/maintenance.js b/src/api/maintenance/maintenance.js new file mode 100644 index 0000000..64557ac --- /dev/null +++ b/src/api/maintenance/maintenance.js @@ -0,0 +1,67 @@ +import request from '@/utils/request'; + +// 设备运维规则配置 +export function getMaintainConfigList(params) { + return request({ + url: '/api/admin/equipment-maintain-config/index', + method: 'get', + params + }); +} + +export function getMaintainConfigDetail(params) { + return request({ + url: '/api/admin/equipment-maintain-config/show', + method: 'get', + params + }); +} + +export function saveMaintainConfig(data) { + return request({ + url: '/api/admin/equipment-maintain-config/save', + method: 'post', + data + }); +} + +export function deleteMaintainConfig(params) { + return request({ + url: '/api/admin/equipment-maintain-config/destroy', + method: 'get', + params + }); +} + +// 设备运维记录 +export function getOperationList(params) { + return request({ + url: '/api/admin/equipment-operation/index', + method: 'get', + params + }); +} + +export function getOperationDetail(params) { + return request({ + url: '/api/admin/equipment-operation/show', + method: 'get', + params + }); +} + +export function saveOperation(data) { + return request({ + url: '/api/admin/equipment-operation/save', + method: 'post', + data + }); +} + +export function deleteOperation(params) { + return request({ + url: '/api/admin/equipment-operation/destroy', + method: 'get', + params + }); +} diff --git a/src/views/maintenance/maintenance_records.vue b/src/views/maintenance/maintenance_records.vue index 523a804..c8e87df 100644 --- a/src/views/maintenance/maintenance_records.vue +++ b/src/views/maintenance/maintenance_records.vue @@ -165,7 +165,10 @@
-
当前用户: {{ currentUser }}
+
+ + +
@@ -339,6 +342,7 @@ export default { mounted() { this.calcTableHeight(); window.addEventListener('resize', this.calcTableHeight); + this.initSignaturePad(); }, beforeDestroy() { window.removeEventListener('resize', this.calcTableHeight); @@ -503,6 +507,85 @@ export default { closeViewModal() { this.showViewModal = false; this.currentRecord = {}; + }, + initSignaturePad() { + const canvas = this.$refs.signaturePad; + if (!canvas) return; + const ctx = canvas.getContext('2d'); + // 适配高分屏 + const dpr = window.devicePixelRatio || 1; + const container = canvas.parentNode; + const displayWidth = container.offsetWidth || 400; + canvas.width = displayWidth * dpr; + canvas.height = 120 * dpr; + canvas.style.width = displayWidth + 'px'; + canvas.style.height = '120px'; + ctx.scale(dpr, dpr); + ctx.lineWidth = 2; + ctx.lineCap = 'round'; + let drawing = false; + let lastX = 0, lastY = 0; + const getPos = e => { + if (e.touches && e.touches.length) { + const rect = canvas.getBoundingClientRect(); + return { + x: e.touches[0].clientX - rect.left, + y: e.touches[0].clientY - rect.top + }; + } else { + const rect = canvas.getBoundingClientRect(); + return { + x: e.clientX - rect.left, + y: e.clientY - rect.top + }; + } + }; + const start = e => { + drawing = true; + const pos = getPos(e); + lastX = pos.x; + lastY = pos.y; + }; + const move = e => { + if (!drawing) return; + const pos = getPos(e); + ctx.beginPath(); + ctx.moveTo(lastX, lastY); + ctx.lineTo(pos.x, pos.y); + ctx.stroke(); + lastX = pos.x; + lastY = pos.y; + }; + const end = () => { drawing = false; }; + canvas.addEventListener('mousedown', start); + canvas.addEventListener('mousemove', move); + canvas.addEventListener('mouseup', end); + canvas.addEventListener('mouseleave', end); + canvas.addEventListener('touchstart', start); + canvas.addEventListener('touchmove', move); + canvas.addEventListener('touchend', end); + this.signaturePadCtx = ctx; + this.signaturePadCanvas = canvas; + }, + clearSignature() { + if (this.signaturePadCtx && this.signaturePadCanvas) { + this.signaturePadCtx.clearRect(0, 0, this.signaturePadCanvas.width, this.signaturePadCanvas.height); + } + }, + getSignatureDataUrl() { + if (this.signaturePadCanvas) { + return this.signaturePadCanvas.toDataURL('image/png'); + } + return ''; + } + }, + watch: { + showModal(val) { + if (val) { + this.$nextTick(() => { + this.initSignaturePad(); + }); + } } } } @@ -719,6 +802,8 @@ export default { } .form-group { + width: 100%; + min-width: 0; margin-bottom: 1rem; } @@ -759,17 +844,29 @@ export default { color: #6c757d; } -.signature-area .signature-display { - background-color: #f8f9fa; - border: 1px dashed #ced4da; - padding: 1rem; - text-align: center; - color: #6c757d; - border-radius: 0.25rem; - min-height: 80px; +.signature-area { + width: 100%; + min-width: 0; +} +.signature-pad-wrapper { + width: 100%; + min-width: 0; display: flex; - align-items: center; - justify-content: center; + flex-direction: column; + align-items: flex-start; +} +.signature-canvas { + border: 1px dashed #ced4da; + background: #fff; + border-radius: 4px; + width: 100%; + height: 120px; + cursor: crosshair; + display: block; + box-sizing: border-box; + margin: 0; + padding: 0; + min-width: 0; } .form-value {