|
|
@@ -15,6 +15,7 @@ import '@synboy/spreadjs-custom-render/dist/style.css'
|
|
|
import { getStandardTemplateInfo } from '@/api/pressure2/standard/template'
|
|
|
import { ExcelApi } from '@/api/pressure2/excel'
|
|
|
import { DynamicTbValApi } from '@/api/pressure2/dynamictbval'
|
|
|
+import { serializeDataSourceForStorage } from '@/utils/reportUtil'
|
|
|
import { buildFileUrl } from '@/utils'
|
|
|
import axios from 'axios'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
@@ -24,10 +25,16 @@ defineOptions({ name: 'SsjsonReportViewer' })
|
|
|
const emit = defineEmits<{
|
|
|
ready: []
|
|
|
save: [data: Record<string, any>]
|
|
|
+ saveSuccess: [result: { insId: string; dataSource: Record<string, any>; refId: string }]
|
|
|
+ saveFail: []
|
|
|
}>()
|
|
|
|
|
|
const previewRef = ref<InstanceType<typeof OptimizedTemplatePreview>>()
|
|
|
const loading = ref(false)
|
|
|
+// 当前实例ID(从 loadByRefId 的后端响应中获取)
|
|
|
+const currentInsId = ref<string>('')
|
|
|
+// 当前 refId(保存成功事件透传用)
|
|
|
+const currentRefId = ref<string>('')
|
|
|
|
|
|
// SpreadJS 授权(仅设置一次,避免反复赋值)
|
|
|
const licenseKey = import.meta.env.VITE_SPREADJS_LICENSE_KEY
|
|
|
@@ -279,6 +286,9 @@ const loadByRefId = async (
|
|
|
// OptimizedTemplatePreview 根据 bindingPath + formData 渲染,不需要在 workbook 上 setDataSource
|
|
|
let sheetData: Record<string, any> = {}
|
|
|
const res = await DynamicTbValApi.getDynamicTbInsAndValByRefId(initData)
|
|
|
+ // 保存实例ID和refId,供保存功能使用
|
|
|
+ currentInsId.value = res.dynamicTbInsRespVO?.id || ''
|
|
|
+ currentRefId.value = initData.refId || ''
|
|
|
if (res.dynamicTbValRespVOList?.length) {
|
|
|
res.dynamicTbValRespVOList.forEach((i: any) => {
|
|
|
const val = i.valValue
|
|
|
@@ -365,7 +375,51 @@ const clearFormData = () => previewRef.value?.clearFormData?.()
|
|
|
const getUploadFields = () => previewRef.value?.getUploadFields?.()
|
|
|
|
|
|
const handleReady = () => emit('ready')
|
|
|
-const handleSave = (data: Record<string, any>) => emit('save', data)
|
|
|
+
|
|
|
+/**
|
|
|
+ * 保存数据(供父组件通过 ref 调用,或由内部 @save 事件触发)
|
|
|
+ * 参考 SpreadViewer.handleSave:
|
|
|
+ * 1. 收集 OptimizedTemplatePreview 的表单数据(bindingPath → value)
|
|
|
+ * 2. 序列化(对象/数组 → JSON 字符串)
|
|
|
+ * 3. 调用 DynamicTbValApi.saveAllColValue 持久化
|
|
|
+ */
|
|
|
+const handleSave = async () => {
|
|
|
+ if (!currentInsId.value) {
|
|
|
+ ElMessage.warning('缺少实例ID,无法保存')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ // 收集表单数据(bindingPath → value,来自各表单组件的双向绑定)
|
|
|
+ const boundData = previewRef.value?.getBoundFormData?.() || {}
|
|
|
+ if (!Object.keys(boundData).length) {
|
|
|
+ ElMessage.warning('没有可保存的数据')
|
|
|
+ loading.value = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 序列化(对象/数组 → JSON 字符串,与 SpreadViewer 保持一致)
|
|
|
+ const serializedData = serializeDataSourceForStorage(boundData)
|
|
|
+ // 调用后端 API 持久化
|
|
|
+ const res = await DynamicTbValApi.saveAllColValue(currentInsId.value, serializedData)
|
|
|
+ if (res) {
|
|
|
+ ElMessage.success('保存成功')
|
|
|
+ emit('saveSuccess', {
|
|
|
+ insId: currentInsId.value,
|
|
|
+ dataSource: serializedData,
|
|
|
+ refId: currentRefId.value
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ emit('saveFail')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('保存失败:', e)
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ emit('saveFail')
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
if (tempHost) {
|
|
|
@@ -378,6 +432,7 @@ defineExpose({
|
|
|
loadByTemplateId,
|
|
|
loadByRefId,
|
|
|
loadFromConfig,
|
|
|
+ handleSave,
|
|
|
getBoundFormData,
|
|
|
setFormData,
|
|
|
clearFormData,
|