diff --git a/src/api/sampleTracking/sampleTracking.js b/src/api/sampleTracking/sampleTracking.js
index 1f376b9..6d93478 100644
--- a/src/api/sampleTracking/sampleTracking.js
+++ b/src/api/sampleTracking/sampleTracking.js
@@ -15,5 +15,6 @@ export const oneKeyCreateProofTracking = data => createAPI('/sampleTracking/proo
export const createProofTrackingRecord = data => createAPI('/sampleTracking/proofTracking/createProofRecord', 'POST', data)
export const batchUpdateProofTrackingPlan = data => createAPI('/sampleTracking/proofTracking/batchUpdatePlan', 'POST', data)
export const updateProofTrackingProcess = data => createAPI('/sampleTracking/proofTracking/updateProcess', 'POST', data)
+export const updateProofTrackingComments = data => createAPI('/sampleTracking/proofTracking/updateComments', 'POST', data)
export const finishProofTracking = data => createAPI('/sampleTracking/proofTracking/finishProofing', 'POST', data)
export const queryProofTrackingProcessHistory = data => createAPI('/sampleTracking/proofTracking/processHistory', 'POST', data)
diff --git a/src/views/modules/sampleTracking/projectInfoTracking.vue b/src/views/modules/sampleTracking/projectInfoTracking.vue
index 132fd00..72c3de0 100644
--- a/src/views/modules/sampleTracking/projectInfoTracking.vue
+++ b/src/views/modules/sampleTracking/projectInfoTracking.vue
@@ -1430,7 +1430,7 @@ export default {
}
},
deletePartModal (row) {
- this.$confirm('确定删除该项目物料?', '提示', {
+ this.$confirm('确定删除该项目物料?将同步删除该物料下的打样追踪记录。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -1450,7 +1450,7 @@ export default {
}).catch(() => {})
},
deleteHandle (row) {
- this.$confirm('确定删除该笔数据?', '提示', {
+ this.$confirm('确定删除该项目?将同步删除该项目下的项目物料及打样追踪记录。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
diff --git a/src/views/modules/sampleTracking/projectPartTracking.vue b/src/views/modules/sampleTracking/projectPartTracking.vue
index 04bcde1..9b08fcd 100644
--- a/src/views/modules/sampleTracking/projectPartTracking.vue
+++ b/src/views/modules/sampleTracking/projectPartTracking.vue
@@ -1301,7 +1301,7 @@ export default {
})
},
deleteHandle (row) {
- this.$confirm('确定删除该笔数据?', '提示', {
+ this.$confirm('确定删除该项目物料?将同步删除该物料下的打样追踪记录。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
diff --git a/src/views/modules/sampleTracking/projectProofTracking.vue b/src/views/modules/sampleTracking/projectProofTracking.vue
index 92882a3..81f3a5b 100644
--- a/src/views/modules/sampleTracking/projectProofTracking.vue
+++ b/src/views/modules/sampleTracking/projectProofTracking.vue
@@ -53,7 +53,7 @@
-
+
@@ -68,7 +68,7 @@
v-for="item in processColumns"
:key="item.code"
:label="item.label"
- width="130"
+ width="120"
align="center"
header-align="center"
>
@@ -77,29 +77,77 @@
-
-
-
+
+
+
+ √
+
-
+
+
+
+
+
新增打样
@@ -666,6 +714,7 @@ import {
oneKeyCreateProofTracking,
queryProofTrackingProcessHistory,
searchProofTracking,
+ updateProofTrackingComments,
updateProofTrackingProcess
} from '@/api/sampleTracking/sampleTracking'
import { getCustomerNo, saveNewCustomer } from '@/api/eam/eamProject.js'
@@ -684,8 +733,46 @@ import {
import { queryCustomerList } from '@/api/customer/customer'
import Chooselist from '@/views/modules/common/Chooselist_eam'
+function focusCommentsNativeInput (el, vnode) {
+ const doFocus = () => {
+ const componentInput = vnode && vnode.componentInstance && vnode.componentInstance.$refs
+ ? vnode.componentInstance.$refs.input
+ : null
+ const inputEl = componentInput || (el && el.querySelector ? el.querySelector('input') : null)
+ if (!inputEl || typeof inputEl.focus !== 'function') {
+ return false
+ }
+ inputEl.focus()
+ const textLength = inputEl.value ? String(inputEl.value).length : 0
+ if (typeof inputEl.setSelectionRange === 'function') {
+ inputEl.setSelectionRange(textLength, textLength)
+ }
+ return true
+ }
+ if (doFocus()) {
+ return
+ }
+ setTimeout(doFocus, 0)
+ setTimeout(doFocus, 50)
+ setTimeout(doFocus, 100)
+}
+
export default {
name: 'ProjectProofTracking',
+ directives: {
+ focusCommentsInput: {
+ inserted (el, binding, vnode) {
+ if (binding.value) {
+ focusCommentsNativeInput(el, vnode)
+ }
+ },
+ componentUpdated (el, binding, vnode) {
+ if (binding.value && !binding.oldValue) {
+ focusCommentsNativeInput(el, vnode)
+ }
+ }
+ }
+ },
components: {
Chooselist
},
@@ -780,6 +867,9 @@ export default {
batchEditMode: false,
processHistoryMap: {},
processHistoryRows: [],
+ commentsEditingTrackingId: null,
+ commentsDraft: '',
+ commentsSaveLoading: false,
oneKeyDialogVisible: false,
saveOneKeyLoading: false,
@@ -1116,6 +1206,12 @@ export default {
if (data && data.code === 0) {
this.dataList = (data.page && data.page.list) || []
this.totalPage = (data.page && data.page.totalCount) || 0
+ if (this.commentsEditingTrackingId) {
+ const hasEditingRow = this.dataList.some(item => item.trackingId === this.commentsEditingTrackingId)
+ if (!hasEditingRow) {
+ this.cancelCommentsEdit()
+ }
+ }
if (this.dataList.length > 0) {
this.currentRow = this.dataList[0]
}
@@ -1142,6 +1238,55 @@ export default {
selectionChange (rows) {
this.selectionRows = rows || []
},
+ isCommentsEditing (row) {
+ return !!row && row.trackingId === this.commentsEditingTrackingId
+ },
+ startCommentsEdit (row) {
+ if (!row || !row.trackingId || this.commentsSaveLoading) {
+ return
+ }
+ this.commentsEditingTrackingId = row.trackingId
+ this.commentsDraft = row.comments || ''
+ },
+ cancelCommentsEdit () {
+ if (this.commentsSaveLoading) {
+ return
+ }
+ this.commentsEditingTrackingId = null
+ this.commentsDraft = ''
+ },
+ saveCommentsEdit (row) {
+ if (this.commentsSaveLoading) {
+ return
+ }
+ if (!row || !row.trackingId) {
+ this.$message.warning('跟踪记录ID不能为空')
+ return
+ }
+ const comments = this.commentsDraft == null ? '' : String(this.commentsDraft)
+ if (comments === (row.comments || '')) {
+ this.cancelCommentsEdit()
+ return
+ }
+ this.commentsSaveLoading = true
+ updateProofTrackingComments({
+ trackingId: row.trackingId,
+ comments: comments,
+ updateBy: this.$store.state.user.name
+ }).then(({ data }) => {
+ this.commentsSaveLoading = false
+ if (data && data.code === 0) {
+ row.comments = comments
+ this.$message.success('Comments保存成功')
+ this.cancelCommentsEdit()
+ } else {
+ this.$message.error(data.msg || 'Comments保存失败')
+ }
+ }).catch(() => {
+ this.commentsSaveLoading = false
+ this.$message.error('Comments保存异常')
+ })
+ },
rowClick (row) {
this.currentRow = row
},
@@ -1403,6 +1548,68 @@ export default {
this.$message.error('批量修改异常')
})
},
+ handleProcessDateChange (row, processCol, dateVal) {
+ if (!row || !processCol) {
+ return
+ }
+ const actualDate = this.formatDate(dateVal)
+ this.updateProcessFromTable(row, processCol, {
+ status: '已完成',
+ actualDate: actualDate,
+ remark: '表格直接选择日期'
+ }, true)
+ },
+ markProcessComplete (row, processCol) {
+ if (!row || !processCol || this.isProcessComplete(row, processCol)) {
+ return
+ }
+ const today = this.formatDate(new Date())
+ this.updateProcessFromTable(row, processCol, {
+ status: '已完成',
+ actualDate: today,
+ remark: '表格一键完成'
+ }, false, '工序已标记为完成')
+ },
+ updateProcessFromTable (row, processCol, processData, silentSuccess, successMsg) {
+ if (!row || !processCol || !row.trackingId) {
+ this.$message.error('工序参数缺失')
+ return
+ }
+ const status = processData && processData.status ? String(processData.status).trim() : ''
+ if (!status) {
+ this.$message.error('工序状态不能为空')
+ return
+ }
+ const actualDate = processData && processData.actualDate ? this.formatDate(processData.actualDate) : ''
+ const inData = {
+ trackingId: row.trackingId,
+ processCode: processCol.code,
+ processName: processCol.label,
+ status: status,
+ actualDate: actualDate || null,
+ remark: processData && processData.remark ? processData.remark : '',
+ updateBy: this.$store.state.user.name
+ }
+ updateProofTrackingProcess(inData).then(({ data }) => {
+ if (data && data.code === 0) {
+ row[processCol.statusField] = status
+ row[processCol.actualField] = actualDate
+ const cacheKey = `${row.trackingId}_${processCol.code}`
+ if (this.processHistoryMap[cacheKey]) {
+ this.$delete(this.processHistoryMap, cacheKey)
+ }
+ if (!silentSuccess) {
+ this.$message.success(successMsg || '工序更新成功')
+ }
+ } else {
+ this.$message.error(data.msg || '工序更新失败')
+ this.getDataList()
+ }
+ }).catch(() => {
+ this.$message.error('工序更新异常')
+ this.getDataList()
+ })
+ },
openProcessDialog (row, processCol) {
if (!row || !processCol) {
return
@@ -1488,34 +1695,57 @@ export default {
this.$message.error('打样完成异常')
})
},
+ getProcessCacheKey (row, processCol) {
+ if (!row || !processCol || !row.trackingId) {
+ return ''
+ }
+ return `${row.trackingId}_${processCol.code}`
+ },
loadProcessHistory (row, processCol, refreshDialog) {
if (!row || !row.trackingId) {
- return
+ return Promise.resolve([])
}
- const cacheKey = `${row.trackingId}_${processCol.code}`
- if (this.processHistoryMap[cacheKey] && this.processHistoryMap[cacheKey].length > 0) {
+ const cacheKey = this.getProcessCacheKey(row, processCol)
+ if (Object.prototype.hasOwnProperty.call(this.processHistoryMap, cacheKey)) {
+ const cachedRows = this.processHistoryMap[cacheKey] || []
if (refreshDialog) {
- this.processHistoryRows = this.processHistoryMap[cacheKey]
+ this.processHistoryRows = cachedRows
}
- return
+ return Promise.resolve(cachedRows)
}
- queryProofTrackingProcessHistory({
+ return queryProofTrackingProcessHistory({
trackingId: row.trackingId,
processCode: processCol.code
}).then(({ data }) => {
+ let rows = []
if (data && data.code === 0) {
- const rows = data.rows || []
+ rows = data.rows || []
// Vue2 对对象新增 key 需要使用 $set 才能触发视图更新(tooltip 才会刷新历史列表)
this.$set(this.processHistoryMap, cacheKey, rows)
if (refreshDialog) {
this.processHistoryRows = rows
}
}
+ return rows
+ }).catch(() => {
+ if (refreshDialog) {
+ this.processHistoryRows = []
+ }
+ this.$set(this.processHistoryMap, cacheKey, [])
+ return []
})
},
+ hasProcessHistory (row, processCol) {
+ if (!row || !processCol || !row.trackingId) {
+ return false
+ }
+ const cacheKey = `${row.trackingId}_${processCol.code}`
+ const rows = this.processHistoryMap[cacheKey] || []
+ return rows.length > 0
+ },
getProcessTooltip (row, processCol) {
if (!row || !processCol) {
- return '-'
+ return ''
}
const cacheKey = row.trackingId ? `${row.trackingId}_${processCol.code}` : ''
const rows = this.processHistoryMap[cacheKey] || []
@@ -1539,7 +1769,7 @@ export default {
})
if (dateList.length === 0) {
- return '-'
+ return ''
}
return dateList.join('\n')
},
@@ -1670,11 +1900,42 @@ export default {
}
.process-content {
- cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 4px;
text-align: center;
line-height: 18px;
}
+.process-complete-btn {
+ padding: 4px 8px;
+ min-width: 12px;
+}
+
+.comments-cell {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ min-height: 26px;
+}
+
+.comments-edit-input {
+ flex: 1;
+}
+
+.comments-save-btn {
+ padding: 4px 7px;
+ min-width: 28px;
+}
+
+.comments-text {
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
.process-date-tooltip {
white-space: pre-line;
}