@steedos-labs/content-compliance 1.0.1 → 1.0.3

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 (53) hide show
  1. package/dist/index.js +1 -1
  2. package/lib/actions/contentHubFillOnSave.d.ts +5 -0
  3. package/lib/actions/contentHubFillOnSave.js +49 -0
  4. package/lib/actions/contentHubFillOnSave.js.map +1 -0
  5. package/lib/actions/contentHubMaterialGroups.js +19 -35
  6. package/lib/actions/contentHubMaterialGroups.js.map +1 -1
  7. package/lib/actions/contentHubSyncPreview.d.ts +9 -4
  8. package/lib/actions/contentHubSyncPreview.js +23 -19
  9. package/lib/actions/contentHubSyncPreview.js.map +1 -1
  10. package/lib/actions/index.d.ts +1 -0
  11. package/lib/actions/index.js +1 -0
  12. package/lib/actions/index.js.map +1 -1
  13. package/lib/index.js +35 -110
  14. package/lib/index.js.map +1 -1
  15. package/lib/methods/__tests__/contentHubFormFill.test.d.ts +1 -0
  16. package/lib/methods/__tests__/contentHubFormFill.test.js +274 -0
  17. package/lib/methods/__tests__/contentHubFormFill.test.js.map +1 -0
  18. package/lib/methods/__tests__/contentHubPush.test.js +211 -6
  19. package/lib/methods/__tests__/contentHubPush.test.js.map +1 -1
  20. package/lib/methods/__tests__/contentHubSyncRule.test.js +37 -5
  21. package/lib/methods/__tests__/contentHubSyncRule.test.js.map +1 -1
  22. package/lib/methods/__tests__/contentHubTagSync.test.js +21 -57
  23. package/lib/methods/__tests__/contentHubTagSync.test.js.map +1 -1
  24. package/lib/methods/content_hub.js +13 -3
  25. package/lib/methods/content_hub.js.map +1 -1
  26. package/lib/methods/content_hub_form_fill.d.ts +2 -0
  27. package/lib/methods/content_hub_form_fill.js +75 -0
  28. package/lib/methods/content_hub_form_fill.js.map +1 -0
  29. package/lib/methods/content_hub_material_group.d.ts +1 -0
  30. package/lib/methods/content_hub_material_group.js +14 -1
  31. package/lib/methods/content_hub_material_group.js.map +1 -1
  32. package/lib/methods/content_hub_material_group_rule.d.ts +9 -0
  33. package/lib/methods/content_hub_material_group_rule.js +62 -1
  34. package/lib/methods/content_hub_material_group_rule.js.map +1 -1
  35. package/lib/methods/content_hub_sync_rule.d.ts +13 -0
  36. package/lib/methods/content_hub_sync_rule.js +49 -13
  37. package/lib/methods/content_hub_sync_rule.js.map +1 -1
  38. package/lib/methods/content_hub_tag.d.ts +0 -5
  39. package/lib/methods/content_hub_tag.js +47 -207
  40. package/lib/methods/content_hub_tag.js.map +1 -1
  41. package/lib/methods/content_hub_uploader.d.ts +24 -0
  42. package/lib/methods/content_hub_uploader.js +282 -0
  43. package/lib/methods/content_hub_uploader.js.map +1 -0
  44. package/main/default/objects/pepsico_ch_sync_rule/fields/kol_classification.field.yml +1 -1
  45. package/main/default/objects/pepsico_ch_tag_sync_log/fields/expired_date.field.yml +1 -0
  46. package/main/default/objects/pepsico_material_approval/fields/ch_material_group.field.yml +5 -12
  47. package/main/default/objects/pepsico_material_approval/fields/ch_material_group_path.field.yml +8 -4
  48. package/main/default/objects/pepsico_material_approval/fields/ch_sync_enabled.field.yml +10 -0
  49. package/main/default/objects/pepsico_material_approval/fields/ch_sync_manual.field.yml +12 -0
  50. package/main/default/objects/pepsico_material_approval/fields/ch_sync_rule_check.field.yml +13 -16
  51. package/main/default/objects/pepsico_material_approval/fields/ch_uploader_notified_group.field.yml +11 -0
  52. package/main/default/triggers/pepsico_material_approval_content_hub.trigger.yml +32 -0
  53. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ export declare const CONTENT_HUB_UPLOADER_LOG_NAME = "Content Hub\u4E0A\u4F20\u6388\u6743";
2
+ export type UploaderRecipient = {
3
+ email: string;
4
+ role: '发起人' | 'Agency';
5
+ userId?: string;
6
+ };
7
+ export type UploaderPermissionRow = {
8
+ email: string;
9
+ accountStatus?: string;
10
+ workspaceMemberStatus?: string;
11
+ materialGroupId?: string;
12
+ materialGroupPath?: string;
13
+ permissionStatus?: string;
14
+ effectiveScope?: string | null;
15
+ };
16
+ export declare const getUploaderRecipients: (ctx: any, approval: any) => Promise<UploaderRecipient[]>;
17
+ export declare const buildW1Body: (emails: string[], materialGroupIds: string[]) => string;
18
+ export declare const parseW1Response: (text: any) => any;
19
+ export declare const requestUploaderPermission: (token: string, emails: string[], materialGroupIds: string[], trace?: any) => Promise<any>;
20
+ export declare const buildUploaderEmail: (approval: any, path: string, row?: UploaderPermissionRow) => {
21
+ subject: string;
22
+ html: string;
23
+ };
24
+ export declare const grantUploaderAndNotify: (ctx: any, approval: any, materialGroupIds: string[], getToken: () => Promise<string>) => Promise<void>;
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.grantUploaderAndNotify = exports.buildUploaderEmail = exports.requestUploaderPermission = exports.parseW1Response = exports.buildW1Body = exports.getUploaderRecipients = exports.CONTENT_HUB_UPLOADER_LOG_NAME = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var axios_1 = require("axios");
6
+ var _ = require("lodash");
7
+ var pls_1 = require("./pls");
8
+ exports.CONTENT_HUB_UPLOADER_LOG_NAME = 'Content Hub上传授权';
9
+ var newRequestId = function () {
10
+ var crypto = require('crypto');
11
+ return crypto.randomUUID ? crypto.randomUUID() : "".concat(Date.now(), "-").concat(Math.random().toString(16).slice(2));
12
+ };
13
+ var normalizeEmail = function (email) { return (_.isString(email) ? email.trim().toLowerCase() : ''); };
14
+ var getUploaderRecipients = function (ctx, approval) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
15
+ var spaceUsers, creatorId, recipients, byUser, collaboratorId, rows, initiator, agency, initiator;
16
+ return tslib_1.__generator(this, function (_a) {
17
+ switch (_a.label) {
18
+ case 0:
19
+ spaceUsers = ctx.getObject('space_users');
20
+ creatorId = approval.created_by || approval.owner;
21
+ recipients = [];
22
+ byUser = function (userId) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
23
+ var rows;
24
+ return tslib_1.__generator(this, function (_a) {
25
+ switch (_a.label) {
26
+ case 0:
27
+ if (!userId) {
28
+ return [2, null];
29
+ }
30
+ return [4, spaceUsers.directFind({
31
+ filters: [['user', '=', userId], ['space', '=', approval.space]],
32
+ fields: ['user', 'email'],
33
+ top: 1
34
+ })];
35
+ case 1:
36
+ rows = _a.sent();
37
+ return [2, rows && rows[0]];
38
+ }
39
+ });
40
+ }); };
41
+ if (!(approval.is_external === true)) return [3, 4];
42
+ collaboratorId = _.isPlainObject(approval.internal_collaborator) ? approval.internal_collaborator._id : approval.internal_collaborator;
43
+ if (!collaboratorId) return [3, 2];
44
+ return [4, spaceUsers.directFind({ filters: [['_id', '=', collaboratorId]], fields: ['user', 'email'], top: 1 })];
45
+ case 1:
46
+ rows = _a.sent();
47
+ initiator = rows && rows[0];
48
+ if (initiator && initiator.email) {
49
+ recipients.push({ email: initiator.email, role: '发起人', userId: initiator.user });
50
+ }
51
+ _a.label = 2;
52
+ case 2: return [4, byUser(creatorId)];
53
+ case 3:
54
+ agency = _a.sent();
55
+ if (agency && agency.email) {
56
+ recipients.push({ email: agency.email, role: 'Agency', userId: agency.user });
57
+ }
58
+ return [3, 6];
59
+ case 4: return [4, byUser(approval.owner || creatorId)];
60
+ case 5:
61
+ initiator = _a.sent();
62
+ if (initiator && initiator.email) {
63
+ recipients.push({ email: initiator.email, role: '发起人', userId: initiator.user });
64
+ }
65
+ _a.label = 6;
66
+ case 6: return [2, _.uniqBy(_.filter(recipients, function (r) { return !!normalizeEmail(r.email); }), function (r) { return normalizeEmail(r.email); })];
67
+ }
68
+ });
69
+ }); };
70
+ exports.getUploaderRecipients = getUploaderRecipients;
71
+ var buildW1Body = function (emails, materialGroupIds) {
72
+ var ids = _.uniq(_.map(materialGroupIds, String));
73
+ if (_.some(ids, function (id) { return !/^\d+$/.test(id); })) {
74
+ throw new Error("\u7D20\u6750\u7EC4 ID \u4E0D\u5408\u6CD5: ".concat(ids.join(',')));
75
+ }
76
+ return "{\"email\":".concat(JSON.stringify(_.uniq(_.compact(_.map(emails, normalizeEmail)))), ",\"materialGroupIdList\":[").concat(ids.join(','), "]}");
77
+ };
78
+ exports.buildW1Body = buildW1Body;
79
+ var parseW1Response = function (text) {
80
+ if (!_.isString(text)) {
81
+ return text;
82
+ }
83
+ return JSON.parse(text.replace(/("materialGroupId"\s*:\s*)(\d+)/g, '$1"$2"'));
84
+ };
85
+ exports.parseW1Response = parseW1Response;
86
+ var requestUploaderPermission = function (token, emails, materialGroupIds, trace) {
87
+ if (trace === void 0) { trace = {}; }
88
+ return tslib_1.__awaiter(void 0, void 0, void 0, function () {
89
+ var body, requestId, result, error_1;
90
+ return tslib_1.__generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0:
93
+ body = (0, exports.buildW1Body)(emails, materialGroupIds);
94
+ requestId = newRequestId();
95
+ trace.request = {
96
+ url: '/creativeSaas/pepsico/compliance/v1/editable-material/uploader-permission',
97
+ request_id: requestId,
98
+ body: body
99
+ };
100
+ _a.label = 1;
101
+ case 1:
102
+ _a.trys.push([1, 3, , 4]);
103
+ return [4, axios_1.default.post("".concat(process.env.PEPSICO_CONTENT_HUB_BASE_URL).concat(trace.request.url), body, {
104
+ headers: {
105
+ 'tenant-access-token': token,
106
+ 'X-Request-Id': requestId,
107
+ 'Content-Type': 'application/json; charset=UTF-8'
108
+ },
109
+ timeout: 30000,
110
+ transformResponse: [function (data) { return data; }]
111
+ })];
112
+ case 2:
113
+ result = _a.sent();
114
+ trace.response = (0, exports.parseW1Response)(result.data);
115
+ return [2, trace.response];
116
+ case 3:
117
+ error_1 = _a.sent();
118
+ if (error_1 && error_1.response) {
119
+ trace.http_status = error_1.response.status;
120
+ try {
121
+ trace.response = (0, exports.parseW1Response)(error_1.response.data);
122
+ }
123
+ catch (e) {
124
+ trace.response = error_1.response.data;
125
+ }
126
+ }
127
+ throw error_1;
128
+ case 4: return [2];
129
+ }
130
+ });
131
+ });
132
+ };
133
+ exports.requestUploaderPermission = requestUploaderPermission;
134
+ var escapeHtml = function (text) { return String(text == null ? '' : text)
135
+ .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); };
136
+ var buildUploaderEmail = function (approval, path, row) {
137
+ var webUrl = process.env.PEPSICO_CONTENT_HUB_WEB_URL;
138
+ path = String(path || '').split('|').map(function (name) { return name.trim(); }).join(' > ');
139
+ var ssoPending = row && row.accountStatus === 'SSO_PENDING';
140
+ var subject = "\u3010Content Hub\u3011\u8BF7\u4E0A\u4F20\u53EF\u7F16\u8F91\u7D20\u6750: ".concat(approval.name);
141
+ var html = "\n <p>\u60A8\u597D\uFF0C</p>\n <p>\u5BA1\u6279\u5355\u300C".concat(escapeHtml(approval.name), "\u300D\u7684\u7D20\u6750\u5DF2\u540C\u6B65\u5230 Content Hub\uFF0C\u5B58\u653E\u4F4D\u7F6E\uFF1A</p>\n <p><b>").concat(escapeHtml(path), "</b></p>\n <p>\u8BF7\u767B\u5F55 Content Hub\uFF0C\u5728\u4E0A\u8FF0\u76EE\u5F55\u4E0A\u4F20\u8BE5\u6279\u7D20\u6750\u7684\u53EF\u7F16\u8F91\u7248\u672C\uFF08\u5982 PSD / PSB \u7B49\u6E90\u6587\u4EF6\uFF09\u3002\u60A8\u5DF2\u88AB\u6388\u4E88\u8BE5\u76EE\u5F55\u7684\u4E0A\u4F20\u6743\u9650\u3002</p>\n ").concat(ssoPending ? '<p>您是首次使用 Content Hub,请先通过公司 SSO 登录一次以完成账号开通。</p>' : '', "\n ").concat(webUrl ? "<p><a href=\"".concat(escapeHtml(webUrl), "\">\u6253\u5F00 Content Hub</a></p>") : '', "\n <p>\u5BA1\u6279\u5355\uFF1A<a href=\"").concat(process.env.ROOT_URL, "/app/pepsico_content_review/pepsico_material_approval/view/").concat(approval._id, "\">").concat(escapeHtml(approval.name), "</a></p>\n <p>\u6709\u4EFB\u4F55\u7591\u95EE\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u5458\u3002</p>\n ");
142
+ return { subject: subject, html: html };
143
+ };
144
+ exports.buildUploaderEmail = buildUploaderEmail;
145
+ var grantUploaderAndNotify = function (ctx, approval, materialGroupIds, getToken) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
146
+ var groupKey, log, recipients, response, _a, rows, emailed, notEmailed, _loop_1, recipients_1, recipients_1_1, recipient, e_1_1, error_2, e_2;
147
+ var e_1, _b;
148
+ return tslib_1.__generator(this, function (_c) {
149
+ switch (_c.label) {
150
+ case 0:
151
+ groupKey = _.sortBy(_.map(materialGroupIds, String)).join(',');
152
+ log = {
153
+ action: 'content-hub-uploader-permission',
154
+ approval_id: approval._id,
155
+ approval_name: approval.name,
156
+ material_group_ids: materialGroupIds
157
+ };
158
+ _c.label = 1;
159
+ case 1:
160
+ _c.trys.push([1, 19, , 24]);
161
+ if (!groupKey) {
162
+ return [2];
163
+ }
164
+ if (approval.ch_uploader_notified_group === groupKey) {
165
+ return [2];
166
+ }
167
+ return [4, (0, exports.getUploaderRecipients)(ctx, approval)];
168
+ case 2:
169
+ recipients = _c.sent();
170
+ log.recipients = recipients.map(function (r) { return ({ email: r.email, role: r.role }); });
171
+ if (!(recipients.length === 0)) return [3, 4];
172
+ log.status = 'skipped';
173
+ log.reason = '取不到发起人 / Agency 的邮箱';
174
+ return [4, (0, pls_1.writeSystemLog)(ctx, 'info', log, exports.CONTENT_HUB_UPLOADER_LOG_NAME, approval.space)];
175
+ case 3:
176
+ _c.sent();
177
+ return [2];
178
+ case 4:
179
+ _a = exports.requestUploaderPermission;
180
+ return [4, getToken()];
181
+ case 5: return [4, _a.apply(void 0, [_c.sent(), _.map(recipients, 'email'), materialGroupIds, log])];
182
+ case 6:
183
+ response = _c.sent();
184
+ if (!(!response || response.success !== true || response.code !== 200)) return [3, 8];
185
+ log.status = 'failed';
186
+ log.error = (response && (response.msg || response.message)) || 'W1 调用失败';
187
+ return [4, (0, pls_1.writeSystemLog)(ctx, 'error', log, exports.CONTENT_HUB_UPLOADER_LOG_NAME, approval.space)];
188
+ case 7:
189
+ _c.sent();
190
+ return [2];
191
+ case 8:
192
+ rows = response.data || [];
193
+ emailed = [];
194
+ notEmailed = [];
195
+ _loop_1 = function (recipient) {
196
+ var mine, usable, row, path, _d, subject, html, error_3;
197
+ return tslib_1.__generator(this, function (_e) {
198
+ switch (_e.label) {
199
+ case 0:
200
+ mine = _.filter(rows, function (row) { return normalizeEmail(row.email) === normalizeEmail(recipient.email); });
201
+ usable = _.filter(mine, function (row) { return row.accountStatus !== 'FAILED' && row.permissionStatus !== 'FAILED'; });
202
+ if (mine.length > 0 && usable.length === 0) {
203
+ notEmailed.push({ email: recipient.email, reason: '账号或授权失败', rows: mine });
204
+ return [2, "continue"];
205
+ }
206
+ row = usable[0];
207
+ path = _.uniq(_.compact(_.map(usable, 'materialGroupPath'))).join(';') || approval.ch_material_group_path || '';
208
+ _d = (0, exports.buildUploaderEmail)(approval, path, row), subject = _d.subject, html = _d.html;
209
+ _e.label = 1;
210
+ case 1:
211
+ _e.trys.push([1, 3, , 4]);
212
+ return [4, ctx.broker.call('@builder6/email.send', { to: recipient.email, subject: subject, html: html })];
213
+ case 2:
214
+ _e.sent();
215
+ emailed.push(recipient.email);
216
+ return [3, 4];
217
+ case 3:
218
+ error_3 = _e.sent();
219
+ notEmailed.push({ email: recipient.email, reason: "\u53D1\u9001\u90AE\u4EF6\u5931\u8D25: ".concat(error_3.message) });
220
+ return [3, 4];
221
+ case 4: return [2];
222
+ }
223
+ });
224
+ };
225
+ _c.label = 9;
226
+ case 9:
227
+ _c.trys.push([9, 14, 15, 16]);
228
+ recipients_1 = tslib_1.__values(recipients), recipients_1_1 = recipients_1.next();
229
+ _c.label = 10;
230
+ case 10:
231
+ if (!!recipients_1_1.done) return [3, 13];
232
+ recipient = recipients_1_1.value;
233
+ return [5, _loop_1(recipient)];
234
+ case 11:
235
+ _c.sent();
236
+ _c.label = 12;
237
+ case 12:
238
+ recipients_1_1 = recipients_1.next();
239
+ return [3, 10];
240
+ case 13: return [3, 16];
241
+ case 14:
242
+ e_1_1 = _c.sent();
243
+ e_1 = { error: e_1_1 };
244
+ return [3, 16];
245
+ case 15:
246
+ try {
247
+ if (recipients_1_1 && !recipients_1_1.done && (_b = recipients_1.return)) _b.call(recipients_1);
248
+ }
249
+ finally { if (e_1) throw e_1.error; }
250
+ return [7];
251
+ case 16:
252
+ log.emailed = emailed;
253
+ log.not_emailed = notEmailed;
254
+ log.status = notEmailed.length > 0 ? 'partial' : 'done';
255
+ return [4, ctx.getObject('pepsico_material_approval').directUpdate(approval._id, { ch_uploader_notified_group: groupKey })];
256
+ case 17:
257
+ _c.sent();
258
+ return [4, (0, pls_1.writeSystemLog)(ctx, notEmailed.length > 0 ? 'error' : 'info', log, exports.CONTENT_HUB_UPLOADER_LOG_NAME, approval.space)];
259
+ case 18:
260
+ _c.sent();
261
+ return [3, 24];
262
+ case 19:
263
+ error_2 = _c.sent();
264
+ log.status = 'failed';
265
+ log.error = error_2.message;
266
+ _c.label = 20;
267
+ case 20:
268
+ _c.trys.push([20, 22, , 23]);
269
+ return [4, (0, pls_1.writeSystemLog)(ctx, 'error', log, exports.CONTENT_HUB_UPLOADER_LOG_NAME, approval.space)];
270
+ case 21:
271
+ _c.sent();
272
+ return [3, 23];
273
+ case 22:
274
+ e_2 = _c.sent();
275
+ return [3, 23];
276
+ case 23: return [3, 24];
277
+ case 24: return [2];
278
+ }
279
+ });
280
+ }); };
281
+ exports.grantUploaderAndNotify = grantUploaderAndNotify;
282
+ //# sourceMappingURL=content_hub_uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content_hub_uploader.js","sourceRoot":"","sources":["../../src/methods/content_hub_uploader.ts"],"names":[],"mappings":";;;;AAYA,+BAA0B;AAC1B,0BAA6B;AAC7B,6BAAuC;AAE1B,QAAA,6BAA6B,GAAG,iBAAiB,CAAC;AAc/D,IAAM,YAAY,GAAG;IACjB,IAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,UAAG,IAAI,CAAC,GAAG,EAAE,cAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC;AAC5G,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UAAC,KAAU,IAAK,OAAA,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAArD,CAAqD,CAAC;AAQtF,IAAM,qBAAqB,GAAG,UAAO,GAAG,EAAE,QAAa;;;;;gBACpD,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAC1C,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC;gBAClD,UAAU,GAAwB,EAAE,CAAC;gBAErC,MAAM,GAAG,UAAO,MAAc;;;;;gCAChC,IAAI,CAAC,MAAM,EAAE;oCACT,WAAO,IAAI,EAAC;iCACf;gCACY,WAAM,UAAU,CAAC,UAAU,CAAC;wCACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;wCAChE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;wCACzB,GAAG,EAAE,CAAC;qCACT,CAAC,EAAA;;gCAJI,IAAI,GAAG,SAIX;gCACF,WAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAC;;;qBAC1B,CAAC;qBAEE,CAAA,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAA,EAA7B,cAA6B;gBACvB,cAAc,GAAG,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;qBACzI,cAAc,EAAd,cAAc;gBAED,WAAM,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAA;;gBAAlH,IAAI,GAAG,SAA2G;gBAClH,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE;oBAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;iBACpF;;oBAEU,WAAM,MAAM,CAAC,SAAS,CAAC,EAAA;;gBAAhC,MAAM,GAAG,SAAuB;gBACtC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE;oBACxB,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;iBACjF;;oBAEiB,WAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS,CAAC,EAAA;;gBAArD,SAAS,GAAG,SAAyC;gBAC3D,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE;oBAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;iBACpF;;oBAEL,WAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,EAAzB,CAAyB,CAAC,EAAE,UAAC,CAAC,IAAK,OAAA,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,EAAC;;;KAC3G,CAAC;AAtCW,QAAA,qBAAqB,yBAsChC;AAMK,IAAM,WAAW,GAAG,UAAC,MAAgB,EAAE,gBAA0B;IACpE,IAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,UAAC,EAAE,IAAK,OAAA,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAjB,CAAiB,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,oDAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;KACnD;IACD,OAAO,qBAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,uCAA2B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAI,CAAC;AACpI,CAAC,CAAC;AANW,QAAA,WAAW,eAMtB;AAEK,IAAM,eAAe,GAAG,UAAC,IAAS;IACrC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACnB,OAAO,IAAI,CAAC;KACf;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC;AALW,QAAA,eAAe,mBAK1B;AAMK,IAAM,yBAAyB,GAAG,UAAO,KAAa,EAAE,MAAgB,EAAE,gBAA0B,EAAE,KAAe;IAAf,sBAAA,EAAA,UAAe;;;;;;oBAClH,IAAI,GAAG,IAAA,mBAAW,EAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBAC7C,SAAS,GAAG,YAAY,EAAE,CAAC;oBACjC,KAAK,CAAC,OAAO,GAAG;wBACZ,GAAG,EAAE,2EAA2E;wBAChF,UAAU,EAAE,SAAS;wBACrB,IAAI,MAAA;qBACP,CAAC;;;;oBAEiB,WAAM,eAAK,CAAC,IAAI,CAAC,UAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAE,EAAE,IAAI,EAAE;4BACrG,OAAO,EAAE;gCACL,qBAAqB,EAAE,KAAK;gCAC5B,cAAc,EAAE,SAAS;gCACzB,cAAc,EAAE,iCAAiC;6BACpD;4BACD,OAAO,EAAE,KAAK;4BAEd,iBAAiB,EAAE,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,EAAJ,CAAI,CAAC;yBACtC,CAAC,EAAA;;oBATI,MAAM,GAAG,SASb;oBACF,KAAK,CAAC,QAAQ,GAAG,IAAA,uBAAe,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC9C,WAAO,KAAK,CAAC,QAAQ,EAAC;;;oBAEtB,IAAI,OAAK,IAAI,OAAK,CAAC,QAAQ,EAAE;wBACzB,KAAK,CAAC,WAAW,GAAG,OAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAC1C,IAAI;4BACA,KAAK,CAAC,QAAQ,GAAG,IAAA,uBAAe,EAAC,OAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;yBACzD;wBAAC,OAAO,CAAC,EAAE;4BACR,KAAK,CAAC,QAAQ,GAAG,OAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;yBACxC;qBACJ;oBACD,MAAM,OAAK,CAAC;;;;;CAEnB,CAAC;AAhCW,QAAA,yBAAyB,6BAgCpC;AAEF,IAAM,UAAU,GAAG,UAAC,IAAS,IAAK,OAAA,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KAC7D,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAD7D,CAC6D,CAAC;AAKzF,IAAM,kBAAkB,GAAG,UAAC,QAAa,EAAE,IAAY,EAAE,GAA2B;IACvF,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAEvD,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,EAAE,EAAX,CAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAM,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,KAAK,aAAa,CAAC;IAC9D,IAAM,OAAO,GAAG,mFAA0B,QAAQ,CAAC,IAAI,CAAE,CAAC;IAC1D,IAAM,IAAI,GAAG,kFAEA,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,iIAC1B,UAAU,CAAC,IAAI,CAAC,yUAEtB,UAAU,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,uBACrE,MAAM,CAAC,CAAC,CAAC,uBAAe,UAAU,CAAC,MAAM,CAAC,wCAA0B,CAAC,CAAC,CAAC,EAAE,4DACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,wEAA8D,QAAQ,CAAC,GAAG,gBAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,8HAEjJ,CAAC;IACF,OAAO,EAAE,OAAO,SAAA,EAAE,IAAI,MAAA,EAAE,CAAC;AAC7B,CAAC,CAAC;AAjBW,QAAA,kBAAkB,sBAiB7B;AAKK,IAAM,sBAAsB,GAAG,UAAO,GAAG,EAAE,QAAa,EAAE,gBAA0B,EAAE,QAA+B;;;;;;gBAClH,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC/D,GAAG,GAAQ;oBACb,MAAM,EAAE,iCAAiC;oBACzC,WAAW,EAAE,QAAQ,CAAC,GAAG;oBACzB,aAAa,EAAE,QAAQ,CAAC,IAAI;oBAC5B,kBAAkB,EAAE,gBAAgB;iBACvC,CAAC;;;;gBAEE,IAAI,CAAC,QAAQ,EAAE;oBACX,WAAO;iBACV;gBACD,IAAI,QAAQ,CAAC,0BAA0B,KAAK,QAAQ,EAAE;oBAClD,WAAO;iBACV;gBACkB,WAAM,IAAA,6BAAqB,EAAC,GAAG,EAAE,QAAQ,CAAC,EAAA;;gBAAvD,UAAU,GAAG,SAA0C;gBAC7D,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAlC,CAAkC,CAAC,CAAC;qBACvE,CAAA,UAAU,CAAC,MAAM,KAAK,CAAC,CAAA,EAAvB,cAAuB;gBACvB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBACvB,GAAG,CAAC,MAAM,GAAG,qBAAqB,CAAC;gBACnC,WAAM,IAAA,oBAAc,EAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,qCAA6B,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAA;;gBAArF,SAAqF,CAAC;gBACtF,WAAO;;gBAIY,KAAA,iCAAyB,CAAA;gBAAC,WAAM,QAAQ,EAAE,EAAA;oBAAhD,WAAM,kBAA0B,SAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAC,EAAA;;gBAA/G,QAAQ,GAAG,SAAoG;qBAEjH,CAAA,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAA,EAA/D,cAA+D;gBAC/D,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACtB,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC;gBAC1E,WAAM,IAAA,oBAAc,EAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,qCAA6B,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAA;;gBAAtF,SAAsF,CAAC;gBACvF,WAAO;;gBAIL,IAAI,GAA4B,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBACpD,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,GAAG,EAAE,CAAC;oCACX,SAAS;;;;;gCACV,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,UAAC,GAAG,IAAK,OAAA,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,EAA7D,CAA6D,CAAC,CAAC;gCAC9F,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,GAAG,CAAC,gBAAgB,KAAK,QAAQ,EAAnE,CAAmE,CAAC,CAAC;gCAC5G,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oCACxC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;iCAE9E;gCACK,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gCAChB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,sBAAsB,IAAI,EAAE,CAAC;gCAChH,KAAoB,IAAA,0BAAkB,EAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,EAAzD,OAAO,aAAA,EAAE,IAAI,UAAA,CAA6C;;;;gCAE9D,WAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,SAAA,EAAE,IAAI,MAAA,EAAE,CAAC,EAAA;;gCAArF,SAAqF,CAAC;gCACtF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;;;gCAE9B,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,gDAAW,OAAK,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC;;;;;;;;;gBAdhE,eAAA,iBAAA,UAAU,CAAA;;;;gBAAvB,SAAS;mCAAT,SAAS;;;;;;;;;;;;;;;;;;;gBAiBpB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;gBACtB,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC;gBAC7B,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxD,WAAM,GAAG,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,0BAA0B,EAAE,QAAQ,EAAE,CAAC,EAAA;;gBAArH,SAAqH,CAAC;gBACtH,WAAM,IAAA,oBAAc,EAAC,GAAG,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,qCAA6B,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAA;;gBAAvH,SAAuH,CAAC;;;;gBAExH,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACtB,GAAG,CAAC,KAAK,GAAG,OAAK,CAAC,OAAO,CAAC;;;;gBAEtB,WAAM,IAAA,oBAAc,EAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,qCAA6B,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAA;;gBAAtF,SAAsF,CAAC;;;;;;;;;KAKlG,CAAC;AArEW,QAAA,sBAAsB,0BAqEjC"}
@@ -57,7 +57,7 @@ amis:
57
57
  messages: {}
58
58
  cache: 86400000
59
59
  data_type: text
60
- description: 审批单的 KOL 分类(粉丝量级)是所选项之一时命中; 不填表示不限
60
+ description: 审批单的 KOL 分类(粉丝量级)是所选项之一时命中; 不填表示不限。只有 KOL 类分类的审批单有 KOL 分类, 其他审批单不看这个条件
61
61
  group: 匹配条件
62
62
  is_wide: true
63
63
  label: KOL 分类
@@ -1,6 +1,7 @@
1
1
  name: expired_date
2
2
  group: 通用
3
3
  label: 日志过期时间
4
+ # 早期写入的明细带过期时间(原计划 90 天自动清理); 现已不自动删除, 新写入的明细不再填
4
5
  required: false
5
6
  sort_no: 1400
6
7
  type: datetime
@@ -1,9 +1,14 @@
1
1
  name: ch_material_group
2
2
  amis:
3
3
  id: 'u:ch_material_group'
4
+ # 只在编辑时显示; 只读时不渲染(也就不去查 Content Hub), 改由「Content Hub 素材组路径」显示存下的全路径
5
+ visibleOn: "form_version == 'v3' && ch_sync_enabled == true && global.mode !== 'read'"
4
6
  type: tree-select
5
7
  label: Content Hub 素材组
6
8
  multiple: false
9
+ # 只存素材组 ID 字符串, 不存整个选项对象(否则推送时素材组会变成 [object Object])
10
+ joinValues: false
11
+ extractValue: true
7
12
  clearable: true
8
13
  searchable: true
9
14
  onlyLeaf: false
@@ -34,16 +39,6 @@ amis:
34
39
  api.query = query;
35
40
  return api;
36
41
  messages: {}
37
- onEvent:
38
- change:
39
- weight: 0
40
- actions:
41
- # 同时把选中节点的完整名称路径存下来, Content Hub 那边目录改名 / 删除后历史单据照样能看
42
- - ignoreError: true
43
- actionType: setValue
44
- componentId: 'u:ch_material_group_path'
45
- args:
46
- value: '${event.data.item.materialGroupPath || ""}'
47
42
  data_type: text
48
43
  description: 素材同步到 Content Hub 后存放的位置
49
44
  group: 素材标签
@@ -52,5 +47,3 @@ label: Content Hub 素材组
52
47
  required: false
53
48
  sort_no: 1370
54
49
  type: select
55
- # 只在 Content Hub 改版后的新版表单(form_version 见 content_hub_sync_rule.ts 的 CONTENT_HUB_FORM_VERSIONS)显示, 存量单据不受影响
56
- visible_on: form_version == 'v3' && ch_sync_enabled == true
@@ -1,8 +1,14 @@
1
1
  name: ch_material_group_path
2
2
  amis:
3
3
  id: 'u:ch_material_group_path'
4
- static: true
5
- description: 选择素材组后自动带出
4
+ # 只读展示: 存的是 Content Hub 的路径格式(各级用 | 连接), 显示时换成 > 更易读
5
+ type: static
6
+ tpl: '${REPLACE(ch_material_group_path, "|", " > ")}'
7
+ # 只读时代替素材组下拉显示存下的全路径, 不再查 Content Hub; 编辑时不显示
8
+ label: Content Hub 素材组
9
+ description: 素材同步到 Content Hub 后存放的位置
10
+ visibleOn: "form_version == 'v3' && ch_sync_enabled == true && global.mode === 'read'"
11
+ description: 保存时按所选素材组自动带出完整路径
6
12
  group: 素材标签
7
13
  is_wide: true
8
14
  label: Content Hub 素材组路径
@@ -10,5 +16,3 @@ readonly: true
10
16
  required: false
11
17
  sort_no: 1380
12
18
  type: text
13
- # 只在 Content Hub 改版后的新版表单(form_version 见 content_hub_sync_rule.ts 的 CONTENT_HUB_FORM_VERSIONS)显示, 存量单据不受影响
14
- visible_on: form_version == 'v3' && ch_sync_enabled == true
@@ -1,6 +1,16 @@
1
1
  name: ch_sync_enabled
2
2
  amis:
3
3
  id: 'u:ch_sync_enabled'
4
+ onEvent:
5
+ # 只有用户点选才会触发 change(规则带出用的 setValue 不会), 记下「手动设置过」
6
+ change:
7
+ weight: 0
8
+ actions:
9
+ - ignoreError: true
10
+ actionType: setValue
11
+ componentId: 'u:ch_sync_manual'
12
+ args:
13
+ value: true
4
14
  description: 系统会根据填写的信息自动勾选。如果这批素材不需要同步到 Content Hub,可以取消勾选。
5
15
  group: 素材标签
6
16
  label: 同步到 Content Hub
@@ -0,0 +1,12 @@
1
+ name: ch_sync_manual
2
+ # 辅助字段: 用户在页面上手动勾选 / 取消过「同步到 Content Hub」就记为 true, 之后不再按同步规则自动改开关
3
+ amis:
4
+ id: 'u:ch_sync_manual'
5
+ className: hidden
6
+ description: 用户手动改过「同步到 Content Hub」后为是, 之后不再按同步规则自动带出
7
+ group: 素材标签
8
+ label: 已手动设置同步开关
9
+ required: false
10
+ sort_no: 1367
11
+ type: boolean
12
+ visible_on: form_version == 'v3'
@@ -1,8 +1,9 @@
1
1
  name: ch_sync_rule_check
2
- # 辅助字段, 不存值: 只是挂一个 service, 填单时按同步规则预判是否需要同步, 写入「同步到 Content Hub」开关
2
+ # 辅助字段, 不存值: 只是挂一个 service, 填单时按同步规则预判是否需要同步, 写入「同步到 Content Hub」开关, 并显示命中的规则
3
3
  amis:
4
4
  type: service
5
- className: hidden
5
+ # 只在编辑时预判; 只读查看时不请求, 也不改开关
6
+ visibleOn: "form_version == 'v3' && global.mode !== 'read'"
6
7
  api:
7
8
  # url 里引用这几个字段, 任一变化时 service 会重新请求
8
9
  url: '/api/pepsico-content/content-hub/sync-preview?owner_department=${owner_department}&classification=${classification}&product=${product}&kol_classification=${kol_classification}'
@@ -21,7 +22,13 @@ amis:
21
22
  api.query = query;
22
23
  return api;
23
24
  messages: {}
24
- body: []
25
+ # 在开关旁边提示按哪条规则带出的; 没命中时管理员能看到每条规则没命中的原因, 方便排查规则配置
26
+ body:
27
+ - type: tpl
28
+ className: text-muted text-sm
29
+ visibleOn: '${ch_sync_preview}'
30
+ tpl: >-
31
+ <% if (data.ch_sync_preview.needSync) { %>已按同步规则「<%- data.ch_sync_preview.ruleName %>」自动勾选同步<% } else if (data.ch_sync_preview.ruleName) { %>同步规则「<%- data.ch_sync_preview.ruleName %>」设为不同步<% } else { %>未命中任何同步规则, 默认不同步<% } %><% if (!data.ch_sync_preview.needSync && data.global && data.global.user && data.global.user.is_space_admin && data.ch_sync_preview.mismatches && data.ch_sync_preview.mismatches.length) { %><br/>(仅管理员可见)各规则未命中原因:<% data.ch_sync_preview.mismatches.forEach(function(m){ %><br/>· <%- m.rule %>: <%- m.reason %><% }) %><% } %>
25
32
  onEvent:
26
33
  fetchInited:
27
34
  weight: 0
@@ -32,24 +39,14 @@ amis:
32
39
  if (event.data.responseStatus !== 0) {
33
40
  return;
34
41
  }
35
- const pick = (v) => _.isPlainObject(v) ? (v.value || v._id) : v;
36
- const str = (v) => { const raw = pick(v); return _.isArray(raw) ? _.map(raw, pick).join(',') : (raw || ''); };
37
- const key = _.map(['owner_department', 'classification', 'product', 'kol_classification'], (k) => str(event.data[k])).join('|');
38
- const store = window.__chSyncRuleKeys || (window.__chSyncRuleKeys = {});
39
- const recordId = event.data._id || 'new';
40
- const prevKey = store[recordId];
41
- store[recordId] = key;
42
- const current = event.data.ch_sync_enabled;
43
- // 打开已有单据时保留已存的选择(用户可能手动关过); 之后这几个字段变了再按规则重新带出
44
- if ((current === true || current === false) && (prevKey === undefined || prevKey === key)) {
42
+ // 用户手动设置过开关就以用户为准; 否则按当前填写的内容和同步规则带出(保存时服务端还会再算一次)
43
+ if (event.data.ch_sync_manual === true) {
45
44
  return;
46
45
  }
47
- doAction({ actionType: 'setValue', componentId: 'u:ch_sync_enabled', args: { value: !!event.data.needSync } });
46
+ doAction({ actionType: 'setValue', componentId: 'u:ch_sync_enabled', args: { value: !!(event.data.ch_sync_preview && event.data.ch_sync_preview.needSync) } });
48
47
  description: 辅助字段, 不存值。填单时按「Content Hub 同步规则」预判是否需要同步, 带出「同步到 Content Hub」的默认值
49
48
  group: 素材标签
50
49
  label: 同步规则预判
51
50
  required: false
52
51
  sort_no: 1366
53
52
  type: text
54
- # 只在 Content Hub 改版后的新版表单(form_version 见 content_hub_sync_rule.ts 的 CONTENT_HUB_FORM_VERSIONS)显示, 存量单据不受影响
55
- visible_on: form_version == 'v3'
@@ -0,0 +1,11 @@
1
+ name: ch_uploader_notified_group
2
+ # 系统字段: 推送成功后已经为哪个素材组开通过上传权限、发过通知邮件, 同一素材组不重复处理
3
+ description: 已开通 Content Hub 上传权限并通知发起人 / Agency 的素材组, 系统自动记录
4
+ group: 素材标签
5
+ hidden: true
6
+ label: 已通知上传的素材组
7
+ omit: true
8
+ readonly: true
9
+ required: false
10
+ sort_no: 1390
11
+ type: text
@@ -0,0 +1,32 @@
1
+ name: pepsico_material_approval_content_hub
2
+ listenTo: pepsico_material_approval
3
+ when:
4
+ - beforeInsert
5
+ - beforeUpdate
6
+ isEnabled: true
7
+ handler: |-
8
+ // 新版表单(v3)保存时补算「同步到 Content Hub」开关(用户没手动改过时按同步规则)和「Content Hub 素材组路径」,
9
+ // 不依赖页面联动是否生效。逻辑在 src/methods/content_hub_form_fill.ts; 存量单据在那边直接跳过。
10
+ // 只是补算, 任何异常都不能挡住保存(系统已上线, 存量单据照常可改)
11
+ const { doc } = ctx.params;
12
+ // 填单预判接口的返回值会被页面合并进表单数据, 不是字段, 不存库
13
+ if (doc) {
14
+ delete doc.ch_sync_preview;
15
+ delete doc.needSync;
16
+ delete doc.ruleName;
17
+ }
18
+ try {
19
+ if (!ctx.broker || !doc) {
20
+ return;
21
+ }
22
+ const result = await ctx.broker.call('@steedos-labs/content-compliance.contentHubFillOnSave', {
23
+ doc,
24
+ id: ctx.params.isInsert === true ? null : ctx.params.id
25
+ });
26
+ Object.assign(doc, (result && result.patch) || {});
27
+ } catch (e) {
28
+ console.error('[Content Hub]保存时补算失败, 不影响保存', ctx.params && ctx.params.id, e && e.message);
29
+ }
30
+ authentication_type: none
31
+ locked: false
32
+ type: code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos-labs/content-compliance",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "内容审核系统",
5
5
  "main": "package.service.js",
6
6
  "scripts": {