有复选框的
<template>
<tenant-expansion-component ref="sdkComponent" code="tenant_sdk_CPT_xs1114sda" @confirm="handleModify" />
</template>
<script setup>
import { ElMessageBox } from 'element-plus'
import { ref, provide, nextTick } from 'vue'
import FormResult from 'FormResult'
const props = defineProps({
BigNumber: {
type: Function,
default: () => {}
}
})
const BigNumber = props.BigNumber
const visible = ref(false)
let infoC = {}
let callbackC = {}
const sdkComponent = ref()
const code = {
product: 'C_FID_frv75eyvrf', // 产品
remark: 'C_FID_kwlkawb2i7', // 备注
num: 'C_FID_hzwomx4xhu', // 数量
unitPrice: 'C_FID_o6vpyvwd9u', // 销售单价
relationship: 'C_FID_hvwwzmxlqf', // 与主产品关系
times: 'C_FID_slcq9w8eeb' // 主子产品倍率
}
const fileds = [
{ instanceCode: code.unitPrice, name: '销售单价', type: 'number' },
{ instanceCode: code.num, name: '数量', type: 'number' },
{ instanceCode: code.remark, name: '备注', type: 'input' }
]
let errorMsg = []
const init = (info, callback) => {
infoC = info
callbackC = callback
errorMsg = []
console.log('init', info, callback)
sdkComponent.value.dynamic?.open({
fileds: fileds
})
}
const updateNumericField = (list, data, fieldCode, decimalPlaces = 2) => {
const { amplitudeType, amplitudeVal, ratioVal, editType } = data
list.forEach((item, index) => {
if(!infoC.batchIds.includes(item.id?.key)) return
if(item[code.relationship]?.key == 'C_ST_0') return errorMsg.push({ name: item[code.product]?.value})
let newVal
const currentValue = item[fieldCode]?.key || 0
if (editType === 'fixed') {
newVal = data.fixedVal <= 0 ? 1 : data.fixedVal
} else if (editType === 'value') {
newVal = new BigNumber(currentValue)
.plus(new BigNumber(amplitudeVal).times(amplitudeType === 'add' ? 1 : -1))
.toFixed(decimalPlaces)
} else if (editType === 'ratio') {
newVal = new BigNumber(currentValue)
.times(new BigNumber(ratioVal).div(100))
.times(amplitudeType === 'add' ? 1 : -1)
.plus(currentValue)
.toFixed(decimalPlaces)
}
// 对于数量字段,最小值为1
if (fieldCode === code.num && newVal <= 0) {
newVal = '1'
}
item[fieldCode] = { key: newVal, value: newVal }
})
return list
}
/**
* data: {
instanceCode: '',
editType: 'fixed', // 调整方式 固定值 fixed / 按数值调整 value / 按比例调整 ratio
amplitudeType:'add', // 调整类型 上调 add / 下调 minus
fixedVal: '', // 固定值
amplitudeVal: '', // 数值值
ratioVal: '', // 比例值
}
*/
const handleModify = (data) => {
const { listData } = callbackC
let list = data.flatListData(JSON.parse(JSON.stringify(listData.value)))
if (data.instanceCode === code.unitPrice) {
list.forEach((item) => {
let val
if (data.editType === 'fixed') {
val = data.fixedVal
} else if (data.editType === 'value') {
val = new BigNumber(item[code.unitPrice]?.key || 0)
.plus(new BigNumber(data.amplitudeVal).times(data.amplitudeType === 'add' ? 1 : -1))
.toFixed(2)
} else if (data.editType === 'ratio') {
val = new BigNumber(item[code.unitPrice]?.key || 0)
.times(
new BigNumber(data.ratioVal)
.div(100)
.times(data.amplitudeType === 'add' ? 1 : -1)
.plus(1)
)
.toFixed(2)
}
if(infoC.batchIds.includes(item.id?.key)) {
item[code.unitPrice] = { ...item[code.unitPrice], key: val, value: val }
}
})
} else if (data.instanceCode === code.num) {
updateNumericField(list, data, code.num, 0)
} else if (data.instanceCode === code.remark) {
const val = data.fixedVal
list.forEach((item) => {
if(infoC.batchIds.includes(item.id?.key)) {
item[code.remark] = { ...item[code.remark], key: val, value: val }
}
})
}
if (errorMsg.length) {
const prdNames = errorMsg.map(item => `<span style="color:red;">${item.name}</span>`).join('、')
ElMessageBox.alert(`${prdNames} 为组件产品,不能单独修改数量,但会跟随主产品的数量改变而改变`, '提示', {
confirmButtonText: '确定',
dangerouslyUseHTMLString: true,
type: 'warning',
})
}
callbackC.emitEditTableData(callbackC.intoTree(list, 'id.key'))
callbackC?.dataValueChangeTrigger?.(code.num)
// 清空选中项
callbackC.toggleSelection?.()
}
defineExpose({
init
})
</script>
<style lang='scss' scoped>
</style>
无复选框的(针对所有数据的)
<template>
<tenant-expansion-component ref="sdkComponent" code="tenant_sdk_CPT_xs1114sda" @confirm="handleModify" />
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { ref, provide, nextTick } from 'vue'
import FormResult from 'FormResult'
const props = defineProps({
BigNumber: {
type: Function,
default: () => {}
}
})
const BigNumber = props.BigNumber
const visible = ref(false)
let infoC = {}
let callbackC = {}
const sdkComponent = ref()
const code = {
remark: 'C_FID_kwlkawb2i7', // 备注
num: 'C_FID_hzwomx4xhu', // 数量
unitPrice: 'C_FID_o6vpyvwd9u', // 销售单价
relationship: 'C_FID_hvwwzmxlqf', // 与主产品关系
}
const fileds = [
{ instanceCode: code.unitPrice, name: '销售单价', type: 'number' },
{ instanceCode: code.num, name: '数量', type: 'number' },
{ instanceCode: code.remark, name: '备注', type: 'input' }
]
const init = (info, callback) => {
infoC = info
callbackC = callback
console.log('init', info, callback)
sdkComponent.value.dynamic?.open({
fileds: fileds
})
}
const updateNumericField = (list, data, fieldCode, decimalPlaces = 2) => {
const { amplitudeType, amplitudeVal, ratioVal, editType } = data
let theParentList = []
list.forEach((item, index) => {
if (!item.parentId || item[code.relationship]?.key !== 'C_ST_0') {
theParentList.push({ ...item, originIndex: index })
}
})
theParentList.forEach((item) => {
let newVal
const currentValue = item[fieldCode]?.key || 0
if (editType === 'fixed') {
newVal = data.fixedVal <= 0 ? 1 : data.fixedVal
} else if (editType === 'value') {
newVal = new BigNumber(currentValue)
.plus(new BigNumber(amplitudeVal).times(amplitudeType === 'add' ? 1 : -1))
.toFixed(decimalPlaces)
} else if (editType === 'ratio') {
newVal = new BigNumber(currentValue)
.times(new BigNumber(ratioVal).div(100))
.times(amplitudeType === 'add' ? 1 : -1)
.plus(currentValue)
.toFixed(decimalPlaces)
}
// 对于数量字段,最小值为1
if (fieldCode === code.num && newVal <= 0) {
newVal = '1'
}
list[item.originIndex][fieldCode] = { key: newVal, value: newVal }
})
return list
}
/**
* data: {
instanceCode: '',
editType: 'fixed', // 调整方式 固定值 fixed / 按数值调整 value / 按比例调整 ratio
amplitudeType:'add', // 调整类型 上调 add / 下调 minus
fixedVal: '', // 固定值
amplitudeVal: '', // 数值值
ratioVal: '', // 比例值
}
*/
const handleModify = (data) => {
const { listData } = callbackC
let list = data.flatListData(JSON.parse(JSON.stringify(listData.value)))
if (data.instanceCode === code.unitPrice) {
list.forEach((item) => {
let val
if (data.editType === 'fixed') {
val = data.fixedVal
} else if (data.editType === 'value') {
val = new BigNumber(item[code.unitPrice]?.key || 0)
.plus(new BigNumber(data.amplitudeVal).times(data.amplitudeType === 'add' ? 1 : -1))
.toFixed(2)
} else if (data.editType === 'ratio') {
val = new BigNumber(item[code.unitPrice]?.key || 0)
.times(
new BigNumber(data.ratioVal)
.div(100)
.times(data.amplitudeType === 'add' ? 1 : -1)
.plus(1)
)
.toFixed(2)
}
item[code.unitPrice] = { ...item[code.unitPrice], key: val, value: val }
})
} else if (data.instanceCode === code.num) {
updateNumericField(list, data, code.num, 0)
} else if (data.instanceCode === code.remark) {
const val = data.fixedVal
list.forEach((item) => {
item[code.remark] = { ...item[code.remark], key: val, value: val }
})
}
callbackC.emitEditTableData(callbackC.intoTree(list, 'id.key'))
callbackC?.dataValueChangeTrigger?.(code.num)
}
defineExpose({
init
})
</script>
<style lang='scss' scoped>
</style>