@@ -191,15 +191,15 @@
>
-
+
- 查看
-
+
- 查看
diff --git a/src/views/ProductionManagement/DesignReportTask/Check/index.vue b/src/views/ProductionManagement/DesignReportTask/Check/index.vue
index 320296f..2b73490 100644
--- a/src/views/ProductionManagement/DesignReportTask/Check/index.vue
+++ b/src/views/ProductionManagement/DesignReportTask/Check/index.vue
@@ -5,9 +5,43 @@
任务ID:
项目号:
-
+
+
+
物料编码:
-
+
+
+
+ 类别:
+
操作人:
开始日期:
@@ -21,7 +55,7 @@
查询
- 批量校验
+ 批量校验
+
@@ -54,11 +89,13 @@
-
+
-
- {{ scope.row.已校验 ? '已校验' : '校验' }}
-
+
+
+ {{ scope.row.已校验 ? '已校验' : '校验' }}
+
+
@@ -112,10 +149,13 @@ export default {
dialogVisible: false,
tableData: [],
multipleSelection: [],
+ projectOptions: [],
+ materialOptions: [],
searchForm: {
did: '',
projectNo: '',
itemCode: '',
+ category: '',
operator: '',
startDate: '',
endDate: '',
@@ -147,14 +187,28 @@ export default {
}
},
created() {
+ this.loadDefaultProjectOptions()
+ this.loadDefaultMaterialOptions()
this.searchTable()
},
methods: {
+ loadDefaultProjectOptions() {
+ this.queryProjects('')
+ },
+ loadDefaultMaterialOptions() {
+ this.queryMaterialOptions('')
+ },
+ handleProjectVisibleChange(visible) {
+ if (visible && this.projectOptions.length === 0) {
+ this.loadDefaultProjectOptions()
+ }
+ },
buildSearchParams() {
return [
['DID', this.searchForm.did || 0],
['项目号', this.searchForm.projectNo || ''],
['物料编码', this.searchForm.itemCode || ''],
+ ['类别', this.searchForm.category || ''],
['操作人', this.searchForm.operator || ''],
['开始日期', this.searchForm.startDate || ''],
['结束日期', this.searchForm.endDate || ''],
@@ -174,6 +228,24 @@ export default {
this.loading = false
}
},
+ async queryProjects(query) {
+ const data = this.CreateData('11', '设计报工_项目查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.projectOptions = response.data || []
+ } catch (error) {
+ this.projectOptions = []
+ }
+ },
+ async queryMaterialOptions(query) {
+ const data = this.CreateData('11', '设计报工_物料查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.materialOptions = response.data || []
+ } catch (error) {
+ this.materialOptions = []
+ }
+ },
handleSelectionChange(selection) {
this.multipleSelection = selection
},
@@ -261,6 +333,12 @@ export default {
},
currentUserName() {
return (this.$store && this.$store.getters && this.$store.getters.name) || ''
+ },
+ formatMaterialLabel(item) {
+ return item.物料名称 ? `${item.物料编码} | ${item.物料名称}` : item.物料编码
+ },
+ formatProjectLabel(item) {
+ return item.项目名称 ? `${item.项目号} | ${item.项目名称}` : item.项目号
}
}
}
@@ -278,4 +356,24 @@ export default {
.show-text {
margin-right: 4px;
}
+
+.design-action-buttons {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: nowrap;
+ gap: 10px;
+ width: 100%;
+ white-space: nowrap;
+}
+
+.design-action-buttons ::v-deep .el-button {
+ margin: 0;
+ padding: 0;
+ min-width: 32px;
+}
+
+.design-action-buttons ::v-deep .el-button + .el-button {
+ margin-left: 0;
+}
diff --git a/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue b/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue
index 626b3e4..86cdf83 100644
--- a/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue
+++ b/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue
@@ -23,9 +23,43 @@
操作人:
项目号:
-
+
+
+
物料编码:
-
+
+
+
+ 类别:
+
任务ID:
查询
@@ -54,6 +88,7 @@
+
@@ -80,12 +115,15 @@ export default {
return {
loading: false,
tableData: [],
+ projectOptions: [],
+ materialOptions: [],
searchForm: {
startDate: '',
endDate: '',
operator: '',
projectNo: '',
itemCode: '',
+ category: '',
did: ''
}
}
@@ -97,9 +135,22 @@ export default {
}
},
created() {
+ this.loadDefaultProjectOptions()
+ this.loadDefaultMaterialOptions()
this.searchTable()
},
methods: {
+ loadDefaultProjectOptions() {
+ this.queryProjects('')
+ },
+ loadDefaultMaterialOptions() {
+ this.queryMaterialOptions('')
+ },
+ handleProjectVisibleChange(visible) {
+ if (visible && this.projectOptions.length === 0) {
+ this.loadDefaultProjectOptions()
+ }
+ },
buildSearchParams() {
return [
['开始日期', this.searchForm.startDate || ''],
@@ -107,6 +158,7 @@ export default {
['操作人', this.searchForm.operator || ''],
['项目号', this.searchForm.projectNo || ''],
['物料编码', this.searchForm.itemCode || ''],
+ ['类别', this.searchForm.category || ''],
['DID', this.searchForm.did || 0]
]
},
@@ -123,6 +175,24 @@ export default {
this.loading = false
}
},
+ async queryProjects(query) {
+ const data = this.CreateData('11', '设计报工_项目查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.projectOptions = response.data || []
+ } catch (error) {
+ this.projectOptions = []
+ }
+ },
+ async queryMaterialOptions(query) {
+ const data = this.CreateData('11', '设计报工_物料查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.materialOptions = response.data || []
+ } catch (error) {
+ this.materialOptions = []
+ }
+ },
buildTree(rows) {
const personMap = new Map()
const dateMap = new Map()
@@ -154,13 +224,19 @@ export default {
getTreeTitle(row) {
if (row.Level === 1) return row.操作人 || '未填写操作人'
if (row.Level === 2) return row.工作日期 ? `日期 ${row.工作日期}` : '未填写日期'
- return row.任务描述 || `${row.DID || ''}`
+ return row.类别 ? `${row.类别} | ${row.任务描述 || row.DID || ''}` : (row.任务描述 || `${row.DID || ''}`)
},
formatHours(value) {
if (value === null || value === undefined || value === '') return ''
const numberValue = Number(value)
if (Number.isNaN(numberValue)) return ''
return numberValue.toFixed(2)
+ },
+ formatMaterialLabel(item) {
+ return item.物料名称 ? `${item.物料编码} | ${item.物料名称}` : item.物料编码
+ },
+ formatProjectLabel(item) {
+ return item.项目名称 ? `${item.项目号} | ${item.项目名称}` : item.项目号
}
}
}
diff --git a/src/views/ProductionManagement/DesignReportTask/Report/index.vue b/src/views/ProductionManagement/DesignReportTask/Report/index.vue
index 35e36fa..3fcc330 100644
--- a/src/views/ProductionManagement/DesignReportTask/Report/index.vue
+++ b/src/views/ProductionManagement/DesignReportTask/Report/index.vue
@@ -5,13 +5,62 @@
任务ID:
项目号:
-
+
+
+
物料编码:
-
+
+
+
图号:
父件编码:
-
+
+
+
+ 类别:
+
状态:
@@ -42,20 +91,24 @@
+
+
-
+
- 开始
- 结束
- 完成
+
+ 开始
+ 结束
+ 完成
+
@@ -71,32 +124,53 @@ export default {
loading: false,
actionLoading: false,
tableData: [],
+ projectOptions: [],
+ materialOptions: [],
+ parentMaterialOptions: [],
searchForm: {
did: '',
projectNo: '',
itemCode: '',
drawingNo: '',
parentItemCode: '',
+ category: '',
status: ''
}
}
},
created() {
+ this.loadDefaultProjectOptions()
+ this.loadDefaultMaterialOptions()
this.searchTable()
},
methods: {
+ loadDefaultProjectOptions() {
+ this.queryProjects('')
+ },
+ loadDefaultMaterialOptions() {
+ this.queryMaterialOptions('')
+ this.queryParentMaterialOptions('')
+ },
+ handleProjectVisibleChange(visible) {
+ if (visible && this.projectOptions.length === 0) {
+ this.loadDefaultProjectOptions()
+ }
+ },
buildSearchParams() {
return [
['DID', this.searchForm.did || 0],
['项目号', this.searchForm.projectNo || ''],
['物料编码', this.searchForm.itemCode || ''],
['图号', this.searchForm.drawingNo || ''],
+ ['类别', this.searchForm.category || ''],
['关联父件物料编码', this.searchForm.parentItemCode || ''],
['预计开始时间_Start', ''],
['预计开始时间_End', ''],
['预计结束时间_Start', ''],
['预计结束时间_End', ''],
- ['单据状态', this.searchForm.status || '']
+ ['单据状态', this.searchForm.status || ''],
+ ['当前操作人ID', this.currentUserId()],
+ ['当前操作人', this.currentUserName()]
]
},
async searchTable() {
@@ -112,18 +186,57 @@ export default {
this.loading = false
}
},
+ async queryProjects(query) {
+ const data = this.CreateData('11', '设计报工_项目查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.projectOptions = response.data || []
+ } catch (error) {
+ this.projectOptions = []
+ }
+ },
+ async queryMaterialOptions(query) {
+ const data = this.CreateData('11', '设计报工_物料查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.materialOptions = response.data || []
+ } catch (error) {
+ this.materialOptions = []
+ }
+ },
+ async queryParentMaterialOptions(query) {
+ const data = this.CreateData('11', '设计报工_物料查询', [['过滤', query || '']])
+ try {
+ const response = await this.ExecDatabase(data)
+ this.parentMaterialOptions = response.data || []
+ } catch (error) {
+ this.parentMaterialOptions = []
+ }
+ },
canStart(row) {
- return row.单据状态 !== '已完成' && Number(row.未结束报工数 || 0) === 0
+ return row.单据状态 !== '已完成' && Number(row.当前用户未结束报工数 || 0) === 0
},
canEnd(row) {
- return row.单据状态 !== '已完成' && Number(row.未结束报工数 || 0) > 0
+ return Number(row.当前用户未结束报工数 || 0) > 0
},
canComplete(row) {
- return row.单据状态 !== '已完成' && Number(row.未结束报工数 || 0) === 0 && Number(row.报工次数 || 0) > 0
+ return row.单据状态 !== '已完成' && Number(row.报工次数 || 0) > 0
},
- startTask(row) {
+ async startTask(row) {
+ const latest = await this.getLatestTask(row.DID)
+ if (!latest) return
+ Object.assign(row, latest)
+ if (latest.单据状态 === '已完成') {
+ this.$message.error('任务已完成,不能开始')
+ this.searchTable()
+ return
+ }
+ if (Number(latest.当前用户未结束报工数 || 0) > 0) {
+ this.$message.warning('当前人员已存在未结束的报工记录')
+ return
+ }
this.runAction('设计报工_任务_开始', [
- ['DID', row.DID],
+ ['DID', latest.DID],
['操作人ID', this.currentUserId()],
['操作人', this.currentUserName()]
], '开始成功')
@@ -135,16 +248,65 @@ export default {
['操作人', this.currentUserName()]
], '结束成功')
},
- completeTask(row) {
- this.$confirm(`确定完成设计任务 DID ${row.DID} 吗?`, '提示', { type: 'warning' })
+ async completeTask(row) {
+ const latest = await this.getLatestTask(row.DID)
+ if (!latest) return
+ Object.assign(row, latest)
+ if (Number(latest.未结束报工数 || 0) > 0) {
+ const people = latest.未结束报工人员 || '有人员'
+ this.$message.warning(`${people} 还未点击结束,不能完成任务`)
+ return
+ }
+ if (latest.单据状态 === '已完成') {
+ this.$message.warning('任务已完成')
+ this.searchTable()
+ return
+ }
+ if (!this.canComplete(latest)) {
+ this.$message.warning('任务未产生已结束报工,不能完成')
+ return
+ }
+ this.$confirm(`确定完成设计任务 DID ${latest.DID} 吗?`, '提示', { type: 'warning' })
.then(() => {
this.runAction('设计报工_任务_完成', [
- ['DID', row.DID],
+ ['DID', latest.DID],
['操作人', this.currentUserName()]
], '完成成功')
})
.catch(() => {})
},
+ async getLatestTask(did) {
+ const params = [
+ ['DID', did || 0],
+ ['项目号', ''],
+ ['物料编码', ''],
+ ['图号', ''],
+ ['类别', ''],
+ ['关联父件物料编码', ''],
+ ['预计开始时间_Start', ''],
+ ['预计开始时间_End', ''],
+ ['预计结束时间_Start', ''],
+ ['预计结束时间_End', ''],
+ ['单据状态', ''],
+ ['当前操作人ID', this.currentUserId()],
+ ['当前操作人', this.currentUserName()]
+ ]
+ const data = this.CreateData('11', '设计报工_任务_查询', params)
+ try {
+ const response = await this.ExecDatabase(data)
+ const rows = response.data || []
+ if (rows.length === 0) {
+ this.$message.error('任务不存在或已被删除')
+ this.searchTable()
+ return null
+ }
+ return rows[0]
+ } catch (error) {
+ console.error('设计报工任务实时查询失败:', error)
+ this.$message.error('完成前校验失败')
+ return null
+ }
+ },
async runAction(procedure, params, defaultMessage) {
if (this.actionLoading) return
this.actionLoading = true
@@ -177,6 +339,12 @@ export default {
currentUserName() {
return (this.$store && this.$store.getters && this.$store.getters.name) || ''
},
+ formatMaterialLabel(item) {
+ return item.物料名称 ? `${item.物料编码} | ${item.物料名称}` : item.物料编码
+ },
+ formatProjectLabel(item) {
+ return item.项目名称 ? `${item.项目号} | ${item.项目名称}` : item.项目号
+ },
getStatusType(status) {
if (status === '已完成') return 'success'
if (status === '执行中') return 'warning'
@@ -199,4 +367,24 @@ export default {
.show-text {
margin-right: 4px;
}
+
+.design-action-buttons {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: nowrap;
+ gap: 10px;
+ width: 100%;
+ white-space: nowrap;
+}
+
+.design-action-buttons ::v-deep .el-button {
+ margin: 0;
+ padding: 0;
+ min-width: 32px;
+}
+
+.design-action-buttons ::v-deep .el-button + .el-button {
+ margin-left: 0;
+}
diff --git a/src/views/ProductionManagement/DesignReportTask/Task/index.vue b/src/views/ProductionManagement/DesignReportTask/Task/index.vue
index f152d0c..551d034 100644
--- a/src/views/ProductionManagement/DesignReportTask/Task/index.vue
+++ b/src/views/ProductionManagement/DesignReportTask/Task/index.vue
@@ -13,8 +13,10 @@
:remote-method="queryProjects"
size="small"
style="width: 150px; margin-right: 8px"
+ @clear="loadDefaultProjectOptions"
+ @visible-change="handleProjectVisibleChange"
>
-
+
物料编码:
+ 类别:
+
状态:
@@ -120,6 +124,7 @@
+
@@ -133,10 +138,12 @@
-
+
- 编辑
- 删除
+
+ 编辑
+ 删除
+
@@ -165,15 +172,16 @@
-
+
@@ -199,7 +207,7 @@
-
+
@@ -207,9 +215,14 @@
+
+
+
+
+
-
+
@@ -234,7 +247,7 @@
-
+
@@ -318,6 +331,7 @@ export default {
itemCode: '',
drawingNo: '',
parentItemCode: '',
+ category: '',
planStartFrom: '',
planStartTo: '',
planEndFrom: '',
@@ -327,14 +341,14 @@ export default {
formData: this.getEmptyForm(),
rules: {
物料编码: [{ required: true, message: '请选择物料编码', trigger: 'change' }],
- 任务描述: [{ required: true, message: '请输入任务描述', trigger: 'blur' }],
- assigneeIds: [{ type: 'array', required: true, message: '请选择指派对象', trigger: 'change' }]
+ 任务描述: [{ required: true, message: '请输入任务描述', trigger: 'blur' }]
}
}
},
created() {
- this.queryProjects('')
+ this.loadDefaultProjectOptions()
this.queryPersonnel('')
+ this.loadDefaultMaterialOptions()
this.searchTable()
},
methods: {
@@ -345,6 +359,7 @@ export default {
物料编码: '',
物料名称: '',
图号: '',
+ 类别: '',
任务描述: '',
关联父件物料编码: '',
关联父件物料名称: '',
@@ -366,6 +381,7 @@ export default {
['项目号', this.searchForm.projectNo || ''],
['物料编码', this.searchForm.itemCode || ''],
['图号', this.searchForm.drawingNo || ''],
+ ['类别', this.searchForm.category || ''],
['关联父件物料编码', this.searchForm.parentItemCode || ''],
['预计开始时间_Start', this.searchForm.planStartFrom || ''],
['预计开始时间_End', this.searchForm.planStartTo || ''],
@@ -390,6 +406,8 @@ export default {
openAdd() {
this.isEdit = false
this.formData = this.getEmptyForm()
+ this.loadDefaultProjectOptions()
+ this.loadDefaultMaterialOptions()
this.dialogVisible = true
this.$nextTick(() => this.$refs.taskForm && this.$refs.taskForm.clearValidate())
},
@@ -412,9 +430,23 @@ export default {
}
})
}
+ this.loadDefaultProjectOptions()
+ this.loadDefaultMaterialOptions()
this.dialogVisible = true
this.$nextTick(() => this.$refs.taskForm && this.$refs.taskForm.clearValidate())
},
+ loadDefaultProjectOptions() {
+ this.queryProjects('')
+ },
+ loadDefaultMaterialOptions() {
+ this.queryMaterialOptions('')
+ this.queryParentMaterialOptions('')
+ },
+ handleProjectVisibleChange(visible) {
+ if (visible && this.projectOptions.length === 0) {
+ this.loadDefaultProjectOptions()
+ }
+ },
submitForm() {
this.$refs.taskForm.validate(async valid => {
if (!valid) return
@@ -447,6 +479,7 @@ export default {
params.push(['物料编码', this.formData.物料编码 || ''])
params.push(['物料名称', this.formData.物料名称 || ''])
params.push(['图号', this.formData.图号 || ''])
+ params.push(['类别', this.formData.类别 || ''])
params.push(['任务描述', this.formData.任务描述 || ''])
params.push(['关联父件物料编码', this.formData.关联父件物料编码 || ''])
params.push(['关联父件物料名称', this.formData.关联父件物料名称 || ''])
@@ -464,18 +497,68 @@ export default {
deleteTask(row) {
this.$confirm(`确定删除设计任务 DID ${row.DID} 吗?已有报工记录的任务不能删除。`, '提示', { type: 'warning' })
.then(async () => {
- const data = this.CreateData('12', '设计报工_任务_删除', [['DID', row.DID]])
- const response = await this.ExecDatabase(data)
- const result = this.getResult(response)
- if (String(result.result) === '1') {
- this.$message.success(result.message || '删除成功')
+ const latest = await this.getLatestTask(row.DID)
+ if (!latest) return
+ Object.assign(row, latest)
+ const blockMessage = this.getDeleteBlockMessage(latest)
+ if (blockMessage) {
+ this.$message.error(blockMessage)
this.searchTable()
- } else {
- this.$message.error(result.message || '删除失败')
+ return
+ }
+ try {
+ const data = this.CreateData('12', '设计报工_任务_删除', [['DID', row.DID]])
+ const response = await this.ExecDatabase(data)
+ const result = this.getResult(response)
+ if (String(result.result) === '1') {
+ this.$message.success(result.message || '删除成功')
+ this.searchTable()
+ } else {
+ this.$message.error(result.message || '删除失败')
+ }
+ } catch (error) {
+ console.error('设计任务删除失败:', error)
+ this.$message.error('删除失败')
}
})
.catch(() => {})
},
+ async getLatestTask(did) {
+ const params = [
+ ['DID', did || 0],
+ ['项目号', ''],
+ ['物料编码', ''],
+ ['图号', ''],
+ ['类别', ''],
+ ['关联父件物料编码', ''],
+ ['预计开始时间_Start', ''],
+ ['预计开始时间_End', ''],
+ ['预计结束时间_Start', ''],
+ ['预计结束时间_End', ''],
+ ['单据状态', '']
+ ]
+ const data = this.CreateData('11', '设计报工_任务_查询', params)
+ try {
+ const response = await this.ExecDatabase(data)
+ const rows = response.data || []
+ if (rows.length === 0) {
+ this.$message.error('删除失败:任务不存在或已被删除')
+ this.searchTable()
+ return null
+ }
+ return rows[0]
+ } catch (error) {
+ console.error('设计任务删除前查询失败:', error)
+ this.$message.error('删除失败')
+ return null
+ }
+ },
+ getDeleteBlockMessage(row) {
+ if (Number(row.报工次数 || 0) > 0) return '删除失败:该任务已有设计报工记录,不能删除'
+ if (row.单据状态 === '已完成') return '删除失败:任务已完成,不能删除'
+ if (row.单据状态 && row.单据状态 !== '待开始') return `删除失败:任务状态为${row.单据状态},不能删除`
+ return ''
+ },
async queryProjects(query) {
const data = this.CreateData('11', '设计报工_项目查询', [['过滤', query || '']])
try {
@@ -528,6 +611,9 @@ export default {
formatMaterialLabel(item) {
return item.物料名称 ? `${item.物料编码} | ${item.物料名称}` : item.物料编码
},
+ formatProjectLabel(item) {
+ return item.项目名称 ? `${item.项目号} | ${item.项目名称}` : item.项目号
+ },
formatPersonLabel(item) {
return item.账号 ? `${item.人员姓名} | ${item.账号}` : item.人员姓名
},
@@ -572,6 +658,26 @@ export default {
color: #606266;
}
+.design-action-buttons {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: nowrap;
+ gap: 10px;
+ width: 100%;
+ white-space: nowrap;
+}
+
+.design-action-buttons ::v-deep .el-button {
+ margin: 0;
+ padding: 0;
+ min-width: 32px;
+}
+
+.design-action-buttons ::v-deep .el-button + .el-button {
+ margin-left: 0;
+}
+
.danger-action {
color: #f56c6c;
}
diff --git a/work/DeviceManagement/DeviceInformation/01-项目功能内容.md b/work/DeviceManagement/DeviceInformation/01-项目功能内容.md
deleted file mode 100644
index 6d25571..0000000
--- a/work/DeviceManagement/DeviceInformation/01-项目功能内容.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# 01-项目功能内容
-
-## 页面
-
-- 页面路径:`src/views/DeviceManagement/DeviceInformation/index.vue`
-- 菜单/模块:设备管理 / 设备信息维护
-- 原始文档:`doc/修改设备信息维护.docx`
-
-## 本轮功能范围
-
-1. 设备信息维护列表新增字段展示:
- - 设备名称:来自 Excel `名称`,数据库字段 `名称`
- - 公司编码(财务)
- - 生产用名:复用原 `设备名称`
- - 规格/型号:复用原 `设备型号`
- - 设备信息
- - 使用部门
- - 入账日期
- - 单位
- - 数量
- - 状态
- - 维修记录
- - 维保记录
- - 工位绑定
- - 主要设备
- - 设备标准开机工时(小时)
- - 特种设备
- - 证书有效期至
-
-2. 设备新增/编辑弹窗新增对应维护字段。
-
-3. 公司编码(财务):
- - 新增时必填。
- - 编辑时前端置灰不可修改。
- - 后端编辑过程不更新公司编码,避免绕过前端改动。
-
-4. 工位绑定:
- - 使用多选下拉。
- - 选项来源:`MES_登录_工位与名称_查询`,即工位管理数据。
- - 数据库存储为逗号分隔的工位号。
-
-5. 主要设备、特种设备:
- - 下拉选项为“是/否”。
-
-6. 证书有效期至:
- - 日期选择。
- - 已过期:表格行红色背景并置顶。
- - 30 天内到期:表格行黄色背景并靠前。
- - 其他数据正常排序在后。
-
-## 数据库对象
-
-- 表:`dbo.基础数据_设备工位点检表`
-- 查询过程:`dbo.设备管理_设备信息_查询`
-- 新增过程:`dbo.设备管理_设备信息_增加`
-- 编辑过程:`dbo.设备管理_设备信息_编辑`
-- 删除过程:`dbo.设备管理_设备信息_删除`,本轮未改。
-- 增量脚本:`db_backups/update_device_information_maintenance_20260629.sql`
-- 设备名称字段与 Excel 导入脚本:`db_backups/add_device_name_and_import_excel_20260629.sql`
-- Excel 日期修正脚本:`db_backups/fix_device_excel_import_dates_20260629.sql`
-- 新增过程提示文本修正脚本:`db_backups/fix_device_add_company_code_message_20260629.sql`
diff --git a/work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md b/work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md
deleted file mode 100644
index 502ff4c..0000000
--- a/work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 02-项目程序开发详细步骤
-
-## 1. 需求解析
-
-1. 从 `doc/修改设备信息维护.docx` 提取文字需求。
-2. 确认目标页面为 `src/views/DeviceManagement/DeviceInformation/index.vue`。
-3. 确认工位数据来源为 `MES_登录_工位与名称_查询`,与系统工位管理保持一致。
-
-## 2. 数据库开发
-
-1. 连接目标库 `192.168.2.92 / YL_MESDB`。
-2. 查询 `dbo.基础数据_设备工位点检表`,确认原表仅有旧字段。
-3. 新增增量脚本 `db_backups/update_device_information_maintenance_20260629.sql`。
-4. 脚本内容:
- - 使用 `COL_LENGTH` 判断字段是否存在,保证可重复执行。
- - 新增设备档案字段:公司编码、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至。
- - 更新 `设备管理_设备信息_查询`,返回新字段并按证书有效期预警排序。
- - 更新 `设备管理_设备信息_增加`,写入新增字段,并校验公司编码不能为空。
- - 更新 `设备管理_设备信息_编辑`,更新新增字段,但不更新公司编码。
-5. 使用 `sqlcmd -f 65001` 执行脚本,避免中文脚本编码问题。
-
-## 3. 前端开发
-
-1. 重写设备信息维护页面表格列,字段名与数据库返回保持一致。
-2. 扩展新增/编辑表单字段。
-3. 新增 `stationOptions`,通过 `MES_登录_工位与名称_查询` 加载工位管理数据。
-4. 工位绑定使用 `el-select multiple collapse-tags`。
-5. 新增 `emptyForm`,统一新增和重置表单默认值。
-6. 新增 `buildSubmitParams`,统一组装新增/编辑参数。
-7. 新增 `getCertificateLevel`、`tableRowClassName`、`sortedTableData`:
- - 过期为 0,置顶并红色。
- - 30 天内为 1,靠前并黄色。
- - 其他为 2。
-8. 表格使用横向宽度自动撑开,并固定操作列,适配新增多列。
-
-## 4. 验证
-
-1. 数据库字段验证:查询 `sys.columns`。
-2. 存储过程参数验证:查询 `sys.parameters`。
-3. 查询过程验证:执行 `EXEC dbo.[设备管理_设备信息_查询]`。
-4. 前端构建验证:执行 `npm run build`。
-5. 工作文档归档:复制原始 docx 到 `work/DeviceManagement/DeviceInformation` 并补齐 README 与 01-06 文档。
-
-## 5. 设备信息 Excel 导入
-
-1. 读取 `doc/设备信息.xlsx`,确认 Sheet1 共 89 行数据。
-2. 新增数据库字段 `名称`,用于保存 Excel `名称` 列;原字段 `设备名称` 继续保存 Excel `生产用名`。
-3. 更新设备信息维护页面:
- - 列表新增“设备名称”列,对应数据库字段 `名称`。
- - 新增/编辑弹窗新增“设备名称”输入框。
- - 提交参数增加 `名称`。
-4. 新增脚本 `db_backups/add_device_name_and_import_excel_20260629.sql`:
- - `COL_LENGTH` 判断并新增 `名称` 字段。
- - 更新新增/编辑存储过程参数和写入逻辑。
- - 使用 `MERGE` 按 `公司编码` 导入或更新 89 行 Excel 数据,避免重复导入。
-5. 首次导入后发现 Excel 日期对象受时区影响,部分入账日期早一天;新增 `db_backups/fix_device_excel_import_dates_20260629.sql`,按 Excel 单元格显示值修正入账日期。
-6. 新增 `db_backups/fix_device_add_company_code_message_20260629.sql`,只重新发布新增过程,修正“公司编码不能为空”提示文本,避免重新执行整份导入脚本覆盖已修正日期。
-7. 使用 `sqlcmd -f 65001` 执行数据库脚本,验证总数、样例数据和存储过程文本。
diff --git a/work/DeviceManagement/DeviceInformation/03-推进台账.md b/work/DeviceManagement/DeviceInformation/03-推进台账.md
deleted file mode 100644
index fa431f0..0000000
--- a/work/DeviceManagement/DeviceInformation/03-推进台账.md
+++ /dev/null
@@ -1,185 +0,0 @@
-# 03-推进台账
-
-## 2026-06-29 第 1 轮:设备信息维护页面和数据库扩展
-
-### 做了什么
-
-- 解析 `doc/修改设备信息维护.docx`。
-- 确认目标页面 `src/views/DeviceManagement/DeviceInformation/index.vue`。
-- 确认工位绑定选项来源为 `MES_登录_工位与名称_查询`。
-- 连接目标数据库并确认旧表结构缺少需求字段。
-- 新增数据库增量脚本并同步到 `YL_MESDB`。
-- 修改设备信息维护前端页面。
-- 创建 `work/DeviceManagement/DeviceInformation` 工作目录并复制需求文档。
-- 新增 README、功能内容、开发步骤、推进台账、任务矩阵、验收证据、决策记录。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `db_backups/update_device_information_maintenance_20260629.sql`
-- `work/DeviceManagement/DeviceInformation/修改设备信息维护.docx`
-- `work/DeviceManagement/DeviceInformation/README.md`
-- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md`
-- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
-- `work/DeviceManagement/DeviceInformation/06-决策记录.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- `sqlcmd` 连接目标库成功。
-- 新增字段已存在于 `dbo.基础数据_设备工位点检表`。
-- `设备管理_设备信息_查询/增加/编辑` 参数已更新。
-- 查询过程可执行。
-- `npm run build` 通过,仅有既有体积和 Browserslist 过期警告。
-
-### 下一步
-
-- 进入真实系统页面做新增、编辑、证书有效期颜色排序的人工验收。
-- 如果现场要求“公司编码”历史数据也必填,需要补历史数据清洗或唯一性规则。
-
-## 2026-06-29 第 2 轮:取消设备类型必填
-
-### 做了什么
-
-- 根据用户反馈,去掉设备信息维护新增/编辑表单中“设备类型”的必填校验。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- 代码层确认 `rules` 中已移除 `设备类型` 必填规则。
-
-### 下一步
-
-- 如需严格验证,可再次执行 `npm run build` 或进入页面直接新增无设备类型的设备记录。
-
-## 2026-06-29 第 3 轮:修复入账日期和证书有效期编辑报错
-
-### 做了什么
-
-- 修复设备编辑时 `入账日期`、`证书有效期至` 无法修改的问题。
-- 前端提交日期时改为传 `yyyy-MM-dd` 字符串或空字符串。
-- 数据库新增修复脚本,将新增/编辑过程的两个日期入参改为 `nvarchar(50)`,在过程内使用 `TRY_CONVERT(date, NULLIF(..., ''))` 转换。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `db_backups/fix_device_information_date_edit_20260629.sql`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- 执行修复 SQL 到 `192.168.2.92 / YL_MESDB` 成功。
-- 验证 `设备管理_设备信息_增加/编辑` 的 `@入账日期`、`@证书有效期至` 参数已变更为 `nvarchar`。
-- 直接执行 `设备管理_设备信息_编辑`,传入正常日期 `2026-07-01`、`2026-07-31`,返回 `result=1` 且数据库日期更新成功。
-- 直接执行 `设备管理_设备信息_编辑`,传入空字符串日期,返回 `result=1` 且数据库日期保存为 `NULL`。
-
-### 下一步
-
-- 到真实页面再执行一次编辑日期和清空日期的人工验收。
-
-## 2026-06-29 第 4 轮:修复日期控件点击报错
-
-### 做了什么
-
-- 针对页面点击日期时报 `date.getHours is not a function` 的问题,修正前端日期控件绑定方式。
-- 去掉 `el-date-picker` 的 `value-format="yyyy-MM-dd"`,让 Element UI 日期控件内部绑定 `Date` 对象。
-- 编辑回填时使用 `parseDateValue` 将数据库日期转换为本地 `Date` 对象。
-- 提交时继续通过 `dateParam` 格式化为 `yyyy-MM-dd` 字符串,兼容已修复的数据库过程。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- 代码层确认两个 `el-date-picker` 已移除 `value-format`。
-- 代码层确认编辑回填日期使用 `parseDateValue` 返回 `Date` 对象。
-- 执行 `npm run build` 通过,仅有既有资源体积和 Browserslist 过期警告。
-
-### 下一步
-
-- 在真实页面点击日期面板并选择新日期,确认不再出现 `date.getHours is not a function`。
-
-## 2026-06-29 第 5 轮:修复编辑弹窗日期不回填
-
-### 做了什么
-
-- 确认数据库和列表数据有值;同时恢复测试记录 `设备流水号=1` 的日期为 `2026-07-01`、`2026-07-31`。
-- 增强 `formatDate` 和 `parseDateValue`,兼容 `yyyy-MM-dd`、`yyyy-MM-dd HH:mm:ss`、`yyyy/MM/dd`、`/Date(...)`、`Date` 对象等返回格式。
-- 将新增表单日期默认值从空字符串改为 `null`,符合 Element UI 日期控件空值约定。
-- 编辑回填时不再整体替换 `form` 对象,改为逐字段 `$set`,并在 `$nextTick` 后再次设置两个日期字段,避免被 `resetFields` 或弹窗初始化覆盖。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- 数据库记录 `设备流水号=1` 的 `入账日期=2026-07-01`、`证书有效期至=2026-07-31`。
-- 本地 Node 脚本验证多种日期格式可解析为有效 `Date`。
-- 执行 `npm run build` 通过,仅有既有资源体积和 Browserslist 过期警告。
-- 本地 dev server 监听 `https://127.0.0.1:1997/`,命令行访问因自签名证书被拦截,需浏览器允许证书后测试页面。
-
-### 下一步
-
-- 在浏览器打开 `https://127.0.0.1:1997/`,登录后进入设备信息维护页面,点击编辑验证两个日期是否回填。
-
-## 2026-06-29 第 6 轮:新增设备名称字段并导入设备信息 Excel
-
-### 做了什么
-
-- 根据用户要求新增“设备名称”字段,页面列表和新增/编辑弹窗均增加该字段。
-- 读取 `doc/设备信息.xlsx`,确认 Sheet1 共 89 行数据,并复制到 `work/DeviceManagement/DeviceInformation/设备信息.xlsx` 归档。
-- 明确字段映射:Excel `名称` 保存到新增数据库字段 `名称`;Excel `生产用名` 继续保存到原字段 `设备名称`。
-- 新增并执行 Excel 导入脚本,按 `公司编码` 使用 `MERGE` 导入,防止重复执行造成重复数据。
-- 发现 Excel 日期导入存在时区早一天问题后,新增日期修正脚本,按 Excel 显示日期修正 `入账日期`。
-- 修正新增存储过程里“公司编码不能为空”提示文本,避免脚本生成时遗留问号文本。
-
-### 改了哪些文件
-
-- `src/views/DeviceManagement/DeviceInformation/index.vue`
-- `db_backups/add_device_name_and_import_excel_20260629.sql`
-- `db_backups/fix_device_excel_import_dates_20260629.sql`
-- `db_backups/fix_device_add_company_code_message_20260629.sql`
-- `work/DeviceManagement/DeviceInformation/README.md`
-- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md`
-- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md`
-- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
-- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
-- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
-- `work/DeviceManagement/DeviceInformation/06-决策记录.md`
-- `gptlog-process/gpdlog.md`
-
-### 验证了什么
-
-- 数据库表 `dbo.基础数据_设备工位点检表` 已新增 `名称` 字段。
-- `doc/设备信息.xlsx` 89 行已导入数据库,导入后设备信息总数为 89。
-- 样例数据验证:
- - `REALLY-11`:设备名称 `气泵(空压机)`,生产用名 `气泵`,入账日期 `2007-01-01`。
- - `REALLY-6`:设备名称 `数控加工中心`,生产用名 `加1`,入账日期 `2008-12-24`。
- - `REALLY-1`:设备名称 `普通车床`,生产用名 `普1`,入账日期 `2011-01-01`。
-- 执行 `npm run build` 通过,仅有既有资源体积和 Browserslist 过期警告。
-
-### 下一步
-
-- 在浏览器打开 `https://127.0.0.1:1997/`,进入设备信息维护页面检查新增字段显示、编辑回填和保存。
diff --git a/work/DeviceManagement/DeviceInformation/04-任务矩阵.md b/work/DeviceManagement/DeviceInformation/04-任务矩阵.md
deleted file mode 100644
index c2de1c2..0000000
--- a/work/DeviceManagement/DeviceInformation/04-任务矩阵.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 04-任务矩阵
-
-| 任务编号 | 任务 | 状态 | 验收标准 |
-| --- | --- | --- | --- |
-| DI-001 | 解析需求文档 | 已完成 | 已从 `doc/修改设备信息维护.docx` 提取字段和交互要求 |
-| DI-002 | 定位目标页面 | 已完成 | 确认页面为 `src/views/DeviceManagement/DeviceInformation/index.vue` |
-| DI-003 | 扩展数据库字段 | 已完成 | `dbo.基础数据_设备工位点检表` 已包含 14 个新增字段 |
-| DI-004 | 更新查询过程 | 已完成 | 查询过程返回新增字段,并按证书有效期预警排序 |
-| DI-005 | 更新新增过程 | 已完成 | 新增过程接收新增字段,公司编码为空时返回失败 |
-| DI-006 | 更新编辑过程 | 已完成 | 编辑过程更新新增字段但不更新公司编码 |
-| DI-007 | 修改列表列展示 | 已完成 | 前端表格展示需求字段,操作列固定在右侧 |
-| DI-008 | 修改新增/编辑表单 | 已完成 | 表单包含需求字段,主要设备/特种设备为是/否下拉 |
-| DI-008A | 取消设备类型必填 | 已完成 | `rules` 中不再包含设备类型必填校验,新增/编辑允许设备类型为空 |
-| DI-009 | 工位绑定多选 | 已完成 | 工位绑定为多选下拉,选项来源于工位管理查询 |
-| DI-010 | 证书有效期预警 | 已完成 | 已过期红色置顶,30 天内黄色靠前 |
-| DI-011 | 构建验证 | 已完成 | `npm run build` 通过 |
-| DI-011A | 修复日期编辑报错 | 已完成 | 入账日期、证书有效期至可传正常日期或空字符串,存储过程返回成功 |
-| DI-011B | 修复日期控件点击报错 | 已完成 | 日期控件绑定 `Date` 对象,点击日期面板不再触发 `date.getHours is not a function` |
-| DI-011C | 修复编辑弹窗日期不回填 | 已完成 | 日期回填兼容多种后端返回格式,并在弹窗渲染后再次写入日期字段 |
-| DI-014 | 新增设备名称字段 | 已完成 | 数据库新增 `名称` 字段,页面列表和编辑弹窗显示“设备名称” |
-| DI-015 | 导入设备信息 Excel | 已完成 | `doc/设备信息.xlsx` 89 行导入数据库,按公司编码 MERGE 防重复 |
-| DI-016 | 修正 Excel 入账日期 | 已完成 | 采用 Excel 显示日期修正导入结果,避免时区早一天 |
-| DI-017 | 修正新增过程提示文本 | 已完成 | 新增过程公司编码为空时返回“公司编码不能为空”,不再返回问号乱码 |
-| DI-012 | 真实页面人工验收 | 待办 | 登录系统确认页面显示、新增、编辑、预警颜色和排序符合需求 |
-| DI-013 | 历史数据治理 | 观察 | 如历史设备缺公司编码影响业务,再补清洗脚本和规则 |
diff --git a/work/DeviceManagement/DeviceInformation/05-验收证据.md b/work/DeviceManagement/DeviceInformation/05-验收证据.md
deleted file mode 100644
index e195ffd..0000000
--- a/work/DeviceManagement/DeviceInformation/05-验收证据.md
+++ /dev/null
@@ -1,288 +0,0 @@
-# 05-验收证据
-
-## 文档解析
-
-- 原始文档:`doc/修改设备信息维护.docx`
-- 工作副本:`work/DeviceManagement/DeviceInformation/修改设备信息维护.docx`
-- 提取结果:字段包括公司编码、生产用名、规格/型号、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至。
-
-## 数据库连接
-
-命令:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -Q "SET NOCOUNT ON; SELECT TOP 1 name FROM sys.databases WHERE name=N'YL_MESDB';"
-```
-
-结果:
-
-- 返回 `YL_MESDB`。
-
-## 字段验证
-
-命令:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -Q "SET NOCOUNT ON; SELECT c.name, t.name AS type_name, c.max_length, c.is_nullable FROM sys.columns c JOIN sys.types t ON c.user_type_id=t.user_type_id WHERE c.object_id=OBJECT_ID(N'dbo.基础数据_设备工位点检表') AND c.name IN (N'公司编码',N'设备信息',N'使用部门',N'入账日期',N'单位',N'数量',N'状态',N'维修记录',N'维保记录',N'工位绑定',N'主要设备',N'设备标准开机工时',N'特种设备',N'证书有效期至') ORDER BY c.column_id;"
-```
-
-结果:
-
-- 已返回 14 个新增字段。
-- 日期字段为 `date`。
-- 数量、设备标准开机工时为 `decimal`。
-- 文本字段为 `nvarchar`。
-
-## 存储过程参数验证
-
-命令:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -Q "SET NOCOUNT ON; SELECT p.name AS proc_name, pa.name AS param_name, TYPE_NAME(pa.user_type_id) AS type_name FROM sys.procedures p JOIN sys.parameters pa ON p.object_id=pa.object_id WHERE p.name IN (N'设备管理_设备信息_查询',N'设备管理_设备信息_增加',N'设备管理_设备信息_编辑') ORDER BY p.name, pa.parameter_id;"
-```
-
-结果:
-
-- `设备管理_设备信息_增加` 已包含新增字段参数。
-- `设备管理_设备信息_编辑` 已包含新增字段参数和 `@设备流水号`。
-- `设备管理_设备信息_查询` 参数保持兼容。
-
-## 查询过程验证
-
-命令:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -Q "SET NOCOUNT ON; EXEC dbo.[设备管理_设备信息_查询] @设备名称_check=0, @设备名称=N'', @设备类型_check=0, @设备类型=NULL;" -h -1 -W
-```
-
-结果:
-
-- 命令执行成功。
-- 当前无输出行或未显示样本数据,但过程无执行错误。
-
-## 前端构建
-
-命令:
-
-```powershell
-npm run build
-```
-
-结果:
-
-- 构建通过。
-- webpack compiled with 2 warnings。
-- 警告为项目既有资源体积过大、Browserslist/caniuse-lite 数据过期。
-
-## 产物证据
-
-- 前端页面:`src/views/DeviceManagement/DeviceInformation/index.vue`
-- 数据库脚本:`db_backups/update_device_information_maintenance_20260629.sql`
-- 日期编辑修复脚本:`db_backups/fix_device_information_date_edit_20260629.sql`
-- 工作目录:`work/DeviceManagement/DeviceInformation`
-- 日志:`gptlog-process/gpdlog.md`
-
-## 日期编辑修复验证
-
-命令:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -i db_backups\fix_device_information_date_edit_20260629.sql
-```
-
-结果:
-
-- 脚本执行成功。
-- `设备管理_设备信息_增加/编辑` 的 `@入账日期`、`@证书有效期至` 已调整为 `nvarchar` 参数。
-
-正常日期验证:
-
-```powershell
-EXEC dbo.[设备管理_设备信息_编辑]
- @入账日期=N'2026-07-01',
- @证书有效期至=N'2026-07-31',
- ...
-```
-
-结果:
-
-- 返回 `result = 1`。
-- 数据库保存为 `2026-07-01` 和 `2026-07-31`。
-
-清空日期验证:
-
-```powershell
-EXEC dbo.[设备管理_设备信息_编辑]
- @入账日期=N'',
- @证书有效期至=N'',
- ...
-```
-
-结果:
-
-- 返回 `result = 1`。
-- 数据库对应日期字段保存为 `NULL`。
-
-前端构建复验:
-
-```powershell
-npm run build
-```
-
-结果:
-
-- 构建通过。
-- webpack compiled with 2 warnings。
-- 警告仍为项目既有资源体积过大、Browserslist/caniuse-lite 数据过期。
-
-## 设备名称字段和 Excel 导入验收
-
-Excel 数据来源:
-
-- `doc/设备信息.xlsx`
-- 工作副本:`work/DeviceManagement/DeviceInformation/设备信息.xlsx`
-- Sheet1 数据行数:89 行。
-
-导入脚本:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -i db_backups\add_device_name_and_import_excel_20260629.sql
-```
-
-结果:
-
-- `dbo.基础数据_设备工位点检表` 已新增字段 `名称`。
-- `设备管理_设备信息_增加` 已增加 `@名称` 参数并写入 `[名称]`。
-- `设备管理_设备信息_编辑` 已增加 `@名称` 参数并更新 `[名称]`。
-- Excel 89 行按 `公司编码` 导入或更新。
-
-日期修正脚本:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -i db_backups\fix_device_excel_import_dates_20260629.sql
-```
-
-结果:
-
-- 使用 Excel 单元格显示值修正 `入账日期`。
-- 修正后设备信息总数为 89。
-
-提示文本修正脚本:
-
-```powershell
-sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -f 65001 -i db_backups\fix_device_add_company_code_message_20260629.sql
-```
-
-结果:
-
-- 新增过程公司编码为空时返回 `公司编码不能为空`。
-- 未重新执行导入脚本,避免覆盖已修正的入账日期。
-
-数据库抽样验证:
-
-```powershell
-SELECT COUNT(*) AS cnt
-FROM dbo.[基础数据_设备工位点检表];
-
-SELECT TOP 10
- [设备流水号],
- [名称],
- [公司编码],
- [设备名称] AS [生产用名],
- [设备型号],
- [入账日期]
-FROM dbo.[基础数据_设备工位点检表]
-ORDER BY [设备流水号];
-```
-
-结果:
-
-- 总数:89。
-- `REALLY-11`:`名称=气泵(空压机)`,`生产用名=气泵`,`入账日期=2007-01-01`。
-- `REALLY-6`:`名称=数控加工中心`,`生产用名=加1`,`入账日期=2008-12-24`。
-- `REALLY-1`:`名称=普通车床`,`生产用名=普1`,`入账日期=2011-01-01`。
-
-前端构建验证:
-
-```powershell
-npm run build
-```
-
-结果:
-
-- 构建通过。
-- webpack compiled with 2 warnings。
-- 警告仍为项目既有资源体积过大、Browserslist/caniuse-lite 数据过期。
-
-## 编辑弹窗日期不回填修复验证
-
-数据库测试数据:
-
-```powershell
-UPDATE dbo.[基础数据_设备工位点检表]
-SET [入账日期]='2026-07-01',
- [证书有效期至]='2026-07-31'
-WHERE [设备流水号]=1;
-```
-
-结果:
-
-- `设备流水号=1` 的 `入账日期` 为 `2026-07-01`。
-- `设备流水号=1` 的 `证书有效期至` 为 `2026-07-31`。
-
-本地日期解析验证:
-
-```powershell
-node -e "<日期解析测试脚本>"
-```
-
-结果:
-
-- `2026-07-01`
-- `2026-07-01 00:00:00`
-- `2026/07/01 00:00:00`
-- `/Date(1782864000000)/`
-- `Date` 对象
-
-以上格式均可解析为有效 `Date`。
-
-构建验证:
-
-```powershell
-npm run build
-```
-
-结果:
-
-- 构建通过。
-- webpack compiled with 2 warnings。
-- 警告仍为项目既有资源体积过大、Browserslist/caniuse-lite 数据过期。
-
-页面测试地址:
-
-- `https://127.0.0.1:1997/`
-- 本地 dev server 使用自签名 HTTPS,浏览器需要允许证书后进入页面测试。
-
-## 日期控件点击报错修复验证
-
-问题:
-
-- 页面点击 `入账日期` 或 `证书有效期至` 日期面板时报错:`TypeError: date.getHours is not a function`。
-
-修复:
-
-- 移除两个 `el-date-picker` 的 `value-format="yyyy-MM-dd"`。
-- 编辑回填时用 `parseDateValue` 将数据库日期转换为 `Date` 对象。
-- 提交时用 `dateParam` 再格式化为 `yyyy-MM-dd` 字符串。
-
-验证命令:
-
-```powershell
-npm run build
-```
-
-结果:
-
-- 构建通过。
-- webpack compiled with 2 warnings。
-- 警告仍为项目既有资源体积过大、Browserslist/caniuse-lite 数据过期。
diff --git a/work/DeviceManagement/DeviceInformation/06-决策记录.md b/work/DeviceManagement/DeviceInformation/06-决策记录.md
deleted file mode 100644
index 4c79475..0000000
--- a/work/DeviceManagement/DeviceInformation/06-决策记录.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# 06-决策记录
-
-## DR-001 公司编码编辑只读并由后端保护
-
-- 决策:新增时公司编码必填;编辑时前端禁用;编辑存储过程不更新公司编码。
-- 原因:需求明确“公司编码为必填且不可被修改”。仅前端禁用不足以防止接口绕过。
-- 影响:历史数据若公司编码为空,编辑时不会强制补齐;如后续要求历史数据也完整,需要专项清洗。
-
-## DR-002 生产用名和规格/型号复用旧字段
-
-- 决策:生产用名使用 `设备名称`,规格/型号使用 `设备型号`。
-- 原因:需求明确“复用设备名称”“复用设备型号”,保持与既有存储过程和其他页面兼容。
-- 影响:其他依赖 `设备管理_设备信息_查询` 的页面仍能使用旧字段。
-
-## DR-003 工位绑定存储为逗号分隔工位号
-
-- 决策:前端多选展示工位名称,提交时保存工位号逗号字符串到 `工位绑定`。
-- 原因:当前系统通用参数传递和旧表结构以简单字段为主,本轮避免新建关系表扩大影响面。
-- 影响:后续如需要按单工位统计或约束唯一性,应迁移为设备-工位绑定明细表。
-
-## DR-004 证书有效期排序前后端都处理
-
-- 决策:数据库查询过程增加预警排序;前端 `sortedTableData` 再按同样规则排序并控制行背景色。
-- 原因:后端保证分页查询顺序,前端保证当前页显示稳定和颜色一致。
-- 影响:分页总数据的全局置顶依赖数据库排序;前端只处理当前页。
-
-## DR-005 SQL 脚本使用可重复执行字段判断
-
-- 决策:新增字段使用 `COL_LENGTH` 判断存在后再 `ALTER TABLE ADD`。
-- 原因:避免脚本重复执行时报“列已存在”。
-- 影响:字段类型若后续要调整,需另起变更脚本,不能靠本脚本自动修改类型。
-
-## DR-006 Excel 名称与生产用名分开保存
-
-- 决策:Excel `名称` 保存到新增数据库字段 `名称`,页面显示为“设备名称”;Excel `生产用名` 继续保存到原字段 `设备名称`,页面显示为“生产用名”。
-- 原因:原系统多处依赖 `设备名称` 字段作为生产用名/设备简称,直接改语义会影响其他页面。
-- 影响:后续涉及“设备名称”时应先确认是新字段 `名称` 还是旧字段 `设备名称`。
-
-## DR-007 Excel 导入按公司编码 MERGE
-
-- 决策:设备信息 Excel 导入按 `公司编码` 做 `MERGE`,匹配则更新,不匹配则新增。
-- 原因:用户要求把 Excel 数据插入数据库,但导入脚本可能被重复执行;使用 `MERGE` 可以降低重复数据风险。
-- 影响:Excel 中公司编码不是全局唯一的行会被视为同一设备;后续如要支持一编码多设备,需要新增更稳定的唯一键规则。
-
-## DR-008 Excel 日期按显示值修正
-
-- 决策:首次导入发现日期早一天后,单独使用 Excel 单元格显示值生成修正脚本,不重新执行整份导入脚本。
-- 原因:Node 读取 Excel 日期对象时受时区影响,显示值更贴近业务人员在表格中看到的日期。
-- 影响:后续导入 Excel 日期时,应优先使用单元格显示文本或显式本地日期解析。
diff --git a/work/DeviceManagement/DeviceInformation/README.md b/work/DeviceManagement/DeviceInformation/README.md
deleted file mode 100644
index 28da231..0000000
--- a/work/DeviceManagement/DeviceInformation/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# 修改设备信息维护 README
-
-## 索引
-
-| 文件 | 用途 |
-| --- | --- |
-| `修改设备信息维护.docx` | 原始需求文档副本 |
-| `设备信息.xlsx` | 设备信息初始化导入数据副本 |
-| `01-项目功能内容.md` | 本轮设备信息维护页面功能范围 |
-| `02-项目程序开发详细步骤.md` | 前端、数据库和验证开发步骤 |
-| `03-推进台账.md` | 每轮做了什么、改了哪些文件、验证了什么、下一步是什么 |
-| `04-任务矩阵.md` | 任务编号、状态、验收标准 |
-| `05-验收证据.md` | 命令、数据库、页面、构建等验收证据 |
-| `06-决策记录.md` | 关键实现决策与原因 |
-
-## 后续推进方式
-
-后续继续该任务时,优先查看 `04-任务矩阵.md` 中状态为“待办”或“观察”的任务,再按 `03-推进台账.md` 追加新轮次记录。涉及数据库变更时,先补充 `db_backups` 增量脚本,再同步更新 `05-验收证据.md`。
diff --git a/work/DeviceManagement/DeviceInformation/修改设备信息维护.docx b/work/DeviceManagement/DeviceInformation/修改设备信息维护.docx
deleted file mode 100644
index b8156d5..0000000
Binary files a/work/DeviceManagement/DeviceInformation/修改设备信息维护.docx and /dev/null differ
diff --git a/work/DeviceManagement/DeviceInformation/设备信息.xlsx b/work/DeviceManagement/DeviceInformation/设备信息.xlsx
deleted file mode 100644
index c1825ae..0000000
Binary files a/work/DeviceManagement/DeviceInformation/设备信息.xlsx and /dev/null differ
diff --git a/work/ProductionManagement/DesignReportTask/01-项目功能内容.md b/work/ProductionManagement/DesignReportTask/01-项目功能内容.md
index 977a3c5..051bb4b 100644
--- a/work/ProductionManagement/DesignReportTask/01-项目功能内容.md
+++ b/work/ProductionManagement/DesignReportTask/01-项目功能内容.md
@@ -28,7 +28,7 @@
字段:
- DID:唯一序号,自增;新建时不可见,编辑时不可修改。
-- 项目号:下拉选择,可搜索;具体 SAP 视图字段后续提供。
+- 项目号:下拉选择,可搜索;来源为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` 字段,页面显示 `项目代码 | 项目名称`。
- 物料编码:下拉选择,可搜索,参考 `ProcessManagement/PartDrawlook/index.vue` 的物料编码过滤。
- 图号:文本框输入。
- 任务描述:文本框输入。
diff --git a/work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md b/work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md
index ebff880..3db5fd5 100644
--- a/work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md
+++ b/work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md
@@ -29,7 +29,7 @@
8. 已新增辅助下拉过程:
- `设计报工_物料查询`。
- `设计报工_人员查询`。
- - `设计报工_项目查询`。
+ - `设计报工_项目查询`:来源为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` 字段。
## 二、前端开发
@@ -42,6 +42,7 @@
7. 指派对象多人员选择参考 `PlanManagement/SelfMakePlando/index.vue` 的二次派工。
8. 工时校验布局参考 `ProductionManagement/WorkHoursCheck/index.vue`,但移除 SAP 上传相关逻辑。
9. 工时报表布局参考 `ProductionManagement/Workhours/index.vue`,但查询独立设计报工表。
+10. 四个页面的项目号查询条件统一使用 `设计报工_项目查询` 远程下拉。
## 三、验证步骤
diff --git a/work/ProductionManagement/DesignReportTask/03-推进台账.md b/work/ProductionManagement/DesignReportTask/03-推进台账.md
index 98d7e61..05b9481 100644
--- a/work/ProductionManagement/DesignReportTask/03-推进台账.md
+++ b/work/ProductionManagement/DesignReportTask/03-推进台账.md
@@ -100,3 +100,32 @@
### 下一步
- 等待项目号 SAP 视图字段来源。
- 如后续需要访问页面,再单独做菜单权限分配;本轮不处理菜单权限。
+
+## 2026-07-09 项目号来源修正
+
+### 做了什么
+- 根据用户确认,将项目号来源从临时的 `MES_设计报工_任务` 已有项目号改为 SAP 项目视图。
+- 新增并发布 `db_backups/update_design_report_project_source_20260709.sql`。
+- 同步更新 `db_backups/create_design_report_task_module_20260630.sql` 中的 `设计报工_项目查询`。
+- 检查并修改 DesignReportTask 四个页面,项目号查询条件统一使用 SAP 项目代码远程下拉。
+
+### 改了哪些文件
+- `db_backups/update_design_report_project_source_20260709.sql`
+- `db_backups/create_design_report_task_module_20260630.sql`
+- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
+- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
+- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
+- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
+- `work/ProductionManagement/DesignReportTask/README.md`
+- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
+- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
+- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
+- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
+- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
+- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
+
+### 验证了什么
+- `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 存在字段 `项目代码`、`项目名称`。
+- `设计报工_项目查询 @过滤=N''` 可返回 SAP 项目代码列表。
+- `设计报工_项目查询 @过滤=N'CW-260001'` 可返回 `CW-260001`。
+- `npm run build` 构建通过。
diff --git a/work/ProductionManagement/DesignReportTask/04-任务矩阵.md b/work/ProductionManagement/DesignReportTask/04-任务矩阵.md
index a482041..fee4e9b 100644
--- a/work/ProductionManagement/DesignReportTask/04-任务矩阵.md
+++ b/work/ProductionManagement/DesignReportTask/04-任务矩阵.md
@@ -10,7 +10,7 @@
| DRT-006 | 确认完成规则 | 已完成 | 必须已有结束时间,未结束不能完成 |
| DRT-007 | 确认删除规则 | 已完成 | 有报工记录不能删除 |
| DRT-008 | 确认独立性 | 已完成 | 不参与现有任何生产/SAP/工时报表流程 |
-| DRT-009 | 确认项目号来源 | 待确认 | 业务提供 SAP 视图和字段 |
+| DRT-009 | 确认项目号来源 | 已完成 | 来源为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` |
| DRT-010 | 数据库和页面开发 | 已完成 | 表、过程、页面发布并验证,不分配菜单权限 |
| DRT-011 | 复制确认版 Word 文档到工作目录 | 已完成 | `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx` 存在 |
| DRT-012 | 补充菜单权限口径 | 已完成 | README、开发步骤、决策记录明确本阶段不分配菜单权限 |
@@ -21,3 +21,4 @@
| DRT-017 | 新增设计工时校验页面 | 已完成 | 页面文件 `Check/index.vue` 存在并构建通过 |
| DRT-018 | 新增设计工时报表页面 | 已完成 | 页面文件 `HoursReport/index.vue` 存在并构建通过 |
| DRT-019 | 验证完成/删除业务规则 | 已完成 | 未结束不能完成,已有报工记录不能删除由后端约束 |
+| DRT-020 | 修正项目号来源和四页项目下拉 | 已完成 | 四个页面项目号均通过 `设计报工_项目查询` 查询 SAP 项目代码 |
diff --git a/work/ProductionManagement/DesignReportTask/05-验收证据.md b/work/ProductionManagement/DesignReportTask/05-验收证据.md
index a704ec7..5dc2997 100644
--- a/work/ProductionManagement/DesignReportTask/05-验收证据.md
+++ b/work/ProductionManagement/DesignReportTask/05-验收证据.md
@@ -24,7 +24,7 @@ work/ProductionManagement/DesignReportTask/设计报工任务模块.docx
## 用户确认口径
```text
-项目号具体取哪个 SAP 视图字段后续提供。
+项目号来源修正为 SAP 视图 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` 字段。
完成要求已有结束时间,未结束不能完成。
删除任务时,如果已经有报工记录,不能删除。
不参与之前的任何东西,独立的。
@@ -43,7 +43,20 @@ src/views/ProductionManagement/Workhours/index.vue
设计报工模块的独立数据表、独立过程和 4 个前端页面已新增。
-项目号 SAP 视图字段来源仍待业务提供;当前项目号下拉临时从已存在设计任务项目号中取值,并允许前端手工录入。
+项目号 SAP 视图字段来源已确认:`[SAP].[SBO_YL].[dbo].[VIEW_OPRJ].[项目代码]`。当前四个页面项目号均通过 `设计报工_项目查询` 使用 SAP 项目代码下拉。
+
+## 项目号来源修正验证
+
+执行过程:
+```powershell
+sqlcmd -S 192.168.2.92 -U sa -P ****** -d YL_MESDB -f 65001 -i .\db_backups\update_design_report_project_source_20260709.sql
+```
+
+验证结果:
+```text
+设计报工_项目查询 @过滤=N'' 可返回 SAP 项目代码和项目名称。
+设计报工_项目查询 @过滤=N'CW-260001' 返回 CW-260001。
+```
## 菜单权限口径
diff --git a/work/ProductionManagement/DesignReportTask/06-决策记录.md b/work/ProductionManagement/DesignReportTask/06-决策记录.md
index 6fe8e89..df74c3f 100644
--- a/work/ProductionManagement/DesignReportTask/06-决策记录.md
+++ b/work/ProductionManagement/DesignReportTask/06-决策记录.md
@@ -32,15 +32,16 @@
- 删除过程需要先检查设计报工记录表。
- 后续如需撤销,只能增加作废状态,不做物理删除。
-## DDR-004 项目号来源待业务提供
+## DDR-004 项目号来源已确认
-决策:项目号字段暂保留为可搜索下拉,SAP 视图和字段来源后续补充。
+决策:项目号字段使用可搜索下拉,来源为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` 字段。
-原因:用户确认项目号具体 SAP 视图字段后续提供。
+原因:用户已确认项目号来源应为 `SAP.SBO_YL.dbo.VIEW_OPRJ.项目代码`。
影响:
-- 开发时可先预留过程参数和前端控件。
-- 项目号下拉过程需等字段来源明确后实现。
+- `设计报工_项目查询` 返回 `项目号=项目代码`,同时返回 `项目名称` 供前端展示。
+- DesignReportTask 四个页面的项目号查询条件统一使用该过程。
+- 新建设计任务的项目号不再依赖已存在设计任务中的历史项目号。
## DDR-005 指派对象按多人派工预留
@@ -64,14 +65,15 @@
- 菜单挂载和角色权限分配暂不纳入本轮验收。
- 如果后续需要开放页面访问,再单独按权限方案处理。
-## DDR-007 项目号来源未确认时的临时实现
+## DDR-007 项目号临时实现已废弃
-决策:项目号下拉暂时查询 `MES_设计报工_任务` 中已存在项目号,并允许前端手工输入。
+决策:废弃“从 `MES_设计报工_任务` 中取已存在项目号,并允许前端手工输入”的临时实现。
-原因:用户确认项目号具体 SAP 视图字段后续提供,但本轮需要先落地页面、数据表和功能。
+原因:项目号正式来源已经确认为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ].[项目代码]`。
影响:
-- 后续拿到 SAP 视图字段后,只需要调整 `设计报工_项目查询` 存储过程。
+- `设计报工_项目查询` 已改为查询 SAP 项目视图。
+- `Task`、`Report`、`Check`、`HoursReport` 四个页面项目号均使用远程下拉。
- 前端控件和任务表字段无需重做。
## DDR-008 前端页面独立放在 DesignReportTask 目录
diff --git a/work/ProductionManagement/DesignReportTask/README.md b/work/ProductionManagement/DesignReportTask/README.md
index a7002d6..9609578 100644
--- a/work/ProductionManagement/DesignReportTask/README.md
+++ b/work/ProductionManagement/DesignReportTask/README.md
@@ -16,7 +16,7 @@
- 当前阶段:方案梳理与文档修订。
- 核心原则:设计报工任务、设计报工记录、设计工时校验、设计工时报表全部独立,不参与现有生产报工、SAP 上传、生产工时校验和既有工时报表。
- 菜单权限:本阶段不分配菜单权限,不写入菜单表和角色权限表。
-- 待确认项:`项目号` 的 SAP 视图和字段来源由业务后续提供。
+- 项目号来源:`[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码` 字段,页面显示 `项目代码 | 项目名称`。
## 已落地内容