@gingkoo/base-server 0.0.1-alpha.0 → 0.0.1-alpha.1
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 +7 -0
- package/app.js +32 -40
- package/backend/common/entity.js +55 -0
- package/backend/common/enum.js +247 -0
- package/backend/common/fss/index.js +18 -0
- package/backend/common/fss/routers/attachment.js +45 -0
- package/backend/common/fss/routers/download.js +43 -0
- package/backend/common/fss/routers/import_export.js +113 -0
- package/backend/common/fss/routers/resources.js +149 -0
- package/backend/common/fss/routers/upload.js +81 -0
- package/backend/common/fss/services/import_export.js +159 -0
- package/backend/common/fss/services/index.js +92 -0
- package/backend/common/fss/utils.js +39 -0
- package/backend/common/ginfo/config.js +5 -0
- package/backend/common/ginfo/index.js +62 -0
- package/backend/common/index_template.html +28 -0
- package/backend/common/logger/index.js +96 -0
- package/backend/common/mapping.js +98 -0
- package/backend/common/middleware/auth.js +97 -0
- package/backend/common/middleware/cors.js +13 -0
- package/backend/common/middleware/response.js +25 -0
- package/backend/common/page_engine.js +487 -0
- package/backend/common/schedule.js +45 -0
- package/backend/common/services/dataCombine.js +67 -0
- package/backend/common/services/dept.js +37 -0
- package/backend/common/services/dict.js +487 -0
- package/backend/common/services/email.js +49 -0
- package/backend/common/services/generalConfig.js +137 -0
- package/backend/common/services/login.js +18 -0
- package/backend/common/services/notice.js +260 -0
- package/backend/common/services/permission.js +500 -0
- package/backend/common/services/roles.js +57 -0
- package/backend/common/services/send-notice.js +86 -0
- package/backend/common/services/task.js +259 -0
- package/backend/common/services/user.js +673 -0
- package/backend/common/socket.js +18 -0
- package/backend/common/sse/index.js +81 -0
- package/backend/common/sse/router.js +30 -0
- package/backend/common/task.js +75 -0
- package/backend/common/wechat/index.js +9 -0
- package/backend/common/wechat/routers/auth.js +238 -0
- package/{modules/user/frontend → backend/common/wechat/routers}/index.html +14 -7
- package/backend/common/wechat/services/auth.js +209 -0
- package/backend/common/wechat/services/notice.js +171 -0
- package/backend/config/index.js +63 -0
- package/backend/config/path.js +3 -0
- package/backend/router.js +96 -0
- package/backend/routers/app.js +222 -0
- package/backend/routers/automate.js +276 -0
- package/backend/routers/dict.js +370 -0
- package/backend/routers/email.js +85 -0
- package/backend/routers/generalConfig.js +276 -0
- package/backend/routers/idm.js +245 -0
- package/backend/routers/module.js +357 -0
- package/backend/routers/notice.js +138 -0
- package/backend/routers/pages.js +46 -0
- package/backend/routers/permission.js +985 -0
- package/backend/routers/setting.js +184 -0
- package/backend/routers/team/index.js +22 -0
- package/backend/routers/team/routers/mapping.js +29 -0
- package/backend/routers/team/routers/member.js +72 -0
- package/backend/routers/team/routers/membermanage.js +289 -0
- package/backend/routers/team/routers/pages.js +47 -0
- package/backend/routers/team/routers/roles.js +92 -0
- package/backend/routers/team/routers/teaminfo.js +27 -0
- package/backend/routers/team/routers/usergroup.js +213 -0
- package/backend/routers/team/services/mapping.js +101 -0
- package/backend/routers/team/services/member.js +206 -0
- package/backend/routers/team/services/roles.js +71 -0
- package/backend/routers/team/services/teaminfo.js +20 -0
- package/backend/routers/team/services/usergroup.js +128 -0
- package/backend/routers/user.js +436 -0
- package/backend/services/automate.js +60 -0
- package/backend/services/config.js +14 -0
- package/backend/services/module.js +298 -0
- package/backend/services/permission.js +192 -0
- package/backend/services/services.js +115 -0
- package/backend/services/setting.js +190 -0
- package/backend/services/token.js +42 -0
- package/backend/space.js +52 -0
- package/backend/space_mapping.js +15 -0
- package/backend/utils/avatar.js +48 -0
- package/backend/utils/color_gen_helper.js +20 -0
- package/backend/utils/date.js +66 -0
- package/backend/utils/excel.js +446 -0
- package/backend/utils/fs/doc.md +64 -0
- package/backend/utils/fs/index.js +127 -0
- package/backend/utils/jwt.js +54 -0
- package/backend/utils/modules/sequence.js +93 -0
- package/backend/utils/object.js +31 -0
- package/backend/utils/page-query-helper/index.js +61 -0
- package/backend/utils/path.js +123 -0
- package/backend/utils/run.js +25 -0
- package/backend/utils/tokenize.js +82 -0
- package/backend/utils/typeof.js +5 -0
- package/backend/utils/util.js +153 -0
- package/backend/views/api/index.js +32 -0
- package/backend/views/api/index.xml +49 -0
- package/backend/views/dict/index.js +80 -0
- package/backend/views/dict/index.xml +52 -0
- package/backend/views/index.js +32 -0
- package/backend/views/members_manage/index.js +68 -0
- package/backend/views/members_manage/index.xml +68 -0
- package/backend/views/roles/index.js +17 -0
- package/backend/views/roles/index.xml +47 -0
- package/backend/views/usergroup/index.js +68 -0
- package/backend/views/usergroup/index.xml +65 -0
- package/dist/assets/css/index-cc834b52.css +3 -0
- package/dist/assets/css/index-cc834b52.css.gz +0 -0
- package/dist/assets/js/index-9eef7474.js +762 -0
- package/dist/assets/js/index-9eef7474.js.gz +0 -0
- package/dist/assets/js/react-cropper.es-d3337769.js +10 -0
- package/dist/assets/js/react-cropper.es-d3337769.js.gz +0 -0
- package/dist/assets/png/u9-2348c304.png +0 -0
- package/dist/assets/woff2/materialicons-83be7b2f.woff2 +0 -0
- package/dist/index.html +162 -0
- package/package.json +60 -5
- package/common/router.js +0 -42
- package/modules/user/backend/index.js +0 -19
- package/modules/user/backend/routers/user.js +0 -11
- package/modules/user/frontend/index.js +0 -1
- 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;
|