eli-video-interview 1.7.0 → 1.9.0
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/esm/components/Charts/ReportPie.js +27 -10
- package/esm/components/react-photo-view/hooks/useAnimationPosition.d.ts +1 -1
- package/esm/modules/ai-question/Root.js +11 -5
- package/esm/modules/ai-question/components/GlobalDimensions/Dialog.d.ts +9 -0
- package/esm/modules/ai-question/components/GlobalDimensions/Dialog.js +154 -0
- package/esm/modules/ai-question/components/GlobalDimensions/index.d.ts +3 -0
- package/esm/modules/ai-question/components/GlobalDimensions/index.js +57 -0
- package/esm/modules/ai-question/components/QuestionModel/index.js +2 -1
- package/esm/modules/ai-question/components/QuestionModel/interface.d.ts +12 -0
- package/esm/modules/ai-question/components/QuestionPreview/styled.d.ts +2 -2
- package/esm/modules/ai-question/utils/weight.d.ts +17 -0
- package/esm/modules/ai-question/utils/weight.js +38 -0
- package/esm/modules/ai-report/components/ScoreReport/styled.d.ts +3 -3
- package/esm/modules/ai-report/components/VideoQuestion/styled.d.ts +2 -2
- package/esm/modules/ai-report/components/WorkPlaces/styled.d.ts +2 -2
- package/esm/modules/ai-report/interface.d.ts +16 -0
- package/esm/modules/ai-report-v2/Root.js +2 -1
- package/esm/modules/ai-report-v2/components/AIEvaluate/Graph.d.ts +2 -0
- package/esm/modules/ai-report-v2/components/AIEvaluate/Graph.js +57 -6
- package/esm/modules/ai-report-v2/components/AIEvaluate/index.js +1 -0
- package/esm/modules/ai-report-v2/components/GlobalDimensions/index.d.ts +3 -0
- package/esm/modules/ai-report-v2/components/GlobalDimensions/index.js +84 -0
- package/esm/modules/ai-report-v2/components/ReportHeader/ReportHeader.js +3 -2
- package/esm/modules/ai-report-v2/components/ScoreReport/styled.d.ts +3 -3
- package/esm/modules/ai-report-v2/components/VideoQuestion/styled.d.ts +2 -2
- package/esm/modules/ai-report-v2/components/WorkPlaces/styled.d.ts +2 -2
- package/esm/modules/ai-report-v2/components/styled.d.ts +3 -0
- package/esm/modules/ai-report-v2/components/styled.js +10 -0
- package/esm/modules/ai-report-v2/interface.d.ts +16 -0
- package/esm/modules/ai-report-v3/Root.js +2 -1
- package/esm/modules/ai-report-v3/components/AIEvaluate/Graph.d.ts +2 -0
- package/esm/modules/ai-report-v3/components/AIEvaluate/Graph.js +75 -48
- package/esm/modules/ai-report-v3/components/AIEvaluate/index.js +1 -0
- package/esm/modules/ai-report-v3/components/CheatRisk/CheatRisk.js +9 -4
- package/esm/modules/ai-report-v3/components/GlobalDimensions/index.d.ts +3 -0
- package/esm/modules/ai-report-v3/components/GlobalDimensions/index.js +82 -0
- package/esm/modules/ai-report-v3/components/ModuleTitle.d.ts +1 -1
- package/esm/modules/ai-report-v3/components/ModuleTitle.js +3 -1
- package/esm/modules/ai-report-v3/components/ScoreReport/styled.d.ts +3 -3
- package/esm/modules/ai-report-v3/components/VideoQuestion/styled.d.ts +2 -2
- package/esm/modules/ai-report-v3/components/WorkPlaces/styled.d.ts +2 -2
- package/esm/modules/ai-report-v3/interface.d.ts +16 -0
- package/esm/modules/ai-template/components/TemplateList/styled.d.ts +3 -3
- package/esm/modules/ai-template/components/TemplateMenu/styled.d.ts +1 -1
- package/esm/store/ai-question/question-model-store.d.ts +4 -1
- package/esm/store/ai-question/question-model-store.js +41 -5
- package/lib/components/Charts/ReportPie.js +27 -10
- package/lib/components/react-photo-view/hooks/useAnimationPosition.d.ts +1 -1
- package/lib/modules/ai-question/Root.js +11 -5
- package/lib/modules/ai-question/components/GlobalDimensions/Dialog.d.ts +9 -0
- package/lib/modules/ai-question/components/GlobalDimensions/Dialog.js +156 -0
- package/lib/modules/ai-question/components/GlobalDimensions/index.d.ts +3 -0
- package/lib/modules/ai-question/components/GlobalDimensions/index.js +62 -0
- package/lib/modules/ai-question/components/QuestionModel/index.js +2 -1
- package/lib/modules/ai-question/components/QuestionModel/interface.d.ts +12 -0
- package/lib/modules/ai-question/components/QuestionPreview/styled.d.ts +2 -2
- package/lib/modules/ai-question/utils/weight.d.ts +17 -0
- package/lib/modules/ai-question/utils/weight.js +43 -0
- package/lib/modules/ai-report/components/ScoreReport/styled.d.ts +3 -3
- package/lib/modules/ai-report/components/VideoQuestion/styled.d.ts +2 -2
- package/lib/modules/ai-report/components/WorkPlaces/styled.d.ts +2 -2
- package/lib/modules/ai-report/interface.d.ts +16 -0
- package/lib/modules/ai-report-v2/Root.js +2 -1
- package/lib/modules/ai-report-v2/components/AIEvaluate/Graph.d.ts +2 -0
- package/lib/modules/ai-report-v2/components/AIEvaluate/Graph.js +57 -6
- package/lib/modules/ai-report-v2/components/AIEvaluate/index.js +1 -0
- package/lib/modules/ai-report-v2/components/GlobalDimensions/index.d.ts +3 -0
- package/lib/modules/ai-report-v2/components/GlobalDimensions/index.js +89 -0
- package/lib/modules/ai-report-v2/components/ReportHeader/ReportHeader.js +2 -1
- package/lib/modules/ai-report-v2/components/ScoreReport/styled.d.ts +3 -3
- package/lib/modules/ai-report-v2/components/VideoQuestion/styled.d.ts +2 -2
- package/lib/modules/ai-report-v2/components/WorkPlaces/styled.d.ts +2 -2
- package/lib/modules/ai-report-v2/components/styled.d.ts +3 -0
- package/lib/modules/ai-report-v2/components/styled.js +11 -1
- package/lib/modules/ai-report-v2/interface.d.ts +16 -0
- package/lib/modules/ai-report-v3/Root.js +2 -1
- package/lib/modules/ai-report-v3/components/AIEvaluate/Graph.d.ts +2 -0
- package/lib/modules/ai-report-v3/components/AIEvaluate/Graph.js +75 -48
- package/lib/modules/ai-report-v3/components/AIEvaluate/index.js +1 -0
- package/lib/modules/ai-report-v3/components/CheatRisk/CheatRisk.js +9 -4
- package/lib/modules/ai-report-v3/components/GlobalDimensions/index.d.ts +3 -0
- package/lib/modules/ai-report-v3/components/GlobalDimensions/index.js +87 -0
- package/lib/modules/ai-report-v3/components/ModuleTitle.d.ts +1 -1
- package/lib/modules/ai-report-v3/components/ModuleTitle.js +3 -1
- package/lib/modules/ai-report-v3/components/ScoreReport/styled.d.ts +3 -3
- package/lib/modules/ai-report-v3/components/VideoQuestion/styled.d.ts +2 -2
- package/lib/modules/ai-report-v3/components/WorkPlaces/styled.d.ts +2 -2
- package/lib/modules/ai-report-v3/interface.d.ts +16 -0
- package/lib/modules/ai-template/components/TemplateList/styled.d.ts +3 -3
- package/lib/modules/ai-template/components/TemplateMenu/styled.d.ts +1 -1
- package/lib/store/ai-question/question-model-store.d.ts +4 -1
- package/lib/store/ai-question/question-model-store.js +41 -5
- package/package.json +1 -1
|
@@ -69,16 +69,18 @@ var ReportPie = function (props) {
|
|
|
69
69
|
}).includes(0);
|
|
70
70
|
var min = Math.min.apply(Math, scores);
|
|
71
71
|
var max = Math.max.apply(Math, scores);
|
|
72
|
+
// 全局维度(只绑试卷、不绑题目)在圆环里也标出来源:
|
|
73
|
+
// 颜色沿用「按分数档位上色」,来源靠标签里的小号「全局」标记 + tooltip 说明,重名/导出 PDF 时也能分辨
|
|
72
74
|
var data = source.map(function (_a) {
|
|
73
|
-
var name = _a.name, score = _a.score, params = __rest(_a, ["name", "score"]);
|
|
74
|
-
return (__assign({ name: formateTitle(name), originalName: name, value: score }, params));
|
|
75
|
+
var name = _a.name, score = _a.score, dimensionSource = _a.source, params = __rest(_a, ["name", "score", "source"]);
|
|
76
|
+
return (__assign({ name: formateTitle(name), originalName: name, value: score, isGlobal: dimensionSource === 2 }, params));
|
|
75
77
|
});
|
|
76
78
|
var options = {
|
|
77
79
|
tooltip: {
|
|
78
80
|
trigger: 'item',
|
|
79
81
|
formatter: function (_a) {
|
|
80
|
-
var value = _a.value, _b = _a.data, rank = _b.rank, total = _b.total, originalName = _b.originalName;
|
|
81
|
-
return "".concat(originalName, "<br />\u5F97\u5206\uFF1A").concat(value, "\u5206").concat(total > 0 ? "<br />\u6392\u540D\uFF1A".concat(rank, "/").concat(total) : '');
|
|
82
|
+
var value = _a.value, _b = _a.data, rank = _b.rank, total = _b.total, originalName = _b.originalName, isGlobal = _b.isGlobal;
|
|
83
|
+
return "".concat(originalName).concat(isGlobal ? '(全局维度·不关联题目)' : '', "<br />\u5F97\u5206\uFF1A").concat(value, "\u5206").concat(total > 0 ? "<br />\u6392\u540D\uFF1A".concat(rank, "/").concat(total) : '');
|
|
82
84
|
},
|
|
83
85
|
backgroundColor: 'rgba(0, 0, 0, 0.86)',
|
|
84
86
|
textStyle: {
|
|
@@ -93,15 +95,30 @@ var ReportPie = function (props) {
|
|
|
93
95
|
data: data,
|
|
94
96
|
roseType: 'radius',
|
|
95
97
|
label: {
|
|
96
|
-
|
|
97
|
-
fontWeight: 500,
|
|
98
|
+
// 维度名正常字号;全局维度在下一行补一个小号浅绿「全局」标记(比同字号后缀清爽)
|
|
98
99
|
formatter: function (_a) {
|
|
99
|
-
var name = _a.name;
|
|
100
|
-
return "".concat(name);
|
|
100
|
+
var name = _a.name, item = _a.data;
|
|
101
|
+
return ((item === null || item === void 0 ? void 0 : item.isGlobal) ? "{name|".concat(name, "}\n{tag|\u5168\u5C40}") : "{name|".concat(name, "}"));
|
|
102
|
+
},
|
|
103
|
+
rich: {
|
|
104
|
+
name: {
|
|
105
|
+
color: 'rgba(0, 0, 0, 0.86)',
|
|
106
|
+
fontSize: 12,
|
|
107
|
+
lineHeight: 16,
|
|
108
|
+
fontWeight: 500,
|
|
109
|
+
},
|
|
110
|
+
tag: {
|
|
111
|
+
color: '#33A853',
|
|
112
|
+
fontSize: 10,
|
|
113
|
+
lineHeight: 15,
|
|
114
|
+
padding: [1, 5],
|
|
115
|
+
borderRadius: 8,
|
|
116
|
+
backgroundColor: 'rgba(78, 201, 83, 0.14)',
|
|
117
|
+
align: 'center',
|
|
118
|
+
},
|
|
101
119
|
},
|
|
102
|
-
rich: __assign({}, levelMapping),
|
|
103
120
|
overflow: 'break',
|
|
104
|
-
width:
|
|
121
|
+
width: 76,
|
|
105
122
|
lineHeight: 18,
|
|
106
123
|
},
|
|
107
124
|
labelLine: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { MutableRefObject } from 'react';
|
|
2
|
-
export default function useAnimationPosition(visible: boolean | undefined, originRef: MutableRefObject<HTMLElement | null> | undefined, loaded: boolean, x: number, y: number, width: number, height: number, scale: number, speed: number, updateEasing: (pause: boolean) => void): readonly [number, number, number, number, number, 0 | 1, import("../types").EasingMode, "
|
|
2
|
+
export default function useAnimationPosition(visible: boolean | undefined, originRef: MutableRefObject<HTMLElement | null> | undefined, loaded: boolean, x: number, y: number, width: number, height: number, scale: number, speed: number, updateEasing: (pause: boolean) => void): readonly [number, number, number, number, number, 0 | 1, import("../types").EasingMode, "fill" | "contain" | "cover" | undefined];
|
|
@@ -68,7 +68,7 @@ var AiQuestionRoot = forwardRef(function (props, ref) {
|
|
|
68
68
|
var selctedAbilitys = useAiAbilityListStore().selctedAbilitys;
|
|
69
69
|
var isOem = props.isOem;
|
|
70
70
|
var handleValues = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
71
|
-
var questionModelData, _a, pcUrl, pcThumbUrl, mediaUrl, thumbUrl, appliedAllPosition, steps;
|
|
71
|
+
var questionModelData, _a, pcUrl, pcThumbUrl, mediaUrl, thumbUrl, appliedAllPosition, steps, globalDimensions;
|
|
72
72
|
return __generator(this, function (_b) {
|
|
73
73
|
questionModelData = (getQuestionModelStore() || {}).questionModelData;
|
|
74
74
|
_a = getBootVideoStore() || {}, pcUrl = _a.pcUrl, pcThumbUrl = _a.pcThumbUrl, mediaUrl = _a.mediaUrl, thumbUrl = _a.thumbUrl, appliedAllPosition = _a.appliedAllPosition;
|
|
@@ -80,8 +80,9 @@ var AiQuestionRoot = forwardRef(function (props, ref) {
|
|
|
80
80
|
});
|
|
81
81
|
return item;
|
|
82
82
|
});
|
|
83
|
+
globalDimensions = ((questionModelData === null || questionModelData === void 0 ? void 0 : questionModelData.globalDimensions) || []).map(function (item) { return (__assign(__assign({}, item), { weight: Number(item.weight) })); });
|
|
83
84
|
return [2 /*return*/, Promise.resolve({
|
|
84
|
-
data: __assign(__assign({}, questionModelData), { steps: steps }),
|
|
85
|
+
data: __assign(__assign({}, questionModelData), { steps: steps, globalDimensions: globalDimensions }),
|
|
85
86
|
media: {
|
|
86
87
|
pcUrl: pcUrl,
|
|
87
88
|
pcThumbUrl: pcThumbUrl,
|
|
@@ -96,20 +97,25 @@ var AiQuestionRoot = forwardRef(function (props, ref) {
|
|
|
96
97
|
handleValues: handleValues,
|
|
97
98
|
handleTemplate: function (steps) { return addModel(steps); },
|
|
98
99
|
handleSubmit: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
99
|
-
var _a, _b, name, token, questions, aiModel, _c, pcUrl, pcThumbUrl, mediaUrl, thumbUrl, appliedAllPosition, data, error_1;
|
|
100
|
+
var _a, _b, name, token, questions, aiModel, globalDimensions, _c, pcUrl, pcThumbUrl, mediaUrl, thumbUrl, appliedAllPosition, globalWeightSum, data, error_1;
|
|
100
101
|
return __generator(this, function (_d) {
|
|
101
102
|
switch (_d.label) {
|
|
102
103
|
case 0: return [4 /*yield*/, handleValues()];
|
|
103
104
|
case 1:
|
|
104
|
-
_a = _d.sent(), _b = _a.data, name = _b.name, token = _b.token, questions = _b.steps, aiModel = _b.aiModel, _c = _a.media, pcUrl = _c.pcUrl, pcThumbUrl = _c.pcThumbUrl, mediaUrl = _c.mediaUrl, thumbUrl = _c.thumbUrl, appliedAllPosition = _c.appliedAllPosition;
|
|
105
|
+
_a = _d.sent(), _b = _a.data, name = _b.name, token = _b.token, questions = _b.steps, aiModel = _b.aiModel, globalDimensions = _b.globalDimensions, _c = _a.media, pcUrl = _c.pcUrl, pcThumbUrl = _c.pcThumbUrl, mediaUrl = _c.mediaUrl, thumbUrl = _c.thumbUrl, appliedAllPosition = _c.appliedAllPosition;
|
|
105
106
|
if (!(questions === null || questions === void 0 ? void 0 : questions.length)) {
|
|
106
107
|
Message.error('还未添加题目,请添加题目');
|
|
107
108
|
return [2 /*return*/, Promise.reject()];
|
|
108
109
|
}
|
|
110
|
+
globalWeightSum = globalDimensions.reduce(function (total, item) { return total + (Number(item.weight) || 0); }, 0);
|
|
111
|
+
if (globalWeightSum > 100.005) {
|
|
112
|
+
Message.error("\u5168\u5C40\u7EF4\u5EA6\u6743\u91CD\u5408\u8BA1 ".concat(globalWeightSum, "%\uFF0C\u4E0D\u80FD\u8D85\u8FC7 100%"));
|
|
113
|
+
return [2 /*return*/, Promise.reject()];
|
|
114
|
+
}
|
|
109
115
|
_d.label = 2;
|
|
110
116
|
case 2:
|
|
111
117
|
_d.trys.push([2, 4, , 5]);
|
|
112
|
-
return [4 /*yield*/, PostAiModelUpsert(__assign(__assign({ name: name, thirdToken: '', aiModel: (props === null || props === void 0 ? void 0 : props.aiModel) || aiModel }, interviewRoomState), { introductoryVideoSetting: {}, selectAbilities: selctedAbilitys, token: token, questions: questions.map(function (item, i) { return (__assign(__assign({}, item), { selfIntroOpt: i < 2 ? item.selfIntroOpt : 0 })); }) }))];
|
|
118
|
+
return [4 /*yield*/, PostAiModelUpsert(__assign(__assign({ name: name, thirdToken: '', aiModel: (props === null || props === void 0 ? void 0 : props.aiModel) || aiModel }, interviewRoomState), { introductoryVideoSetting: {}, selectAbilities: selctedAbilitys, token: token, globalDimensions: globalDimensions, questions: questions.map(function (item, i) { return (__assign(__assign({}, item), { selfIntroOpt: i < 2 ? item.selfIntroOpt : 0 })); }) }))];
|
|
113
119
|
case 3:
|
|
114
120
|
data = (_d.sent()).data;
|
|
115
121
|
return [2 /*return*/, Promise.resolve({
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface GlobalDimensionDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
tab: 'library' | 'custom';
|
|
5
|
+
aiQuestionCount: number;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const GlobalDimensionDialog: ({ open, tab, aiQuestionCount, onClose }: GlobalDimensionDialogProps) => JSX.Element;
|
|
9
|
+
export default GlobalDimensionDialog;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
+
if (!m) return o;
|
|
15
|
+
var i = m.call(o), r, ar = [], e;
|
|
16
|
+
try {
|
|
17
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) { e = { error: error }; }
|
|
20
|
+
finally {
|
|
21
|
+
try {
|
|
22
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
29
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
30
|
+
if (ar || !(i in from)) {
|
|
31
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
32
|
+
ar[i] = from[i];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
36
|
+
};
|
|
37
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
38
|
+
import { GetAiAbilityList } from "../../../../services/ai-ability";
|
|
39
|
+
import { useQuestionModelStore } from "../../../../store/ai-question/question-model-store";
|
|
40
|
+
import { useEnterpriseStore } from "../../../../store/enterprise/enterprise-store";
|
|
41
|
+
import { useRequest } from 'ahooks';
|
|
42
|
+
import { AddIcon, Button, Checkbox, Chip, DeleteIcon, Dialog, IconButton, Input, Message, SearchIcon, Tabs, TextField, Typography } from 'fbm-ui';
|
|
43
|
+
import { Box, Stack } from 'fbm-ui/lib/mui';
|
|
44
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
45
|
+
/** 一份试卷最多可配置的全局维度个数(与后端 model.MaxGlobalDimensionCount 保持一致) */
|
|
46
|
+
var MAX_GLOBAL_DIMENSION_COUNT = 8;
|
|
47
|
+
var LIBRARY_SOURCE = 1;
|
|
48
|
+
var CUSTOM_SOURCE = 2;
|
|
49
|
+
var formatWeight = function (value) {
|
|
50
|
+
var matched = value.replace(/[^\d.]/g, '').match(/^\d*\.?\d{0,2}/);
|
|
51
|
+
return matched ? matched[0] : '';
|
|
52
|
+
};
|
|
53
|
+
var weightSum = function (dimensions) { return dimensions.reduce(function (total, item) { return total + (Number(item === null || item === void 0 ? void 0 : item.weight) || 0); }, 0); };
|
|
54
|
+
var GlobalDimensionDialog = function (_a) {
|
|
55
|
+
var open = _a.open, tab = _a.tab, aiQuestionCount = _a.aiQuestionCount, onClose = _a.onClose;
|
|
56
|
+
var _b = useQuestionModelStore(function (store) { return [store.questionModelData, store.updateGlobalDimensions]; }), questionModelData = _b.questionModelData, updateGlobalDimensions = _b.updateGlobalDimensions;
|
|
57
|
+
var _c = useEnterpriseStore().enterprise, jobToken = _c.jobToken, thirdToken = _c.thirdToken;
|
|
58
|
+
var _d = __read(useState(tab), 2), activeTab = _d[0], setActiveTab = _d[1];
|
|
59
|
+
var _e = __read(useState([]), 2), selected = _e[0], setSelected = _e[1];
|
|
60
|
+
var _f = __read(useState(''), 2), keyword = _f[0], setKeyword = _f[1];
|
|
61
|
+
var _g = __read(useState(''), 2), customName = _g[0], setCustomName = _g[1];
|
|
62
|
+
var _h = __read(useState(''), 2), customDefine = _h[0], setCustomDefine = _h[1];
|
|
63
|
+
var data = useRequest(function () { return GetAiAbilityList({ jobToken: jobToken, thirdToken: thirdToken }); }, {
|
|
64
|
+
refreshDeps: [jobToken, thirdToken],
|
|
65
|
+
}).data;
|
|
66
|
+
var libraryList = useMemo(function () { var _a; return ((_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.list) || []; }, [data]);
|
|
67
|
+
var filteredLibrary = useMemo(function () {
|
|
68
|
+
var text = keyword.trim();
|
|
69
|
+
return text ? libraryList.filter(function (item) { var _a; return (_a = item.name) === null || _a === void 0 ? void 0 : _a.includes(text); }) : libraryList;
|
|
70
|
+
}, [libraryList, keyword]);
|
|
71
|
+
// 打开弹窗时用试卷当前配置初始化(确定前不改动表单数据)
|
|
72
|
+
useEffect(function () {
|
|
73
|
+
if (!open) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
setActiveTab(tab);
|
|
77
|
+
setSelected(((questionModelData === null || questionModelData === void 0 ? void 0 : questionModelData.globalDimensions) || []).map(function (item) { return (__assign({}, item)); }));
|
|
78
|
+
setKeyword('');
|
|
79
|
+
setCustomName('');
|
|
80
|
+
setCustomDefine('');
|
|
81
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
82
|
+
}, [open, tab]);
|
|
83
|
+
var selectedTokens = useMemo(function () { return selected.map(function (item) { return item.collectionToken; }).filter(Boolean); }, [selected]);
|
|
84
|
+
var handleToggleLibrary = useCallback(function (ability, checked) {
|
|
85
|
+
if (checked) {
|
|
86
|
+
if (selected.length >= MAX_GLOBAL_DIMENSION_COUNT) {
|
|
87
|
+
Message.error("\u4E00\u4E2A\u8BD5\u5377\u6700\u591A\u914D\u7F6E ".concat(MAX_GLOBAL_DIMENSION_COUNT, " \u4E2A\u5168\u5C40\u7EF4\u5EA6"));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
setSelected(function (prev) { return __spreadArray(__spreadArray([], __read(prev), false), [
|
|
91
|
+
{ source: LIBRARY_SOURCE, collectionToken: ability.token, name: ability.name, define: ability.define || '', weight: '' },
|
|
92
|
+
], false); });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
setSelected(function (prev) { return prev.filter(function (item) { return item.collectionToken !== ability.token; }); });
|
|
96
|
+
}, [selected.length]);
|
|
97
|
+
var handleAddCustom = useCallback(function () {
|
|
98
|
+
var name = customName.trim();
|
|
99
|
+
if (!name) {
|
|
100
|
+
Message.error('请填写维度名称');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (selected.length >= MAX_GLOBAL_DIMENSION_COUNT) {
|
|
104
|
+
Message.error("\u4E00\u4E2A\u8BD5\u5377\u6700\u591A\u914D\u7F6E ".concat(MAX_GLOBAL_DIMENSION_COUNT, " \u4E2A\u5168\u5C40\u7EF4\u5EA6"));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
setSelected(function (prev) { return __spreadArray(__spreadArray([], __read(prev), false), [{ source: CUSTOM_SOURCE, name: name, define: customDefine.trim(), weight: '' }], false); });
|
|
108
|
+
setCustomName('');
|
|
109
|
+
setCustomDefine('');
|
|
110
|
+
}, [customDefine, customName, selected.length]);
|
|
111
|
+
var handleWeightChange = useCallback(function (index, value) {
|
|
112
|
+
var formatValue = formatWeight(value);
|
|
113
|
+
setSelected(function (prev) { return prev.map(function (item, i) { return (i === index ? __assign(__assign({}, item), { weight: formatValue }) : item); }); });
|
|
114
|
+
}, []);
|
|
115
|
+
var handleDefineChange = useCallback(function (index, value) {
|
|
116
|
+
setSelected(function (prev) { return prev.map(function (item, i) { return (i === index ? __assign(__assign({}, item), { define: value }) : item); }); });
|
|
117
|
+
}, []);
|
|
118
|
+
var handleRemove = useCallback(function (index) {
|
|
119
|
+
setSelected(function (prev) { return prev.filter(function (_, i) { return i !== index; }); });
|
|
120
|
+
}, []);
|
|
121
|
+
var handleSubmit = useCallback(function () {
|
|
122
|
+
if (selected.length > MAX_GLOBAL_DIMENSION_COUNT) {
|
|
123
|
+
Message.error("\u4E00\u4E2A\u8BD5\u5377\u6700\u591A\u914D\u7F6E ".concat(MAX_GLOBAL_DIMENSION_COUNT, " \u4E2A\u5168\u5C40\u7EF4\u5EA6"));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
var emptyWeight = selected.find(function (item) { return !(Number(item.weight) > 0); });
|
|
127
|
+
if (emptyWeight) {
|
|
128
|
+
Message.error("\u8BF7\u586B\u5199\u300C".concat(emptyWeight.name, "\u300D\u7684\u6743\u91CD"));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
var total = weightSum(selected);
|
|
132
|
+
if (total > 100.005) {
|
|
133
|
+
Message.error("\u5168\u5C40\u7EF4\u5EA6\u6743\u91CD\u5408\u8BA1 ".concat(total, "%\uFF0C\u4E0D\u80FD\u8D85\u8FC7 100%"));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
updateGlobalDimensions(selected.map(function (item) { return (__assign(__assign({}, item), { weight: Number(item.weight) || 0 })); }));
|
|
137
|
+
onClose();
|
|
138
|
+
}, [onClose, selected, updateGlobalDimensions]);
|
|
139
|
+
return (_jsx(Dialog, __assign({ open: open, title: "\u6DFB\u52A0\u5168\u5C40\u7EF4\u5EA6", size: "lg", onClose: onClose, onOk: handleSubmit, okText: "\u786E\u5B9A", closeText: "\u53D6\u6D88" }, { children: _jsxs(Box, __assign({ display: "flex", sx: { minHeight: 380 } }, { children: [_jsxs(Box, __assign({ flex: "1 1 0", minWidth: 0, pr: 2.5 }, { children: [_jsx(Tabs, { borderBottom: "none", value: activeTab, onChange: function (_, value) { return setActiveTab(value); }, tabs: [
|
|
140
|
+
{ label: '系统维度库', value: 'library' },
|
|
141
|
+
{ label: '自定义维度', value: 'custom' },
|
|
142
|
+
] }), activeTab === 'library' && (_jsxs(Box, __assign({ mt: 1.5 }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", justifyContent: "space-between", mb: 1.5 }, { children: [_jsx(Input, { sx: { width: 240 }, size: "small", value: keyword, startAdornment: _jsx(SearchIcon, { color: "disabled" }), placeholder: "\u641C\u7D22\u7EF4\u5EA6\u540D\u79F0", onChange: function (e) { return setKeyword(e.target.value); } }), _jsx(Typography, __assign({ variant: "caption", color: "secondary" }, { children: "\u53EF\u591A\u9009 \u00B7 \u4E0E\u300C\u8003\u5BDF\u80FD\u529B\u300D\u5171\u7528\u540C\u4E00\u5957\u7EF4\u5EA6\u5B9A\u4E49" }))] })), filteredLibrary.map(function (item) {
|
|
143
|
+
var checked = selectedTokens.includes(item.token);
|
|
144
|
+
return (_jsxs(Box, __assign({ display: "flex", alignItems: "center", sx: {
|
|
145
|
+
border: '1px solid rgba(0, 0, 0, 0.08)',
|
|
146
|
+
borderRadius: 1,
|
|
147
|
+
px: 1.5,
|
|
148
|
+
py: 1,
|
|
149
|
+
mb: 1,
|
|
150
|
+
cursor: 'pointer',
|
|
151
|
+
}, onClick: function () { return handleToggleLibrary(item, !checked); } }, { children: [_jsx(Checkbox, { checked: checked, onChange: function () { }, sx: { pointerEvents: 'none', p: 0.5, mr: 0.5 } }), _jsxs(Box, __assign({ minWidth: 0 }, { children: [_jsx(Typography, __assign({ variant: "body2" }, { children: item.name })), item.define && (_jsx(Typography, __assign({ variant: "caption", color: "secondary", noWrap: true, display: "block", maxWidth: 430 }, { children: item.define })))] }))] }), item.token));
|
|
152
|
+
}), filteredLibrary.length === 0 && (_jsx(Typography, __assign({ variant: "body2", color: "secondary" }, { children: "\u6CA1\u6709\u5339\u914D\u7684\u7EF4\u5EA6" })))] }))), activeTab === 'custom' && (_jsxs(Stack, __assign({ spacing: 2, mt: 2 }, { children: [_jsx(TextField, { label: "\u7EF4\u5EA6\u540D\u79F0", value: customName, onChange: function (e) { return setCustomName(e.target.value); } }), _jsx(TextField, { label: "\u8BC4\u4EF7\u6807\u51C6", multiline: true, rows: 4, value: customDefine, placeholder: "AI \u6309\u8FD9\u6BB5\u63CF\u8FF0\u7ED9\u8BE5\u7EF4\u5EA6\u6253\u5206\u5E76\u7ED9\u51FA\u8BC4\u4EF7", onChange: function (e) { return setCustomDefine(e.target.value); } }), _jsx(Box, { children: _jsx(Button, __assign({ variant: "outlined", color: "inherit", startIcon: _jsx(AddIcon, {}), onClick: handleAddCustom }, { children: "\u65B0\u5EFA\u81EA\u5B9A\u4E49\u7EF4\u5EA6" })) }), _jsx(Typography, __assign({ variant: "caption", color: "secondary" }, { children: "\u81EA\u5B9A\u4E49\u7EF4\u5EA6\u53EA\u5728\u672C\u6B21\u8BD5\u5377\u751F\u6548\uFF0C\u4E0D\u5199\u56DE\u7EF4\u5EA6\u5E93\u3002" }))] })))] })), _jsxs(Box, __assign({ sx: { flex: '0 0 320px', borderLeft: '1px solid rgba(0, 0, 0, 0.08)', pl: 2.5 } }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", spacing: 1 }, { children: [_jsx(Typography, __assign({ variant: "body2", fontWeight: 500 }, { children: "\u5DF2\u9009\u7EF4\u5EA6" })), _jsx(Chip, { color: "default", label: selected.length, size: "medium" })] })), _jsxs(Box, __assign({ sx: { maxHeight: 320, overflowY: 'auto', pr: 0.5, mt: 1.5 } }, { children: [selected.map(function (item, index) { return (_jsxs(Box, __assign({ sx: { border: '1px solid rgba(0, 0, 0, 0.08)', borderRadius: 1, px: 1.5, py: 1, mb: 1 } }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", spacing: 1 }, { children: [_jsx(Typography, __assign({ variant: "body2", sx: { flex: '1 1 auto', minWidth: 0 }, noWrap: true }, { children: item.name })), _jsx(Input, { size: "small", sx: { width: 92 }, value: item.weight, placeholder: "0", onChange: function (e) { return handleWeightChange(index, e.target.value); }, endAdornment: _jsx(Typography, __assign({ variant: "caption", color: "textSecondary" }, { children: "%" })) }), _jsx(IconButton, __assign({ size: "small", onClick: function () { return handleRemove(index); } }, { children: _jsx(DeleteIcon, {}) }))] })), _jsx(TextField, { size: "small", multiline: true, rows: 2, sx: { marginTop: 1 }, placeholder: "\u8BC4\u4EF7\u6807\u51C6\uFF08\u9ED8\u8BA4\u53D6\u7EF4\u5EA6\u5E93\u5B9A\u4E49\uFF09", value: item.define || '', onChange: function (e) { return handleDefineChange(index, e.target.value); } })] }), "".concat(item.collectionToken || item.name, "-").concat(index))); }), selected.length === 0 && (_jsx(Typography, __assign({ variant: "body2", color: "secondary" }, { children: "\u8FD8\u6CA1\u6709\u9009\u62E9\u5168\u5C40\u7EF4\u5EA6" })))] })), _jsx(Typography, __assign({ variant: "caption", color: "secondary", display: "block", mt: 1 }, { children: "\u6743\u91CD\u5FC5\u586B\uFF0C\u4E0E\u9898\u76EE\u6743\u91CD\u5408\u8BA1\u9700\u8981\u51D1\u6EE1 100%\uFF1B\u8C03\u6574\u540E\u4F1A\u6309\u6BD4\u4F8B\u91CD\u6392\u9898\u76EE\u6743\u91CD\u3002" })), _jsxs(Typography, __assign({ variant: "caption", display: "block" }, { children: ["\u5F53\u524D\u5408\u8BA1\uFF1A", weightSum(selected), "%", aiQuestionCount === 0 && '(当前试卷没有可 AI 评分的题目,需要合计 100%)'] }))] }))] })) })));
|
|
153
|
+
};
|
|
154
|
+
export default GlobalDimensionDialog;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
+
if (!m) return o;
|
|
15
|
+
var i = m.call(o), r, ar = [], e;
|
|
16
|
+
try {
|
|
17
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) { e = { error: error }; }
|
|
20
|
+
finally {
|
|
21
|
+
try {
|
|
22
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
29
|
+
import GlobalDimensionDialog from './Dialog';
|
|
30
|
+
import { IS_AI_ANALYSIS } from "../../../../constants/ai-question";
|
|
31
|
+
import { useQuestionModelStore } from "../../../../store/ai-question/question-model-store";
|
|
32
|
+
import { AddIcon, Button, Chip, Paper, Typography } from 'fbm-ui';
|
|
33
|
+
import { Box, Stack } from 'fbm-ui/lib/mui';
|
|
34
|
+
import { memo, useCallback, useMemo, useState } from 'react';
|
|
35
|
+
/**
|
|
36
|
+
* 全局维度:只绑试卷、不绑题目,按整场回答统一评价。
|
|
37
|
+
* 展示样式与「面试间互动方式」「题目」卡片保持一致(Paper outlined + fbm-ui 组件)。
|
|
38
|
+
*/
|
|
39
|
+
var GlobalDimensions = function () {
|
|
40
|
+
var _a = useQuestionModelStore(function (store) { return [store.questionModelData, store.updateGlobalDimensions]; }), questionModelData = _a.questionModelData, updateGlobalDimensions = _a.updateGlobalDimensions;
|
|
41
|
+
var _b = (questionModelData || {}).steps, steps = _b === void 0 ? [] : _b;
|
|
42
|
+
var dimensions = useMemo(function () { return (questionModelData === null || questionModelData === void 0 ? void 0 : questionModelData.globalDimensions) || []; }, [questionModelData]);
|
|
43
|
+
var aiQuestionCount = useMemo(function () { return steps.filter(function (step) { return IS_AI_ANALYSIS(step); }).length; }, [steps]);
|
|
44
|
+
var _c = __read(useState(false), 2), open = _c[0], setOpen = _c[1];
|
|
45
|
+
var _d = __read(useState('library'), 2), tab = _d[0], setTab = _d[1];
|
|
46
|
+
var handleOpen = useCallback(function (nextTab) {
|
|
47
|
+
setTab(nextTab);
|
|
48
|
+
setOpen(true);
|
|
49
|
+
}, []);
|
|
50
|
+
var handleRemove = useCallback(function (index) {
|
|
51
|
+
updateGlobalDimensions(dimensions.filter(function (_, i) { return i !== index; }));
|
|
52
|
+
}, [dimensions, updateGlobalDimensions]);
|
|
53
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Paper, __assign({ variant: "outlined", sx: { display: 'block', mt: 2, px: 2, pt: 1.5, pb: 2 } }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", justifyContent: "space-between", spacing: 2 }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", minWidth: 0 }, { children: [_jsx(Typography, __assign({ variant: "body2", color: "primary.main", fontWeight: "medium" }, { children: "\u5168\u5C40\u7EF4\u5EA6" })), _jsx(Chip, { color: "default", label: "\u4E0D\u5173\u8054\u9898\u76EE", size: "medium", sx: { ml: 1 } }), _jsx(Typography, __assign({ variant: "caption", color: "secondary", ml: 1.5, noWrap: true }, { children: "\u9762\u8BD5\u7ED3\u675F\u540E\u6309\u6574\u573A\u56DE\u7B54\u7EDF\u4E00\u8BC4\u4EF7\uFF0C\u5019\u9009\u4EBA\u4E0D\u9700\u8981\u4F5C\u7B54" }))] })), dimensions.length > 0 && (_jsx(Button, __assign({ variant: "text", sx: { flexShrink: 0 }, onClick: function () { return handleOpen('library'); } }, { children: "\u7F16\u8F91\u8BC4\u4EF7\u6807\u51C6" })))] })), _jsxs(Box, __assign({ mt: 1.5, display: "flex", flexWrap: "wrap", alignItems: "center", sx: { gap: 1 } }, { children: [dimensions.map(function (item, index) { return (_jsx(Chip, { color: "default", label: "".concat(item.name, " \u00B7 \u6743\u91CD ").concat(item.weight, "%"), onDelete: function () { return handleRemove(index); } }, "".concat(item.token || item.name, "-").concat(index))); }), _jsx(Button, __assign({ variant: "text", icon: _jsx(AddIcon, {}), onClick: function () { return handleOpen('library'); } }, { children: "\u6DFB\u52A0\u5168\u5C40\u7EF4\u5EA6" }))] })), _jsx(Typography, __assign({ variant: "caption", color: "secondary", display: "block", mt: dimensions.length > 0 ? 1 : 0.5 }, { children: dimensions.length > 0
|
|
54
|
+
? "\u5DF2\u914D\u7F6E ".concat(dimensions.length, " \u4E2A\u5168\u5C40\u7EF4\u5EA6\uFF0C\u4F1A\u548C\u9898\u76EE\u7EF4\u5EA6\u4E00\u8D77\u51FA\u73B0\u5728\u62A5\u544A\u56FE\u8868\u4E2D")
|
|
55
|
+
: '还没有全局维度。如果希望按整场回答评价某些能力,点上方「添加全局维度」。' }))] })), _jsx(GlobalDimensionDialog, { open: open, tab: tab, aiQuestionCount: aiQuestionCount, onClose: function () { return setOpen(false); } })] }));
|
|
56
|
+
};
|
|
57
|
+
export default memo(GlobalDimensions);
|
|
@@ -10,6 +10,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
return __assign.apply(this, arguments);
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import GlobalDimensions from '../GlobalDimensions';
|
|
13
14
|
import { defaultQuestionParams } from '../QuestionUpdate/const';
|
|
14
15
|
import QuestionModelHeader from './Header';
|
|
15
16
|
import Interactive from './Interactive';
|
|
@@ -79,6 +80,6 @@ var Question = function () {
|
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
}, [token, aiEvaluationData, questionModelData === null || questionModelData === void 0 ? void 0 : questionModelData.steps, templateList, addModel]);
|
|
82
|
-
return (_jsx(QuestionModelRoot, { children: loading ? (_jsx(Skeleton, {})) : (_jsxs(_Fragment, { children: [_jsx(QuestionModelHeader, {}), _jsx(Interactive, {}), _jsx(QuestionModelList, {})] })) }));
|
|
83
|
+
return (_jsx(QuestionModelRoot, { children: loading ? (_jsx(Skeleton, {})) : (_jsxs(_Fragment, { children: [_jsx(QuestionModelHeader, {}), _jsx(Interactive, {}), _jsx(GlobalDimensions, {}), _jsx(QuestionModelList, {})] })) }));
|
|
83
84
|
};
|
|
84
85
|
export default Question;
|
|
@@ -15,6 +15,18 @@ export interface QuestionModelData {
|
|
|
15
15
|
aiInterviewerProfile?: AiInterviewerProfile;
|
|
16
16
|
steps: QuestionModelStep[];
|
|
17
17
|
interactionMethods?: InteractionMethod[];
|
|
18
|
+
/** 全局维度(只绑试卷、不绑题目,按整场回答统一评价) */
|
|
19
|
+
globalDimensions?: GlobalDimension[];
|
|
20
|
+
}
|
|
21
|
+
/** 全局维度:来源 1=系统维度库 2=自定义 */
|
|
22
|
+
export interface GlobalDimension {
|
|
23
|
+
token?: string;
|
|
24
|
+
source: number;
|
|
25
|
+
collectionId?: number;
|
|
26
|
+
collectionToken?: string;
|
|
27
|
+
name: string;
|
|
28
|
+
define?: string;
|
|
29
|
+
weight: number;
|
|
18
30
|
}
|
|
19
31
|
export interface QuestionModelDataRes {
|
|
20
32
|
data: QuestionModelData;
|
|
@@ -5,7 +5,7 @@ export declare const PreviewRoot: import("@emotion/styled").StyledComponent<{
|
|
|
5
5
|
elevation?: number | undefined;
|
|
6
6
|
square?: boolean | undefined;
|
|
7
7
|
sx?: import("@mui/system").SxProps<import("fbm-ui/lib/mui").Theme> | undefined;
|
|
8
|
-
variant?: "
|
|
8
|
+
variant?: "elevation" | "outlined" | undefined;
|
|
9
9
|
} & import("@mui/material/OverridableComponent").CommonProps & Omit<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof import("react").HTMLAttributes<HTMLDivElement>> & {
|
|
10
10
|
ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
11
|
-
}, keyof import("@mui/material/OverridableComponent").CommonProps | "
|
|
11
|
+
}, "children" | keyof import("@mui/material/OverridableComponent").CommonProps | "sx" | "elevation" | "square" | "variant"> & import("@mui/system").MUIStyledCommonProps<import("fbm-ui/lib/mui").Theme>, {}, {}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 权重池计算(纯函数,便于单独验证)
|
|
3
|
+
*
|
|
4
|
+
* 口径:题目维度权重 + 全局维度权重 = 100%
|
|
5
|
+
* - 全局维度是试卷级配置,它的权重合计决定了题目还能用多少权重池;
|
|
6
|
+
* - 题目权重需要按比例缩放到这个池子里,否则会出现负权重 / 合计不等于 100% 的脏数据。
|
|
7
|
+
*/
|
|
8
|
+
/** 题目维度可用的权重池 = 100 - 全局维度权重合计(不会小于 0) */
|
|
9
|
+
export declare const computeQuestionWeightPool: (globalDimensions?: Array<{
|
|
10
|
+
weight: number | string;
|
|
11
|
+
}>) => number;
|
|
12
|
+
/**
|
|
13
|
+
* 把一组权重按比例缩放到 target,保留 2 位小数。
|
|
14
|
+
* - 总和为 0(新建试卷还没分配权重)时,把 target 全给最后一项;
|
|
15
|
+
* - 最后一个吸收四舍五入误差,并夹到 0 以上,避免出现负权重。
|
|
16
|
+
*/
|
|
17
|
+
export declare const rebalanceWeights: (weights: Array<number | string>, target: number) => number[];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 权重池计算(纯函数,便于单独验证)
|
|
3
|
+
*
|
|
4
|
+
* 口径:题目维度权重 + 全局维度权重 = 100%
|
|
5
|
+
* - 全局维度是试卷级配置,它的权重合计决定了题目还能用多少权重池;
|
|
6
|
+
* - 题目权重需要按比例缩放到这个池子里,否则会出现负权重 / 合计不等于 100% 的脏数据。
|
|
7
|
+
*/
|
|
8
|
+
var round2 = function (value) { return Math.round(value * 100) / 100; };
|
|
9
|
+
/** 题目维度可用的权重池 = 100 - 全局维度权重合计(不会小于 0) */
|
|
10
|
+
export var computeQuestionWeightPool = function (globalDimensions) {
|
|
11
|
+
if (globalDimensions === void 0) { globalDimensions = []; }
|
|
12
|
+
var globalWeightSum = globalDimensions.reduce(function (total, item) { return total + (Number(item === null || item === void 0 ? void 0 : item.weight) || 0); }, 0);
|
|
13
|
+
return Math.max(0, round2(100 - globalWeightSum));
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 把一组权重按比例缩放到 target,保留 2 位小数。
|
|
17
|
+
* - 总和为 0(新建试卷还没分配权重)时,把 target 全给最后一项;
|
|
18
|
+
* - 最后一个吸收四舍五入误差,并夹到 0 以上,避免出现负权重。
|
|
19
|
+
*/
|
|
20
|
+
export var rebalanceWeights = function (weights, target) {
|
|
21
|
+
if (!weights.length) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
var safeTarget = Math.max(0, round2(target));
|
|
25
|
+
var total = weights.reduce(function (sum, weight) { return sum + (Number(weight) || 0); }, 0);
|
|
26
|
+
if (total <= 0) {
|
|
27
|
+
return weights.map(function (_, index) { return (index === weights.length - 1 ? safeTarget : 0); });
|
|
28
|
+
}
|
|
29
|
+
var result = weights.map(function (weight, index) {
|
|
30
|
+
if (index === weights.length - 1) {
|
|
31
|
+
return 0; // 最后一项统一补差额
|
|
32
|
+
}
|
|
33
|
+
return round2(((Number(weight) || 0) / total) * safeTarget);
|
|
34
|
+
});
|
|
35
|
+
var allocated = result.reduce(function (sum, weight) { return sum + weight; }, 0);
|
|
36
|
+
result[result.length - 1] = Math.max(0, round2(safeTarget - allocated));
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
@@ -8,15 +8,15 @@ export declare const ScoreUnitTypography: import("@emotion/styled").StyledCompon
|
|
|
8
8
|
export declare const RefreshIconRoot: import("@emotion/styled").StyledComponent<{
|
|
9
9
|
children?: import("react").ReactNode;
|
|
10
10
|
classes?: Partial<import("@mui/material").SvgIconClasses> | undefined;
|
|
11
|
-
color?: "inherit" | "disabled" | "action" | "
|
|
11
|
+
color?: "inherit" | "disabled" | "action" | "secondary" | "error" | "warning" | "success" | "info" | "primary" | undefined;
|
|
12
12
|
fontSize?: "small" | "inherit" | "medium" | "large" | undefined;
|
|
13
13
|
htmlColor?: string | undefined;
|
|
14
14
|
shapeRendering?: string | undefined;
|
|
15
15
|
sx?: import("@mui/system").SxProps<import("@mui/material").Theme> | undefined;
|
|
16
16
|
titleAccess?: string | undefined;
|
|
17
17
|
viewBox?: string | undefined;
|
|
18
|
-
} & import("@mui/material/OverridableComponent").CommonProps & Omit<Pick<import("react").SVGProps<SVGSVGElement>, "string" | "name" | "type" | "
|
|
18
|
+
} & import("@mui/material/OverridableComponent").CommonProps & Omit<Pick<import("react").SVGProps<SVGSVGElement>, "string" | "method" | "d" | "y" | "name" | "type" | "filter" | "fill" | "values" | "style" | "clipPath" | "mask" | "path" | "children" | "className" | "display" | "overflow" | "visibility" | "order" | "color" | "width" | "height" | "fontFamily" | "fontSize" | "fontStyle" | "fontWeight" | "letterSpacing" | "cursor" | "direction" | "fontSizeAdjust" | "fontStretch" | "fontVariant" | "imageRendering" | "opacity" | "paintOrder" | "pointerEvents" | "rotate" | "scale" | "textRendering" | "transform" | "unicodeBidi" | "wordSpacing" | "writingMode" | "offset" | "textDecoration" | "azimuth" | "clip" | "alignmentBaseline" | "baselineShift" | "clipRule" | "colorInterpolation" | "colorRendering" | "dominantBaseline" | "fillOpacity" | "fillRule" | "floodColor" | "floodOpacity" | "glyphOrientationVertical" | "lightingColor" | "markerEnd" | "markerMid" | "markerStart" | "shapeRendering" | "stopColor" | "stopOpacity" | "stroke" | "strokeDasharray" | "strokeDashoffset" | "strokeLinecap" | "strokeLinejoin" | "strokeMiterlimit" | "strokeOpacity" | "strokeWidth" | "textAnchor" | "vectorEffect" | "key" | "id" | "lang" | "tabIndex" | "role" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "max" | "media" | "min" | "target" | "crossOrigin" | "accentHeight" | "accumulate" | "additive" | "allowReorder" | "alphabetic" | "amplitude" | "arabicForm" | "ascent" | "attributeName" | "attributeType" | "autoReverse" | "baseFrequency" | "baseProfile" | "bbox" | "begin" | "bias" | "by" | "calcMode" | "capHeight" | "clipPathUnits" | "colorInterpolationFilters" | "colorProfile" | "contentScriptType" | "contentStyleType" | "cx" | "cy" | "decelerate" | "descent" | "diffuseConstant" | "divisor" | "dur" | "dx" | "dy" | "edgeMode" | "elevation" | "enableBackground" | "end" | "exponent" | "externalResourcesRequired" | "filterRes" | "filterUnits" | "focusable" | "format" | "fr" | "from" | "fx" | "fy" | "g1" | "g2" | "glyphName" | "glyphOrientationHorizontal" | "glyphRef" | "gradientTransform" | "gradientUnits" | "hanging" | "horizAdvX" | "horizOriginX" | "href" | "ideographic" | "in2" | "in" | "intercept" | "k1" | "k2" | "k3" | "k4" | "k" | "kernelMatrix" | "kernelUnitLength" | "kerning" | "keyPoints" | "keySplines" | "keyTimes" | "lengthAdjust" | "limitingConeAngle" | "local" | "markerHeight" | "markerUnits" | "markerWidth" | "maskContentUnits" | "maskUnits" | "mathematical" | "mode" | "numOctaves" | "operator" | "orient" | "orientation" | "origin" | "overlinePosition" | "overlineThickness" | "panose1" | "pathLength" | "patternContentUnits" | "patternTransform" | "patternUnits" | "points" | "pointsAtX" | "pointsAtY" | "pointsAtZ" | "preserveAlpha" | "preserveAspectRatio" | "primitiveUnits" | "r" | "radius" | "refX" | "refY" | "renderingIntent" | "repeatCount" | "repeatDur" | "requiredExtensions" | "requiredFeatures" | "restart" | "result" | "rx" | "ry" | "seed" | "slope" | "spacing" | "specularConstant" | "specularExponent" | "speed" | "spreadMethod" | "startOffset" | "stdDeviation" | "stemh" | "stemv" | "stitchTiles" | "strikethroughPosition" | "strikethroughThickness" | "surfaceScale" | "systemLanguage" | "tableValues" | "targetX" | "targetY" | "textLength" | "to" | "u1" | "u2" | "underlinePosition" | "underlineThickness" | "unicode" | "unicodeRange" | "unitsPerEm" | "vAlphabetic" | "version" | "vertAdvY" | "vertOriginX" | "vertOriginY" | "vHanging" | "vIdeographic" | "viewBox" | "viewTarget" | "vMathematical" | "widths" | "x1" | "x2" | "x" | "xChannelSelector" | "xHeight" | "xlinkActuate" | "xlinkArcrole" | "xlinkHref" | "xlinkRole" | "xlinkShow" | "xlinkTitle" | "xlinkType" | "xmlBase" | "xmlLang" | "xmlns" | "xmlnsXlink" | "xmlSpace" | "y1" | "y2" | "yChannelSelector" | "z" | "zoomAndPan"> & {
|
|
19
19
|
ref?: ((instance: SVGSVGElement | null) => void) | import("react").RefObject<SVGSVGElement> | null | undefined;
|
|
20
|
-
}, keyof import("@mui/material/OverridableComponent").CommonProps | "color" | "fontSize" | "shapeRendering" | "
|
|
20
|
+
}, "children" | keyof import("@mui/material/OverridableComponent").CommonProps | "color" | "fontSize" | "shapeRendering" | "sx" | "viewBox" | "htmlColor" | "titleAccess"> & {
|
|
21
21
|
children?: import("react").ReactNode;
|
|
22
22
|
} & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
export declare const StyledSlider: import("@emotion/styled").StyledComponent<{
|
|
3
|
-
color?: "
|
|
3
|
+
color?: "secondary" | "primary" | undefined;
|
|
4
4
|
classes?: (Partial<import("fbm-ui/lib/mui").SliderUnstyledClasses> & {
|
|
5
5
|
colorPrimary?: string | undefined;
|
|
6
6
|
colorSecondary?: string | undefined;
|
|
@@ -56,7 +56,7 @@ export declare const StyledSlider: import("@emotion/styled").StyledComponent<{
|
|
|
56
56
|
valueLabelFormat?: string | ((value: number, index: number) => import("react").ReactNode) | undefined;
|
|
57
57
|
} & Omit<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "key" | keyof import("react").HTMLAttributes<HTMLSpanElement>> & {
|
|
58
58
|
ref?: ((instance: HTMLSpanElement | null) => void) | import("react").RefObject<HTMLSpanElement> | null | undefined;
|
|
59
|
-
}, "name" | "
|
|
59
|
+
}, "name" | "track" | "size" | "classes" | "color" | "scale" | "sx" | "defaultValue" | "tabIndex" | "aria-label" | "aria-labelledby" | "aria-valuetext" | "onChange" | "max" | "min" | "orientation" | "value" | "disabled" | "step" | "components" | "componentsProps" | "disableSwap" | "getAriaLabel" | "getAriaValueText" | "isRtl" | "marks" | "onChangeCommitted" | "valueLabelDisplay" | "valueLabelFormat"> & import("@mui/system").MUIStyledCommonProps<import("fbm-ui/lib/mui").Theme>, {}, {}>;
|
|
60
60
|
export declare const ScoreSliderRoot: import("@emotion/styled").StyledComponent<import("fbm-ui/lib/components/Box").BoxProps & {
|
|
61
61
|
children?: import("react").ReactNode;
|
|
62
62
|
} & import("@mui/system").MUIStyledCommonProps<import("fbm-ui/lib/mui").Theme>, {}, {}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
export declare const WorkplaceStyledSlider: import("@emotion/styled").StyledComponent<{
|
|
3
|
-
color?: "
|
|
3
|
+
color?: "secondary" | "primary" | undefined;
|
|
4
4
|
classes?: (Partial<import("fbm-ui/lib/mui").SliderUnstyledClasses> & {
|
|
5
5
|
colorPrimary?: string | undefined;
|
|
6
6
|
colorSecondary?: string | undefined;
|
|
@@ -56,7 +56,7 @@ export declare const WorkplaceStyledSlider: import("@emotion/styled").StyledComp
|
|
|
56
56
|
valueLabelFormat?: string | ((value: number, index: number) => import("react").ReactNode) | undefined;
|
|
57
57
|
} & Omit<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "key" | keyof import("react").HTMLAttributes<HTMLSpanElement>> & {
|
|
58
58
|
ref?: ((instance: HTMLSpanElement | null) => void) | import("react").RefObject<HTMLSpanElement> | null | undefined;
|
|
59
|
-
}, "name" | "
|
|
59
|
+
}, "name" | "track" | "size" | "classes" | "color" | "scale" | "sx" | "defaultValue" | "tabIndex" | "aria-label" | "aria-labelledby" | "aria-valuetext" | "onChange" | "max" | "min" | "orientation" | "value" | "disabled" | "step" | "components" | "componentsProps" | "disableSwap" | "getAriaLabel" | "getAriaValueText" | "isRtl" | "marks" | "onChangeCommitted" | "valueLabelDisplay" | "valueLabelFormat"> & import("@mui/system").MUIStyledCommonProps<import("fbm-ui/lib/mui").Theme>, {}, {}>;
|
|
60
60
|
export declare const ScoreSliderRoot: import("@emotion/styled").StyledComponent<import("fbm-ui/lib/components/Box").BoxProps & {
|
|
61
61
|
children?: import("react").ReactNode;
|
|
62
62
|
} & import("@mui/system").MUIStyledCommonProps<import("fbm-ui/lib/mui").Theme>, {}, {}>;
|
|
@@ -26,6 +26,8 @@ export interface Collection {
|
|
|
26
26
|
rank: number;
|
|
27
27
|
total: number;
|
|
28
28
|
avgScore: number;
|
|
29
|
+
/** 维度来源 1=题目维度 2=全局维度(老报告不返回该字段) */
|
|
30
|
+
source?: number;
|
|
29
31
|
}
|
|
30
32
|
export interface AnalysisResult {
|
|
31
33
|
text: string;
|
|
@@ -91,6 +93,18 @@ export interface WorkPlaceAbility {
|
|
|
91
93
|
scoreText: string;
|
|
92
94
|
token: string;
|
|
93
95
|
}
|
|
96
|
+
/** 全局维度(只绑试卷、不绑题目,按整场回答统一评价) */
|
|
97
|
+
export interface GlobalDimensionAbility {
|
|
98
|
+
token: string;
|
|
99
|
+
name: string;
|
|
100
|
+
define: string;
|
|
101
|
+
score: number;
|
|
102
|
+
scoreText: string;
|
|
103
|
+
scoreLevel: number;
|
|
104
|
+
weight: number;
|
|
105
|
+
source: number;
|
|
106
|
+
answer: string;
|
|
107
|
+
}
|
|
94
108
|
export interface WorkPlaceScoreInfo {
|
|
95
109
|
score: number;
|
|
96
110
|
scoreText: string;
|
|
@@ -172,6 +186,8 @@ export interface AiInterviewReportList {
|
|
|
172
186
|
workplaceEvaluation?: string;
|
|
173
187
|
evaluations: Array<any>;
|
|
174
188
|
workplaces: WorkPlaceAbility[];
|
|
189
|
+
/** 全局维度(只绑试卷、不绑题目);没有配置时后端不返回该字段 */
|
|
190
|
+
globalDimensions?: GlobalDimensionAbility[];
|
|
175
191
|
suggestion: Suggestion;
|
|
176
192
|
summaryText: SummaryText;
|
|
177
193
|
model: 'pro' | 'standard';
|