fmui-base 2.3.59 → 2.3.60

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,7 @@
3
3
  ---npm publish
4
4
 
5
5
  ## 更新日志
6
+ - 2.3.60:移动端支持减签
6
7
  - 2.3.59:移动端不通过的流程允许作废,移动端支持关联流程
7
8
  - 2.3.58:移动端数据表设置字段的关联值支持用户岗位
8
9
  - 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) {
92
116
  continue;
93
117
  }
94
- if (hasSubTblBusinessValue(kv.value)) {
118
+ if (isSubTblSysField(cell.key)) {
119
+ continue;
120
+ }
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) {
@@ -142,7 +264,7 @@ function cloneAndFilterEmptySubTblRows(editFormData) {
142
264
  }
143
265
  }
144
266
  }
145
- return data;
267
+ return slimFormDataForSubmit(data);
146
268
  }
147
269
 
148
270
  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,18 @@ 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
+ if (!forceOptlock && !(0, _filterEmptySubTblRows.isValidFormDataId)(formData && formData.dataId) && !(0, _filterEmptySubTblRows.isValidFormDataId)(t.state.dataId)) {
1620
+ var contentDataId = content && (content.dataId || content.businessKey);
1621
+ if (!(0, _filterEmptySubTblRows.isValidFormDataId)(contentDataId)) {
1622
+ resolvedOptlock = '';
1623
+ }
1607
1624
  }
1608
1625
  t.setState({
1609
1626
  editFormData: formData,
@@ -2631,6 +2648,9 @@ var PageHome = function (_React$Component) {
2631
2648
  case 'HELP_ADDLOTS':
2632
2649
  t.handleSubmit(6);
2633
2650
  break;
2651
+ case 'HELP_REDUCELOTS':
2652
+ t.handleSubmit(22);
2653
+ break;
2634
2654
  case 'FLOW_REVOKE':
2635
2655
  t.handleSubmit(7);
2636
2656
  break;
@@ -2702,7 +2722,11 @@ var PageHome = function (_React$Component) {
2702
2722
  permissionCode: _this2.state.permissionCode
2703
2723
  };
2704
2724
  if (t.state.module === 'approve' && t.state.formDataOptlock !== '' && t.state.formDataOptlock !== null && typeof t.state.formDataOptlock !== 'undefined') {
2705
- param.optlock = t.state.formDataOptlock;
2725
+ // 无有效主表 dataId 时不传 optlock,避免后端「已传版本却无主键」直接报冲突
2726
+ var optlockDataId = dataId || sendData && sendData.dataId || t.state.dataId;
2727
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(optlockDataId)) {
2728
+ param.optlock = t.state.formDataOptlock;
2729
+ }
2706
2730
  }
2707
2731
  var dealActionName = "";
2708
2732
  if (_this2.state.isStart == true) {
@@ -2711,6 +2735,12 @@ var PageHome = function (_React$Component) {
2711
2735
  dealActionName = _this2.state.finalButtons.get("BASE_SUMBIT");
2712
2736
  }
2713
2737
  param.dealActionName = dealActionName;
2738
+ // 网关条件「上一环节办理人批示内容」依赖当前批示意见,getNextActivity 必须透传
2739
+ param.comment = typeof newComment === 'undefined' || newComment == null ? '' : newComment;
2740
+ param.commentType = 'text';
2741
+ if (t.state.commentId) {
2742
+ param.commentId = t.state.commentId;
2743
+ }
2714
2744
  var nextList = null; //下一个后继节点列表
2715
2745
  var radomList = null; //下一个随机活动节点
2716
2746
  var succeedRange = ""; //后继活动id
@@ -3390,6 +3420,9 @@ var PageHome = function (_React$Component) {
3390
3420
  }, function () {
3391
3421
  $(window).scrollTop(0);
3392
3422
  });
3423
+ } else if (operate == 22) {
3424
+ //减签
3425
+ t.openReduceSign();
3393
3426
  } else if (operate == 7) {
3394
3427
  //撤销
3395
3428
  this.recallClick();
@@ -4022,7 +4055,7 @@ var PageHome = function (_React$Component) {
4022
4055
  var allEditIdsArray = [];
4023
4056
 
4024
4057
  //主表id
4025
- if (data.dataId) {
4058
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(data && data.dataId)) {
4026
4059
  var mainTableId = data.dataId;
4027
4060
  allEditIdsArray.push(mainTableId);
4028
4061
  }
@@ -4638,6 +4671,9 @@ var PageHome = function (_React$Component) {
4638
4671
  } else if (operate == 6) {
4639
4672
  //加签
4640
4673
  this.addlots();
4674
+ } else if (operate == 22) {
4675
+ //减签
4676
+ this.reduceSign();
4641
4677
  } else if (operate == 4) {
4642
4678
  //传阅
4643
4679
  this.circulateNode();
@@ -5793,7 +5829,21 @@ var PageHome = function (_React$Component) {
5793
5829
  // }
5794
5830
  param.commentbizSn = commentbizSn;
5795
5831
  if (t.state.module === 'approve' && t.state.formDataOptlock !== '' && t.state.formDataOptlock !== null && typeof t.state.formDataOptlock !== 'undefined') {
5796
- param.optlock = t.state.formDataOptlock;
5832
+ // 无有效主表 dataId 时不传 optlock,避免后端「已传版本却无主键」直接报冲突
5833
+ var sendOptlockDataId = param.dataId || t.state.dataId;
5834
+ try {
5835
+ if ((!sendOptlockDataId || !(0, _filterEmptySubTblRows.isValidFormDataId)(sendOptlockDataId)) && param.formData) {
5836
+ var parsedFd = typeof param.formData === 'string' ? JSON.parse(param.formData) : param.formData;
5837
+ if (parsedFd && (0, _filterEmptySubTblRows.isValidFormDataId)(parsedFd.dataId)) {
5838
+ sendOptlockDataId = parsedFd.dataId;
5839
+ }
5840
+ }
5841
+ } catch (eOpt) {}
5842
+ if ((0, _filterEmptySubTblRows.isValidFormDataId)(sendOptlockDataId)) {
5843
+ param.optlock = t.state.formDataOptlock;
5844
+ } else if (param.optlock !== undefined) {
5845
+ delete param.optlock;
5846
+ }
5797
5847
  }
5798
5848
 
5799
5849
  var db = _db2.default;
@@ -6725,6 +6775,152 @@ var PageHome = function (_React$Component) {
6725
6775
  }
6726
6776
  });
6727
6777
  }
6778
+
6779
+ // 打开减签页:拉取本节点被加签人列表
6780
+
6781
+ }, {
6782
+ key: 'openReduceSign',
6783
+ value: function openReduceSign() {
6784
+ var t = this;
6785
+ _db2.default.FlowModuleAPI.getSignUserList({
6786
+ taskId: t.state.taskId
6787
+ }).then(function (content) {
6788
+ var list = content || [];
6789
+ var addPool = [];
6790
+ for (var i = 0; i < list.length; i++) {
6791
+ var item = list[i];
6792
+ addPool.push({
6793
+ userid: item.userid,
6794
+ username: item.username,
6795
+ status: item.status
6796
+ });
6797
+ }
6798
+ t.setState({
6799
+ pageStatus: '1',
6800
+ operate: 22,
6801
+ reduceSignUserList: list,
6802
+ reduceSignAddPool: addPool,
6803
+ reduceSignReducePool: [],
6804
+ reduceShortMessage: t.state.addlotsShortMessage || '0'
6805
+ }, function () {
6806
+ $(window).scrollTop(0);
6807
+ });
6808
+ }).catch(function (error) {
6809
+ _Toast2.default.show({
6810
+ type: 'error',
6811
+ content: error && error.errorMsg ? error.errorMsg : '获取减签用户失败'
6812
+ });
6813
+ });
6814
+ }
6815
+ }, {
6816
+ key: 'moveToReducePool',
6817
+ value: function moveToReducePool(userId) {
6818
+ var addPool = (this.state.reduceSignAddPool || []).slice();
6819
+ var reducePool = (this.state.reduceSignReducePool || []).slice();
6820
+ for (var i = 0; i < addPool.length; i++) {
6821
+ if (addPool[i].userid == userId && addPool[i].status != '1') {
6822
+ reducePool.push(addPool[i]);
6823
+ addPool.splice(i, 1);
6824
+ break;
6825
+ }
6826
+ }
6827
+ this.setState({
6828
+ reduceSignAddPool: addPool,
6829
+ reduceSignReducePool: reducePool
6830
+ });
6831
+ }
6832
+ }, {
6833
+ key: 'moveToAddPool',
6834
+ value: function moveToAddPool(userId) {
6835
+ var addPool = (this.state.reduceSignAddPool || []).slice();
6836
+ var reducePool = (this.state.reduceSignReducePool || []).slice();
6837
+ for (var i = 0; i < reducePool.length; i++) {
6838
+ if (reducePool[i].userid == userId) {
6839
+ addPool.push(reducePool[i]);
6840
+ reducePool.splice(i, 1);
6841
+ break;
6842
+ }
6843
+ }
6844
+ this.setState({
6845
+ reduceSignAddPool: addPool,
6846
+ reduceSignReducePool: reducePool
6847
+ });
6848
+ }
6849
+ }, {
6850
+ key: 'changeReduceShortMessage',
6851
+ value: function changeReduceShortMessage(data) {
6852
+ var newremindStyle = "";
6853
+ for (var i = 0; i < data.length; i++) {
6854
+ if (i == data.length - 1) newremindStyle += data[i].value;else newremindStyle += data[i].value + ',';
6855
+ }
6856
+ this.setState({
6857
+ reduceShortMessage: newremindStyle || '0'
6858
+ });
6859
+ }
6860
+ }, {
6861
+ key: 'reduceSign',
6862
+ value: function reduceSign() {
6863
+ var t = this;
6864
+ var selected = t.state.reduceSignReducePool || [];
6865
+ var userIds = '';
6866
+ var userNames = '';
6867
+ selected.map(function (item) {
6868
+ userIds += item.userid + ',';
6869
+ userNames += item.username + ',';
6870
+ });
6871
+ if (userIds == '') {
6872
+ _Toast2.default.show({
6873
+ type: 'error',
6874
+ content: '请选择需要减签的用户'
6875
+ });
6876
+ return false;
6877
+ }
6878
+ userIds = userIds.substring(0, userIds.length - 1);
6879
+ userNames = userNames.substring(0, userNames.length - 1);
6880
+ var processTitle = t.state.processTitle || t.state.fileTitle || '';
6881
+ var reminders = t.state.reduceShortMessage;
6882
+ if (reminders == '0') {
6883
+ reminders = '';
6884
+ }
6885
+ var isPush = t.state.isPush;
6886
+ _db2.default.FlowModuleAPI.reduceSign({
6887
+ taskId: t.state.taskId,
6888
+ userIds: userIds,
6889
+ userNames: userNames,
6890
+ reminders: reminders,
6891
+ processTitle: processTitle,
6892
+ module: t.state.module,
6893
+ processInstanceId: t.state.processInstanceId,
6894
+ formId: t.state.formId,
6895
+ dataId: t.state.dataId,
6896
+ permissionCode: t.state.permissionCode,
6897
+ categoryCode: t.state.category || ''
6898
+ }).then(function (content) {
6899
+ _Toast2.default.show({
6900
+ type: 'success',
6901
+ content: (t.state.finalButtons.get('HELP_REDUCELOTS') || '减签') + '成功'
6902
+ });
6903
+ if (isPush == '1') {
6904
+ closePage();
6905
+ } else {
6906
+ setTimeout(function () {
6907
+ history.back();
6908
+ }, 1500);
6909
+ }
6910
+ }).catch(function (error) {
6911
+ if (typeof error.errorMsg == 'undefined') {
6912
+ _Toast2.default.show({
6913
+ type: 'error',
6914
+ content: '提交出错'
6915
+ });
6916
+ } else {
6917
+ _Toast2.default.show({
6918
+ type: 'error',
6919
+ content: error.errorMsg.replace('!', '').replace('!', '')
6920
+ });
6921
+ }
6922
+ });
6923
+ }
6728
6924
  }, {
6729
6925
  key: 'circulateNode',
6730
6926
  value: function circulateNode() {
@@ -7469,6 +7665,11 @@ var PageHome = function (_React$Component) {
7469
7665
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 5 });
7470
7666
  } else if (buttonCode == 'HELP_ADDLOTS') {
7471
7667
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 6 });
7668
+ var pmMore = String(_this4.state.participantMode);
7669
+ if (pmMore == '1' || pmMore == '2') {
7670
+ var reduceNameMore = _this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签';
7671
+ buttonCodeListNew.push({ name: reduceNameMore, type: 'secondary', display: 'inline', no: 22 });
7672
+ }
7472
7673
  } else if (buttonCode == 'BASE_END') {
7473
7674
  buttonCodeListNew.push({ name: buttonName, type: 'secondary', display: 'inline', no: 8 });
7474
7675
  } else if (buttonCode == 'BASE_NOTPASS') {
@@ -7488,6 +7689,13 @@ var PageHome = function (_React$Component) {
7488
7689
  } else {
7489
7690
  actionSheetButtonOpt.push(buttonCode);
7490
7691
  actionSheetButtonOptName.push(buttonName);
7692
+ if (buttonCode == 'HELP_ADDLOTS') {
7693
+ var pmSheet = String(_this4.state.participantMode);
7694
+ if (pmSheet == '1' || pmSheet == '2') {
7695
+ actionSheetButtonOpt.push('HELP_REDUCELOTS');
7696
+ actionSheetButtonOptName.push(_this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签');
7697
+ }
7698
+ }
7491
7699
  }
7492
7700
  }
7493
7701
  var nowNum = mainSlotCount;
@@ -7526,6 +7734,11 @@ var PageHome = function (_React$Component) {
7526
7734
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 5 });
7527
7735
  } else if (buttonCode == 'HELP_ADDLOTS') {
7528
7736
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 6 });
7737
+ var pmFew = String(_this4.state.participantMode);
7738
+ if (pmFew == '1' || pmFew == '2') {
7739
+ var reduceNameFew = _this4.state.finalButtons.get('HELP_REDUCELOTS') || '减签';
7740
+ buttonList.push({ name: reduceNameFew, type: 'secondary', display: 'inline', no: 22 });
7741
+ }
7529
7742
  } else if (buttonCode == 'BASE_END') {
7530
7743
  buttonList.push({ name: buttonName, type: 'secondary', display: 'inline', no: 8 });
7531
7744
  } else if (buttonCode == 'BASE_NOTPASS') {
@@ -9903,6 +10116,73 @@ var PageHome = function (_React$Component) {
9903
10116
  onChange: this.changeAddlotsShortMessage.bind(this),
9904
10117
  required: false })
9905
10118
  ),
10119
+ _react2.default.createElement(
10120
+ _Group2.default.List,
10121
+ { className: this.state.operate == 22 ? '' : 't-DN' },
10122
+ _react2.default.createElement(
10123
+ 'div',
10124
+ { style: { background: '#f2f3f5', padding: '10px 5px' } },
10125
+ _react2.default.createElement(
10126
+ 'span',
10127
+ { className: 'theme-color' },
10128
+ _react2.default.createElement('i', { className: 'iconfont icon-back t-rotate-180 t-FS14 t-FR' }),
10129
+ this.state.finalButtons.get("HELP_REDUCELOTS") || '减签'
10130
+ )
10131
+ ),
10132
+ _react2.default.createElement(
10133
+ 'div',
10134
+ { className: 't-field-box t-FBH t-FBAC', style: { padding: '10px 16px', flexWrap: 'wrap' } },
10135
+ _react2.default.createElement(
10136
+ 'div',
10137
+ { className: 't-field-layout-h-label', style: { width: '100%', marginBottom: '6px' } },
10138
+ '\u52A0\u7B7E\u7528\u6237'
10139
+ ),
10140
+ _react2.default.createElement(
10141
+ 'div',
10142
+ { style: { display: 'flex', flexWrap: 'wrap', width: '100%' } },
10143
+ (this.state.reduceSignAddPool || []).map(function (item, idx) {
10144
+ return item.status == '1' ? _react2.default.createElement(
10145
+ 'span',
10146
+ { key: 'add-' + item.userid + '-' + idx, style: { margin: '0 8px 8px 0', padding: '4px 10px', background: '#f0f0f0', color: '#999', borderRadius: '4px', fontSize: '13px' } },
10147
+ item.username,
10148
+ '(\u5DF2\u529E)'
10149
+ ) : _react2.default.createElement(
10150
+ 'span',
10151
+ { 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' } },
10152
+ item.username,
10153
+ ' \xD7'
10154
+ );
10155
+ })
10156
+ )
10157
+ ),
10158
+ _react2.default.createElement(
10159
+ 'div',
10160
+ { className: 't-field-box t-FBH t-FBAC', style: { padding: '10px 16px', flexWrap: 'wrap' } },
10161
+ _react2.default.createElement(
10162
+ 'div',
10163
+ { className: 't-field-layout-h-label', style: { width: '100%', marginBottom: '6px' } },
10164
+ '\u51CF\u7B7E\u7528\u6237'
10165
+ ),
10166
+ _react2.default.createElement(
10167
+ 'div',
10168
+ { style: { display: 'flex', flexWrap: 'wrap', width: '100%' } },
10169
+ (this.state.reduceSignReducePool || []).map(function (item, idx) {
10170
+ return _react2.default.createElement(
10171
+ 'span',
10172
+ { 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' } },
10173
+ item.username,
10174
+ ' \xD7'
10175
+ );
10176
+ })
10177
+ )
10178
+ ),
10179
+ _react2.default.createElement(_CheckboxField2.default, {
10180
+ data: this.state.shortMessageList,
10181
+ className: '',
10182
+ mode: 'list',
10183
+ onChange: this.changeReduceShortMessage.bind(this),
10184
+ required: false })
10185
+ ),
9906
10186
  _react2.default.createElement(
9907
10187
  _Group2.default.List,
9908
10188
  { 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.60",
4
4
  "title": "fmui-base",
5
5
  "description": "fmui移动端组件",
6
6
  "main": "lib/index.js",