feat: update test task dashboard
This commit is contained in:
BIN
doc/修改质检测试任务看板.docx
Normal file
BIN
doc/修改质检测试任务看板.docx
Normal file
Binary file not shown.
@@ -67,3 +67,47 @@
|
|||||||
### 结论
|
### 结论
|
||||||
|
|
||||||
已完成本次 `index.vue` 修改:分类汇总数量颜色与指标列一致,分类图片改为左文右图的真实图片显示,四个分类分别使用不同图片;发货状态列表不再重复填充不足的行数。构建验证通过,只有 Vite chunk size 和 Sass legacy JS API 的常规警告。
|
已完成本次 `index.vue` 修改:分类汇总数量颜色与指标列一致,分类图片改为左文右图的真实图片显示,四个分类分别使用不同图片;发货状态列表不再重复填充不足的行数。构建验证通过,只有 Vite chunk size 和 Sass legacy JS API 的常规警告。
|
||||||
|
|
||||||
|
## 2026-07-03 修改质检测试任务看板
|
||||||
|
|
||||||
|
### 提问
|
||||||
|
|
||||||
|
用户要求先上传远程修改,然后根据 `doc/修改质检测试任务看板.docx` 修改页面 `C:\WorkYuanLy\装配任务看板\src\views\TestTaskDashboard.vue`。修改完成后,在 `work` 下创建对应路径,复制原始文档,并新增或修改 `01-项目功能内容`、`02-项目程序开发详细步骤`、`03-推进台账`、`04-任务矩阵`、`05-验收证据`、`06-决策记录`、README 索引,同时将完整中文执行过程追加到 `gptlog-process/gpdlog.md`。
|
||||||
|
|
||||||
|
### 执行过程
|
||||||
|
|
||||||
|
1. 检查 Git 状态,发现上一轮 `index.vue` 分类汇总修改、四张分类图片和 `gptlog-process/gpdlog.md` 尚未推送,同时 `TestTaskDashboard.vue` 已存在一处未提交差异。
|
||||||
|
2. 为避免两轮需求混在一起,先暂存上一轮相关文件:`src/views/index.vue`、`src/assets/dashboard/阀.png`、`src/assets/dashboard/其他.png`、`src/assets/dashboard/电气.png`、`src/assets/dashboard/机械.png`、`gptlog-process/gpdlog.md`。
|
||||||
|
3. 执行提交 `feat: refine aggregate dashboard display`,提交号 `765ed0a`。
|
||||||
|
4. 执行 `git push origin main`,将上一轮修改推送到远程 `origin/main`。
|
||||||
|
5. 读取 `doc` 目录,确认存在 `修改质检测试任务看板.docx`。
|
||||||
|
6. 使用 docx 解包方式读取 `word/document.xml`,提取到需求:注释掉可执行任务数和旧加急任务数,增加加急汇总和滞留汇总;注释掉在制任务缺件明细;已完工任务放在测试任务汇总下面;发货状态列表和测试装配任务列表放在右侧;左侧增加测试任务汇总且不需要齐套和派工;滞留取及时检验报表任务数;加急取 `质量管理_测试装配任务_查询` 中加急总数大于 0 的任务数。
|
||||||
|
7. 读取当前 `src/views/TestTaskDashboard.vue`,确认原布局为顶部 5 卡片、左侧发货/测试列表、右侧缺件/已完工列表。
|
||||||
|
8. 读取参考页面 `src/views/index.vue`,确认分类汇总表布局参考。
|
||||||
|
9. 读取参考页面 `C:\WorkYuanLy\MES_Manage_View_V20\src\views\QualityManagement\CheckTask\punctualInspection.vue`,确认及时检验报表存储过程为 `质量管理_及时检验报表_查询`,并确认参数结构和属性 `2` 对应装配。
|
||||||
|
10. 读取参考页面 `C:\WorkYuanLy\MES_Manage_View_V20\src\views\QualityManagement\TestAssemblyTask\index.vue`,确认测试装配任务查询使用 `质量管理_测试装配任务_查询` 和任务类型、生产订单、销售订单、物料名称、物料编码参数。
|
||||||
|
11. 修改 `TestTaskDashboard.vue` 模板:左侧改为“测试任务汇总”和“已完工任务”,右侧改为“发货状态列表”和“测试装配任务列表”。
|
||||||
|
12. 从模板中移除“在制任务缺件明细”面板,避免页面空位。
|
||||||
|
13. 新增测试任务汇总表,按“阀类/系统类”分组展示“加急/滞留”两个指标。
|
||||||
|
14. 新增 `rawTestAssemblyRows` 和 `stagnationRows` 数据源,用于汇总计算。
|
||||||
|
15. 新增 `testSummaryGroups`、`testSummaryMetrics` 和 `testSummaryRows`,生成左侧测试任务汇总表行。
|
||||||
|
16. 新增 `searchStagnationData`,调用 `质量管理_及时检验报表_查询`,参数按参考页面构造并设置 `属性` 为 `2`。
|
||||||
|
17. 调整 `searchDashboardData`,新增滞留查询,移除缺件明细查询。
|
||||||
|
18. 恢复 `searchTestAssemblyTaskData` 对查询参数 `param` 的传递,使其与参考页面一致。
|
||||||
|
19. 修改 `applyTestAssemblyTaskData`:保存原始测试装配任务行,计算待协助、加急汇总、异常未关闭,并继续写入测试装配任务列表。
|
||||||
|
20. 修改 `applyQualityTimelinessData`:质检及时率写入新的顶部卡片索引。
|
||||||
|
21. 新增 `applyStagnationData`:保存及时检验报表行,并将滞留汇总设置为结果行数。
|
||||||
|
22. 新增 `isUrgentTask`、`getTaskGroupKey`、`countTestSummaryRows`,分别用于加急识别、阀类/系统类归类和汇总表统计。
|
||||||
|
23. 将顶部 `summaryCards` 改为 `reactive` 数组,并改为 5 项:待协助任务数、加急汇总、滞留汇总、质检及时率、异常未关闭消息数。
|
||||||
|
24. 修改样式:主区域改为左窄右宽,左列上下展示测试任务汇总和已完工任务,右列上下展示发货状态和测试装配任务。
|
||||||
|
25. 新增测试任务汇总表样式,包括项目列、指标列、数量列,以及加急红色、滞留橙色。
|
||||||
|
26. 删除不再使用的缺件明细查询函数、缺件行数据和缺件列配置。
|
||||||
|
27. 执行 `npm run build`,构建成功;Vite 正常生成 `TestTaskDashboard` 相关 JS/CSS 产物。
|
||||||
|
28. 创建 `work/修改质检测试任务看板`。
|
||||||
|
29. 将原始 `doc/修改质检测试任务看板.docx` 复制到 `work/修改质检测试任务看板/修改质检测试任务看板.docx`。
|
||||||
|
30. 在 work 目录中新增 README、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`、`07-执行过程日志.md`。
|
||||||
|
31. 将本轮完整中文执行日志追加到 `gptlog-process/gpdlog.md`。
|
||||||
|
|
||||||
|
### 结论
|
||||||
|
|
||||||
|
已按 `修改质检测试任务看板.docx` 完成 `TestTaskDashboard.vue` 修改:顶部统计卡片已调整,左侧新增测试任务汇总并放置已完工任务,右侧放置发货状态列表和测试装配任务列表,缺件明细已移除;加急汇总来自测试装配任务查询中加急总数大于 0 的任务数,滞留汇总来自及时检验报表任务数。`npm run build` 构建通过。work 目录资料已创建并复制原始 docx。
|
||||||
|
|||||||
@@ -33,6 +33,50 @@
|
|||||||
</section>
|
</section>
|
||||||
<section class="main-grid">
|
<section class="main-grid">
|
||||||
<div class="left-column">
|
<div class="left-column">
|
||||||
|
<article class="panel table-panel test-summary-panel">
|
||||||
|
<div class="panel-caption">测试任务汇总</div>
|
||||||
|
<div class="summary-wrap">
|
||||||
|
<table class="test-summary-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="summary-group-th">项目</th>
|
||||||
|
<th class="summary-metric-th">指标</th>
|
||||||
|
<th class="summary-count-th">数量</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="row in testSummaryRows" :key="`${row.groupKey}-${row.metricKey}`">
|
||||||
|
<td v-if="row.groupRowspan" :rowspan="row.groupRowspan" class="summary-group-cell">
|
||||||
|
{{ row.group }}
|
||||||
|
</td>
|
||||||
|
<td class="summary-metric-cell" :class="`metric-${row.metricKey}`">{{ row.metric }}</td>
|
||||||
|
<td class="summary-count-cell" :class="`metric-${row.metricKey}`">{{ row.value }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="panel table-panel">
|
||||||
|
<div class="panel-caption">已完工任务</div>
|
||||||
|
<div class="scroll-wrap">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="idx-th">序号</th>
|
||||||
|
<th v-for="c in doneColumns" :key="c.key">{{ c.label }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody :style="doneScrollStyle">
|
||||||
|
<tr v-for="(r, i) in doneDisplayRows" :key="i">
|
||||||
|
<td class="idx-td">{{ r._idx }}</td>
|
||||||
|
<td v-for="c in doneColumns" :key="c.key" :class="c.key === 'passRate' ? r.rateClass : ''">{{ r[c.key] }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<aside class="right-column">
|
||||||
<article class="panel table-panel">
|
<article class="panel table-panel">
|
||||||
<div class="panel-caption">发货状态列表</div>
|
<div class="panel-caption">发货状态列表</div>
|
||||||
<div class="scroll-wrap">
|
<div class="scroll-wrap">
|
||||||
@@ -71,46 +115,6 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
|
||||||
<aside class="right-column">
|
|
||||||
<article class="panel table-panel">
|
|
||||||
<div class="panel-caption">在制任务缺件明细</div>
|
|
||||||
<div class="scroll-wrap">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="idx-th">序号</th>
|
|
||||||
<th v-for="c in materialColumns" :key="c.key">{{ c.label }}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody :style="materialScrollStyle">
|
|
||||||
<tr v-for="(r, i) in materialDisplayRows" :key="i">
|
|
||||||
<td class="idx-td">{{ r._idx }}</td>
|
|
||||||
<td v-for="c in materialColumns" :key="c.key">{{ r[c.key] }}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
<article class="panel table-panel">
|
|
||||||
<div class="panel-caption">已完工任务</div>
|
|
||||||
<div class="scroll-wrap">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="idx-th">序号</th>
|
|
||||||
<th v-for="c in doneColumns" :key="c.key">{{ c.label }}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody :style="doneScrollStyle">
|
|
||||||
<tr v-for="(r, i) in doneDisplayRows" :key="i">
|
|
||||||
<td class="idx-td">{{ r._idx }}</td>
|
|
||||||
<td v-for="c in doneColumns" :key="c.key" :class="c.key === 'passRate' ? r.rateClass : ''">{{ r[c.key] }}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
</aside>
|
</aside>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
@@ -163,23 +167,32 @@ onUnmounted(() => {
|
|||||||
// ============ 滚动数据 ============
|
// ============ 滚动数据 ============
|
||||||
const deliveryRows = ref([])
|
const deliveryRows = ref([])
|
||||||
const taskRows = ref([])
|
const taskRows = ref([])
|
||||||
const materialRows = ref([])
|
|
||||||
const doneRows = ref([])
|
const doneRows = ref([])
|
||||||
|
const rawTestAssemblyRows = ref([])
|
||||||
|
const stagnationRows = ref([])
|
||||||
|
|
||||||
// 每个列表的滚动偏移
|
// 每个列表的滚动偏移
|
||||||
const deliveryOffset = ref(0)
|
const deliveryOffset = ref(0)
|
||||||
const taskOffset = ref(0)
|
const taskOffset = ref(0)
|
||||||
const materialOffset = ref(0)
|
|
||||||
const doneOffset = ref(0)
|
const doneOffset = ref(0)
|
||||||
|
|
||||||
// 可见行数
|
// 可见行数
|
||||||
const VISIBLE_ROWS = {
|
const VISIBLE_ROWS = {
|
||||||
delivery: 8,
|
delivery: 8,
|
||||||
task: 7,
|
task: 7,
|
||||||
material: 8,
|
|
||||||
done: 7
|
done: 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const testSummaryGroups = [
|
||||||
|
{ key: 'valve', label: '阀类' },
|
||||||
|
{ key: 'system', label: '系统类' }
|
||||||
|
]
|
||||||
|
|
||||||
|
const testSummaryMetrics = [
|
||||||
|
{ key: 'urgent', label: '加急' },
|
||||||
|
{ key: 'stagnation', label: '滞留' }
|
||||||
|
]
|
||||||
|
|
||||||
// 生成带序号和循环滚动的显示行
|
// 生成带序号和循环滚动的显示行
|
||||||
const makeDisplayRows = (rows, offset, visibleCount) => {
|
const makeDisplayRows = (rows, offset, visibleCount) => {
|
||||||
if (!rows || rows.length === 0) return []
|
if (!rows || rows.length === 0) return []
|
||||||
@@ -194,13 +207,29 @@ const makeDisplayRows = (rows, offset, visibleCount) => {
|
|||||||
|
|
||||||
const deliveryDisplayRows = computed(() => makeDisplayRows(deliveryRows.value, deliveryOffset.value, VISIBLE_ROWS.delivery))
|
const deliveryDisplayRows = computed(() => makeDisplayRows(deliveryRows.value, deliveryOffset.value, VISIBLE_ROWS.delivery))
|
||||||
const taskDisplayRows = computed(() => makeDisplayRows(taskRows.value, taskOffset.value, VISIBLE_ROWS.task))
|
const taskDisplayRows = computed(() => makeDisplayRows(taskRows.value, taskOffset.value, VISIBLE_ROWS.task))
|
||||||
const materialDisplayRows = computed(() => makeDisplayRows(materialRows.value, materialOffset.value, VISIBLE_ROWS.material))
|
|
||||||
const doneDisplayRows = computed(() => makeDisplayRows(doneRows.value, doneOffset.value, VISIBLE_ROWS.done))
|
const doneDisplayRows = computed(() => makeDisplayRows(doneRows.value, doneOffset.value, VISIBLE_ROWS.done))
|
||||||
|
const testSummaryRows = computed(() => {
|
||||||
|
const rows = []
|
||||||
|
|
||||||
|
testSummaryGroups.forEach(group => {
|
||||||
|
testSummaryMetrics.forEach(metric => {
|
||||||
|
rows.push({
|
||||||
|
group: group.label,
|
||||||
|
groupKey: group.key,
|
||||||
|
groupRowspan: metric.key === testSummaryMetrics[0].key ? testSummaryMetrics.length : 0,
|
||||||
|
metric: metric.label,
|
||||||
|
metricKey: metric.key,
|
||||||
|
value: countTestSummaryRows(group.key, metric.key)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return rows
|
||||||
|
})
|
||||||
|
|
||||||
// 滚动样式(平滑过渡)
|
// 滚动样式(平滑过渡)
|
||||||
const deliveryScrollStyle = computed(() => ({ transition: 'none' }))
|
const deliveryScrollStyle = computed(() => ({ transition: 'none' }))
|
||||||
const taskScrollStyle = computed(() => ({ transition: 'none' }))
|
const taskScrollStyle = computed(() => ({ transition: 'none' }))
|
||||||
const materialScrollStyle = computed(() => ({ transition: 'none' }))
|
|
||||||
const doneScrollStyle = computed(() => ({ transition: 'none' }))
|
const doneScrollStyle = computed(() => ({ transition: 'none' }))
|
||||||
|
|
||||||
// 启动单个列表滚动
|
// 启动单个列表滚动
|
||||||
@@ -217,7 +246,6 @@ const startScroll = (rowsRef, offsetRef) => {
|
|||||||
const startAllScroll = () => {
|
const startAllScroll = () => {
|
||||||
startScroll(deliveryRows, deliveryOffset)
|
startScroll(deliveryRows, deliveryOffset)
|
||||||
startScroll(taskRows, taskOffset)
|
startScroll(taskRows, taskOffset)
|
||||||
startScroll(materialRows, materialOffset)
|
|
||||||
startScroll(doneRows, doneOffset)
|
startScroll(doneRows, doneOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,8 +258,8 @@ const stopAllScroll = () => {
|
|||||||
const searchDashboardData = () => {
|
const searchDashboardData = () => {
|
||||||
searchTestAssemblyTaskData()
|
searchTestAssemblyTaskData()
|
||||||
searchQualityTimelinessData()
|
searchQualityTimelinessData()
|
||||||
|
searchStagnationData()
|
||||||
searchDoneTaskData()
|
searchDoneTaskData()
|
||||||
searchMaterialshortageData()
|
|
||||||
searchDeliveryData()
|
searchDeliveryData()
|
||||||
}
|
}
|
||||||
const searchTestAssemblyTaskData = () => {
|
const searchTestAssemblyTaskData = () => {
|
||||||
@@ -264,29 +292,44 @@ const searchDoneTaskData = () => {
|
|||||||
]
|
]
|
||||||
queryDashboardData('质量管理_测试装配任务_完成查询', applyDoneTaskData, param)
|
queryDashboardData('质量管理_测试装配任务_完成查询', applyDoneTaskData, param)
|
||||||
}
|
}
|
||||||
|
const searchStagnationData = () => {
|
||||||
|
const param = [
|
||||||
|
['合同号', ''],
|
||||||
|
['订单号', ''],
|
||||||
|
['零件编号', ''],
|
||||||
|
['零件名称', ''],
|
||||||
|
['完工日期_Start', ''],
|
||||||
|
['完工日期_End', ''],
|
||||||
|
['检测日期_Start', ''],
|
||||||
|
['检测日期_End', ''],
|
||||||
|
['检测结果', ''],
|
||||||
|
['检测人', ''],
|
||||||
|
['检测类别', ''],
|
||||||
|
['属性', '2']
|
||||||
|
]
|
||||||
|
queryDashboardData('质量管理_及时检验报表_查询', applyStagnationData, param)
|
||||||
|
}
|
||||||
const searchDeliveryData = () => {
|
const searchDeliveryData = () => {
|
||||||
queryDashboardData('装配中心任务看板_质检发货状态查询', applyDeliveryData)
|
queryDashboardData('装配中心任务看板_质检发货状态查询', applyDeliveryData)
|
||||||
}
|
}
|
||||||
const searchMaterialshortageData = () => {
|
|
||||||
queryDashboardData('装配中心任务看板_在制品缺件查询', applyMaterialshortageData)
|
|
||||||
}
|
|
||||||
const applyTestAssemblyTaskData = rows => {
|
const applyTestAssemblyTaskData = rows => {
|
||||||
const sortedRows = sortTestAssemblyTaskRows(rows)
|
const sortedRows = sortTestAssemblyTaskRows(rows)
|
||||||
|
rawTestAssemblyRows.value = sortedRows
|
||||||
const executableRows = sortedRows.filter(isInspectionUnfinished)
|
const executableRows = sortedRows.filter(isInspectionUnfinished)
|
||||||
const valueRows = executableRows.filter(item => getTaskType(item) === '阀类')
|
|
||||||
const systemRows = executableRows.filter(item => getTaskType(item) === '系统类')
|
|
||||||
|
|
||||||
summaryCards[0].metrics[0].value = valueRows.length
|
summaryCards[0].value = executableRows.filter(isReworkTask).length
|
||||||
summaryCards[0].metrics[1].value = systemRows.length
|
summaryCards[1].value = sortedRows.filter(isUrgentTask).length
|
||||||
summaryCards[1].value = executableRows.filter(isReworkTask).length
|
|
||||||
summaryCards[3].value = executableRows.filter(item => getNumber(item.加急总数 || item.加急数量) > 0).length
|
|
||||||
summaryCards[4].value = sortedRows.reduce((sum, item) => sum + getNumber(item.异常未关闭数 || item.测试装配异常未关闭总数), 0)
|
summaryCards[4].value = sortedRows.reduce((sum, item) => sum + getNumber(item.异常未关闭数 || item.测试装配异常未关闭总数), 0)
|
||||||
|
|
||||||
applyTaskData(sortedRows)
|
applyTaskData(sortedRows)
|
||||||
}
|
}
|
||||||
const applyQualityTimelinessData = rows => {
|
const applyQualityTimelinessData = rows => {
|
||||||
const row = getFirstRow(rows)
|
const row = getFirstRow(rows)
|
||||||
summaryCards[2].value = `${getNumber(row.质检及时率).toFixed(2)}`
|
summaryCards[3].value = `${getNumber(row.质检及时率).toFixed(2)}`
|
||||||
|
}
|
||||||
|
const applyStagnationData = rows => {
|
||||||
|
stagnationRows.value = rows
|
||||||
|
summaryCards[2].value = rows.length
|
||||||
}
|
}
|
||||||
const applyDeliveryData = rows => {
|
const applyDeliveryData = rows => {
|
||||||
deliveryRows.value = rows.map(item => {
|
deliveryRows.value = rows.map(item => {
|
||||||
@@ -344,16 +387,6 @@ const applyTaskData = rows => {
|
|||||||
expectedInspectionDate: formatDate(item.预计送检日期)
|
expectedInspectionDate: formatDate(item.预计送检日期)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
const applyMaterialshortageData = rows => {
|
|
||||||
console.log(rows)
|
|
||||||
materialRows.value = rows.map(item => ({
|
|
||||||
wipOrder: item.DocEntry,
|
|
||||||
shortageStatus: item.U_Name,
|
|
||||||
finishTime: item.ItemCode,
|
|
||||||
owner: item.加急数量
|
|
||||||
}))
|
|
||||||
console.log(materialRows.value)
|
|
||||||
}
|
|
||||||
const queryDashboardData = (procedureName, applyData, param = []) => {
|
const queryDashboardData = (procedureName, applyData, param = []) => {
|
||||||
let data
|
let data
|
||||||
data = CreateData('11', procedureName, param)
|
data = CreateData('11', procedureName, param)
|
||||||
@@ -396,6 +429,22 @@ const isInspectionUnfinished = item => getNumber(item.完成数量) > getNumber(
|
|||||||
|
|
||||||
const isReworkTask = item => String(item.检测说明 || '').includes('返工')
|
const isReworkTask = item => String(item.检测说明 || '').includes('返工')
|
||||||
|
|
||||||
|
const isUrgentTask = item => getNumber(item.加急总数 || item.加急数量) > 0
|
||||||
|
|
||||||
|
const getTaskGroupKey = item => {
|
||||||
|
const taskType = String(getTaskType(item))
|
||||||
|
const text = String(item.自制件属性 || item.物料名称 || item.零件名称 || item.物料描述 || '')
|
||||||
|
return taskType.includes('系统') || text.includes('系统') ? 'system' : 'valve'
|
||||||
|
}
|
||||||
|
|
||||||
|
const countTestSummaryRows = (groupKey, metricKey) => {
|
||||||
|
const sourceRows = metricKey === 'stagnation' ? stagnationRows.value : rawTestAssemblyRows.value
|
||||||
|
return sourceRows
|
||||||
|
.filter(item => getTaskGroupKey(item) === groupKey)
|
||||||
|
.filter(item => metricKey === 'urgent' ? isUrgentTask(item) : true)
|
||||||
|
.length
|
||||||
|
}
|
||||||
|
|
||||||
const sortTestAssemblyTaskRows = rows => rows.slice().sort((a, b) => {
|
const sortTestAssemblyTaskRows = rows => rows.slice().sort((a, b) => {
|
||||||
const unfinishedA = isInspectionUnfinished(a)
|
const unfinishedA = isInspectionUnfinished(a)
|
||||||
const unfinishedB = isInspectionUnfinished(b)
|
const unfinishedB = isInspectionUnfinished(b)
|
||||||
@@ -441,13 +490,13 @@ const icons = {
|
|||||||
shield: svgIcon('#3a9aff', '#0861e8', '<path d="M36 14l16 7v13c0 11-7 18-16 24-9-6-16-13-16-24V21z"/><path d="M28 37l6 6 12-14"/>'),
|
shield: svgIcon('#3a9aff', '#0861e8', '<path d="M36 14l16 7v13c0 11-7 18-16 24-9-6-16-13-16-24V21z"/><path d="M28 37l6 6 12-14"/>'),
|
||||||
done: svgIcon('#47eaa0', '#0da76b', '<rect x="19" y="19" width="34" height="34" rx="8"/><path d="M27 37l7 7 15-18"/>')
|
done: svgIcon('#47eaa0', '#0da76b', '<rect x="19" y="19" width="34" height="34" rx="8"/><path d="M27 37l7 7 15-18"/>')
|
||||||
}
|
}
|
||||||
const summaryCards = [
|
const summaryCards = reactive([
|
||||||
{ title: '可执行任务数', unit: '条', className: 'executable-card', metrics: [{ label: '阀类', value: 0 }, { label: '系统类', value: 0 }] },
|
{ title: '待协助任务数', value: 0, unit: '条', icon: icons.pending, valueClass: 'red-text' },
|
||||||
{ title: '待协助任务数', value: 0, unit: '条', icon: icons.pending , valueClass: 'red-text'},
|
{ title: '加急汇总', value: 0, unit: '条', icon: icons.urgent, valueClass: 'red-text' },
|
||||||
|
{ title: '滞留汇总', value: 0, unit: '条', icon: icons.returnDown, valueClass: 'orange-text' },
|
||||||
{ title: '质检及时率', value: '100.00', icon: icons.finalCheck, valueClass: 'green-text full-value' },
|
{ title: '质检及时率', value: '100.00', icon: icons.finalCheck, valueClass: 'green-text full-value' },
|
||||||
{ title: '加急任务数', value: 125, unit: '条', icon: icons.urgent, valueClass: 'red-text' },
|
{ title: '异常未关闭消息数', value: 0, unit: '条', icon: icons.urgent, valueClass: 'red-text', className: 'exception-card' }
|
||||||
{ title: '异常未关闭消息数', value: 5, unit: '条', icon: icons.urgent, valueClass: 'red-text', className: 'exception-card' },
|
])
|
||||||
]
|
|
||||||
const taskColumns = [
|
const taskColumns = [
|
||||||
{ label: '生产订单', key: 'productionOrder', width: '72px' },
|
{ label: '生产订单', key: 'productionOrder', width: '72px' },
|
||||||
{ label: '销售订单', key: 'salesOrder', width: '92px' },
|
{ label: '销售订单', key: 'salesOrder', width: '92px' },
|
||||||
@@ -473,12 +522,6 @@ const taskColumns2 = [
|
|||||||
{ label: '操作人', key: 'urgentQty', width: '62px' },
|
{ label: '操作人', key: 'urgentQty', width: '62px' },
|
||||||
{ label: '装配开工', key: 'operator', width: '82px' },
|
{ label: '装配开工', key: 'operator', width: '82px' },
|
||||||
]
|
]
|
||||||
const materialColumns = [
|
|
||||||
{ label: '生产订单', key: 'wipOrder', width: '76px' },
|
|
||||||
{ label: '物料名称', key: 'shortageStatus', width: '105px' },
|
|
||||||
{ label: '物料编码', key: 'finishTime', width: '160px' },
|
|
||||||
{ label: '加急数量', key: 'owner', width: '90px' },
|
|
||||||
]
|
|
||||||
const doneColumns = [
|
const doneColumns = [
|
||||||
{ label: '生产订单', key: 'productionOrder', width: '88px' },
|
{ label: '生产订单', key: 'productionOrder', width: '88px' },
|
||||||
{ label: '物料名称', key: 'materialName', width: '150px' },
|
{ label: '物料名称', key: 'materialName', width: '150px' },
|
||||||
@@ -572,22 +615,23 @@ const doneColumns = [
|
|||||||
|
|
||||||
.main-grid {
|
.main-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 2.05fr 1fr;
|
grid-template-columns: 610px 1fr;
|
||||||
gap: 17px;
|
gap: 17px;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.left-column {
|
.left-column {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-rows: 1.05fr .9fr;
|
grid-template-rows: 1fr .88fr;
|
||||||
gap: 17px;
|
gap: 17px;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.right-column {
|
.right-column {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-rows: 1.05fr .9fr;
|
grid-template-rows: .92fr 1.08fr;
|
||||||
gap: 17px;
|
gap: 17px;
|
||||||
|
min-width: 0;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -837,6 +881,7 @@ const doneColumns = [
|
|||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.summary-wrap,
|
||||||
.scroll-wrap {
|
.scroll-wrap {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
@@ -884,6 +929,51 @@ th {
|
|||||||
height: 47px;
|
height: 47px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.test-summary-table th {
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.test-summary-table td {
|
||||||
|
height: 110px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-group-th {
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-metric-th {
|
||||||
|
width: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-count-th {
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-group-cell {
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: 800;
|
||||||
|
background: rgba(7, 74, 112, 0.58);
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-metric-cell {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-count-cell {
|
||||||
|
font-size: 44px;
|
||||||
|
font-weight: 900;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-urgent {
|
||||||
|
color: #ff4451;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-stagnation {
|
||||||
|
color: #ffb13b;
|
||||||
|
}
|
||||||
|
|
||||||
.warning td {
|
.warning td {
|
||||||
color: #ff4949;
|
color: #ff4949;
|
||||||
}
|
}
|
||||||
|
|||||||
30
work/修改质检测试任务看板/01-项目功能内容.md
Normal file
30
work/修改质检测试任务看板/01-项目功能内容.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 01-项目功能内容
|
||||||
|
|
||||||
|
## 目标
|
||||||
|
|
||||||
|
根据 `doc/修改质检测试任务看板.docx` 调整质检测试任务看板页面:
|
||||||
|
|
||||||
|
- 页面文件:`src/views/TestTaskDashboard.vue`
|
||||||
|
- 页面标题保持:`质检测试任务看板`
|
||||||
|
- 顶部统计卡片移除“可执行任务数”和旧“加急任务数”。
|
||||||
|
- 顶部统计卡片新增“加急汇总”和“滞留汇总”。
|
||||||
|
- 左侧新增“测试任务汇总”,只统计“加急”和“滞留”,不展示“派工”和“齐套”。
|
||||||
|
- 左侧“测试任务汇总”下方展示“已完工任务”。
|
||||||
|
- 右侧展示“发货状态列表”和“测试装配任务列表”。
|
||||||
|
- 移除“在制任务缺件明细”展示,避免页面空位。
|
||||||
|
|
||||||
|
## 数据来源
|
||||||
|
|
||||||
|
- 测试装配任务:`质量管理_测试装配任务_查询`
|
||||||
|
- 质检及时率:`质量管理_测试装配任务_质检及时率`
|
||||||
|
- 已完工任务:`质量管理_测试装配任务_完成查询`
|
||||||
|
- 发货状态:`装配中心任务看板_质检发货状态查询`
|
||||||
|
- 滞留任务:`质量管理_及时检验报表_查询`
|
||||||
|
|
||||||
|
## 汇总口径
|
||||||
|
|
||||||
|
- 加急汇总:测试装配任务查询结果中 `加急总数` 或 `加急数量` 大于 0 的任务数。
|
||||||
|
- 滞留汇总:及时检验报表查询结果的任务行数。
|
||||||
|
- 测试任务汇总:按“阀类/系统类”分组展示加急和滞留数量。
|
||||||
|
- 待协助任务数:仍沿用测试装配任务中检测说明包含“返工”的待协助识别逻辑。
|
||||||
|
- 异常未关闭消息数:沿用测试装配任务结果中的异常未关闭数字段汇总。
|
||||||
34
work/修改质检测试任务看板/02-项目程序开发详细步骤.md
Normal file
34
work/修改质检测试任务看板/02-项目程序开发详细步骤.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# 02-项目程序开发详细步骤
|
||||||
|
|
||||||
|
1. 检查当前 Git 状态,确认已有 `index.vue` 等上一轮修改。
|
||||||
|
2. 按用户要求先上传上一轮已完成修改:
|
||||||
|
- 暂存并提交 `src/views/index.vue`、四张分类图片和 `gptlog-process/gpdlog.md`。
|
||||||
|
- 推送到 `origin/main`,提交号为 `765ed0a`。
|
||||||
|
3. 读取 `doc/修改质检测试任务看板.docx`。
|
||||||
|
4. 解包 docx 并读取 `word/document.xml`,提取需求文本。
|
||||||
|
5. 读取当前 `src/views/TestTaskDashboard.vue` 的模板、脚本和样式。
|
||||||
|
6. 读取参考页面:
|
||||||
|
- `src/views/index.vue`
|
||||||
|
- `C:\WorkYuanLy\MES_Manage_View_V20\src\views\QualityManagement\CheckTask\punctualInspection.vue`
|
||||||
|
- `C:\WorkYuanLy\MES_Manage_View_V20\src\views\QualityManagement\TestAssemblyTask\index.vue`
|
||||||
|
7. 修改模板布局:
|
||||||
|
- 左侧改为“测试任务汇总”和“已完工任务”。
|
||||||
|
- 右侧改为“发货状态列表”和“测试装配任务列表”。
|
||||||
|
- 删除页面上的“在制任务缺件明细”区域。
|
||||||
|
8. 修改数据查询:
|
||||||
|
- 新增 `质量管理_及时检验报表_查询` 查询作为滞留数据源。
|
||||||
|
- 恢复测试装配任务查询参数传递。
|
||||||
|
- 移除缺件明细查询入口。
|
||||||
|
9. 修改统计逻辑:
|
||||||
|
- 新增 `rawTestAssemblyRows` 和 `stagnationRows`。
|
||||||
|
- 新增 `testSummaryRows` 计算左侧汇总表。
|
||||||
|
- 新增 `isUrgentTask`、`getTaskGroupKey`、`countTestSummaryRows`。
|
||||||
|
10. 修改顶部统计卡片:
|
||||||
|
- 改为响应式 `reactive` 数组。
|
||||||
|
- 配置为待协助、加急汇总、滞留汇总、质检及时率、异常未关闭消息数。
|
||||||
|
11. 修改样式:
|
||||||
|
- 主区域改为左窄右宽布局。
|
||||||
|
- 为测试任务汇总表增加单独的项目、指标、数量样式。
|
||||||
|
12. 执行 `npm run build` 验证构建。
|
||||||
|
13. 创建 `work/修改质检测试任务看板`,复制原始 docx,并新增 README 与 01-07 文档。
|
||||||
|
14. 将完整中文执行日志追加到 `gptlog-process/gpdlog.md`。
|
||||||
16
work/修改质检测试任务看板/03-推进台账.md
Normal file
16
work/修改质检测试任务看板/03-推进台账.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# 03-推进台账
|
||||||
|
|
||||||
|
| 轮次 | 做了什么 | 修改文件 | 验证了什么 | 下一步 |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| 1 | 检查 Git 状态,识别上一轮待上传修改和本轮目标文件 | 无 | 确认 `TestTaskDashboard.vue` 存在未提交差异 | 先提交上一轮修改 |
|
||||||
|
| 2 | 提交并推送上一轮分类汇总看板修改 | `src/views/index.vue`、分类图片、`gptlog-process/gpdlog.md` | 推送成功到 `origin/main`,提交号 `765ed0a` | 读取本轮 docx |
|
||||||
|
| 3 | 解包并读取 `修改质检测试任务看板.docx` | 无 | 提取到页面布局和数据口径要求 | 读取参考页面 |
|
||||||
|
| 4 | 读取参考页面和当前页面实现 | 无 | 确认滞留数据源为 `质量管理_及时检验报表_查询` | 修改页面 |
|
||||||
|
| 5 | 重排质检测试任务看板布局 | `src/views/TestTaskDashboard.vue` | 左侧/右侧模块符合文档描述 | 补数据逻辑 |
|
||||||
|
| 6 | 新增加急、滞留、测试任务汇总计算 | `src/views/TestTaskDashboard.vue` | 加急和滞留统计可由对应接口结果计算 | 构建验证 |
|
||||||
|
| 7 | 执行构建 | 无 | `npm run build` 成功 | 创建 work 文档 |
|
||||||
|
| 8 | 创建本任务资料目录和 01-07 文档 | `work/修改质检测试任务看板/*` | 文档齐全,原始 docx 已复制 | 追加总日志 |
|
||||||
|
|
||||||
|
## 下一步建议
|
||||||
|
|
||||||
|
在连接真实数据库环境后,打开页面核对加急汇总、滞留汇总、测试任务汇总三处数字是否与业务报表一致。
|
||||||
15
work/修改质检测试任务看板/04-任务矩阵.md
Normal file
15
work/修改质检测试任务看板/04-任务矩阵.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# 04-任务矩阵
|
||||||
|
|
||||||
|
| 编号 | 任务 | 状态 | 验收标准 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| QT-001 | 前置上传上一轮修改 | 已完成 | `origin/main` 已包含提交 `765ed0a` |
|
||||||
|
| QT-002 | 读取并解析需求文档 | 已完成 | 提取出“去掉可执行/旧加急、新增加急汇总/滞留汇总、左侧测试任务汇总、右侧列表”等要求 |
|
||||||
|
| QT-003 | 调整页面布局 | 已完成 | 左侧为“测试任务汇总”和“已完工任务”,右侧为“发货状态列表”和“测试装配任务列表” |
|
||||||
|
| QT-004 | 移除缺件明细展示 | 已完成 | 页面模板不再展示“在制任务缺件明细” |
|
||||||
|
| QT-005 | 顶部统计卡片调整 | 已完成 | 顶部展示待协助、加急汇总、滞留汇总、质检及时率、异常未关闭 |
|
||||||
|
| QT-006 | 加急汇总统计 | 已完成 | 使用 `质量管理_测试装配任务_查询` 中 `加急总数/加急数量 > 0` 的任务数 |
|
||||||
|
| QT-007 | 滞留汇总统计 | 已完成 | 使用 `质量管理_及时检验报表_查询` 的结果行数 |
|
||||||
|
| QT-008 | 测试任务汇总表 | 已完成 | 按阀类/系统类分组展示加急和滞留,不展示派工和齐套 |
|
||||||
|
| QT-009 | 构建验证 | 已完成 | `npm run build` 成功 |
|
||||||
|
| QT-010 | work 文档归档 | 已完成 | README 和 01-07 文档已创建,原始 docx 已复制 |
|
||||||
|
| QT-011 | 中文过程日志追加 | 已完成 | 已追加到 `gptlog-process/gpdlog.md` |
|
||||||
40
work/修改质检测试任务看板/05-验收证据.md
Normal file
40
work/修改质检测试任务看板/05-验收证据.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# 05-验收证据
|
||||||
|
|
||||||
|
## 文件证据
|
||||||
|
|
||||||
|
- 页面文件:`C:\WorkYuanLy\装配任务看板\src\views\TestTaskDashboard.vue`
|
||||||
|
- 原始需求文档:`C:\WorkYuanLy\装配任务看板\doc\修改质检测试任务看板.docx`
|
||||||
|
- work 复制件:`C:\WorkYuanLy\装配任务看板\work\修改质检测试任务看板\修改质检测试任务看板.docx`
|
||||||
|
- 过程日志:`C:\WorkYuanLy\装配任务看板\gptlog-process\gpdlog.md`
|
||||||
|
|
||||||
|
## 命令证据
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
结果:上一轮修改已推送,远程从 `ea35196` 更新到 `765ed0a`。
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
结果:构建成功。
|
||||||
|
|
||||||
|
## 构建摘要
|
||||||
|
|
||||||
|
- Vite 成功转换 3701 个模块。
|
||||||
|
- 生成 `TestTaskDashboard-DQvHt1uq.js` 和 `TestTaskDashboard-KjO6IohD.css` 等产物。
|
||||||
|
- 构建存在常规警告:
|
||||||
|
- Sass legacy JS API deprecation warning。
|
||||||
|
- 部分 chunk 超过 500 kB。
|
||||||
|
- 上述警告未阻断构建。
|
||||||
|
|
||||||
|
## 页面验收点
|
||||||
|
|
||||||
|
- 顶部无“可执行任务数”和旧“加急任务数”。
|
||||||
|
- 顶部有“加急汇总”和“滞留汇总”。
|
||||||
|
- 左侧有“测试任务汇总”,指标仅为“加急”和“滞留”。
|
||||||
|
- 左侧汇总下方是“已完工任务”。
|
||||||
|
- 右侧上方是“发货状态列表”。
|
||||||
|
- 右侧下方是“测试装配任务列表”。
|
||||||
37
work/修改质检测试任务看板/06-决策记录.md
Normal file
37
work/修改质检测试任务看板/06-决策记录.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# 06-决策记录
|
||||||
|
|
||||||
|
## D-001:先提交上一轮修改
|
||||||
|
|
||||||
|
决策:在修改 `TestTaskDashboard.vue` 前,先提交并推送上一轮分类汇总看板修改。
|
||||||
|
|
||||||
|
原因:用户明确要求“先上传远程修改后”再进行本轮页面修改,避免两轮需求混在一个提交中。
|
||||||
|
|
||||||
|
## D-002:左侧测试任务汇总按阀类/系统类分组
|
||||||
|
|
||||||
|
决策:测试任务汇总沿用当前页面已有的“阀类/系统类”分类口径,只展示“加急”和“滞留”。
|
||||||
|
|
||||||
|
原因:需求文档要求参考 `index.vue`,但明确“不需要齐套和派工”;当前测试任务页面已有阀类/系统类识别逻辑,复用该分类最小且稳定。
|
||||||
|
|
||||||
|
## D-003:滞留数据使用及时检验报表
|
||||||
|
|
||||||
|
决策:新增 `质量管理_及时检验报表_查询`,并使用属性 `2` 查询装配相关及时检验报表数据。
|
||||||
|
|
||||||
|
原因:文档明确“滞留取值及时检验报表里面的任务数”,参考页面中属性 `2` 对应“装配”。
|
||||||
|
|
||||||
|
## D-004:加急数据使用测试装配任务查询结果
|
||||||
|
|
||||||
|
决策:加急汇总和测试任务汇总中的加急数量,使用 `质量管理_测试装配任务_查询` 返回结果中 `加急总数` 或 `加急数量` 大于 0 的任务数。
|
||||||
|
|
||||||
|
原因:文档明确“加急取值存储过程质量管理_测试装配任务_查询加急总数大于0的任务数”。
|
||||||
|
|
||||||
|
## D-005:移除缺件明细而不是隐藏空区域
|
||||||
|
|
||||||
|
决策:模板中移除“在制任务缺件明细”面板,主区域重新分配为左右两列各两个面板。
|
||||||
|
|
||||||
|
原因:文档要求“注释掉在制任务缺件明细”且“页面不能有空着的位置,合理安排”。移除面板并重排布局可以避免空白区域。
|
||||||
|
|
||||||
|
## D-006:顶部统计数组改为 reactive
|
||||||
|
|
||||||
|
决策:将 `summaryCards` 从普通数组改为 `reactive` 数组。
|
||||||
|
|
||||||
|
原因:接口返回后会直接写入卡片值,响应式数组能确保卡片数字稳定刷新。
|
||||||
9
work/修改质检测试任务看板/07-执行过程日志.md
Normal file
9
work/修改质检测试任务看板/07-执行过程日志.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# 07-执行过程日志
|
||||||
|
|
||||||
|
完整中文执行过程日志已按要求追加到:
|
||||||
|
|
||||||
|
```text
|
||||||
|
C:\WorkYuanLy\装配任务看板\gptlog-process\gpdlog.md
|
||||||
|
```
|
||||||
|
|
||||||
|
本文件作为 work 目录索引的一部分,记录日志落点,便于后续按任务矩阵继续推进。
|
||||||
16
work/修改质检测试任务看板/README.md
Normal file
16
work/修改质检测试任务看板/README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# 修改质检测试任务看板
|
||||||
|
|
||||||
|
## 索引
|
||||||
|
|
||||||
|
- `修改质检测试任务看板.docx`:原始需求文档复制件。
|
||||||
|
- `01-项目功能内容.md`:本次看板功能目标、数据来源和页面结构。
|
||||||
|
- `02-项目程序开发详细步骤.md`:从读取文档到修改、验证的开发步骤。
|
||||||
|
- `03-推进台账.md`:每轮推进内容、修改文件、验证和下一步。
|
||||||
|
- `04-任务矩阵.md`:任务编号、状态、验收标准,避免重复执行。
|
||||||
|
- `05-验收证据.md`:构建命令、提交、文件路径等证据。
|
||||||
|
- `06-决策记录.md`:关键实现决策及原因。
|
||||||
|
- `07-执行过程日志.md`:说明完整中文执行日志已追加到 `gptlog-process/gpdlog.md`。
|
||||||
|
|
||||||
|
## 当前状态
|
||||||
|
|
||||||
|
已完成 `src/views/TestTaskDashboard.vue` 页面修改,并通过 `npm run build` 验证。前置的分类汇总看板修改已先推送到远程 `origin/main`,提交号 `765ed0a`。
|
||||||
BIN
work/修改质检测试任务看板/修改质检测试任务看板.docx
Normal file
BIN
work/修改质检测试任务看板/修改质检测试任务看板.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user