This commit is contained in:
van
2026-05-17 16:51:22 +08:00
parent 716fd95903
commit dabc0632bd
2 changed files with 128 additions and 16 deletions

View File

@@ -1298,7 +1298,7 @@
</template>
<script>
import { listJDOrders, getJDOrder, updateJDOrder, delJDOrder, fetchLogisticsManually, batchMarkRebateReceived, generateExcelText, importGroupRebateExcelBatch, listGroupRebateExcelUploads, deleteGroupRebateUpload, recalcProfitBatch, syncAutoProfitBatch } from '@/api/system/jdorder'
import { listJDOrders, getJDOrder, updateJDOrder, normalizeJDOrderPutPayload, delJDOrder, fetchLogisticsManually, batchMarkRebateReceived, generateExcelText, importGroupRebateExcelBatch, listGroupRebateExcelUploads, deleteGroupRebateUpload, recalcProfitBatch, syncAutoProfitBatch } from '@/api/system/jdorder'
import { fillLogisticsByOrderNo, getTokenStatus, getTencentDocAuthUrl, testUserInfo, getAutoWriteConfig, reverseSyncThirdPartyOrderNo } from '@/api/jarvis/tendoc'
import { mapGetters } from 'vuex'
import ListLayout from '@/components/ListLayout'
@@ -1410,6 +1410,12 @@ export default {
/** 单行 PUT 防抖(避免 change+blur 连击触发若依重复提交拦截) */
_persistOrderTimers: null,
_persistOrderPendingMsg: null,
/** 列表刚从接口赋值后的短时间内:忽略金额组件误触发的 change避免误 PUT */
_listHydrating: false,
_hydrateUnlockTimer: null,
/** 与后端 SameUrlDataInterceptor 对齐:极短时间内相同 JSON body 不重复发送 */
_jdPutDedupeFingerprint: null,
_jdPutDedupeAt: 0,
/** 移动端卡片:当前展开的订单 idnull 表示全部收起,同时只展开一条) */
mobileExpandedOrderId: null,
/** 视口高度(桌面端用于矮窗口下自动收起「跟进状态」筛选) */
@@ -1558,6 +1564,10 @@ export default {
if (this._persistOrderTimers) {
Object.keys(this._persistOrderTimers).forEach(k => clearTimeout(this._persistOrderTimers[k]))
}
if (this._hydrateUnlockTimer) {
clearTimeout(this._hydrateUnlockTimer)
this._hydrateUnlockTimer = null
}
},
methods: {
onJdFilterViewportResize() {
@@ -1715,10 +1725,29 @@ export default {
isReviewPosted: item.isReviewPosted != null ? item.isReviewPosted : 0,
sellingPriceManual: item.sellingPriceManual != null ? item.sellingPriceManual : 0,
profitManual: item.profitManual != null ? item.profitManual : 0,
extraCost: item.extraCost != null ? Number(item.extraCost) : 0
extraCost: item.extraCost != null ? Number(item.extraCost) : 0,
/** null 库内也表示「参与统计」Switch 只能绑 0/1统一成整数避免挂载时抖动触发 change */
isCountEnabled: item.isCountEnabled === 0 ? 0 : 1
}
},
assignListFromResponse(res) {
this._listHydrating = true
if (this._hydrateUnlockTimer) {
clearTimeout(this._hydrateUnlockTimer)
this._hydrateUnlockTimer = null
}
if (this._persistOrderTimers) {
Object.keys(this._persistOrderTimers).forEach(k => {
clearTimeout(this._persistOrderTimers[k])
delete this._persistOrderTimers[k]
})
}
if (this._persistOrderPendingMsg) {
Object.keys(this._persistOrderPendingMsg).forEach(k => delete this._persistOrderPendingMsg[k])
}
this._jdPutDedupeFingerprint = null
this._jdPutDedupeAt = 0
this._distMarkBaseline = {}
this._modelNumberBaseline = {}
const list = (res.rows || res.data || [])
@@ -1727,6 +1756,12 @@ export default {
if (this.isMobile) {
this.mobileExpandedOrderId = null
}
this.$nextTick(() => {
this._hydrateUnlockTimer = setTimeout(() => {
this._hydrateUnlockTimer = null
this._listHydrating = false
}, 120)
})
},
toggleMobileOrderExpand(row) {
if (!row || row.id == null) return
@@ -2075,6 +2110,9 @@ export default {
if (!row || row.id == null) {
return Promise.resolve()
}
if (this._listHydrating) {
return Promise.resolve()
}
this.ensureMoneyFieldsForPersist(row)
const sid = String(row.id)
if (!this._persistOrderTimers) this._persistOrderTimers = {}
@@ -2095,14 +2133,51 @@ export default {
this.flushPersistOrderRow(row, msg)
}, 340)
},
/**
* PUT /system/jdorder若依 SameUrlDataInterceptor 判定「同 URL + 同 body + 短间隔」为重复提交;
* 移动端多张卡片内控件挂载时可能对同一行连发两次相同 payload此处丢弃后者。
*/
performJDOrderUpdate(row) {
if (!row || row.id == null) {
return Promise.reject(new Error('无效订单'))
}
const plain = normalizeJDOrderPutPayload(row)
let serialized = ''
try {
serialized = JSON.stringify(plain)
} catch (e) {
serialized = ''
}
const fp = `${plain.id}\u0000${serialized}`
const now = Date.now()
const windowMs = 550
if (
fp === this._jdPutDedupeFingerprint &&
now - this._jdPutDedupeAt < windowMs
) {
return Promise.resolve({ skipped: true })
}
this._jdPutDedupeFingerprint = fp
this._jdPutDedupeAt = now
return updateJDOrder(row)
.then(res => ({ skipped: false, res }))
.catch(err => {
if (`${plain.id}\u0000${serialized}` === this._jdPutDedupeFingerprint) {
this._jdPutDedupeFingerprint = null
this._jdPutDedupeAt = 0
}
return Promise.reject(err)
})
},
flushPersistOrderRow(row, successMsg) {
if (!row || row.id == null) {
return
}
this.ensureMoneyFieldsForPersist(row)
this.invalidatePendingSyncAutoProfit()
updateJDOrder(row)
.then(() => {
this.performJDOrderUpdate(row)
.then(pack => {
if (pack.skipped) return
if (successMsg) this.$message.success(successMsg)
this.schedulePatchOrderRowFromServer(row.id)
})
@@ -2286,8 +2361,9 @@ export default {
},
/** 处理统计开关变化 */
handleCountEnabledChange(row) {
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
if (this._listHydrating) return
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的统计状态已更新为:${row.isCountEnabled ? '参与统计' : '不参与统计'}`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2309,7 +2385,8 @@ export default {
}
this.invalidatePendingSyncAutoProfit()
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的退款状态已更新`)
this.schedulePatchOrderRowFromServer(row.id)
}).catch(() => {
@@ -2332,7 +2409,8 @@ export default {
row.refundDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的退款状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2356,7 +2434,8 @@ export default {
row.refundReceivedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的退款到账状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2378,7 +2457,8 @@ export default {
row.refundReceivedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的退款到账状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2402,7 +2482,8 @@ export default {
row.rebateReceivedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的后返到账状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2424,7 +2505,8 @@ export default {
row.rebateReceivedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的后返到账状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2448,7 +2530,8 @@ export default {
row.priceProtectedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的点过价保状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2472,7 +2555,8 @@ export default {
row.invoiceOpenedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的开过专票状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')
@@ -2496,7 +2580,8 @@ export default {
row.reviewPostedDate = null
}
// 调用后端API更新数据库
updateJDOrder(row).then(() => {
this.performJDOrderUpdate(row).then(pack => {
if (pack.skipped) return
this.$message.success(`订单 ${row.remark} 的晒过评价状态已更新`)
}).catch(() => {
this.$message.error('更新失败,请稍后重试')