}
+ */
+export function downloadWarranty(excoilid) {
+ return l2Request({
+ method: 'get',
+ url: `/api/pdo/warranty/download/${excoilid}`,
+ responseType: 'blob'
+ })
+}
+
diff --git a/apps/l2/src/views/l2/pdo/index.vue b/apps/l2/src/views/l2/pdo/index.vue
index 000855c..d857a30 100644
--- a/apps/l2/src/views/l2/pdo/index.vue
+++ b/apps/l2/src/views/l2/pdo/index.vue
@@ -79,7 +79,7 @@
-
+
@@ -535,4 +535,4 @@ export default {
height: 100%;
padding-left: 15px;
}
-
\ No newline at end of file
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..4823c88
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,166 @@
+{
+ "name": "my-turborepo",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "my-turborepo",
+ "devDependencies": {
+ "turbo": "^2.5.8"
+ }
+ },
+ "node_modules/turbo": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.6.3.tgz",
+ "integrity": "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==",
+ "dev": true,
+ "bin": {
+ "turbo": "bin/turbo"
+ },
+ "optionalDependencies": {
+ "turbo-darwin-64": "2.6.3",
+ "turbo-darwin-arm64": "2.6.3",
+ "turbo-linux-64": "2.6.3",
+ "turbo-linux-arm64": "2.6.3",
+ "turbo-windows-64": "2.6.3",
+ "turbo-windows-arm64": "2.6.3"
+ }
+ },
+ "node_modules/turbo-darwin-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.6.3.tgz",
+ "integrity": "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-darwin-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.6.3.tgz",
+ "integrity": "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-linux-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.6.3.tgz",
+ "integrity": "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-linux-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.6.3.tgz",
+ "integrity": "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-windows-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.6.3.tgz",
+ "integrity": "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/turbo-windows-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.6.3.tgz",
+ "integrity": "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ }
+ },
+ "dependencies": {
+ "turbo": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.6.3.tgz",
+ "integrity": "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==",
+ "dev": true,
+ "requires": {
+ "turbo-darwin-64": "2.6.3",
+ "turbo-darwin-arm64": "2.6.3",
+ "turbo-linux-64": "2.6.3",
+ "turbo-linux-arm64": "2.6.3",
+ "turbo-windows-64": "2.6.3",
+ "turbo-windows-arm64": "2.6.3"
+ }
+ },
+ "turbo-darwin-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.6.3.tgz",
+ "integrity": "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-darwin-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.6.3.tgz",
+ "integrity": "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-linux-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.6.3.tgz",
+ "integrity": "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-linux-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.6.3.tgz",
+ "integrity": "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-windows-64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.6.3.tgz",
+ "integrity": "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==",
+ "dev": true,
+ "optional": true
+ },
+ "turbo-windows-arm64": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.6.3.tgz",
+ "integrity": "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==",
+ "dev": true,
+ "optional": true
+ }
+ }
+}
From c11805aff197a0b557ddbb0eccf03e309f171f0b Mon Sep 17 00:00:00 2001
From: 86156 <823267011@qq.com>
Date: Mon, 5 Jan 2026 14:57:22 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/l2/src/views/l2/send/drive.vue | 210 ++++++++++++++++++++++++--
apps/l2/src/views/l2/send/furnace.vue | 2 +-
2 files changed, 200 insertions(+), 12 deletions(-)
diff --git a/apps/l2/src/views/l2/send/drive.vue b/apps/l2/src/views/l2/send/drive.vue
index 81d4b07..eff3eca 100644
--- a/apps/l2/src/views/l2/send/drive.vue
+++ b/apps/l2/src/views/l2/send/drive.vue
@@ -17,6 +17,50 @@
+
+
+
+
+
+
+
+
+ {{ plan.status === 'PRODUCING' ? '生产中' :
+ plan.status === 'READY' ? '就绪' : '新建' }}
+
+
+
+ {{ plan.planid }}
+ {{ plan.coilid }}
+
+
+
+ 暂无生产计划
+
+
+
+
@@ -60,10 +104,19 @@
type="primary"
size="mini"
icon="el-icon-s-promotion"
- @click="handleSend(setup)"
+ @click="handleSendCurrent(setup)"
:loading="setup.sending"
>
- 下发
+ 当前计划下发
+
+
+ 下一计划下发
@@ -103,6 +156,7 @@
import { listSetup } from '@/api/business/setup'
import { createSendJob, executeSendJob } from '@/api/l2/sendJob'
import { getLastSuccess } from '@/api/l2/sendTemplate'
+import { listPlan } from '@/api/l2/plan'
// 传动字段定义(中文界面,贴合工业场景)
const DRIVE_FIELDS = [
@@ -165,6 +219,8 @@ export default {
loading: false,
lastSuccess: null,
setups: [],
+ planQueueLoading: false,
+ planQueue: [],
driveFields: DRIVE_FIELDS,
driveAddress: { ...DRIVE_ADDRESS }
}
@@ -172,8 +228,53 @@ export default {
created() {
this.reload()
},
+ computed: {
+ // 生产队列(不含已完成),按优先级排序:生产中 > 就绪 > 新建
+ sortedPlanQueue() {
+ const statusPriority = { PRODUCING: 1, READY: 2, NEW: 3 }
+ return (this.planQueue || []).slice().sort((a, b) => {
+ const pa = statusPriority[a.status] || 999
+ const pb = statusPriority[b.status] || 999
+ return pa - pb
+ })
+ },
+ // 下一计划:队列中第一个非生产中计划(READY/NEW);若没有则取队列第一个
+ nextPlan() {
+ const list = this.sortedPlanQueue
+ if (!list.length) return null
+ const next = list.find(p => p.status !== 'PRODUCING')
+ return next || list[0]
+ }
+ },
methods: {
+ // 获取生产计划队列
+ async getPlanQueue() {
+ this.planQueueLoading = true
+ try {
+ // 查询状态为 PRODUCING, READY, NEW 的计划
+ const res = await listPlan({
+ status: 'PRODUCING,READY,NEW',
+ pageSize: 100, // 获取足够多的计划
+ pageNum: 1
+ })
+ this.planQueue = res.data || []
+ } catch (e) {
+ console.error('获取计划队列失败:', e)
+ this.$message.error('获取计划队列失败')
+ } finally {
+ this.planQueueLoading = false
+ }
+ },
+
async reload() {
+ // 同时加载计划队列和设置
+ await Promise.all([
+ this.getPlanQueue(),
+ this.loadSetups()
+ ])
+ },
+
+ async loadSetups() {
this.loading = true
try {
// 1. 获取传动模块上次成功下发数据
@@ -204,7 +305,8 @@ export default {
return {
...s,
params,
- sending: false
+ sending: false,
+ sendingNext: false
}
})
} catch (e) {
@@ -242,7 +344,7 @@ export default {
return new Date(t).toLocaleString()
},
- handleSend(setup) {
+ handleSendCurrent(setup) {
this.$confirm(
`确认要下发【${setup.coilid || '-'}】钢卷的传动参数吗?`,
'提示',
@@ -254,29 +356,53 @@ export default {
).then(() => this.doSend(setup)).catch(() => {})
},
- async doSend(setup) {
- setup.sending = true
+ handleSendNext(setup) {
+ if (!this.nextPlan) {
+ this.$message.warning('暂无下一计划')
+ return
+ }
+ const plan = this.nextPlan
+ this.$confirm(
+ `确认要按下一计划【${plan.coilid || '-'}】下发传动参数吗?`,
+ '提示',
+ {
+ confirmButtonText: '确认',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }
+ ).then(() => this.doSendNextPlan(setup, plan)).catch(() => {})
+ },
+
+ async doSend(setup, plan) {
+ const isNextPlan = !!plan
+ if (isNextPlan) {
+ setup.sendingNext = true
+ } else {
+ setup.sending = true
+ }
+
try {
const items = this.driveFields.map(f => ({
paramCode: f.key,
address: this.driveAddress[f.key],
valueRaw: String(setup.params[f.key] || ''),
setTime: new Date()
- })).filter(it => !!it.address) // 过滤无OPC地址的项
+ })).filter(it => !!it.address)
if (!items.length) {
this.$message.warning('OPC地址未配置,无可下发内容')
return
}
+ const bizKey = isNextPlan ? plan.coilid : setup.coilid
const dto = {
deviceName: 'CGL_LINE_1',
- bizKey: setup.coilid,
+ bizKey: bizKey,
groups: [
{
groupNo: 1,
groupType: 'DRIVE',
- groupName: `传动参数_${setup.coilid || ''}`,
+ groupName: `传动参数_${bizKey || ''}`,
items
}
]
@@ -294,8 +420,16 @@ export default {
console.error(e)
this.$message.error(e.message || '下发失败')
} finally {
- setup.sending = false
+ if (isNextPlan) {
+ setup.sendingNext = false
+ } else {
+ setup.sending = false
+ }
}
+ },
+
+ doSendNextPlan(setup, plan) {
+ this.doSend(setup, plan)
}
}
}
@@ -303,6 +437,60 @@ export default {
\ No newline at end of file
diff --git a/apps/l2/src/views/l2/send/furnace.vue b/apps/l2/src/views/l2/send/furnace.vue
index 31e0714..a708c8b 100644
--- a/apps/l2/src/views/l2/send/furnace.vue
+++ b/apps/l2/src/views/l2/send/furnace.vue
@@ -177,7 +177,7 @@ export default {
templateItems() {
if (!this.template || !Array.isArray(this.template.items)) return []
return [...this.template.items]
- .filter(i => i.enabled === undefined || i.enabled === 1)
+ .filter(i => i.enabled === undefined || i.enabled === 1 || i.enabled === null)
.sort((a, b) => (a.itemNo || 0) - (b.itemNo || 0))
},