@gingkoo/base-server 0.0.1-alpha.0 → 0.0.1-alpha.2

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.
Files changed (122) hide show
  1. package/README.md +7 -0
  2. package/app.js +36 -40
  3. package/backend/common/entity.js +55 -0
  4. package/backend/common/enum.js +247 -0
  5. package/backend/common/fss/index.js +18 -0
  6. package/backend/common/fss/routers/attachment.js +45 -0
  7. package/backend/common/fss/routers/download.js +43 -0
  8. package/backend/common/fss/routers/import_export.js +113 -0
  9. package/backend/common/fss/routers/resources.js +149 -0
  10. package/backend/common/fss/routers/upload.js +81 -0
  11. package/backend/common/fss/services/import_export.js +159 -0
  12. package/backend/common/fss/services/index.js +92 -0
  13. package/backend/common/fss/utils.js +39 -0
  14. package/backend/common/ginfo/config.js +5 -0
  15. package/backend/common/ginfo/index.js +62 -0
  16. package/backend/common/index_template.html +28 -0
  17. package/backend/common/logger/index.js +96 -0
  18. package/backend/common/mapping.js +98 -0
  19. package/backend/common/middleware/auth.js +97 -0
  20. package/backend/common/middleware/cors.js +13 -0
  21. package/backend/common/middleware/response.js +25 -0
  22. package/backend/common/page_engine.js +487 -0
  23. package/backend/common/schedule.js +45 -0
  24. package/backend/common/services/dataCombine.js +67 -0
  25. package/backend/common/services/dept.js +37 -0
  26. package/backend/common/services/dict.js +487 -0
  27. package/backend/common/services/email.js +49 -0
  28. package/backend/common/services/generalConfig.js +137 -0
  29. package/backend/common/services/login.js +18 -0
  30. package/backend/common/services/notice.js +260 -0
  31. package/backend/common/services/permission.js +500 -0
  32. package/backend/common/services/roles.js +57 -0
  33. package/backend/common/services/send-notice.js +86 -0
  34. package/backend/common/services/task.js +259 -0
  35. package/backend/common/services/user.js +673 -0
  36. package/backend/common/socket.js +18 -0
  37. package/backend/common/sse/index.js +81 -0
  38. package/backend/common/sse/router.js +30 -0
  39. package/backend/common/task.js +75 -0
  40. package/backend/common/wechat/index.js +9 -0
  41. package/backend/common/wechat/routers/auth.js +238 -0
  42. package/{modules/user/frontend → backend/common/wechat/routers}/index.html +14 -7
  43. package/backend/common/wechat/services/auth.js +209 -0
  44. package/backend/common/wechat/services/notice.js +171 -0
  45. package/backend/config/index.js +63 -0
  46. package/backend/config/path.js +3 -0
  47. package/backend/router.js +96 -0
  48. package/backend/routers/app.js +222 -0
  49. package/backend/routers/automate.js +276 -0
  50. package/backend/routers/dict.js +370 -0
  51. package/backend/routers/email.js +85 -0
  52. package/backend/routers/generalConfig.js +276 -0
  53. package/backend/routers/idm.js +245 -0
  54. package/backend/routers/module.js +357 -0
  55. package/backend/routers/notice.js +138 -0
  56. package/backend/routers/pages.js +46 -0
  57. package/backend/routers/permission.js +985 -0
  58. package/backend/routers/setting.js +184 -0
  59. package/backend/routers/team/index.js +22 -0
  60. package/backend/routers/team/routers/mapping.js +29 -0
  61. package/backend/routers/team/routers/member.js +72 -0
  62. package/backend/routers/team/routers/membermanage.js +289 -0
  63. package/backend/routers/team/routers/pages.js +47 -0
  64. package/backend/routers/team/routers/roles.js +92 -0
  65. package/backend/routers/team/routers/teaminfo.js +27 -0
  66. package/backend/routers/team/routers/usergroup.js +213 -0
  67. package/backend/routers/team/services/mapping.js +101 -0
  68. package/backend/routers/team/services/member.js +206 -0
  69. package/backend/routers/team/services/roles.js +71 -0
  70. package/backend/routers/team/services/teaminfo.js +20 -0
  71. package/backend/routers/team/services/usergroup.js +128 -0
  72. package/backend/routers/user.js +436 -0
  73. package/backend/services/automate.js +60 -0
  74. package/backend/services/config.js +14 -0
  75. package/backend/services/module.js +298 -0
  76. package/backend/services/permission.js +192 -0
  77. package/backend/services/services.js +115 -0
  78. package/backend/services/setting.js +190 -0
  79. package/backend/services/token.js +42 -0
  80. package/backend/space.js +52 -0
  81. package/backend/space_mapping.js +15 -0
  82. package/backend/utils/avatar.js +48 -0
  83. package/backend/utils/color_gen_helper.js +20 -0
  84. package/backend/utils/date.js +66 -0
  85. package/backend/utils/excel.js +446 -0
  86. package/backend/utils/fs/doc.md +64 -0
  87. package/backend/utils/fs/index.js +127 -0
  88. package/backend/utils/jwt.js +54 -0
  89. package/backend/utils/modules/sequence.js +93 -0
  90. package/backend/utils/object.js +31 -0
  91. package/backend/utils/page-query-helper/index.js +61 -0
  92. package/backend/utils/path.js +123 -0
  93. package/backend/utils/run.js +25 -0
  94. package/backend/utils/tokenize.js +82 -0
  95. package/backend/utils/typeof.js +5 -0
  96. package/backend/utils/util.js +153 -0
  97. package/backend/views/api/index.js +32 -0
  98. package/backend/views/api/index.xml +49 -0
  99. package/backend/views/dict/index.js +80 -0
  100. package/backend/views/dict/index.xml +52 -0
  101. package/backend/views/index.js +32 -0
  102. package/backend/views/members_manage/index.js +68 -0
  103. package/backend/views/members_manage/index.xml +68 -0
  104. package/backend/views/roles/index.js +17 -0
  105. package/backend/views/roles/index.xml +47 -0
  106. package/backend/views/usergroup/index.js +68 -0
  107. package/backend/views/usergroup/index.xml +65 -0
  108. package/dist/common-assets/css/index-05a08720.css +3 -0
  109. package/dist/common-assets/css/index-05a08720.css.gz +0 -0
  110. package/dist/common-assets/js/index-2e8c7128.js +762 -0
  111. package/dist/common-assets/js/index-2e8c7128.js.gz +0 -0
  112. package/dist/common-assets/js/react-cropper.es-19c27537.js +10 -0
  113. package/dist/common-assets/js/react-cropper.es-19c27537.js.gz +0 -0
  114. package/dist/common-assets/png/u9-2348c304.png +0 -0
  115. package/dist/common-assets/woff2/materialicons-83be7b2f.woff2 +0 -0
  116. package/dist/index.html +162 -0
  117. package/package.json +61 -5
  118. package/common/router.js +0 -42
  119. package/modules/user/backend/index.js +0 -19
  120. package/modules/user/backend/routers/user.js +0 -11
  121. package/modules/user/frontend/index.js +0 -1
  122. package/serve.js +0 -9
@@ -0,0 +1,276 @@
1
+ 'use strict';
2
+ var express = require('express');
3
+ const { v4: uuidv4 } = require('uuid');
4
+ const { checkLogin } = require('../common/middleware/auth');
5
+ const api = require('../services/automate');
6
+ var router = express.Router();
7
+
8
+ router.get('/', checkLogin, async function (req, res) {
9
+ let query = req.query;
10
+ let filters = {};
11
+ if (query && query.AUTO_NAME) {
12
+ filters.AUTO_NAME = query.AUTO_NAME;
13
+ }
14
+
15
+ let data = await api.getAutoMateList(filters);
16
+ data = Array.isArray(data) ? data : [];
17
+ if (data.length) {
18
+ data = data.map((v) => {
19
+ let FLOW_CHART = [];
20
+ let newStartStatus = {},
21
+ newEndStatus = {},
22
+ newFields = {};
23
+ try {
24
+ FLOW_CHART = JSON.parse(v.FLOW_CHART);
25
+ newStartStatus = JSON.parse(v.START_STATUS);
26
+ newEndStatus = JSON.parse(v.END_STATUS);
27
+ newFields = JSON.parse(v.FIELDS);
28
+ } catch (e) {}
29
+ return {
30
+ AUTO_NAME: v.AUTO_NAME,
31
+ AUTO_DESC: v.AUTO_DESC || '',
32
+ ISSUE_TYPE: v.ISSUE_TYPE ? v.ISSUE_TYPE.split(',') : [],
33
+ AUTO_SCOPE: v.AUTO_SCOPE,
34
+ PROJECT_ID: v.PROJECT_ID || '',
35
+ TRIGER_TYPE: v.TRIGER_TYPE ? v.TRIGER_TYPE.split(',') : [],
36
+ START_STATUS: newStartStatus.START_STATUS || [],
37
+ LINK_TASK_START_STATUS: newStartStatus.LINK_TASK_START_STATUS || [],
38
+ END_STATUS: newEndStatus.END_STATUS || [],
39
+ LINK_TASK_END_STATUS: newEndStatus.LINK_TASK_END_STATUS || [],
40
+ // FIELDS: v.FIELDS ? v.FIELDS.split(',') : [],
41
+ FIELDS: newFields.FIELDS || [],
42
+ LINK_TASK_FIELDS: newFields.LINK_TASK_FIELDS || [],
43
+ FLOW_CHART,
44
+ DATA_ID: v.DATA_ID,
45
+ USER_ID: v.USER_ID,
46
+ LAST_REVISER: v.LAST_REVISER,
47
+ ENABLE: v.ENABLE,
48
+ DATA_CRT_DATE: v.DATA_CRT_DATE,
49
+ DATA_UPD_DATE: v.DATA_UPD_DATE,
50
+ };
51
+ });
52
+ }
53
+ res.sendOk(data);
54
+ });
55
+
56
+ router.post('/', checkLogin, async function (req, res) {
57
+ let userid = req.get('X-UserId');
58
+ let { body } = req;
59
+ let {
60
+ AUTO_NAME, // 规则名 (必填)
61
+ AUTO_DESC, // 规则描述
62
+ ISSUE_TYPE, // 工作项类型 (必填)
63
+ AUTO_SCOPE, // 工作范围 (必填) 1.全部项目 2.指定项目
64
+ PROJECT_ID, // 指定项目 (必填)
65
+ TRIGER_TYPE, // 触发事件 (必填) 1.指定属性更新后 2.流转状态后 3.新建工作后 4.更新负责人后 5.关联工作项后
66
+ START_STATUS, // 开始状态
67
+ END_STATUS, // 结束状态
68
+ FIELDS, // 指定属性更新 (必填)
69
+ FLOW_CHART, // (必填)
70
+ LINK_TASK_START_STATUS, // 关联工作项开始状态
71
+ LINK_TASK_END_STATUS, // 关联工作项结束状态
72
+ LINK_TASK_FIELDS, //关联工作项指定属性更新
73
+ } = body;
74
+
75
+ if (!AUTO_NAME) {
76
+ return res.sendErr('规则名不能为空');
77
+ }
78
+ if (!ISSUE_TYPE) {
79
+ return res.sendErr('工作项类型不能为空');
80
+ }
81
+ if (!AUTO_SCOPE) {
82
+ return res.sendErr('请选择工作范围');
83
+ }
84
+ if (AUTO_SCOPE === '2' && !PROJECT_ID) {
85
+ return res.sendErr('请选择项目');
86
+ }
87
+ if (!TRIGER_TYPE) {
88
+ return res.sendErr('请选择触发事件');
89
+ }
90
+ if (TRIGER_TYPE === '1' && !FIELDS) {
91
+ return res.sendErr('请选择触发事件的属性');
92
+ }
93
+ if (!FLOW_CHART || (Array.isArray(FLOW_CHART) && !FLOW_CHART.length)) {
94
+ return res.sendErr('请配置流程');
95
+ }
96
+ if (!Array.isArray(FLOW_CHART) || (Array.isArray(FLOW_CHART) && !FLOW_CHART.length)) {
97
+ return res.sendErr('请配置流程');
98
+ }
99
+
100
+ let newStartStatus = JSON.stringify({
101
+ START_STATUS: Array.isArray(START_STATUS) ? START_STATUS : [],
102
+ LINK_TASK_START_STATUS: Array.isArray(LINK_TASK_START_STATUS) ? LINK_TASK_START_STATUS : [],
103
+ });
104
+
105
+ let newEndStatus = JSON.stringify({
106
+ END_STATUS: Array.isArray(END_STATUS) ? END_STATUS : [],
107
+ LINK_TASK_END_STATUS: Array.isArray(LINK_TASK_END_STATUS) ? LINK_TASK_END_STATUS : [],
108
+ });
109
+
110
+ let newFields = JSON.stringify({
111
+ FIELDS: Array.isArray(FIELDS) ? FIELDS : [],
112
+ LINK_TASK_FIELDS: Array.isArray(LINK_TASK_FIELDS) ? LINK_TASK_FIELDS : [],
113
+ });
114
+
115
+ let id = uuidv4().replaceAll('-', '');
116
+ let obj = {
117
+ AUTO_NAME,
118
+ AUTO_DESC: AUTO_DESC || '',
119
+ ISSUE_TYPE: Array.isArray(ISSUE_TYPE) ? ISSUE_TYPE.join(',') : ISSUE_TYPE || '',
120
+ AUTO_SCOPE,
121
+ PROJECT_ID,
122
+ TRIGER_TYPE: Array.isArray(TRIGER_TYPE) ? TRIGER_TYPE.join(',') : TRIGER_TYPE || '',
123
+ // START_STATUS: Array.isArray(START_STATUS) ? START_STATUS.join(',') : '',
124
+ START_STATUS: newStartStatus,
125
+ // END_STATUS: Array.isArray(END_STATUS) ? END_STATUS.join(',') : END_STATUS || '',
126
+ END_STATUS: newEndStatus,
127
+ // FIELDS: Array.isArray(FIELDS)
128
+ // ? FIELDS.join(',')
129
+ // : Array.isArray(END_STATUS)
130
+ // ? END_STATUS.join(',')
131
+ // : END_STATUS || '',
132
+ FIELDS: newFields,
133
+ FLOW_CHART: JSON.stringify(FLOW_CHART),
134
+ ORG_ID: global.orgid,
135
+ DATA_ID: id,
136
+ USER_ID: userid,
137
+ LAST_REVISER: userid,
138
+ STATUS: '00',
139
+ ENABLE: '1',
140
+ };
141
+ await api.batchInsert('ISSUE_AUTOMATION', obj);
142
+
143
+ res.sendOk({ id });
144
+ });
145
+
146
+ router.delete('/:ids', async function (req, res) {
147
+ let { ids } = req.params;
148
+
149
+ await api.batchUpdate(
150
+ 'ISSUE_AUTOMATION',
151
+ {
152
+ STATUS: '01',
153
+ },
154
+ {
155
+ DATA_ID: ids.split(','),
156
+ },
157
+ );
158
+ res.sendOk();
159
+ });
160
+
161
+ router.put('/:id', async function (req, res) {
162
+ let userid = req.get('X-UserId');
163
+ let { body, params } = req;
164
+ let { id } = params;
165
+ let props = Object.assign({}, body);
166
+
167
+ let needFields = [
168
+ // 入参
169
+ 'AUTO_NAME',
170
+ 'AUTO_DESC',
171
+ 'ISSUE_TYPE',
172
+ 'AUTO_SCOPE',
173
+ 'PROJECT_ID',
174
+ 'TRIGER_TYPE',
175
+ 'START_STATUS',
176
+ 'END_STATUS',
177
+ 'FIELDS',
178
+ 'FLOW_CHART',
179
+ 'ENABLE',
180
+ 'LINK_TASK_START_STATUS',
181
+ 'LINK_TASK_END_STATUS',
182
+ 'LINK_TASK_FIELDS',
183
+ ];
184
+
185
+ let obj = {};
186
+ Object.keys(props).forEach((v) => {
187
+ if (~needFields.indexOf(v)) {
188
+ obj[v] = props[v];
189
+ }
190
+ });
191
+
192
+ if ('AUTO_NAME' in obj && !obj.AUTO_NAME) {
193
+ return res.sendErr('规则名不能为空');
194
+ }
195
+ if ('ISSUE_TYPE' in obj && !obj.ISSUE_TYPE) {
196
+ return res.sendErr('工作项类型不能为空');
197
+ }
198
+ if ('AUTO_SCOPE' in obj && !obj.AUTO_SCOPE) {
199
+ return res.sendErr('请选择工作范围');
200
+ }
201
+ if (obj.AUTO_SCOPE === '2' && !obj.PROJECT_ID) {
202
+ return res.sendErr('请选择项目');
203
+ }
204
+ if ('TRIGER_TYPE' in obj && !obj.TRIGER_TYPE) {
205
+ return res.sendErr('请选择触发事件');
206
+ }
207
+ if (obj.TRIGER_TYPE === '1' && !obj.FIELDS) {
208
+ return res.sendErr('请选择触发事件的属性');
209
+ }
210
+ if (
211
+ 'FLOW_CHART' in obj &&
212
+ (!obj.FLOW_CHART || (Array.isArray(obj.FLOW_CHART) && !obj.FLOW_CHART.length))
213
+ ) {
214
+ return res.sendErr('请配置流程');
215
+ }
216
+ if (
217
+ 'FLOW_CHART' in obj &&
218
+ (!Array.isArray(obj.FLOW_CHART) || (Array.isArray(obj.FLOW_CHART) && !obj.FLOW_CHART.length))
219
+ ) {
220
+ return res.sendErr('请配置流程');
221
+ }
222
+
223
+ if ('FLOW_CHART' in obj) {
224
+ obj.FLOW_CHART = JSON.stringify(obj.FLOW_CHART);
225
+ }
226
+ // if ('FIELDS' in obj) {
227
+ // obj.FIELDS = Array.isArray(obj.FIELDS) ? obj.FIELDS.join(',') : '';
228
+ // }
229
+ if ('ISSUE_TYPE' in obj) {
230
+ obj.ISSUE_TYPE = Array.isArray(obj.ISSUE_TYPE) ? obj.ISSUE_TYPE.join(',') : '';
231
+ }
232
+ if ('TRIGER_TYPE' in obj) {
233
+ obj.TRIGER_TYPE = Array.isArray(obj.TRIGER_TYPE) ? obj.TRIGER_TYPE.join(',') : '';
234
+ }
235
+ const {
236
+ END_STATUS,
237
+ LINK_TASK_END_STATUS,
238
+ LINK_TASK_START_STATUS,
239
+ START_STATUS,
240
+ FIELDS,
241
+ LINK_TASK_FIELDS,
242
+ } = obj;
243
+ if ('LINK_TASK_END_STATUS' in obj || 'END_STATUS' in obj) {
244
+ let newEndStatus = JSON.stringify({
245
+ LINK_TASK_END_STATUS: Array.isArray(LINK_TASK_END_STATUS) ? LINK_TASK_END_STATUS : [],
246
+ END_STATUS: Array.isArray(END_STATUS) ? END_STATUS : [],
247
+ });
248
+ obj.END_STATUS = newEndStatus;
249
+ Reflect.deleteProperty(obj, 'LINK_TASK_END_STATUS');
250
+ }
251
+ if ('LINK_TASK_START_STATUS' in obj || 'START_STATUS' in obj) {
252
+ let newStartStatus = JSON.stringify({
253
+ LINK_TASK_START_STATUS: Array.isArray(LINK_TASK_START_STATUS) ? LINK_TASK_START_STATUS : [],
254
+ START_STATUS: Array.isArray(START_STATUS) ? START_STATUS : [],
255
+ });
256
+ obj.START_STATUS = newStartStatus;
257
+ Reflect.deleteProperty(obj, 'LINK_TASK_START_STATUS');
258
+ }
259
+
260
+ if ('FIELDS' in obj || 'LINK_TASK_FIELDS' in obj) {
261
+ let newFields = JSON.stringify({
262
+ FIELDS: Array.isArray(FIELDS) ? FIELDS : [],
263
+ LINK_TASK_FIELDS: Array.isArray(LINK_TASK_FIELDS) ? LINK_TASK_FIELDS : [],
264
+ });
265
+ obj.FIELDS = newFields;
266
+ Reflect.deleteProperty(obj, 'LINK_TASK_FIELDS');
267
+ }
268
+
269
+ obj.LAST_REVISER = userid;
270
+ await api.batchUpdate('ISSUE_AUTOMATION', obj, {
271
+ DATA_ID: id,
272
+ });
273
+ res.sendOk();
274
+ });
275
+
276
+ module.exports = router;
@@ -0,0 +1,370 @@
1
+ 'use strict';
2
+ const express = require('express');
3
+ const dictService = require('../common/services/dict');
4
+ const { parseQueryParams } = require('../utils/page-query-helper/index');
5
+ const { dictLevelType } = require('../common/enum');
6
+
7
+ const router = express.Router();
8
+
9
+ /**
10
+ * 根据 DICT_ID 分页查字典列表
11
+ *
12
+ * @query {string} DICT_ID 字典 id
13
+ * @query {number} page
14
+ * @query {number} size
15
+ */
16
+ router.get('/', async function (req, res) {
17
+ const { params, pageInfo } = parseQueryParams(req.query, ['ORG_ID'], true, 50);
18
+ if (!params.DICT_ID) return res.sendErr('参数错误');
19
+ let type = params.type;
20
+ Reflect.deleteProperty(params, 'type');
21
+
22
+ if (type === dictLevelType.DICT_LENVEL_TYPE.dict || !type) {
23
+ let data = await dictService.getDictItems(params, pageInfo);
24
+
25
+ if (!data) {
26
+ return res.sendErr('');
27
+ }
28
+ return res.sendOk(data);
29
+ }
30
+ return res.sendOk({});
31
+ });
32
+
33
+ // 获取dict层级树
34
+ router.get('/tree', async function (req, res) {
35
+ let baseDict = await dictService.getOrderModules();
36
+ let baseDictGroup = await dictService.getOrderBaseDictModule();
37
+ if (!baseDict || !baseDictGroup) return res.sendErr('没有找到数据');
38
+ let treeData = [];
39
+
40
+ baseDict.map((v, i) => {
41
+ const { MODULE_ID, MODULE_NAME } = v;
42
+ treeData.push({
43
+ icon: 'folder',
44
+ label: MODULE_NAME,
45
+ value: MODULE_ID,
46
+ creatable: true,
47
+ removable: true,
48
+ editable: true,
49
+ cannotSelect: true,
50
+ type: dictLevelType.DICT_LENVEL_TYPE.module,
51
+ });
52
+ let curData = baseDictGroup.filter((v) => {
53
+ return v.MODULE_ID == MODULE_ID;
54
+ });
55
+ if (curData.length > 0) {
56
+ let list = [];
57
+ curData.map((v) => {
58
+ const { MODULE_ID, DICT_ID, DICT_NAME } = v;
59
+ list.push({
60
+ label: DICT_NAME,
61
+ value: DICT_ID,
62
+ parentId: MODULE_ID,
63
+ creatable: false,
64
+ removable: true,
65
+ editable: true,
66
+ type: dictLevelType.DICT_LENVEL_TYPE.dict,
67
+ });
68
+ });
69
+ treeData[i].children = list;
70
+ }
71
+ });
72
+
73
+ res.sendOk({
74
+ options: [
75
+ {
76
+ label: '数据字典',
77
+ icon: 'folder',
78
+ unfolded: true,
79
+ value: global.orgid,
80
+ parentId: global.orgid,
81
+ creatable: true,
82
+ removable: false,
83
+ editable: false,
84
+ cannotSelect: true,
85
+ addText: '添加字典模块',
86
+ children: treeData,
87
+ },
88
+ ],
89
+ value: 'ISSUE_TYPE',
90
+ });
91
+ });
92
+
93
+ /**
94
+ * 新增码值
95
+ * @param {string} DICT_ID 分类ID
96
+ *
97
+ * @body {string} ITEM_ID 代码
98
+ * @body {string} ITEM_VALUE 码值
99
+ * @body {string} ITEM_DESC 描述
100
+ * @body {string} ITEM_COLOR 色彩
101
+ * @body {string} ITEM_ICON 图标
102
+ * @body {string} ITEM_ICON_TYPE 图标类型
103
+ * @body {string} ITEM_STYLE 样式
104
+ * @body {string} ITEM_PARENT 上级
105
+ * @body {string} DICT_PARENT
106
+ */
107
+ router.post('/', async function (req, res) {
108
+ let pageInfo = {
109
+ pageIndex: 0,
110
+ pageSize: 50,
111
+ };
112
+ let { DICT_ID, type } = { ...req.body, ...req.query };
113
+ if (!DICT_ID || !type) return res.sendErr('参数错误');
114
+ if (!req.body.ITEM_VALUE || !req.body.ITEM_ID) return res.sendErr('参数错误');
115
+ if (type === dictLevelType.DICT_LENVEL_TYPE.module) {
116
+ return res.sendErr('添加失败');
117
+ } else if (type === dictLevelType.DICT_LENVEL_TYPE.dict) {
118
+ let {
119
+ ITEM_ID,
120
+ ITEM_VALUE,
121
+ ITEM_DESC,
122
+ ITEM_COLOR,
123
+ ITEM_ICON,
124
+ ITEM_ICON_TYPE,
125
+ ITEM_STYLE,
126
+ ITEM_PARENT,
127
+ DICT_PARENT,
128
+ } = req.body;
129
+ let itemRes = await dictService.getDictItems(
130
+ {
131
+ ITEM_ID,
132
+ },
133
+ pageInfo,
134
+ );
135
+ let itemExists = itemRes.content && itemRes.content.length;
136
+ if (itemExists) return res.sendErr('码值ID已存在');
137
+ let results = await dictService.searchDICTModuleId(DICT_ID);
138
+ if (results.error) return res.sendErr();
139
+ let MODULE_ID = '';
140
+ if (results.results.length > 0) {
141
+ MODULE_ID = results.results[0].MODULE_ID;
142
+ }
143
+
144
+ let data = await dictService.createDictItem({
145
+ ORG_ID: orgid,
146
+ DICT_ID,
147
+ ITEM_ID,
148
+ ITEM_VALUE,
149
+ ITEM_DESC,
150
+ ITEM_COLOR,
151
+ ITEM_ICON,
152
+ ITEM_ICON_TYPE,
153
+ ITEM_STYLE,
154
+ ITEM_PARENT,
155
+ DICT_PARENT,
156
+ MODULE_ID,
157
+ });
158
+
159
+ if (data == null) return res.sendErr('创建失败');
160
+ return res.sendOk('创建成功');
161
+ }
162
+ });
163
+
164
+ /**
165
+ * 编辑码值
166
+ * @param {string} ITEM_ID 码值ID
167
+ *
168
+ * @body {string} ITEM_VALUE 码值
169
+ * @body {string} ITEM_DESC 描述
170
+ * @body {string} ITEM_COLOR 色彩
171
+ * @body {string} ITEM_ICON 图标
172
+ * @body {string} ITEM_ICON_TYPE 图标类型
173
+ * @body {string} ITEM_STYLE 样式
174
+ * @body {string} ITEM_PARENT 上级
175
+ * @body {string} DICT_PARENT
176
+ */
177
+ router.put('/:ITEM_ID', async function (req, res) {
178
+ let { ITEM_ID } = req.params;
179
+
180
+ let {
181
+ ITEM_VALUE,
182
+ ITEM_DESC,
183
+ ITEM_COLOR,
184
+ ITEM_ICON,
185
+ ITEM_ICON_TYPE,
186
+ ITEM_STYLE,
187
+ ITEM_PARENT,
188
+ DICT_PARENT,
189
+ DICT_ID,
190
+ } = { ...req.body, ...req.query };
191
+ if (!ITEM_ID || !DICT_ID) return res.sendErr('参数错误');
192
+
193
+ let data = await dictService.updateDictItem(
194
+ {
195
+ ITEM_VALUE,
196
+ ITEM_DESC,
197
+ ITEM_COLOR,
198
+ ITEM_ICON,
199
+ ITEM_ICON_TYPE,
200
+ ITEM_STYLE,
201
+ ITEM_PARENT,
202
+ DICT_PARENT,
203
+ },
204
+ {
205
+ ITEM_ID,
206
+ DICT_ID,
207
+ },
208
+ );
209
+
210
+ if (data == null) return res.sendErr('编辑失败');
211
+ return res.sendOk();
212
+ });
213
+
214
+ /**
215
+ * 删除单个码值
216
+ * @param {string} ids 码值ID 逗号分隔
217
+ */
218
+ router.delete('/:ITEM_ID', async function (req, res) {
219
+ let { DICT_ID } = { ...req.body, ...req.query };
220
+ let { ITEM_ID } = req.params;
221
+ if (!ITEM_ID || !DICT_ID) return res.sendErr('参数错误');
222
+ let data = await dictService.deleteDictItems({
223
+ ITEM_ID,
224
+ DICT_ID,
225
+ });
226
+ if (data == null) res.sendErr();
227
+ return res.sendOk();
228
+ });
229
+
230
+ /**
231
+ * 批量删除码值
232
+ * @param {string} ids 码值ID 逗号分隔
233
+ */
234
+ router.delete('/', async function (req, res) {
235
+ let { ids, DICT_ID } = req.body;
236
+ if (!ids || !DICT_ID) return res.sendErr('参数错误');
237
+ let data = await dictService.deleteDictItem(ids.split(','), DICT_ID);
238
+ if (data == null) res.sendErr();
239
+ return res.sendOk();
240
+ });
241
+
242
+ /****
243
+ * 修改字典顺序
244
+ * @param {object
245
+ * newIndex :当前新的位置
246
+ * oldIndex:之前的位置
247
+ * DICT_ID:码表
248
+ * }
249
+ * */
250
+ router.post('/dictsort', async function (req, res) {
251
+ const { oldIndex, newIndex, DICT_ID } = { ...req.body, ...req.query };
252
+ if (
253
+ typeof oldIndex == 'undefined' ||
254
+ typeof newIndex == 'undefined' ||
255
+ typeof DICT_ID == 'undefined'
256
+ ) {
257
+ return res.sendErr('参数错误');
258
+ }
259
+ let data = await dictService.getSortDictItem(DICT_ID);
260
+ if (!data) return res.sendErr();
261
+ let orderData = data.slice();
262
+ const [curOrder] = orderData.splice(oldIndex, 1);
263
+ orderData.splice(newIndex, 0, curOrder);
264
+ const result = await dictService.batchUpdateItem(orderData, DICT_ID);
265
+ if (!result) return res.sendErr();
266
+
267
+ return res.sendOk();
268
+ });
269
+
270
+ /**
271
+ * @api {put} /space/dict/api/basedict 修改字典信息和字典模块
272
+ * @apiGroup space
273
+ * @apiDescription
274
+ * @apiVersion 1.0.0
275
+ *
276
+ * @apiQuery id:唯一的key值 name:更新的值 type:父节点的key值
277
+ */
278
+ router.put('/api/basedict', async function (req, res) {
279
+ const { id, name, type } = req.body;
280
+ if (!id || !name || !type) return res.sendErr('参数错误');
281
+ if (type === dictLevelType.DICT_LENVEL_TYPE.module) {
282
+ const { error, result } = await dictService.updateModule(
283
+ {
284
+ MODULE_NAME: name,
285
+ },
286
+ { MODULE_ID: id },
287
+ );
288
+ if (error) return res.sendErr(error);
289
+ return res.sendOk();
290
+ } else if (type === dictLevelType.DICT_LENVEL_TYPE.dict) {
291
+ const { error, result } = await dictService.modifyBaseDict(id, name);
292
+ if (error) return res.sendErr(error);
293
+ return res.sendOk();
294
+ }
295
+ });
296
+
297
+ /**
298
+ * @api {post} /space/dict/api/basedict 新增字典tree
299
+ * @apiGroup space
300
+ * @apiDescription
301
+ * @apiVersion 1.0.0
302
+ *
303
+ * @apiQuery pid:唯一的key值 name:更新的值 inputid:w唯一id
304
+ */
305
+ router.post('/api/basedict', async function (req, res) {
306
+ const { pid, name, inputId, type } = req.body;
307
+ if (!pid || !name || !inputId) return res.sendErr('参数错误');
308
+ if (inputId == global.orgid) return res.sendErr('该字段不可用');
309
+ var reg = /^[a-zA-Z_-]([a-zA-Z0-9_-]+)?$/;
310
+ if (!reg.test(inputId)) return res.sendErr('节点id只支持以英文字字母或下划线开头的组合');
311
+ let basedictResult = await dictService.isExistDictId(inputId);
312
+ if (basedictResult.error) return res.sendErr('数据库执行错误');
313
+ if (basedictResult.results.length > 0) return res.sendErr('字典id已存在');
314
+ let result = await dictService.getBaseDictModule({ MODULE_ID: inputId });
315
+ if (!result) return res.sendErr('数据库执行错误');
316
+ if (result.results.length > 0) return res.sendErr('字典id已存在');
317
+ if (pid == global.orgid) {
318
+ let addModuleResult = await dictService.createModule({
319
+ MODULE_ID: inputId,
320
+ MODULE_NAME: name,
321
+ ORG_ID: global.orgid,
322
+ });
323
+ if (!addModuleResult) return res.sendErr('操作失败');
324
+ return res.sendOk();
325
+ } else {
326
+ const { error, result } = await dictService.addBaseDict(pid, name, inputId);
327
+ if (error) return res.sendErr(error);
328
+ return res.sendOk();
329
+ }
330
+ });
331
+
332
+ /**
333
+ * @api {delete} /space/dict/api/basedict 删除字段tree
334
+ * @apiGroup space
335
+ * @apiDescription
336
+ * @apiVersion 1.0.0
337
+ *
338
+ * @apiQuery id:唯一的key值
339
+ */
340
+ router.delete('/api/basedict', async function (req, res) {
341
+ const { id, type } = req.body;
342
+ if (!id || !type) return res.sendErr('参数错误');
343
+ if (type == dictLevelType.DICT_LENVEL_TYPE.module) {
344
+ const moduleResult = await dictService.deleteModule({
345
+ MODULE_ID: id,
346
+ });
347
+ if (moduleResult.error) return res.sendErr(moduleResult.error);
348
+ const dictinfoResult = await dictService.delBaseDict({
349
+ MODULE_ID: id,
350
+ });
351
+ if (dictinfoResult.error) return res.sendErr(dictinfoResult.error);
352
+ const dictItmeRefult = await dictService.deleteDictItems({
353
+ MODULE_ID: id,
354
+ });
355
+ if (dictItmeRefult.error) return res.sendErr(dictinfoResult.error);
356
+ return res.sendOk();
357
+ } else if (type == dictLevelType.DICT_LENVEL_TYPE.dict) {
358
+ const dictItmeRefult = await dictService.deleteDictItems({
359
+ DICT_ID: id,
360
+ });
361
+ if (dictItmeRefult.error) return res.sendErr(dictinfoResult.error);
362
+ const { error, result } = await dictService.delBaseDict({
363
+ DICT_ID: id,
364
+ });
365
+ if (error) return res.sendErr(error);
366
+ return res.sendOk();
367
+ }
368
+ });
369
+
370
+ module.exports = router;