fmui-base 2.3.59 → 2.3.61

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/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  ---npm publish
4
4
 
5
5
  ## 更新日志
6
+ - 2.3.61:移动端流程提交时过滤主键无效参数,如null字符串
7
+ - 2.3.60:移动端支持减签
6
8
  - 2.3.59:移动端不通过的流程允许作废,移动端支持关联流程
7
9
  - 2.3.58:移动端数据表设置字段的关联值支持用户岗位
8
10
  - 2.3.57:移动端自动通过返回后打开表单报错
package/lib/db/db.js CHANGED
@@ -711,6 +711,31 @@ context.create('FlowModuleAPI', {
711
711
  });
712
712
  }
713
713
  },
714
+ getSignUserList: {
715
+ mockUrl: 'query/getSignUserList.json',
716
+ header: {
717
+ Authorization: 'Bearer ' + getLoginUserInfo().token
718
+ },
719
+ url: _variables2.default.URLS.getSignUserList,
720
+ method: 'GET',
721
+ willFetch: function willFetch() {}
722
+ },
723
+ reduceSign: {
724
+ mockUrl: 'query/reduceSign.json',
725
+ header: {
726
+ Authorization: 'Bearer ' + getLoginUserInfo().token
727
+ },
728
+ url: _variables2.default.URLS.reduceSign,
729
+ method: 'POST',
730
+ postDataFomat: 'FORM',
731
+ willFetch: function willFetch() {
732
+ _Toast2.default.show({
733
+ content: _react2.default.createElement(_loading2.default, null),
734
+ hasMask: true,
735
+ duration: 800
736
+ });
737
+ }
738
+ },
714
739
  getCanJumpActivity: {
715
740
  mockUrl: 'query/getCanJumpActivity.json',
716
741
  header: {
@@ -92,6 +92,8 @@ exports.default = {
92
92
  queryFlowChart: approveUrlPrefix + "queryFlowChart" + '?', //查找流程记录
93
93
  getFlowImage: approveUrlPrefix + "getFlowImage" + '?token=' + getLoginUserInfo().token + "&processInstanceId=", //查找流程图片
94
94
  addSign: approveUrlPrefix + "addSign" + '?', //加签
95
+ getSignUserList: approveUrlPrefix + "getSignUserList" + '?', //减签用户列表
96
+ reduceSign: approveUrlPrefix + "reduceSign" + '?', //减签
95
97
  getCanJumpActivity: approveUrlPrefix + "getCanJumpActivity" + '?', //跳转流程
96
98
  jump: approveUrlPrefix + "jump" + '?', //跳转
97
99
  getDoneTaskListByProcessId: approveUrlPrefix + "getDoneTaskListByProcessId" + '?', //根据流程实例id查询已办
@@ -6,10 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
 
7
7
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
8
8
 
9
+ exports.isValidFormDataId = isValidFormDataId;
9
10
  exports.cloneAndFilterEmptySubTblRows = cloneAndFilterEmptySubTblRows;
10
11
  /**
11
- * 子表空行过滤(提交用):UI 仍可留空行,仅从提交数据中去掉业务全空行。
12
- * 系统字段忽略;0/false 有值;宏回填有值则保留。
12
+ * 子表空行过滤 + 提交 formData 精简(对齐 PC runtimeUtil.getInputData):
13
+ * - UI 仍可留空行,仅从提交数据中去掉业务全空行
14
+ * - 去掉 formItem / linkFields 等仅前端渲染用的大字段
15
+ * - 字段项只保留 key / value(与 PC、后端 KeyValueDto 一致)
13
16
  */
14
17
 
15
18
  var SUB_TBL_SYS_FIELDS = {
@@ -29,6 +32,27 @@ var SUB_TBL_SYS_FIELDS = {
29
32
  sort_no: true
30
33
  };
31
34
 
35
+ /** 提交时从 formData 顶层去掉的前端元数据(PC getInputData 不携带) */
36
+ var SUBMIT_STRIP_TOP_KEYS = {
37
+ formItem: true,
38
+ linkFields: true
39
+ };
40
+
41
+ /**
42
+ * 是否为可用的主表 dataId(排除 null / "null" / "undefined" / 空串)
43
+ * 后端 optlock 校验:已传 optlock 但 dataId 无效会直接报「数据已被他人修改」
44
+ */
45
+ function isValidFormDataId(dataId) {
46
+ if (dataId === null || typeof dataId === 'undefined') {
47
+ return false;
48
+ }
49
+ var s = String(dataId).replace(/^\s+|\s+$/g, '');
50
+ if (s === '' || s === 'null' || s === 'undefined' || s === '-1') {
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+
32
56
  function isSubTblSysField(key) {
33
57
  if (key == null || key === '') {
34
58
  return true;
@@ -87,11 +111,14 @@ function isEmptySubTblBusinessRow(row) {
87
111
  return true;
88
112
  }
89
113
  for (var i = 0; i < row.length; i++) {
90
- var kv = row[i];
91
- if (!kv || isSubTblSysField(kv.key)) {
114
+ var cell = row[i];
115
+ if (!cell) {
116
+ continue;
117
+ }
118
+ if (isSubTblSysField(cell.key)) {
92
119
  continue;
93
120
  }
94
- if (hasSubTblBusinessValue(kv.value)) {
121
+ if (hasSubTblBusinessValue(cell.value)) {
95
122
  return false;
96
123
  }
97
124
  }
@@ -111,8 +138,103 @@ function filterEmptySubTblDataList(subTblData) {
111
138
  return kept;
112
139
  }
113
140
 
141
+ /** 对齐 PC:字段项只保留 key / value */
142
+ function slimKeyValueItem(item) {
143
+ if (!item || (typeof item === 'undefined' ? 'undefined' : _typeof(item)) !== 'object') {
144
+ return item;
145
+ }
146
+ return {
147
+ key: item.key,
148
+ value: item.value
149
+ };
150
+ }
151
+
152
+ function slimKeyValueList(list) {
153
+ if (!list || !list.length) {
154
+ return list || [];
155
+ }
156
+ var out = [];
157
+ for (var i = 0; i < list.length; i++) {
158
+ out.push(slimKeyValueItem(list[i]));
159
+ }
160
+ return out;
161
+ }
162
+
163
+ function slimSubTblDataRows(subTblData) {
164
+ if (!subTblData || !subTblData.length) {
165
+ return subTblData || [];
166
+ }
167
+ var rows = [];
168
+ for (var i = 0; i < subTblData.length; i++) {
169
+ rows.push(slimKeyValueList(subTblData[i]));
170
+ }
171
+ return rows;
172
+ }
173
+
174
+ /**
175
+ * 去掉 formItem/linkFields,并将 main/sub/related 字段精简为 key/value
176
+ */
177
+ function slimFormDataForSubmit(data) {
178
+ if (!data || (typeof data === 'undefined' ? 'undefined' : _typeof(data)) !== 'object') {
179
+ return data;
180
+ }
181
+ for (var stripKey in SUBMIT_STRIP_TOP_KEYS) {
182
+ if (Object.prototype.hasOwnProperty.call(SUBMIT_STRIP_TOP_KEYS, stripKey) && data.hasOwnProperty(stripKey)) {
183
+ delete data[stripKey];
184
+ }
185
+ }
186
+ // 规范化 dataId:字符串 "null" 会导致后端 optlock 按主键更新失败
187
+ if (!isValidFormDataId(data.dataId)) {
188
+ data.dataId = '';
189
+ // 无真实主键时不带 optlock,后端才会跳过乐观锁校验(新建/发起场景)
190
+ if (data.hasOwnProperty('optlock')) {
191
+ delete data.optlock;
192
+ }
193
+ }
194
+ // 对齐 PC getInputData:moduleCode / paramJson 用空串,不传 null
195
+ if (data.moduleCode == null || data.moduleCode === 'null' || data.moduleCode === 'undefined') {
196
+ data.moduleCode = '';
197
+ }
198
+ if (data.paramJson == null || data.paramJson === 'null' || data.paramJson === 'undefined') {
199
+ data.paramJson = '';
200
+ }
201
+ // PC 已注释写入 formVersion;无有效值时不携带,避免 formVersion:null
202
+ if (data.formVersion == null || data.formVersion === '' || data.formVersion === 'null' || data.formVersion === 'undefined') {
203
+ delete data.formVersion;
204
+ }
205
+ if (data.mainTblData) {
206
+ data.mainTblData = slimKeyValueList(data.mainTblData);
207
+ }
208
+ var subTbl = data.subTbl || [];
209
+ for (var i = 0; i < subTbl.length; i++) {
210
+ if (subTbl[i] && subTbl[i].subTblData) {
211
+ subTbl[i].subTblData = slimSubTblDataRows(subTbl[i].subTblData);
212
+ }
213
+ }
214
+ var relatedTbl = data.relatedTbl || [];
215
+ for (var r = 0; r < relatedTbl.length; r++) {
216
+ var related = relatedTbl[r];
217
+ if (!related) {
218
+ continue;
219
+ }
220
+ if (related.relatedMainTblData) {
221
+ related.relatedMainTblData = slimKeyValueList(related.relatedMainTblData);
222
+ }
223
+ var relatedSub = related.relatedSubTblData;
224
+ if (!relatedSub) {
225
+ continue;
226
+ }
227
+ for (var s = 0; s < relatedSub.length; s++) {
228
+ if (relatedSub[s] && relatedSub[s].subTblData) {
229
+ relatedSub[s].subTblData = slimSubTblDataRows(relatedSub[s].subTblData);
230
+ }
231
+ }
232
+ }
233
+ return data;
234
+ }
235
+
114
236
  /**
115
- * 深拷贝后过滤空子表行(不改动页面 state / UI)
237
+ * 深拷贝后过滤空子表行,并精简为与 PC getInputData 一致的提交结构(不改动页面 state / UI)
116
238
  */
117
239
  function cloneAndFilterEmptySubTblRows(editFormData) {
118
240
  if (!editFormData) {
@@ -122,7 +244,12 @@ function cloneAndFilterEmptySubTblRows(editFormData) {
122
244
  try {
123
245
  data = JSON.parse(JSON.stringify(editFormData));
124
246
  } catch (e) {
125
- return editFormData;
247
+ // 深拷贝失败时仍做顶层清洗,避免新建把 formItem/optlock 原样提交
248
+ try {
249
+ data = Object.assign({}, editFormData);
250
+ } catch (e2) {
251
+ return slimFormDataForSubmit(editFormData);
252
+ }
126
253
  }
127
254
  var subTbl = data.subTbl || [];
128
255
  for (var i = 0; i < subTbl.length; i++) {
@@ -142,7 +269,7 @@ function cloneAndFilterEmptySubTblRows(editFormData) {
142
269
  }
143
270
  }
144
271
  }
145
- return data;
272
+ return slimFormDataForSubmit(data);
146
273
  }
147
274
 
148
275
  exports.default = cloneAndFilterEmptySubTblRows;
package/lib/form/form.js CHANGED
@@ -423,9 +423,39 @@ var PageHome = function (_React$Component) {
423
423
  //处理数据
424
424
  var tableData = {};
425
425
  if (status == '0') {
426
- //新增
427
- //新增
428
- value = form.defaultValue;
426
+ //新增 / 再次发起(readd 也走 status=0 以便自动编号取 defaultValue)
427
+ // 再次发起等场景:formData 已带回原值。若一律用 defaultValue,普通字段会空,且后面 sync 会冲掉 mainTblData。
428
+ // 但自动编号/赋值宏必须继续用重新生成的 defaultValue,不能继承原单编号。
429
+ var loadedValue = this.dealwithData(itemParam, mainTblData, relatedTbl);
430
+ var hasLoadedField = false;
431
+ if (formTblId.indexOf(fieldTblId) > 0) {
432
+ relatedTbl.map(function (item) {
433
+ if (item.relatedMainTblName == fieldTblName) {
434
+ item.relatedMainTblData.map(function (item2) {
435
+ if (item2.key == key) {
436
+ hasLoadedField = true;
437
+ }
438
+ });
439
+ }
440
+ });
441
+ } else {
442
+ mainTblData.map(function (item) {
443
+ if (item.key == key) {
444
+ hasLoadedField = true;
445
+ }
446
+ });
447
+ }
448
+ var isBizCodeMacroEarly = form.dataAttr && form.dataAttr.dataSrc == '2' && form.dataAttr.fromMacro && form.dataAttr.fromMacro.value == 'bizCode';
449
+ var inFuzhiFields = !!(fuzhiFields && fuzhiFields.split(",").indexOf(uniqueName) != -1);
450
+ // 赋值字段 或 自动编号宏:有新 defaultValue 时强制重生(对齐上次「再次发起自动编号重新生成」)
451
+ var shouldRegenDefault = form.defaultValue != null && form.defaultValue !== '' && (inFuzhiFields || isBizCodeMacroEarly);
452
+ if (shouldRegenDefault) {
453
+ value = form.defaultValue;
454
+ } else if (hasLoadedField) {
455
+ value = loadedValue || loadedValue === 0 ? loadedValue : form.defaultValue != null ? form.defaultValue : '';
456
+ } else {
457
+ value = form.defaultValue;
458
+ }
429
459
 
430
460
  if (formTblId.indexOf(fieldTblId) > 0) {
431
461
  var hasTable = false;
@@ -445,7 +475,7 @@ var PageHome = function (_React$Component) {
445
475
  //字段不存在
446
476
 
447
477
  tableData.key = key;
448
- tableData.value = form.defaultValue;
478
+ tableData.value = value;
449
479
  tableData.required = required;
450
480
  tableData.label = title;
451
481
  tableData.inputFormat = form.inputFormat;
@@ -484,7 +514,7 @@ var PageHome = function (_React$Component) {
484
514
  });
485
515
  if (!hasField) {
486
516
  tableData.key = key;
487
- tableData.value = form.defaultValue;
517
+ tableData.value = value;
488
518
  tableData.required = required;
489
519
  tableData.label = title;
490
520
  tableData.inputFormat = form.inputFormat;
@@ -703,13 +733,19 @@ var PageHome = function (_React$Component) {
703
733
  // value = form.defaultValue;
704
734
  // }
705
735
  // 宏值新需求,赋值字段取defaultValue;自动编号额外兜底 form.value,避免 formData 偶发缺字段导致空白/丢数
736
+ // 再次发起(status=0):即使 formData 已有旧编号,赋值/自动编号仍强制用重新生成的 defaultValue
706
737
  if (itemParam.dataAttr && itemParam.dataAttr.dataSrc == '2' && fuzhiFields != '') {
707
738
  var isBizCodeMacro = itemParam.dataAttr.fromMacro && itemParam.dataAttr.fromMacro.value == 'bizCode';
708
739
  if (fuzhiFields.split(",").indexOf(itemParam.uniqueName) != -1 && form.defaultValue && form.defaultValue != null) {
709
740
  value = form.defaultValue;
741
+ } else if (status == '0' && isBizCodeMacro && form.defaultValue && form.defaultValue != null) {
742
+ value = form.defaultValue;
710
743
  } else if (isBizCodeMacro && (value === '' || value == null || typeof value == 'undefined') && form.value) {
711
744
  value = form.value;
712
745
  }
746
+ } else if (itemParam.dataAttr && itemParam.dataAttr.dataSrc == '2' && itemParam.dataAttr.fromMacro && itemParam.dataAttr.fromMacro.value == 'bizCode' && status == '0' && form.defaultValue && form.defaultValue != null) {
747
+ // 再次发起:无 fuzhiFields 列表时,只要后端 readd 重生了 defaultValue 也要用新编号
748
+ value = form.defaultValue;
713
749
  } else if (itemParam.dataAttr && itemParam.dataAttr.dataSrc == '2' && itemParam.dataAttr.fromMacro && itemParam.dataAttr.fromMacro.value == 'bizCode' && (value === '' || value == null || typeof value == 'undefined') && form.value) {
714
750
  value = form.value;
715
751
  } else if (itemParam.dataAttr && itemParam.dataAttr.dataSrc == '2' && itemParam.dataAttr.fromMacro && itemParam.dataAttr.fromMacro.value == 'bizCode' && (value === '' || value == null || typeof value == 'undefined') && form.defaultValue) {
@@ -888,15 +924,17 @@ var PageHome = function (_React$Component) {
888
924
  // }else{
889
925
  // valueArray.push(value);
890
926
  // }
891
- if (status == '0') {
927
+ if (status == '0' && !value && value !== 0) {
892
928
  selectItem.map(function (selectI) {
893
929
  if (selectI.isDefault == 1) {
894
930
  valueArray.push(selectI.value);
895
931
  }
896
932
  });
897
933
  } else {
898
- if (value.indexOf("[") >= 0) {
934
+ if (value && (value + '').indexOf("[") >= 0) {
899
935
  valueArray = JSON.parse(value);
936
+ } else if (value || value === 0) {
937
+ valueArray = (value + '').split(",");
900
938
  }
901
939
  }
902
940
  selectItem.map(function (selectI) {
@@ -1425,9 +1463,12 @@ var PageHome = function (_React$Component) {
1425
1463
  value = false;
1426
1464
  }
1427
1465
  } else {
1428
- var defaultValue = form.defaultValue;
1429
- if (defaultValue) {
1430
- if (defaultValue == '1') {
1466
+ // 再次发起:已有落库值优先;全新新增才用设计默认
1467
+ var switchSrc = value || value === 0 || value === false ? value : form.defaultValue;
1468
+ if (switchSrc === true || switchSrc === false) {
1469
+ value = switchSrc;
1470
+ } else if (switchSrc) {
1471
+ if (switchSrc == '1') {
1431
1472
  value = true;
1432
1473
  } else {
1433
1474
  value = false;
@@ -1432,7 +1432,6 @@ var PageHome = function (_React$Component) {
1432
1432
  } else if (operate == 1) {
1433
1433
  //提交
1434
1434
  var sendData = (0, _filterEmptySubTblRows.cloneAndFilterEmptySubTblRows)(t.state.editFormData) || {};
1435
- sendData.formItem = [];
1436
1435
  var param = {
1437
1436
  taskId: this.state.taskId,
1438
1437
  auditorUserIds: auditorUserIds,
@@ -1444,8 +1443,14 @@ var PageHome = function (_React$Component) {
1444
1443
  module: this.state.module,
1445
1444
  lock: this.state.lock,
1446
1445
  reminderContent: this.state.reminderContent,
1447
- processInstanceId: this.state.processInstanceId
1446
+ processInstanceId: this.state.processInstanceId,
1447
+ // 网关条件「上一环节办理人批示内容」依赖当前批示意见,getNextActivity 必须透传
1448
+ comment: typeof newComment === 'undefined' || newComment == null ? '' : newComment,
1449
+ commentType: 'text'
1448
1450
  };
1451
+ if (this.state.commentId) {
1452
+ param.commentId = this.state.commentId;
1453
+ }
1449
1454
  var dealActionName = "";
1450
1455
  if (this.state.isStart == true) {
1451
1456
  dealActionName = "提交";
@@ -323,7 +323,10 @@ var PageHome = function (_React$Component) {
323
323
  var hasRadomList = false; //判断下次办理是否有随机活动节点
324
324
  _db2.default.FlowModuleAPI.getNextActivity({
325
325
  taskId: taskId,
326
- code: code
326
+ code: code,
327
+ // 网关条件「上一环节办理人批示内容」依赖当前批示意见,getNextActivity 必须透传
328
+ comment: t.state.spyj == null || typeof t.state.spyj === 'undefined' ? '' : t.state.spyj,
329
+ commentType: 'text'
327
330
  }).then(function (content) {
328
331
  var nextList = content.activityList; //下一个后继节点列表
329
332
  var radomList = content.radomList; //下一个随机活动节点
@@ -474,6 +474,10 @@ var PageHome = function (_React$Component) {
474
474
  nextJumpActivity: [], //下一个跳转节点
475
475
  jumpPersonValue: [], //转交选择的用户
476
476
  addlotsPersonValue: [], //加签选择的用户
477
+ reduceSignUserList: [], //减签候选原始列表
478
+ reduceSignAddPool: [], //加签用户池(可移到减签)
479
+ reduceSignReducePool: [], //减签用户池(真正提交)
480
+ reduceShortMessage: '0', //减签提醒方式
477
481
  circulateNodePersonValue: [], //传阅节点选择的用户
478
482
  forwardNodePersonValue: [], //转发节点选择的用户
479
483
  circulatePersonValue: [], //通过传阅的用户
@@ -1357,6 +1361,10 @@ var PageHome = function (_React$Component) {
1357
1361
  }
1358
1362
  formData.linkFields = form.linkFields;
1359
1363
  formData.formItem = formItem;
1364
+ // 后端偶发带回字符串 "null",会导致提交带无效 dataId+optlock 被乐观锁拦截
1365
+ if (!(0, _filterEmptySubTblRows.isValidFormDataId)(formData.dataId)) {
1366
+ formData.dataId = '';
1367
+ }
1360
1368
 
1361
1369
  //关联字段
1362
1370
  var formRelaField = content.formRelaField;
@@ -1601,9 +1609,24 @@ var PageHome = function (_React$Component) {
1601
1609
  // }
1602
1610
  // }
1603
1611
  var resolvedOptlock = formData && formData.optlock !== undefined && formData.optlock !== null && formData.optlock !== '' ? String(formData.optlock) : content.optlock !== undefined && content.optlock !== null && content.optlock !== '' ? String(content.optlock) : '';
1612
+ var forceOptlock = false;
1604
1613
  if (t._pendingForceOptlock) {
1605
1614
  resolvedOptlock = String(t._pendingForceOptlock);
1606
1615
  t._pendingForceOptlock = null;
1616
+ forceOptlock = true;
1617
+ }
1618
+ // 无有效主表主键时不缓存 optlock,避免发起/新建误传版本号。
1619
+ // 仅认 formData.dataId(提交真正用的主键);不要用 businessKey 单独保留版本号,否则会顶栏带 optlock、formData 无 dataId 被后端拦。
1620
+ if (!forceOptlock && !(0, _filterEmptySubTblRows.isValidFormDataId)(formData && formData.dataId)) {
1621
+ var contentDataId = content && (content.dataId || content.businessKey);
1622
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(contentDataId)) {
1623
+ formData.dataId = contentDataId;
1624
+ } else {
1625
+ resolvedOptlock = '';
1626
+ if (formData && formData.hasOwnProperty('optlock')) {
1627
+ delete formData.optlock;
1628
+ }
1629
+ }
1607
1630
  }
1608
1631
  t.setState({
1609
1632
  editFormData: formData,
@@ -2631,6 +2654,9 @@ var PageHome = function (_React$Component) {
2631
2654
  case 'HELP_ADDLOTS':
2632
2655
  t.handleSubmit(6);
2633
2656
  break;
2657
+ case 'HELP_REDUCELOTS':
2658
+ t.handleSubmit(22);
2659
+ break;
2634
2660
  case 'FLOW_REVOKE':
2635
2661
  t.handleSubmit(7);
2636
2662
  break;
@@ -2700,9 +2726,13 @@ var PageHome = function (_React$Component) {
2700
2726
  reminderContent: _this2.state.reminderContent,
2701
2727
  processInstanceId: _this2.state.processInstanceId,
2702
2728
  permissionCode: _this2.state.permissionCode
2703
- };
2704
- if (t.state.module === 'approve' && t.state.formDataOptlock !== '' && t.state.formDataOptlock !== null && typeof t.state.formDataOptlock !== 'undefined') {
2705
- param.optlock = t.state.formDataOptlock;
2729
+ // 仅当提交 formData 有真实主键时带 optlock(勿用 state.dataId 兜底,新建易误传)
2730
+ };if (t.state.module === 'approve') {
2731
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(sendData && sendData.dataId) && t.state.formDataOptlock !== '' && t.state.formDataOptlock != null) {
2732
+ param.optlock = t.state.formDataOptlock;
2733
+ } else if (param.optlock !== undefined) {
2734
+ delete param.optlock;
2735
+ }
2706
2736
  }
2707
2737
  var dealActionName = "";
2708
2738
  if (_this2.state.isStart == true) {
@@ -2711,6 +2741,12 @@ var PageHome = function (_React$Component) {
2711
2741
  dealActionName = _this2.state.finalButtons.get("BASE_SUMBIT");
2712
2742
  }
2713
2743
  param.dealActionName = dealActionName;
2744
+ // 网关条件「上一环节办理人批示内容」依赖当前批示意见,getNextActivity 必须透传
2745
+ param.comment = typeof newComment === 'undefined' || newComment == null ? '' : newComment;
2746
+ param.commentType = 'text';
2747
+ if (t.state.commentId) {
2748
+ param.commentId = t.state.commentId;
2749
+ }
2714
2750
  var nextList = null; //下一个后继节点列表
2715
2751
  var radomList = null; //下一个随机活动节点
2716
2752
  var succeedRange = ""; //后继活动id
@@ -3390,6 +3426,9 @@ var PageHome = function (_React$Component) {
3390
3426
  }, function () {
3391
3427
  $(window).scrollTop(0);
3392
3428
  });
3429
+ } else if (operate == 22) {
3430
+ //减签
3431
+ t.openReduceSign();
3393
3432
  } else if (operate == 7) {
3394
3433
  //撤销
3395
3434
  this.recallClick();
@@ -4022,7 +4061,7 @@ var PageHome = function (_React$Component) {
4022
4061
  var allEditIdsArray = [];
4023
4062
 
4024
4063
  //主表id
4025
- if (data.dataId) {
4064
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(data && data.dataId)) {
4026
4065
  var mainTableId = data.dataId;
4027
4066
  allEditIdsArray.push(mainTableId);
4028
4067
  }
@@ -4638,6 +4677,9 @@ var PageHome = function (_React$Component) {
4638
4677
  } else if (operate == 6) {
4639
4678
  //加签
4640
4679
  this.addlots();
4680
+ } else if (operate == 22) {
4681
+ //减签
4682
+ this.reduceSign();
4641
4683
  } else if (operate == 4) {
4642
4684
  //传阅
4643
4685
  this.circulateNode();
@@ -5726,6 +5768,67 @@ var PageHome = function (_React$Component) {
5726
5768
  _Toast2.default.show({ type: 'error', content: '刷新表单失败,请手动刷新页面' });
5727
5769
  });
5728
5770
  }
5771
+
5772
+ /**
5773
+ * sendFlow 提交前清洗 optlock:
5774
+ * - 以 formData.dataId 为准(再 slim 一次)
5775
+ * - 无有效主键时删除顶栏 optlock,并去掉 formData 内 optlock
5776
+ * - 勿用 state.dataId 兜底(新建场景易误传 0)
5777
+ */
5778
+
5779
+ }, {
5780
+ key: 'sanitizeSendFlowOptlockParam',
5781
+ value: function sanitizeSendFlowOptlockParam(param) {
5782
+ var t = this;
5783
+ if (!param || t.state.module !== 'approve') {
5784
+ return;
5785
+ }
5786
+ var fd = null;
5787
+ try {
5788
+ if (param.formData) {
5789
+ fd = typeof param.formData === 'string' ? JSON.parse(param.formData) : param.formData;
5790
+ fd = (0, _filterEmptySubTblRows.cloneAndFilterEmptySubTblRows)(fd) || fd;
5791
+ }
5792
+ } catch (e1) {
5793
+ fd = null;
5794
+ }
5795
+ var payloadDataId = '';
5796
+ if (fd && (0, _filterEmptySubTblRows.isValidFormDataId)(fd.dataId)) {
5797
+ payloadDataId = fd.dataId;
5798
+ } else if ((0, _filterEmptySubTblRows.isValidFormDataId)(param.dataId)) {
5799
+ payloadDataId = param.dataId;
5800
+ }
5801
+ if (!(0, _filterEmptySubTblRows.isValidFormDataId)(payloadDataId)) {
5802
+ delete param.optlock;
5803
+ if (fd) {
5804
+ fd.dataId = '';
5805
+ if (fd.hasOwnProperty('optlock')) {
5806
+ delete fd.optlock;
5807
+ }
5808
+ try {
5809
+ param.formData = JSON.stringify(fd);
5810
+ } catch (e2) {}
5811
+ }
5812
+ return;
5813
+ }
5814
+ if (t.state.formDataOptlock !== '' && t.state.formDataOptlock != null && typeof t.state.formDataOptlock !== 'undefined') {
5815
+ param.optlock = t.state.formDataOptlock;
5816
+ if (fd) {
5817
+ fd.optlock = t.state.formDataOptlock;
5818
+ try {
5819
+ param.formData = JSON.stringify(fd);
5820
+ } catch (e3) {}
5821
+ }
5822
+ } else {
5823
+ delete param.optlock;
5824
+ if (fd && fd.hasOwnProperty('optlock')) {
5825
+ delete fd.optlock;
5826
+ try {
5827
+ param.formData = JSON.stringify(fd);
5828
+ } catch (e4) {}
5829
+ }
5830
+ }
5831
+ }
5729
5832
  }, {
5730
5833
  key: 'sendFlowFuc',
5731
5834
  value: function sendFlowFuc(param) {
@@ -5792,9 +5895,8 @@ var PageHome = function (_React$Component) {
5792
5895
  // param.commentbizSn=commentbizSn;
5793
5896
  // }
5794
5897
  param.commentbizSn = commentbizSn;
5795
- if (t.state.module === 'approve' && t.state.formDataOptlock !== '' && t.state.formDataOptlock !== null && typeof t.state.formDataOptlock !== 'undefined') {
5796
- param.optlock = t.state.formDataOptlock;
5797
- }
5898
+ // 提交前统一清洗:新建无主键绝不带 optlock(含 getNextActivity 残留)
5899
+ t.sanitizeSendFlowOptlockParam(param);
5798
5900
 
5799
5901
  var db = _db2.default;
5800
5902
  db.FlowModuleAPI.sendFlow(param).then(function (content) {
@@ -6725,6 +6827,152 @@ var PageHome = function (_React$Component) {
6725
6827
  }
6726
6828
  });
6727
6829
  }
6830
+
6831
+ // 打开减签页:拉取本节点被加签人列表
6832
+
6833
+ }, {
6834
+ key: 'openReduceSign',
6835
+ value: function openReduceSign() {
6836
+ var t = this;
6837
+ _db2.default.FlowModuleAPI.getSignUserList({
6838
+ taskId: t.state.taskId
6839
+ }).then(function (content) {
6840
+ var list = content || [];
6841
+ var addPool = [];
6842
+ for (var i = 0; i < list.length; i++) {
6843
+ var item = list[i];
6844
+ addPool.push({
6845
+ userid: item.userid,
6846
+ username: item.username,
6847
+ status: item.status
6848
+ });
6849
+ }
6850
+ t.setState({
6851
+ pageStatus: '1',
6852
+ operate: 22,
6853
+ reduceSignUserList: list,
6854
+ reduceSignAddPool: addPool,
6855
+ reduceSignReducePool: [],
6856
+ reduceShortMessage: t.state.addlotsShortMessage || '0'
6857
+ }, function () {
6858
+ $(window).scrollTop(0);
6859
+ });
6860
+ }).catch(function (error) {
6861
+ _Toast2.default.show({
6862
+ type: 'error',
6863
+ content: error && error.errorMsg ? error.errorMsg : '获取减签用户失败'
6864
+ });
6865
+ });
6866
+ }
6867
+ }, {
6868
+ key: 'moveToReducePool',
6869
+ value: function moveToReducePool(userId) {
6870
+ var addPool = (this.state.reduceSignAddPool || []).slice();
6871
+ var reducePool = (this.state.reduceSignReducePool || []).slice();
6872
+ for (var i = 0; i < addPool.length; i++) {
6873
+ if (addPool[i].userid == userId && addPool[i].status != '1') {
6874
+ reducePool.push(addPool[i]);
6875
+ addPool.splice(i, 1);
6876
+ break;
6877
+ }
6878
+ }
6879
+ this.setState({
6880
+ reduceSignAddPool: addPool,
6881
+ reduceSignReducePool: reducePool
6882
+ });
6883
+ }
6884
+ }, {
6885
+ key: 'moveToAddPool',
6886
+ value: function moveToAddPool(userId) {
6887
+ var addPool = (this.state.reduceSignAddPool || []).slice();
6888
+ var reducePool = (this.state.reduceSignReducePool || []).slice();
6889
+ for (var i = 0; i < reducePool.length; i++) {
6890
+ if (reducePool[i].userid == userId) {
6891
+ addPool.push(reducePool[i]);
6892
+ reducePool.splice(i, 1);
6893
+ break;
6894
+ }
6895
+ }
6896
+ this.setState({
6897
+ reduceSignAddPool: addPool,
6898
+ reduceSignReducePool: reducePool
6899
+ });
6900
+ }
6901
+ }, {
6902
+ key: 'changeReduceShortMessage',
6903
+ value: function changeReduceShortMessage(data) {
6904
+ var newremindStyle = "";
6905
+ for (var i = 0; i < data.length; i++) {
6906
+ if (i == data.length - 1) newremindStyle += data[i].value;else newremindStyle += data[i].value + ',';
6907
+ }
6908
+ this.setState({
6909
+ reduceShortMessage: newremindStyle || '0'
6910
+ });
6911
+ }
6912
+ }, {
6913
+ key: 'reduceSign',
6914
+ value: function reduceSign() {
6915
+ var t = this;
6916
+ var selected = t.state.reduceSignReducePool || [];
6917
+ var userIds = '';
6918
+ var userNames = '';
6919
+ selected.map(function (item) {
6920
+ userIds += item.userid + ',';
6921
+ userNames += item.username + ',';
6922
+ });
6923
+ if (userIds == '') {
6924
+ _Toast2.default.show({
6925
+ type: 'error',
6926
+ content: '请选择需要减签的用户'
6927
+ });
6928
+ return false;
6929
+ }
6930
+ userIds = userIds.substring(0, userIds.length - 1);
6931
+ userNames = userNames.substring(0, userNames.length - 1);
6932
+ var processTitle = t.state.processTitle || t.state.fileTitle || '';
6933
+ var reminders = t.state.reduceShortMessage;
6934
+ if (reminders == '0') {
6935
+ reminders = '';
6936
+ }
6937
+ var isPush = t.state.isPush;
6938
+ _db2.default.FlowModuleAPI.reduceSign({
6939
+ taskId: t.state.taskId,
6940
+ userIds: userIds,
6941
+ userNames: userNames,
6942
+ reminders: reminders,
6943
+ processTitle: processTitle,
6944
+ module: t.state.module,
6945
+ processInstanceId: t.state.processInstanceId,
6946
+ formId: t.state.formId,
6947
+ dataId: t.state.dataId,
6948
+ permissionCode: t.state.permissionCode,
6949
+ categoryCode: t.state.category || ''
6950
+ }).then(function (content) {
6951
+ _Toast2.default.show({
6952
+ type: 'success',
6953
+ content: (t.state.finalButtons.get('HELP_REDUCELOTS') || '减签') + '成功'
6954
+ });
6955
+ if (isPush == '1') {
6956
+ closePage();
6957
+ } else {
6958
+ setTimeout(function () {
6959
+ history.back();
6960
+ }, 1500);
6961
+ }
6962
+ }).catch(function (error) {
6963
+ if (typeof error.errorMsg == 'undefined') {
6964
+ _Toast2.default.show({
6965
+ type: 'error',
6966
+ content: '提交出错'
6967
+ });
6968
+ } else {
6969
+ _Toast2.default.show({
6970
+ type: 'error',
6971
+ content: error.errorMsg.replace('!', '').replace('!', '')
6972
+ });
6973
+ }
6974
+ });
6975
+ }
6728
6976
  }, {
6729
6977
  key: 'circulateNode',
6730
6978
  value: function circulateNode() {
@@ -7469,6 +7717,11 @@ var PageHome = function (_React$Component) {
7469
7717
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 5 });
7470
7718
  } else if (buttonCode == 'HELP_ADDLOTS') {
7471
7719
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 6 });
7720
+ var pmMore = String(_this4.state.participantMode);
7721
+ if (pmMore == '1' || pmMore == '2') {
7722
+ var reduceNameMore = _this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签';
7723
+ buttonCodeListNew.push({ name: reduceNameMore, type: 'secondary', display: 'inline', no: 22 });
7724
+ }
7472
7725
  } else if (buttonCode == 'BASE_END') {
7473
7726
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 8 });
7474
7727
  } else if (buttonCode == 'BASE_NOTPASS') {
@@ -7488,6 +7741,13 @@ var PageHome = function (_React$Component) {
7488
7741
  } else {
7489
7742
  actionSheetButtonOpt.push(buttonCode);
7490
7743
  actionSheetButtonOptName.push(buttonName);
7744
+ if (buttonCode == 'HELP_ADDLOTS') {
7745
+ var pmSheet = String(_this4.state.participantMode);
7746
+ if (pmSheet == '1' || pmSheet == '2') {
7747
+ actionSheetButtonOpt.push('HELP_REDUCELOTS');
7748
+ actionSheetButtonOptName.push(_this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签');
7749
+ }
7750
+ }
7491
7751
  }
7492
7752
  }
7493
7753
  var nowNum = mainSlotCount;
@@ -7526,6 +7786,11 @@ var PageHome = function (_React$Component) {
7526
7786
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 5 });
7527
7787
  } else if (buttonCode == 'HELP_ADDLOTS') {
7528
7788
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 6 });
7789
+ var pmFew = String(_this4.state.participantMode);
7790
+ if (pmFew == '1' || pmFew == '2') {
7791
+ var reduceNameFew = _this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签';
7792
+ buttonList.push({ name: reduceNameFew, type: 'secondary', display: 'inline', no: 22 });
7793
+ }
7529
7794
  } else if (buttonCode == 'BASE_END') {
7530
7795
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 8 });
7531
7796
  } else if (buttonCode == 'BASE_NOTPASS') {
@@ -9903,6 +10168,73 @@ var PageHome = function (_React$Component) {
9903
10168
  onChange: this.changeAddlotsShortMessage.bind(this),
9904
10169
  required: false })
9905
10170
  ),
10171
+ _react2.default.createElement(
10172
+ _Group2.default.List,
10173
+ { className: this.state.operate == 22 ? '' : 't-DN' },
10174
+ _react2.default.createElement(
10175
+ 'div',
10176
+ { style: { background: '#f2f3f5', padding: '10px 5px' } },
10177
+ _react2.default.createElement(
10178
+ 'span',
10179
+ { className: 'theme-color' },
10180
+ _react2.default.createElement('i', { className: 'iconfont icon-back t-rotate-180 t-FS14 t-FR' }),
10181
+ this.state.finalButtons.get("HELP_REDUCELOTS") || '减签'
10182
+ )
10183
+ ),
10184
+ _react2.default.createElement(
10185
+ 'div',
10186
+ { className: 't-field-box t-FBH t-FBAC', style: { padding: '10px 16px', flexWrap: 'wrap' } },
10187
+ _react2.default.createElement(
10188
+ 'div',
10189
+ { className: 't-field-layout-h-label', style: { width: '100%', marginBottom: '6px' } },
10190
+ '\u52A0\u7B7E\u7528\u6237'
10191
+ ),
10192
+ _react2.default.createElement(
10193
+ 'div',
10194
+ { style: { display: 'flex', flexWrap: 'wrap', width: '100%' } },
10195
+ (this.state.reduceSignAddPool || []).map(function (item, idx) {
10196
+ return item.status == '1' ? _react2.default.createElement(
10197
+ 'span',
10198
+ { key: 'add-' + item.userid + '-' + idx, style: { margin: '0 8px 8px 0', padding: '4px 10px', background: '#f0f0f0', color: '#999', borderRadius: '4px', fontSize: '13px' } },
10199
+ item.username,
10200
+ '(\u5DF2\u529E)'
10201
+ ) : _react2.default.createElement(
10202
+ 'span',
10203
+ { key: 'add-' + item.userid + '-' + idx, onClick: _this5.moveToReducePool.bind(_this5, item.userid), style: { margin: '0 8px 8px 0', padding: '4px 10px', background: '#e60012', color: '#fff', borderRadius: '4px', fontSize: '13px' } },
10204
+ item.username,
10205
+ ' \xD7'
10206
+ );
10207
+ })
10208
+ )
10209
+ ),
10210
+ _react2.default.createElement(
10211
+ 'div',
10212
+ { className: 't-field-box t-FBH t-FBAC', style: { padding: '10px 16px', flexWrap: 'wrap' } },
10213
+ _react2.default.createElement(
10214
+ 'div',
10215
+ { className: 't-field-layout-h-label', style: { width: '100%', marginBottom: '6px' } },
10216
+ '\u51CF\u7B7E\u7528\u6237'
10217
+ ),
10218
+ _react2.default.createElement(
10219
+ 'div',
10220
+ { style: { display: 'flex', flexWrap: 'wrap', width: '100%' } },
10221
+ (this.state.reduceSignReducePool || []).map(function (item, idx) {
10222
+ return _react2.default.createElement(
10223
+ 'span',
10224
+ { key: 'reduce-' + item.userid + '-' + idx, onClick: _this5.moveToAddPool.bind(_this5, item.userid), style: { margin: '0 8px 8px 0', padding: '4px 10px', background: '#e60012', color: '#fff', borderRadius: '4px', fontSize: '13px' } },
10225
+ item.username,
10226
+ ' \xD7'
10227
+ );
10228
+ })
10229
+ )
10230
+ ),
10231
+ _react2.default.createElement(_CheckboxField2.default, {
10232
+ data: this.state.shortMessageList,
10233
+ className: '',
10234
+ mode: 'list',
10235
+ onChange: this.changeReduceShortMessage.bind(this),
10236
+ required: false })
10237
+ ),
9906
10238
  _react2.default.createElement(
9907
10239
  _Group2.default.List,
9908
10240
  { className: this.state.operate == 4 ? '' : 't-DN' },
@@ -16,7 +16,7 @@ function getAllEditIds(data) {
16
16
  return '';
17
17
  }
18
18
 
19
- if (data.dataId) {
19
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(data.dataId)) {
20
20
  allEditIdsArray.push(data.dataId);
21
21
  }
22
22
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fmui-base",
3
- "version": "2.3.59",
3
+ "version": "2.3.61",
4
4
  "title": "fmui-base",
5
5
  "description": "fmui移动端组件",
6
6
  "main": "lib/index.js",