Files
yihuiyong-ui/apps/web-ele/src/views/database/interface/unit/MaterialsDialog.vue
2026-04-23 11:37:37 +08:00

132 lines
3.8 KiB
Vue

<script setup lang="ts">
import { getCategoriesList } from '#/api/database/materials/root';
import { DbHst } from '#/components/db-hst';
import { ElButton, ElDialog, ElInput } from 'element-plus';
import { computed, nextTick, ref, watch } from 'vue';
const props = defineProps<{
modelValue: boolean
rowData?: any
catalogItemId?: string
}>()
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'success', value: string): void
}>()
const isVisible = computed({
get: () => props.modelValue,
set: (value) => emit('update:modelValue', value),
})
const formulaInput = ref('')
const hstRef = ref<any>(null)
const tableData = ref<any[]>([])
const handleSubmit = () => {
emit('success', formulaInput.value)
isVisible.value = false
}
// 加载工料机总类数据
const loadCategoriesData = async () => {
try {
const res = await getCategoriesList()
// 转换数据格式,映射到表格列
tableData.value = (res || []).map((item: any, index: number) => ({
code: String(index + 1),
category: item.code || '',
taxFreeBaseCode: item.taxExclBaseCode || '',
taxIncludedBaseCode: item.taxInclBaseCode || '',
taxFreeCompileCode: item.taxExclCompileCode || '',
taxIncludedCompileCode: item.taxInclCompileCode || '',
}))
} catch (error) {
console.error('加载工料机总类失败:', error)
tableData.value = []
}
}
const columns = [
{ type: 'text', data: 'code', title: '序号', width: 60, readOnly: true },
{ type: 'text', data: 'category', title: '类别', readOnly: true },
{ type: 'text', data: 'taxFreeBaseCode', title: '除税基价代码', readOnly: true },
{ type: 'text', data: 'taxIncludedBaseCode', title: '含税基价代码', readOnly: true },
{ type: 'text', data: 'taxFreeCompileCode', title: '除税编制代码', readOnly: true },
{ type: 'text', data: 'taxIncludedCompileCode', title: '含税编制代码', readOnly: true },
]
const allowedSelectionDataKeys = new Set([
'taxFreeBaseCode',
'taxIncludedBaseCode',
'taxFreeCompileCode',
'taxIncludedCompileCode',
])
let settings = {
data: [],
colWidths: 150,
columns: columns,
rowHeaders: false,
nestedRows: false,
bindRowsWithHeaders: true,
selectionMode: 'single',
className: 'htCenter',
afterSelection(row: number, col: number, row2: number, col2: number) {
if (row < 0 || col < 0) return
const selectedDataKey = columns?.[col]?.data
if (!selectedDataKey || !allowedSelectionDataKeys.has(selectedDataKey)) return
const cellValue = this.getDataAtCell(row, col)
if (cellValue == null) return
formulaInput.value += String(cellValue)
}
}
watch(
() => props.modelValue,
async (visible) => {
if (!visible) {
formulaInput.value = ''
return
}
// 加载工料机总类数据
await loadCategoriesData()
nextTick(() => {
setTimeout(() => {
if(hstRef?.value?.hotInstance) {
hstRef?.value?.hotInstance.loadData(tableData.value)
}
}, 200);
})
const currentCardinal = props.rowData?.cardinal
formulaInput.value = currentCardinal == null ? '' : String(currentCardinal)
},
{ immediate: true, deep: true },
)
</script>
<template>
<ElDialog v-model="isVisible" title="工料机总类" width="60%" :close-on-click-modal="false" body-class="materials-body-height">
<div class="h-full w-full flex flex-col">
<div>
<ElInput v-model="formulaInput" placeholder="请输入计算基数公式" clearable></ElInput>
</div>
<DbHst ref="hstRef" :settings="settings" v-if="isVisible"></DbHst>
</div>
<template #footer>
<ElButton @click="isVisible = false">取消</ElButton>
<ElButton type="primary" @click="handleSubmit">确定</ElButton>
</template>
</ElDialog>
</template>
<style lang="scss">
.materials-body-height{
height: 500px;
}
</style>