cloud-web-corejs 1.0.54-dev.784 → 1.0.54-dev.786

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cloud-web-corejs",
3
3
  "private": false,
4
- "version": "1.0.54-dev.784",
4
+ "version": "1.0.54-dev.786",
5
5
  "scripts": {
6
6
  "dev": "vue-cli-service serve",
7
7
  "dev:micro": "vue-cli-service serve --port 17527",
@@ -1,10 +1,10 @@
1
- import {getToken} from "../../utils/auth";
2
- import {openCnPrint} from "../../components/cnPrint/index";
3
- import {openHiPrint} from "../../components/hiprint/index";
4
- import {openJdPrint} from "../../components/jdPrint/index";
5
- import {openPddPrint} from "../../components/pddPrint/index";
6
- import {openVipPrint} from "../../components/vipPrint/index";
7
- import {openXhsPrint} from "../../components/xhsPrint/index";
1
+ import { getToken } from "../../utils/auth";
2
+ import { openCnPrint } from "../../components/cnPrint/index";
3
+ import { openHiPrint } from "../../components/hiprint/index";
4
+ import { openJdPrint } from "../../components/jdPrint/index";
5
+ import { openPddPrint } from "../../components/pddPrint/index";
6
+ import { openVipPrint } from "../../components/vipPrint/index";
7
+ import { openXhsPrint } from "../../components/xhsPrint/index";
8
8
 
9
9
  let modules;
10
10
  let configUtil = {
@@ -29,7 +29,7 @@ modules = {
29
29
  },
30
30
  computed: {
31
31
  buttonName() {
32
- if(this.option.label){
32
+ if (this.option.label) {
33
33
  return this.option.label;
34
34
  }
35
35
  let exportTemplates = this.exportTemplates;
@@ -143,14 +143,13 @@ modules = {
143
143
  },
144
144
  getTableGrid() {
145
145
  let grid = null;
146
- let tableTarget = this.option.tableTarget
146
+ let tableTarget = this.option.tableTarget;
147
147
  if (tableTarget) {
148
148
  if (typeof tableTarget === "function") {
149
149
  grid = tableTarget();
150
150
  } else {
151
151
  grid = tableTarget;
152
152
  }
153
-
154
153
  } else if (this.option.tableRef) {
155
154
  grid = this.parentTarget.$refs[this.option.tableRef];
156
155
  }
@@ -160,23 +159,22 @@ modules = {
160
159
  let checkRows = [];
161
160
  let $grid = this.getTableGrid();
162
161
 
163
-
164
162
  let condition = null;
165
- if(this.option.customCondition){
163
+ if (this.option.customCondition) {
166
164
  let condition1 = this.option.customCondition(item);
167
- if(condition1)condition = condition1;
165
+ if (condition1) condition = condition1;
168
166
  }
169
- if(!condition){
167
+ if (!condition) {
170
168
  if ($grid) {
171
169
  checkRows = $grid.getCheckboxRecords(true);
172
170
  } else {
173
- checkRows
174
- = typeof this.option.param === "function"
175
- ? this.option.param(item)
176
- : this.option.param;
171
+ checkRows =
172
+ typeof this.option.param === "function"
173
+ ? this.option.param(item)
174
+ : this.option.param;
177
175
  }
178
176
  let ids = checkRows ? checkRows.map((row) => row.id) : [];
179
- condition = ids.length ? {id: ids} : null;
177
+ condition = ids.length ? { id: ids } : null;
180
178
  }
181
179
  return condition;
182
180
 
@@ -222,7 +220,12 @@ modules = {
222
220
  if ($grid) {
223
221
  checkRows = $grid.getCheckboxRecords(true);
224
222
  if (!checkRows.length) {
225
- this.$baseAlert(this.$t2("请选择需要导出/打印的数据", "components.baseInputExport.selectDataTip"));
223
+ this.$baseAlert(
224
+ this.$t2(
225
+ "请选择需要导出/打印的数据",
226
+ "components.baseInputExport.selectDataTip"
227
+ )
228
+ );
226
229
  return;
227
230
  }
228
231
  }
@@ -238,7 +241,9 @@ modules = {
238
241
  } else if (this.exportTypes.includes(etType)) {
239
242
  //导出excel
240
243
  let conditions = this.tableDefalutHandle(exportTemplate) || [];
241
- this.$baseConfirm(this.$t2("您确定要导出吗?", "components.baseInputExport.exportTip")).then(() => {
244
+ this.$baseConfirm(
245
+ this.$t2("您确定要导出吗?", "components.baseInputExport.exportTip")
246
+ ).then(() => {
242
247
  let condition = $grid
243
248
  ? this.tableDefalutHandle(exportTemplate)
244
249
  : this.tableDefalutHandle(exportTemplate);
@@ -371,16 +376,17 @@ modules = {
371
376
  }
372
377
 
373
378
  function downLoadFile(row, that) {
374
- let realFileName = fileName ? fileName + "-" + row.uuid : row.uuid;
375
- let fileUrl
376
- = configUtil.baseUrl
377
- + that.option.prefix
378
- + "/export_ins/download?uuid="
379
- + row.uuid
380
- + "&ippaaapp="
381
- + row.ippaaapp
382
- + "&n="
383
- + realFileName;
379
+ let filename = row.filename || fileName;
380
+ let realFileName = filename ? filename + "-" + row.uuid : row.uuid;
381
+ let fileUrl =
382
+ configUtil.baseUrl +
383
+ that.option.prefix +
384
+ "/export_ins/download?uuid=" +
385
+ row.uuid +
386
+ "&ippaaapp=" +
387
+ row.ippaaapp +
388
+ "&n=" +
389
+ realFileName;
384
390
  var params = {};
385
391
  that.parentTarget.$http({
386
392
  method: "post",
@@ -52,19 +52,19 @@ import formulaDialog from "@base/components/xform/form-designer/form-widget/dial
52
52
  import baseFormulaDialog from "@base/components/xform/form-designer/form-widget/dialog/baseFormulaDialog.vue";
53
53
  import QRCode from "qrcode";
54
54
  import { openLuckysheetDialog } from "@base/components/luckysheet";
55
- import {
56
- openComponentDialog as mountComponentDialog,
57
- } from "@base/utils/componentDialog";
58
- import {
59
- buildTreeSubmitData,
60
- copyTreeData,
61
- getTreeLoadState,
62
- isTemporaryTreeKey,
63
- resolveTreeCopyConfig,
64
- resolveTreeFields,
65
- resolveTreeIdentityConfig,
66
- resolveTreeSubmitConfig,
67
- } from "../utils/treeTableUtil";
55
+ import {
56
+ openComponentDialog as mountComponentDialog,
57
+ } from "@base/utils/componentDialog";
58
+ import {
59
+ buildTreeSubmitData,
60
+ copyTreeData,
61
+ getTreeLoadState,
62
+ isTemporaryTreeKey,
63
+ resolveTreeCopyConfig,
64
+ resolveTreeFields,
65
+ resolveTreeIdentityConfig,
66
+ resolveTreeSubmitConfig,
67
+ } from "../utils/treeTableUtil";
68
68
 
69
69
  let modules = {};
70
70
  const baseRefUtil = {
@@ -1293,12 +1293,12 @@ modules = {
1293
1293
 
1294
1294
  return hasModifyItem;
1295
1295
  },
1296
- loadFormData(options = {}) {
1297
- let config = options.config || {};
1296
+ loadFormData(options = {}) {
1297
+ let config = options.config || {};
1298
1298
  let that = this;
1299
1299
  let formConfig = this.formConfig;
1300
1300
  let entity = formConfig.entity;
1301
- let dataId = options.dataId ?? this.dataId;
1301
+ let dataId = options.dataId ?? this.dataId;
1302
1302
  let reportTemplate = this.reportTemplate;
1303
1303
  let scriptCode = formConfig.formScriptCode || "getOne";
1304
1304
 
@@ -1327,13 +1327,13 @@ modules = {
1327
1327
  ...formScriptParam,
1328
1328
  },
1329
1329
  },
1330
- ...defaultOption,
1331
- success: (res) => {
1332
- formData = res.objx || {};
1333
- this.setFormData(formData, {
1334
- replace: options.replace === true,
1335
- });
1336
- options.callback && options.callback(formData);
1330
+ ...defaultOption,
1331
+ success: (res) => {
1332
+ formData = res.objx || {};
1333
+ this.setFormData(formData, {
1334
+ replace: options.replace === true,
1335
+ });
1336
+ options.callback && options.callback(formData);
1337
1337
  },
1338
1338
  ...config,
1339
1339
  });
@@ -1434,6 +1434,9 @@ modules = {
1434
1434
  config: {
1435
1435
  successMsg: false,
1436
1436
  isConfirm: false,
1437
+ // 这次保存是「启动流程」的一环,保存完就要接着提交,不能让宿主重挂载
1438
+ // 把当前表单销毁;刷新交给 onWfStartSuccess / onWfStartAbort。
1439
+ skipHostReloadAfterSave: true,
1437
1440
  success: (res) => {
1438
1441
  done();
1439
1442
  },
@@ -1462,6 +1465,8 @@ modules = {
1462
1465
  config: {
1463
1466
  successMsg: false,
1464
1467
  isConfirm: false,
1468
+ // 同上:流程通过前的自动保存,后续由流程侧刷新,此处不重挂载。
1469
+ skipHostReloadAfterSave: true,
1465
1470
  success: (res) => {
1466
1471
  done();
1467
1472
  },
@@ -2001,22 +2006,22 @@ modules = {
2001
2006
  n
2002
2007
  );
2003
2008
  },
2004
- setFormData: function (e, options = {}) {
2005
- let t = this;
2009
+ setFormData: function (e, options = {}) {
2010
+ let t = this;
2006
2011
  /*Object.keys(this.formDataModel).forEach(function (i) {
2007
2012
  e && e.hasOwnProperty(i) && (t.formDataModel[i] = baseRefUtil.deepClone(e[i]));
2008
2013
  });*/
2009
- let nextFormData = baseRefUtil.deepClone(e || {});
2010
- if (options.replace === true) {
2011
- Object.keys(t.formDataModel).forEach((key) => {
2012
- t.$delete(t.formDataModel, key);
2013
- });
2014
- Object.keys(nextFormData).forEach((key) => {
2015
- t.$set(t.formDataModel, key, nextFormData[key]);
2016
- });
2017
- } else {
2018
- Object.assign(t.formDataModel, nextFormData);
2019
- }
2014
+ let nextFormData = baseRefUtil.deepClone(e || {});
2015
+ if (options.replace === true) {
2016
+ Object.keys(t.formDataModel).forEach((key) => {
2017
+ t.$delete(t.formDataModel, key);
2018
+ });
2019
+ Object.keys(nextFormData).forEach((key) => {
2020
+ t.$set(t.formDataModel, key, nextFormData[key]);
2021
+ });
2022
+ } else {
2023
+ Object.assign(t.formDataModel, nextFormData);
2024
+ }
2020
2025
  this.currentFormData = e || {};
2021
2026
  this.broadcast("ContainerItem", "setFormData", this.formDataModel),
2022
2027
  this.broadcast("FieldWidget", "setFormData", this.formDataModel);
@@ -3993,206 +3998,206 @@ modules = {
3993
3998
  reject(msg);
3994
3999
  });
3995
4000
  });
3996
- },
3997
- getTreeTableUtilContext(tableTarget, $grid, source) {
3998
- let treeConfig = $grid?.treeConfig || {};
3999
- let originOption
4000
- = $grid?.params?.originOption || $grid?.originOption || {};
4001
- let fields = resolveTreeFields(treeConfig, {
4002
- strict: true,
4003
- });
4004
- let identityConfig = resolveTreeIdentityConfig(
4005
- treeConfig,
4006
- originOption.treeIdentityConfig || {}
4007
- );
4008
- let copyConfig = resolveTreeCopyConfig(
4009
- fields,
4010
- identityConfig,
4011
- originOption.treeCopyConfig || {}
4012
- );
4013
- let submitConfig = resolveTreeSubmitConfig(
4014
- originOption.treeSubmitConfig || {}
4015
- );
4016
- let temporaryKeyRegistry
4017
- = tableTarget?.treeTemporaryKeyRegistry || new Set();
4018
- let knownFormalKeyRegistry
4019
- = tableTarget?.treeKnownFormalKeyRegistry || new Set();
4020
-
4021
- this.collectTreeRuntimeRows(source || [], treeConfig).forEach((row) => {
4022
- let rowValue = row[fields.rowField];
4023
- let marker = row._X_TREE_TEMP_KEY;
4024
- if (marker !== undefined && marker !== null) {
4025
- temporaryKeyRegistry.add(marker);
4026
- }
4027
- if (
4028
- rowValue !== undefined
4029
- && rowValue !== null
4030
- && rowValue !== ""
4031
- && !isTemporaryTreeKey(row, fields.rowField, identityConfig)
4032
- ) {
4033
- knownFormalKeyRegistry.add(rowValue);
4034
- }
4035
- });
4036
-
4037
- return {
4038
- fields,
4039
- identityConfig,
4040
- copyConfig,
4041
- submitConfig,
4042
- temporaryKeyRegistry,
4043
- knownFormalKeyRegistry,
4044
- };
4045
- },
4046
- collectTreeRuntimeRows(rows, treeConfig) {
4047
- let result = [];
4048
- let visited = new WeakSet();
4049
- let childrenFields = [
4050
- treeConfig?.children,
4051
- treeConfig?.mapChildren || "_X_ROW_CHILD",
4052
- ].filter(Boolean);
4053
- let visit = (items) => {
4054
- if (!Array.isArray(items)) return;
4055
- items.forEach((item) => {
4056
- if (!item || typeof item !== "object" || visited.has(item)) return;
4057
- visited.add(item);
4058
- result.push(item);
4059
- childrenFields.forEach((field) => {
4060
- visit(item[field]);
4061
- });
4062
- });
4063
- };
4064
- visit(rows);
4065
- return result;
4066
- },
4067
- getTreeRuntimeSource($grid, source) {
4068
- let result = Array.isArray(source) ? source.slice() : [];
4069
- let runtimeSources = [
4070
- $grid?.getTableData?.()?.fullData,
4071
- $grid?.$refs?.xTable?.tableFullTreeData,
4072
- ];
4073
- runtimeSources.forEach((rows) => {
4074
- if (!Array.isArray(rows)) return;
4075
- rows.forEach((row) => {
4076
- if (!result.includes(row)) result.push(row);
4077
- });
4078
- });
4079
- return result;
4080
- },
4081
- getTreeUnloadedRows($grid, treeConfig) {
4082
- let xTable = $grid?.$refs?.xTable;
4083
- let fullData = this.getTreeRuntimeSource($grid, []);
4084
- return this.collectTreeRuntimeRows(fullData, treeConfig).filter(
4085
- (row) =>
4086
- getTreeLoadState(row, {
4087
- fields: resolveTreeFields(treeConfig),
4088
- isTreeNodeLoaded:
4089
- typeof xTable?.isTreeExpandLoaded === "function"
4090
- ? (targetRow) => xTable.isTreeExpandLoaded(targetRow)
4091
- : null,
4092
- }).requiresLoad
4093
- );
4094
- },
4095
- async ensureTreeTableLoadState(formTemplateTableDTO, operation) {
4096
- let tableTarget = this.getWidgetRef(formTemplateTableDTO.uniqueName);
4097
- let $grid = tableTarget?.getGridTable?.();
4098
- let treeConfig = $grid?.treeConfig;
4099
- if (!$grid || !treeConfig?.lazy) return;
4100
-
4101
- let treeContext = this.getTreeTableUtilContext(
4102
- tableTarget,
4103
- $grid,
4104
- this.formDataModel[formTemplateTableDTO.name] || []
4105
- );
4106
- let strategy = operation === "copy"
4107
- ? treeContext.copyConfig.lazyStrategy
4108
- : treeContext.submitConfig.unloadedChildrenStrategy;
4109
- if (operation === "submit" && strategy === "omit") return;
4110
-
4111
- let xTable = $grid.$refs?.xTable;
4112
- if (
4113
- !xTable
4114
- || typeof xTable.isTreeExpandLoaded !== "function"
4115
- || typeof $grid.setTreeExpand !== "function"
4116
- ) {
4117
- throw new Error(
4118
- `[${formTemplateTableDTO.tableAlias}]无法读取树节点加载状态`
4119
- );
4120
- }
4121
-
4122
- let unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4123
- if (!unloadedRows.length) return;
4124
- if (strategy !== "loadAll") {
4125
- let action = operation === "copy" ? "复制" : "保存";
4126
- throw new Error(
4127
- `[${formTemplateTableDTO.tableAlias}]存在尚未加载的树节点,请先展开后再${action}`
4128
- );
4129
- }
4130
-
4131
- let loopCount = 0;
4132
- while (unloadedRows.length) {
4133
- if (loopCount++ > 100) {
4134
- throw new Error(
4135
- `[${formTemplateTableDTO.tableAlias}]树节点层级过深,无法完成加载`
4136
- );
4137
- }
4138
- let currentRows = unloadedRows;
4139
- await Promise.all(
4140
- currentRows.map((row) => $grid.setTreeExpand(row, true))
4141
- );
4142
- unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4143
- if (
4144
- unloadedRows.length === currentRows.length
4145
- && unloadedRows.every((row) => currentRows.includes(row))
4146
- ) {
4147
- throw new Error(
4148
- `[${formTemplateTableDTO.tableAlias}]树节点加载未完成,已停止保存`
4149
- );
4150
- }
4151
- }
4152
- },
4153
- async ensureTreeTableReadyForSubmit(formTemplateTableDTO) {
4154
- return this.ensureTreeTableLoadState(
4155
- formTemplateTableDTO,
4156
- "submit"
4157
- );
4158
- },
4159
- async prepareTreeTablesForCopy() {
4160
- let treeTables = this.getFormTemplateTableDTOs().filter(
4161
- (item) => item.isTreeTable
4162
- );
4163
- for (let index = 0; index < treeTables.length; index++) {
4164
- await this.ensureTreeTableLoadState(treeTables[index], "copy");
4165
- }
4166
- },
4167
- async buildSubmitPayload(option) {
4168
- let treeTables = this.getFormTemplateTableDTOs().filter(
4169
- (item) => item.isTreeTable
4170
- );
4171
- for (let index = 0; index < treeTables.length; index++) {
4172
- await this.ensureTreeTableReadyForSubmit(treeTables[index]);
4173
- }
4174
- let formDataSnapshot = this.$baseLodash.cloneDeep(this.formDataModel);
4175
- let subData = this.getSubData2(false, {
4176
- mode: "submit",
4177
- formDataModel: formDataSnapshot,
4178
- });
4179
- if (option) {
4180
- let realFormData = {};
4181
- Object.keys(option).forEach((key) => {
4182
- realFormData[option[key]] = subData[key];
4183
- });
4184
- return realFormData;
4185
- }
4186
- return subData;
4187
- },
4188
- getSubData2(flag, context = {}) {
4001
+ },
4002
+ getTreeTableUtilContext(tableTarget, $grid, source) {
4003
+ let treeConfig = $grid?.treeConfig || {};
4004
+ let originOption
4005
+ = $grid?.params?.originOption || $grid?.originOption || {};
4006
+ let fields = resolveTreeFields(treeConfig, {
4007
+ strict: true,
4008
+ });
4009
+ let identityConfig = resolveTreeIdentityConfig(
4010
+ treeConfig,
4011
+ originOption.treeIdentityConfig || {}
4012
+ );
4013
+ let copyConfig = resolveTreeCopyConfig(
4014
+ fields,
4015
+ identityConfig,
4016
+ originOption.treeCopyConfig || {}
4017
+ );
4018
+ let submitConfig = resolveTreeSubmitConfig(
4019
+ originOption.treeSubmitConfig || {}
4020
+ );
4021
+ let temporaryKeyRegistry
4022
+ = tableTarget?.treeTemporaryKeyRegistry || new Set();
4023
+ let knownFormalKeyRegistry
4024
+ = tableTarget?.treeKnownFormalKeyRegistry || new Set();
4025
+
4026
+ this.collectTreeRuntimeRows(source || [], treeConfig).forEach((row) => {
4027
+ let rowValue = row[fields.rowField];
4028
+ let marker = row._X_TREE_TEMP_KEY;
4029
+ if (marker !== undefined && marker !== null) {
4030
+ temporaryKeyRegistry.add(marker);
4031
+ }
4032
+ if (
4033
+ rowValue !== undefined
4034
+ && rowValue !== null
4035
+ && rowValue !== ""
4036
+ && !isTemporaryTreeKey(row, fields.rowField, identityConfig)
4037
+ ) {
4038
+ knownFormalKeyRegistry.add(rowValue);
4039
+ }
4040
+ });
4041
+
4042
+ return {
4043
+ fields,
4044
+ identityConfig,
4045
+ copyConfig,
4046
+ submitConfig,
4047
+ temporaryKeyRegistry,
4048
+ knownFormalKeyRegistry,
4049
+ };
4050
+ },
4051
+ collectTreeRuntimeRows(rows, treeConfig) {
4052
+ let result = [];
4053
+ let visited = new WeakSet();
4054
+ let childrenFields = [
4055
+ treeConfig?.children,
4056
+ treeConfig?.mapChildren || "_X_ROW_CHILD",
4057
+ ].filter(Boolean);
4058
+ let visit = (items) => {
4059
+ if (!Array.isArray(items)) return;
4060
+ items.forEach((item) => {
4061
+ if (!item || typeof item !== "object" || visited.has(item)) return;
4062
+ visited.add(item);
4063
+ result.push(item);
4064
+ childrenFields.forEach((field) => {
4065
+ visit(item[field]);
4066
+ });
4067
+ });
4068
+ };
4069
+ visit(rows);
4070
+ return result;
4071
+ },
4072
+ getTreeRuntimeSource($grid, source) {
4073
+ let result = Array.isArray(source) ? source.slice() : [];
4074
+ let runtimeSources = [
4075
+ $grid?.getTableData?.()?.fullData,
4076
+ $grid?.$refs?.xTable?.tableFullTreeData,
4077
+ ];
4078
+ runtimeSources.forEach((rows) => {
4079
+ if (!Array.isArray(rows)) return;
4080
+ rows.forEach((row) => {
4081
+ if (!result.includes(row)) result.push(row);
4082
+ });
4083
+ });
4084
+ return result;
4085
+ },
4086
+ getTreeUnloadedRows($grid, treeConfig) {
4087
+ let xTable = $grid?.$refs?.xTable;
4088
+ let fullData = this.getTreeRuntimeSource($grid, []);
4089
+ return this.collectTreeRuntimeRows(fullData, treeConfig).filter(
4090
+ (row) =>
4091
+ getTreeLoadState(row, {
4092
+ fields: resolveTreeFields(treeConfig),
4093
+ isTreeNodeLoaded:
4094
+ typeof xTable?.isTreeExpandLoaded === "function"
4095
+ ? (targetRow) => xTable.isTreeExpandLoaded(targetRow)
4096
+ : null,
4097
+ }).requiresLoad
4098
+ );
4099
+ },
4100
+ async ensureTreeTableLoadState(formTemplateTableDTO, operation) {
4101
+ let tableTarget = this.getWidgetRef(formTemplateTableDTO.uniqueName);
4102
+ let $grid = tableTarget?.getGridTable?.();
4103
+ let treeConfig = $grid?.treeConfig;
4104
+ if (!$grid || !treeConfig?.lazy) return;
4105
+
4106
+ let treeContext = this.getTreeTableUtilContext(
4107
+ tableTarget,
4108
+ $grid,
4109
+ this.formDataModel[formTemplateTableDTO.name] || []
4110
+ );
4111
+ let strategy = operation === "copy"
4112
+ ? treeContext.copyConfig.lazyStrategy
4113
+ : treeContext.submitConfig.unloadedChildrenStrategy;
4114
+ if (operation === "submit" && strategy === "omit") return;
4115
+
4116
+ let xTable = $grid.$refs?.xTable;
4117
+ if (
4118
+ !xTable
4119
+ || typeof xTable.isTreeExpandLoaded !== "function"
4120
+ || typeof $grid.setTreeExpand !== "function"
4121
+ ) {
4122
+ throw new Error(
4123
+ `[${formTemplateTableDTO.tableAlias}]无法读取树节点加载状态`
4124
+ );
4125
+ }
4126
+
4127
+ let unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4128
+ if (!unloadedRows.length) return;
4129
+ if (strategy !== "loadAll") {
4130
+ let action = operation === "copy" ? "复制" : "保存";
4131
+ throw new Error(
4132
+ `[${formTemplateTableDTO.tableAlias}]存在尚未加载的树节点,请先展开后再${action}`
4133
+ );
4134
+ }
4135
+
4136
+ let loopCount = 0;
4137
+ while (unloadedRows.length) {
4138
+ if (loopCount++ > 100) {
4139
+ throw new Error(
4140
+ `[${formTemplateTableDTO.tableAlias}]树节点层级过深,无法完成加载`
4141
+ );
4142
+ }
4143
+ let currentRows = unloadedRows;
4144
+ await Promise.all(
4145
+ currentRows.map((row) => $grid.setTreeExpand(row, true))
4146
+ );
4147
+ unloadedRows = this.getTreeUnloadedRows($grid, treeConfig);
4148
+ if (
4149
+ unloadedRows.length === currentRows.length
4150
+ && unloadedRows.every((row) => currentRows.includes(row))
4151
+ ) {
4152
+ throw new Error(
4153
+ `[${formTemplateTableDTO.tableAlias}]树节点加载未完成,已停止保存`
4154
+ );
4155
+ }
4156
+ }
4157
+ },
4158
+ async ensureTreeTableReadyForSubmit(formTemplateTableDTO) {
4159
+ return this.ensureTreeTableLoadState(
4160
+ formTemplateTableDTO,
4161
+ "submit"
4162
+ );
4163
+ },
4164
+ async prepareTreeTablesForCopy() {
4165
+ let treeTables = this.getFormTemplateTableDTOs().filter(
4166
+ (item) => item.isTreeTable
4167
+ );
4168
+ for (let index = 0; index < treeTables.length; index++) {
4169
+ await this.ensureTreeTableLoadState(treeTables[index], "copy");
4170
+ }
4171
+ },
4172
+ async buildSubmitPayload(option) {
4173
+ let treeTables = this.getFormTemplateTableDTOs().filter(
4174
+ (item) => item.isTreeTable
4175
+ );
4176
+ for (let index = 0; index < treeTables.length; index++) {
4177
+ await this.ensureTreeTableReadyForSubmit(treeTables[index]);
4178
+ }
4179
+ let formDataSnapshot = this.$baseLodash.cloneDeep(this.formDataModel);
4180
+ let subData = this.getSubData2(false, {
4181
+ mode: "submit",
4182
+ formDataModel: formDataSnapshot,
4183
+ });
4184
+ if (option) {
4185
+ let realFormData = {};
4186
+ Object.keys(option).forEach((key) => {
4187
+ realFormData[option[key]] = subData[key];
4188
+ });
4189
+ return realFormData;
4190
+ }
4191
+ return subData;
4192
+ },
4193
+ getSubData2(flag, context = {}) {
4189
4194
  let that = this;
4190
4195
  let formCode = this.reportTemplate.formCode;
4191
4196
  let tableFiledMap = this.getTableFiledMap();
4192
4197
  let formTemplateTableDTOs = this.getFormTemplateTableDTOs();
4193
- let formDataModel
4194
- = context.formDataModel
4195
- || this.$baseLodash.cloneDeep(this.formDataModel);
4198
+ let formDataModel
4199
+ = context.formDataModel
4200
+ || this.$baseLodash.cloneDeep(this.formDataModel);
4196
4201
  let formConfig = this.formConfig;
4197
4202
 
4198
4203
  let res = {};
@@ -4227,32 +4232,32 @@ modules = {
4227
4232
  newFormData[tableAlias] = item ?? null;
4228
4233
  } else {
4229
4234
  if (formTemplateTableDTO.isTreeTable) {
4230
- let tableTarget = this.getWidgetRef(
4231
- formTemplateTableDTO.uniqueName
4232
- );
4233
- let $grid = tableTarget.getGridTable();
4234
- let treeTaBm = newFormData.treeTaBm || [];
4235
- treeTaBm.push(formTemplateTableDTO.tableAlias);
4236
- newFormData.treeTaBm = treeTaBm;
4237
- let modelRows = formDataModel[formTemplateTableDTO.name];
4238
- let sourceRows = Array.isArray(modelRows) ? modelRows : [];
4239
- let treeContext = this.getTreeTableUtilContext(
4240
- tableTarget,
4241
- $grid,
4242
- sourceRows
4243
- );
4244
- newFormData[tableAlias] = buildTreeSubmitData(sourceRows, {
4245
- ...treeContext,
4246
- submitConfig:
4247
- context.mode === "submit"
4248
- ? treeContext.submitConfig
4249
- : {
4250
- ...treeContext.submitConfig,
4251
- orphanParentStrategy: "preserve",
4252
- },
4253
- strict: context.mode === "submit",
4254
- });
4255
- } else {
4235
+ let tableTarget = this.getWidgetRef(
4236
+ formTemplateTableDTO.uniqueName
4237
+ );
4238
+ let $grid = tableTarget.getGridTable();
4239
+ let treeTaBm = newFormData.treeTaBm || [];
4240
+ treeTaBm.push(formTemplateTableDTO.tableAlias);
4241
+ newFormData.treeTaBm = treeTaBm;
4242
+ let modelRows = formDataModel[formTemplateTableDTO.name];
4243
+ let sourceRows = Array.isArray(modelRows) ? modelRows : [];
4244
+ let treeContext = this.getTreeTableUtilContext(
4245
+ tableTarget,
4246
+ $grid,
4247
+ sourceRows
4248
+ );
4249
+ newFormData[tableAlias] = buildTreeSubmitData(sourceRows, {
4250
+ ...treeContext,
4251
+ submitConfig:
4252
+ context.mode === "submit"
4253
+ ? treeContext.submitConfig
4254
+ : {
4255
+ ...treeContext.submitConfig,
4256
+ orphanParentStrategy: "preserve",
4257
+ },
4258
+ strict: context.mode === "submit",
4259
+ });
4260
+ } else {
4256
4261
  newFormData[tableAlias] =
4257
4262
  formDataModel[formTemplateTableDTO.name] ?? null;
4258
4263
  }
@@ -4449,10 +4454,10 @@ modules = {
4449
4454
  this.$baseReload();
4450
4455
  }
4451
4456
  },
4452
- reloadForm(option) {
4453
- let target1 = this.$attrs["parent-target"];
4454
- let target2 = target1?.$attrs["parent-target"];
4455
- let target = !target2 ? this : target1;
4457
+ reloadForm(option) {
4458
+ let target1 = this.$attrs["parent-target"];
4459
+ let target2 = target1?.$attrs["parent-target"];
4460
+ let target = !target2 ? this : target1;
4456
4461
  /* if (this.$attrs['reloadDialog'] !== true) {
4457
4462
  target = this.$attrs['parent-target'];
4458
4463
  }else{
@@ -4462,44 +4467,44 @@ modules = {
4462
4467
  for (let key in updateParam) {
4463
4468
  target.$emit("update:" + key, updateParam[key]);
4464
4469
  }*/
4465
- try {
4466
- let reloadListener = target?.$listeners?.reload;
4467
- if (Array.isArray(reloadListener)) {
4468
- return Promise.all(
4469
- reloadListener.map((listener) => listener(target, option))
4470
- );
4471
- }
4472
- if (typeof reloadListener === "function") {
4473
- return Promise.resolve(reloadListener(target, option));
4474
- }
4475
- return Promise.resolve(target.$baseReload(option));
4476
- } catch (error) {
4477
- return Promise.reject(error);
4478
- }
4479
- },
4480
- async reloadSavedFormData(option = {}) {
4481
- let updateParam = option.updateParam || {};
4482
- let nextDataId = updateParam.dataId ?? this.dataId;
4483
- let nextFormCode = updateParam.formCode;
4484
- if (nextDataId === undefined || nextDataId === null || nextDataId === "") {
4485
- throw new Error("缺少保存后的数据 ID,无法重新加载表单。");
4486
- }
4487
- let response = await this.loadFormData({
4488
- dataId: nextDataId,
4489
- replace: true,
4490
- });
4491
- if (!response || response.type !== "success") {
4492
- throw new Error(response?.content || "保存后的表单数据重新加载失败。");
4493
- }
4494
- if (nextDataId !== undefined && nextDataId !== null) {
4495
- this.$emit("update:dataId", nextDataId);
4496
- }
4497
- if (nextFormCode) {
4498
- this.$emit("update:formCode", nextFormCode);
4499
- }
4500
- await new Promise((resolve) => this.$nextTick(resolve));
4501
- return response;
4502
- },
4470
+ try {
4471
+ let reloadListener = target?.$listeners?.reload;
4472
+ if (Array.isArray(reloadListener)) {
4473
+ return Promise.all(
4474
+ reloadListener.map((listener) => listener(target, option))
4475
+ );
4476
+ }
4477
+ if (typeof reloadListener === "function") {
4478
+ return Promise.resolve(reloadListener(target, option));
4479
+ }
4480
+ return Promise.resolve(target.$baseReload(option));
4481
+ } catch (error) {
4482
+ return Promise.reject(error);
4483
+ }
4484
+ },
4485
+ async reloadSavedFormData(option = {}) {
4486
+ let updateParam = option.updateParam || {};
4487
+ let nextDataId = updateParam.dataId ?? this.dataId;
4488
+ let nextFormCode = updateParam.formCode;
4489
+ if (nextDataId === undefined || nextDataId === null || nextDataId === "") {
4490
+ throw new Error("缺少保存后的数据 ID,无法重新加载表单。");
4491
+ }
4492
+ let response = await this.loadFormData({
4493
+ dataId: nextDataId,
4494
+ replace: true,
4495
+ });
4496
+ if (!response || response.type !== "success") {
4497
+ throw new Error(response?.content || "保存后的表单数据重新加载失败。");
4498
+ }
4499
+ if (nextDataId !== undefined && nextDataId !== null) {
4500
+ this.$emit("update:dataId", nextDataId);
4501
+ }
4502
+ if (nextFormCode) {
4503
+ this.$emit("update:formCode", nextFormCode);
4504
+ }
4505
+ await new Promise((resolve) => this.$nextTick(resolve));
4506
+ return response;
4507
+ },
4503
4508
  saveForm(callback) {
4504
4509
  this.validateForm((valid) => {
4505
4510
  if (!valid) return;
@@ -4894,69 +4899,69 @@ modules = {
4894
4899
  getFormRef() {
4895
4900
  return this;
4896
4901
  },
4897
- isObject(value) {
4898
- return Object.prototype.toString.call(value) === "[object Object]";
4899
- },
4900
- handleCopyTreeData(value, widget) {
4901
- if (!Array.isArray(value) || !widget) return;
4902
-
4903
- let widgetName = widget.options.name;
4904
- let gridRef = this.getWidgetRef(widgetName);
4905
- let $grid = gridRef?.getGridTable?.();
4906
- if (!$grid) {
4907
- throw new Error(`[${widgetName}]树表尚未初始化`);
4908
- }
4909
- if (
4910
- $grid.treeConfig?.lazy
4911
- && this.getTreeUnloadedRows($grid, $grid.treeConfig).length
4912
- ) {
4913
- throw new Error(
4914
- `[${widgetName}]存在尚未加载的树节点,无法复制不完整子树`
4915
- );
4916
- }
4917
-
4918
- // prepareTreeTablesForCopy 会在深拷贝及 copyDataHandle 之前完成 loadAll,
4919
- // 此处只消费准备好的副本;不能再混入 VXE 活对象,否则会覆盖脚本修改并产生同键冲突。
4920
- let sourceRows = value;
4921
- if (!sourceRows.length) return;
4922
-
4923
- let treeContext = this.getTreeTableUtilContext(
4924
- gridRef,
4925
- $grid,
4926
- sourceRows
4927
- );
4928
- let copiedRows = copyTreeData(sourceRows, {
4929
- ...treeContext,
4930
- temporaryKeyRegistry: new Set(
4931
- treeContext.temporaryKeyRegistry
4932
- ),
4933
- targetRows: [],
4934
- });
4935
- let fields = treeContext.fields;
4936
- let ignoredFields = new Set([
4937
- fields.rowField,
4938
- fields.parentField,
4939
- fields.childrenField,
4940
- fields.mapChildrenField,
4941
- fields.hasChildField,
4942
- treeContext.identityConfig.physicalIdField,
4943
- "_X_ROW_KEY",
4944
- "_X_ROW_CHILD",
4945
- "_X_TREE_TEMP_KEY",
4946
- "f_wbs",
4947
- ]);
4948
-
4949
- copiedRows.forEach((row) => {
4950
- this.handleCopyDefaultData(row);
4951
- Object.keys(row).forEach((key) => {
4952
- if (ignoredFields.has(key) || !Array.isArray(row[key])) return;
4953
- this.handleCopyData(row[key], key);
4954
- });
4955
- });
4956
-
4957
- value.splice(0, value.length, ...copiedRows);
4958
- },
4959
- handleCopyDefaultData(data) {
4902
+ isObject(value) {
4903
+ return Object.prototype.toString.call(value) === "[object Object]";
4904
+ },
4905
+ handleCopyTreeData(value, widget) {
4906
+ if (!Array.isArray(value) || !widget) return;
4907
+
4908
+ let widgetName = widget.options.name;
4909
+ let gridRef = this.getWidgetRef(widgetName);
4910
+ let $grid = gridRef?.getGridTable?.();
4911
+ if (!$grid) {
4912
+ throw new Error(`[${widgetName}]树表尚未初始化`);
4913
+ }
4914
+ if (
4915
+ $grid.treeConfig?.lazy
4916
+ && this.getTreeUnloadedRows($grid, $grid.treeConfig).length
4917
+ ) {
4918
+ throw new Error(
4919
+ `[${widgetName}]存在尚未加载的树节点,无法复制不完整子树`
4920
+ );
4921
+ }
4922
+
4923
+ // prepareTreeTablesForCopy 会在深拷贝及 copyDataHandle 之前完成 loadAll,
4924
+ // 此处只消费准备好的副本;不能再混入 VXE 活对象,否则会覆盖脚本修改并产生同键冲突。
4925
+ let sourceRows = value;
4926
+ if (!sourceRows.length) return;
4927
+
4928
+ let treeContext = this.getTreeTableUtilContext(
4929
+ gridRef,
4930
+ $grid,
4931
+ sourceRows
4932
+ );
4933
+ let copiedRows = copyTreeData(sourceRows, {
4934
+ ...treeContext,
4935
+ temporaryKeyRegistry: new Set(
4936
+ treeContext.temporaryKeyRegistry
4937
+ ),
4938
+ targetRows: [],
4939
+ });
4940
+ let fields = treeContext.fields;
4941
+ let ignoredFields = new Set([
4942
+ fields.rowField,
4943
+ fields.parentField,
4944
+ fields.childrenField,
4945
+ fields.mapChildrenField,
4946
+ fields.hasChildField,
4947
+ treeContext.identityConfig.physicalIdField,
4948
+ "_X_ROW_KEY",
4949
+ "_X_ROW_CHILD",
4950
+ "_X_TREE_TEMP_KEY",
4951
+ "f_wbs",
4952
+ ]);
4953
+
4954
+ copiedRows.forEach((row) => {
4955
+ this.handleCopyDefaultData(row);
4956
+ Object.keys(row).forEach((key) => {
4957
+ if (ignoredFields.has(key) || !Array.isArray(row[key])) return;
4958
+ this.handleCopyData(row[key], key);
4959
+ });
4960
+ });
4961
+
4962
+ value.splice(0, value.length, ...copiedRows);
4963
+ },
4964
+ handleCopyDefaultData(data) {
4960
4965
  data.create_by = null;
4961
4966
  data._create_by = null;
4962
4967
  data.create_date = null;
@@ -5011,22 +5016,22 @@ modules = {
5011
5016
  });
5012
5017
  }
5013
5018
  },
5014
- async openCopyEditTab(copyData) {
5015
- try {
5016
- await this.prepareTreeTablesForCopy();
5017
- let formData = this.$baseLodash.cloneDeep(
5018
- copyData || this.formDataModel
5019
- );
5020
- if (formData) {
5021
- this.handleCopyData(formData);
5022
- }
5023
- this.$emit("openCopyEditTab", formData);
5024
- return true;
5025
- } catch (error) {
5026
- this.$message.error(error?.message || "树表数据尚未准备完成");
5027
- return false;
5028
- }
5029
- },
5019
+ async openCopyEditTab(copyData) {
5020
+ try {
5021
+ await this.prepareTreeTablesForCopy();
5022
+ let formData = this.$baseLodash.cloneDeep(
5023
+ copyData || this.formDataModel
5024
+ );
5025
+ if (formData) {
5026
+ this.handleCopyData(formData);
5027
+ }
5028
+ this.$emit("openCopyEditTab", formData);
5029
+ return true;
5030
+ } catch (error) {
5031
+ this.$message.error(error?.message || "树表数据尚未准备完成");
5032
+ return false;
5033
+ }
5034
+ },
5030
5035
 
5031
5036
  async exportPdf() {
5032
5037
  // statusEl.style.display = 'block';
@@ -274,15 +274,12 @@ modules = {
274
274
  = typeof formRef.reloadSavedFormData === "function"
275
275
  ? formRef.reloadSavedFormData
276
276
  : formRef.reloadForm;
277
+ // 保存成功后一律让宿主整页重挂载(toggle v-if):新增/编辑都需要出流程信息、
278
+ // 切编辑模板、按新状态重算显隐与只读——这些就地取数(reloadSavedFormData)做不到。
279
+ // 唯一例外是「保存并提交」路径(skipHostReloadAfterSave=true),
280
+ // 它的刷新交给流程结束后的 onWfStartSuccess / onWfStartAbort,避免刷两次。
277
281
  let runHostReload = async () => {
278
- let currentFormCode = formRef.reportTemplate?.formCode;
279
- if (
280
- skipHostReloadAfterSave
281
- || !editFormCode
282
- || editFormCode === currentFormCode
283
- ) {
284
- return;
285
- }
282
+ if (skipHostReloadAfterSave) return;
286
283
  await formRef.reloadForm({ updateParam });
287
284
  };
288
285
  let callbacksStarted = false;