调整优化 审批和备货单 退税
This commit is contained in:
@@ -157,6 +157,7 @@ export function useStockingForm(isFinal = false, stockingId?: string | number) {
|
||||
// 回显填充抑制标记:为 true 时不触发自动计算覆盖接口值
|
||||
const isPopulating = ref(false)
|
||||
const userEditing = ref<Set<number>>(new Set()) // 跟踪用户正在编辑的行
|
||||
const manualTaxRefundRows = ref<Set<number>>(new Set()) // 跟踪用户手动编辑过预估退税额的行
|
||||
|
||||
// 选项数据
|
||||
const channelOptions = ref<any>()
|
||||
@@ -766,14 +767,49 @@ export function useStockingForm(isFinal = false, stockingId?: string | number) {
|
||||
const copyRow = (idx: number) => {
|
||||
const copied = JSON.parse(JSON.stringify(items.value[idx])) as ItemRow
|
||||
items.value.splice(idx + 1, 0, copied)
|
||||
// 如果原行是手动编辑的,复制的行也标记为手动编辑
|
||||
if (manualTaxRefundRows.value.has(idx)) {
|
||||
// 需要调整后续行的索引
|
||||
const newManualRows = new Set<number>()
|
||||
manualTaxRefundRows.value.forEach((rowIdx) => {
|
||||
if (rowIdx <= idx) {
|
||||
newManualRows.add(rowIdx)
|
||||
} else {
|
||||
newManualRows.add(rowIdx + 1)
|
||||
}
|
||||
})
|
||||
newManualRows.add(idx + 1) // 新复制的行
|
||||
manualTaxRefundRows.value = newManualRows
|
||||
}
|
||||
}
|
||||
|
||||
const addRowAfter = (idx: number) => {
|
||||
items.value.splice(idx + 1, 0, newItem())
|
||||
// 调整后续行的手动编辑标记索引
|
||||
const newManualRows = new Set<number>()
|
||||
manualTaxRefundRows.value.forEach((rowIdx) => {
|
||||
if (rowIdx <= idx) {
|
||||
newManualRows.add(rowIdx)
|
||||
} else {
|
||||
newManualRows.add(rowIdx + 1)
|
||||
}
|
||||
})
|
||||
manualTaxRefundRows.value = newManualRows
|
||||
}
|
||||
|
||||
const removeRow = (idx: number) => {
|
||||
items.value.splice(idx, 1)
|
||||
// 移除该行的手动编辑标记,并调整后续行的索引
|
||||
const newManualRows = new Set<number>()
|
||||
manualTaxRefundRows.value.forEach((rowIdx) => {
|
||||
if (rowIdx < idx) {
|
||||
newManualRows.add(rowIdx)
|
||||
} else if (rowIdx > idx) {
|
||||
newManualRows.add(rowIdx - 1)
|
||||
}
|
||||
// rowIdx === idx 的行被删除,不添加到新集合中
|
||||
})
|
||||
manualTaxRefundRows.value = newManualRows
|
||||
}
|
||||
|
||||
// 收款项操作方法
|
||||
@@ -1098,6 +1134,16 @@ export function useStockingForm(isFinal = false, stockingId?: string | number) {
|
||||
}
|
||||
// 等待本轮变更完成后,再恢复自动计算
|
||||
nextTick(() => {
|
||||
// 检查哪些行的预估退税额与自动计算值不同,标记为手动编辑
|
||||
items.value.forEach((it: any, index: number) => {
|
||||
const currentValue = String(it.tax_refund || '')
|
||||
const autoCalculatedValue = String(calcTaxRefund(it) || '0')
|
||||
if (currentValue !== autoCalculatedValue && currentValue !== '' && currentValue !== '0') {
|
||||
manualTaxRefundRows.value.add(index)
|
||||
}
|
||||
})
|
||||
// 初始化 prevTaxRefundValues
|
||||
prevTaxRefundValues.value = items.value.map((item: any) => String(item.tax_refund || ''))
|
||||
isPopulating.value = false
|
||||
})
|
||||
}
|
||||
@@ -1329,11 +1375,13 @@ export function useStockingForm(isFinal = false, stockingId?: string | number) {
|
||||
}
|
||||
}
|
||||
|
||||
// 自动计算预估退税额
|
||||
const refund = calcTaxRefund(it)
|
||||
if (items.value[index]) {
|
||||
items.value[index].tax_refund = isNaN(refund) ? '0' : String(Number(refund.toFixed(2)))
|
||||
;(items.value[index] as any).tax_refund_currency = 'CNY'
|
||||
// 自动计算预估退税额(跳过用户手动编辑过的行)
|
||||
if (!manualTaxRefundRows.value.has(index)) {
|
||||
const refund = calcTaxRefund(it)
|
||||
if (items.value[index]) {
|
||||
items.value[index].tax_refund = isNaN(refund) ? '0' : String(Number(refund.toFixed(2)))
|
||||
;(items.value[index] as any).tax_refund_currency = 'CNY'
|
||||
}
|
||||
}
|
||||
|
||||
// 自动计算车价
|
||||
@@ -1385,13 +1433,41 @@ export function useStockingForm(isFinal = false, stockingId?: string | number) {
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
// 存储上一次的 tax_refund 值,用于检测用户手动输入
|
||||
const prevTaxRefundValues = ref<string[]>([])
|
||||
|
||||
// 当用户手动输入预估退税额时,重新计算利润
|
||||
watch(
|
||||
() => items.value.map((item: any) => item.tax_refund),
|
||||
() => {
|
||||
(newValues) => {
|
||||
if (isPopulating.value) return
|
||||
|
||||
// 初始化 prevTaxRefundValues
|
||||
if (prevTaxRefundValues.value.length === 0) {
|
||||
prevTaxRefundValues.value = newValues.map((v: any) => String(v || ''))
|
||||
}
|
||||
|
||||
items.value.forEach((it: any, index: number) => {
|
||||
if (!items.value[index]) return
|
||||
|
||||
const currentValue = String(it.tax_refund || '')
|
||||
const prevValue = prevTaxRefundValues.value[index] || ''
|
||||
const autoCalculatedValue = String(calcTaxRefund(it) || '0')
|
||||
|
||||
// 如果当前值与自动计算值不同,且与上一次值不同,说明是用户手动输入的
|
||||
if (
|
||||
currentValue !== autoCalculatedValue &&
|
||||
currentValue !== prevValue &&
|
||||
currentValue !== ''
|
||||
) {
|
||||
// 标记该行已被用户手动编辑
|
||||
manualTaxRefundRows.value.add(index)
|
||||
}
|
||||
|
||||
// 更新上一次的值
|
||||
prevTaxRefundValues.value[index] = currentValue
|
||||
|
||||
// 重新计算利润
|
||||
const profit = calcProfit(it)
|
||||
items.value[index].profit = isNaN(profit) ? 0 : Number(profit.toFixed(2))
|
||||
;(items.value[index] as any).profit_currency = (it as any).profit_currency || 'CNY'
|
||||
|
||||
@@ -176,7 +176,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="选项" size="small">
|
||||
<el-input
|
||||
v-if="group.type == 'field_user'"
|
||||
placeholder="请输入"
|
||||
v-model="group.users"
|
||||
></el-input>
|
||||
<el-select
|
||||
v-else
|
||||
v-model="group.users"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
@@ -251,7 +257,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="选项" size="small">
|
||||
<el-input
|
||||
v-if="group.type == 'field_user'"
|
||||
placeholder="请输入"
|
||||
v-model="group.users"
|
||||
></el-input>
|
||||
<el-select
|
||||
v-else
|
||||
v-model="group.users"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
@@ -660,6 +672,8 @@
|
||||
node.approverGroups.forEach((group) => {
|
||||
if (group && group.type === 'initiator_leader') {
|
||||
approvers.push({ type: 'initiator_leader' })
|
||||
} else if (group && group.type === 'field_user') {
|
||||
approvers.push({ type: group.type, value: group.users })
|
||||
} else if (group && group.type && Array.isArray(group.users) && group.users.length > 0) {
|
||||
approvers.push({ type: group.type, value: group.users.join(',') })
|
||||
}
|
||||
|
||||
@@ -176,7 +176,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="选项" size="small">
|
||||
<el-input
|
||||
v-if="group.type == 'field_user'"
|
||||
placeholder="请输入"
|
||||
v-model="group.users"
|
||||
></el-input>
|
||||
<el-select
|
||||
v-else
|
||||
v-model="group.users"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
@@ -251,7 +257,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="选项" size="small">
|
||||
<el-input
|
||||
v-if="group.type == 'field_user'"
|
||||
placeholder="请输入"
|
||||
v-model="group.users"
|
||||
></el-input>
|
||||
<el-select
|
||||
v-else
|
||||
v-model="group.users"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
@@ -604,6 +616,8 @@
|
||||
await ensureOptionsLoaded(group)
|
||||
if (ap.type === 'initiator_leader') {
|
||||
group.users = []
|
||||
} else if (ap.type === 'field_user') {
|
||||
group.users = ap.value.split(',').map((v) => v.trim())
|
||||
} else if (ap.value) {
|
||||
const values = String(ap.value)
|
||||
.split(',')
|
||||
@@ -637,6 +651,8 @@
|
||||
await ensureOptionsLoaded(group)
|
||||
if (c.type === 'initiator_leader') {
|
||||
group.users = []
|
||||
} else if (c.type === 'field_user') {
|
||||
group.users = c.value.split(',').map((v) => v.trim())
|
||||
} else if (c.value) {
|
||||
// group.users = String(c.value)
|
||||
// .split(',')
|
||||
@@ -773,6 +789,8 @@
|
||||
node.approverGroups.forEach((group) => {
|
||||
if (group && group.type === 'initiator_leader') {
|
||||
approvers.push({ type: 'initiator_leader' })
|
||||
} else if (group && group.type === 'field_user') {
|
||||
approvers.push({ type: group.type, value: group.users })
|
||||
} else if (group && group.type && Array.isArray(group.users) && group.users.length > 0) {
|
||||
approvers.push({ type: group.type, value: group.users.join(',') })
|
||||
}
|
||||
@@ -789,7 +807,7 @@
|
||||
if (group && group.type === 'initiator_leader') {
|
||||
cc.push({ type: 'initiator_leader' })
|
||||
} else if (group && group.type && Array.isArray(group.users) && group.users.length > 0) {
|
||||
cc.push({ type: group.type, value: group.users.join(',') })
|
||||
cc.push({ type: group.type, value: group.users })
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -183,11 +183,15 @@
|
||||
loading.value = true
|
||||
try {
|
||||
const { currentPage, pageSize } = pagination
|
||||
|
||||
const { records, current, size, total } = await systemService.getNoticeList({
|
||||
const params: any = {
|
||||
current: currentPage,
|
||||
size: pageSize
|
||||
})
|
||||
}
|
||||
if (keyword.value) {
|
||||
params.keyword = keyword.value
|
||||
}
|
||||
|
||||
const { records, current, size, total } = await systemService.getNoticeList(params)
|
||||
tableData.value = records.map((item: any) => ({
|
||||
...item
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user