@things-factory/spc 7.0.0-alpha.6
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/CHANGELOG.md +8 -0
- package/client/bootstrap.ts +1 -0
- package/client/index.ts +0 -0
- package/client/pages/spc-chart-page.ts +118 -0
- package/client/route.ts +7 -0
- package/client/tsconfig.json +13 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +2 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +0 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/spc-chart-page.d.ts +26 -0
- package/dist-client/pages/spc-chart-page.js +121 -0
- package/dist-client/pages/spc-chart-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +8 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/controllers/data-use-case-spc.js +40 -0
- package/dist-server/controllers/data-use-case-spc.js.map +1 -0
- package/dist-server/controllers/index.js +5 -0
- package/dist-server/controllers/index.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/c.js +21 -0
- package/dist-server/controllers/spc-/bchart/c.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/histogram.js +27 -0
- package/dist-server/controllers/spc-/bchart/histogram.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/i.js +23 -0
- package/dist-server/controllers/spc-/bchart/i.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/index.js +172 -0
- package/dist-server/controllers/spc-/bchart/index.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/mr.js +24 -0
- package/dist-server/controllers/spc-/bchart/mr.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/np.js +23 -0
- package/dist-server/controllers/spc-/bchart/np.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/p.js +22 -0
- package/dist-server/controllers/spc-/bchart/p.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/pareto.js +25 -0
- package/dist-server/controllers/spc-/bchart/pareto.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/r.js +27 -0
- package/dist-server/controllers/spc-/bchart/r.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/u.js +24 -0
- package/dist-server/controllers/spc-/bchart/u.js.map +1 -0
- package/dist-server/controllers/spc-/bchart/x-bar.js +50 -0
- package/dist-server/controllers/spc-/bchart/x-bar.js.map +1 -0
- package/dist-server/index.js +11 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/service/index.js +21 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/spc-chart/index.js +8 -0
- package/dist-server/service/spc-chart/index.js.map +1 -0
- package/dist-server/service/spc-chart/spc-chart-query.js +198 -0
- package/dist-server/service/spc-chart/spc-chart-query.js.map +1 -0
- package/dist-server/service/spc-chart/spc-chart-type.js +148 -0
- package/dist-server/service/spc-chart/spc-chart-type.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/helps/spc/spc-chart-concept.md +59 -0
- package/helps/spc/spc-chart.md +68 -0
- package/package.json +36 -0
- package/server/controllers/data-use-case-spc.ts +44 -0
- package/server/controllers/index.ts +1 -0
- package/server/controllers/spc-/bchart/c.ts +31 -0
- package/server/controllers/spc-/bchart/histogram.ts +40 -0
- package/server/controllers/spc-/bchart/i.ts +35 -0
- package/server/controllers/spc-/bchart/index.ts +171 -0
- package/server/controllers/spc-/bchart/mr.ts +37 -0
- package/server/controllers/spc-/bchart/np.ts +35 -0
- package/server/controllers/spc-/bchart/p.ts +34 -0
- package/server/controllers/spc-/bchart/pareto.ts +34 -0
- package/server/controllers/spc-/bchart/r.ts +40 -0
- package/server/controllers/spc-/bchart/u.ts +36 -0
- package/server/controllers/spc-/bchart/x-bar.ts +70 -0
- package/server/index.ts +10 -0
- package/server/service/index.ts +21 -0
- package/server/service/spc-chart/index.ts +5 -0
- package/server/service/spc-chart/spc-chart-query.ts +192 -0
- package/server/service/spc-chart/spc-chart-type.ts +103 -0
- package/server/tsconfig.json +10 -0
- package/things-factory.config.js +11 -0
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateCChart = void 0;
|
|
4
|
+
function calculateCChart(data) {
|
|
5
|
+
// 총 결함 수를 계산합니다.
|
|
6
|
+
const totalDefects = data.reduce((sum, { defects }) => sum + defects, 0);
|
|
7
|
+
// 평균 결함 수(C-bar)를 계산합니다.
|
|
8
|
+
const CBar = totalDefects / data.length;
|
|
9
|
+
// 상한 제어선(UCL)과 하한 제어선(LCL)을 계산합니다.
|
|
10
|
+
// 포아송 분포를 가정할 때, UCL = C-bar + 3*sqrt(C-bar), LCL = C-bar - 3*sqrt(C-bar) (단, LCL이 음수인 경우 0으로 설정)
|
|
11
|
+
const UCL = CBar + 3 * Math.sqrt(CBar);
|
|
12
|
+
const LCL = Math.max(CBar - 3 * Math.sqrt(CBar), 0);
|
|
13
|
+
return {
|
|
14
|
+
CBar,
|
|
15
|
+
UCL,
|
|
16
|
+
LCL,
|
|
17
|
+
data
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
exports.calculateCChart = calculateCChart;
|
|
21
|
+
//# sourceMappingURL=c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/c.ts"],"names":[],"mappings":";;;AAYA,SAAgB,eAAe,CAAC,IAAkB;IAChD,iBAAiB;IACjB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAExE,yBAAyB;IACzB,MAAM,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC,MAAM,CAAA;IAEvC,mCAAmC;IACnC,kGAAkG;IAClG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAEnD,OAAO;QACL,IAAI;QACJ,GAAG;QACH,GAAG;QACH,IAAI;KACL,CAAA;AACH,CAAC;AAlBD,0CAkBC","sourcesContent":["interface CChartData {\n period: string // 샘플 기간 또는 단위 식별자\n defects: number // 해당 기간 또는 단위에서 발생한 결함 수\n}\n\ninterface CChartResult {\n CBar: number // 평균 결함 수\n UCL: number // 상한 제어선\n LCL: number // 하한 제어선\n data: CChartData[] // 입력된 결함 데이터\n}\n\nexport function calculateCChart(data: CChartData[]): CChartResult {\n // 총 결함 수를 계산합니다.\n const totalDefects = data.reduce((sum, { defects }) => sum + defects, 0)\n\n // 평균 결함 수(C-bar)를 계산합니다.\n const CBar = totalDefects / data.length\n\n // 상한 제어선(UCL)과 하한 제어선(LCL)을 계산합니다.\n // 포아송 분포를 가정할 때, UCL = C-bar + 3*sqrt(C-bar), LCL = C-bar - 3*sqrt(C-bar) (단, LCL이 음수인 경우 0으로 설정)\n const UCL = CBar + 3 * Math.sqrt(CBar)\n const LCL = Math.max(CBar - 3 * Math.sqrt(CBar), 0)\n\n return {\n CBar,\n UCL,\n LCL,\n data\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateHistogram = void 0;
|
|
4
|
+
function calculateHistogram(samples, variableName, numBins) {
|
|
5
|
+
const values = samples.map(sample => sample.value);
|
|
6
|
+
const minValue = Math.min(...values);
|
|
7
|
+
const maxValue = Math.max(...values);
|
|
8
|
+
const range = maxValue - minValue;
|
|
9
|
+
const binWidth = range / numBins;
|
|
10
|
+
// 초기화된 구간 배열 생성
|
|
11
|
+
const bins = Array.from({ length: numBins }, (_, i) => ({
|
|
12
|
+
binRange: `${(minValue + i * binWidth).toFixed(2)}-${(minValue + (i + 1) * binWidth).toFixed(2)}`,
|
|
13
|
+
count: 0
|
|
14
|
+
}));
|
|
15
|
+
// 각 샘플을 적절한 구간에 할당하고 개수를 세어 구간의 개수를 업데이트합니다.
|
|
16
|
+
samples.forEach(sample => {
|
|
17
|
+
const binIndex = Math.min(numBins - 1, Math.floor((sample.value - minValue) / binWidth));
|
|
18
|
+
bins[binIndex].count++;
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
chartType: 'Histogram',
|
|
22
|
+
variableName,
|
|
23
|
+
bins
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
exports.calculateHistogram = calculateHistogram;
|
|
27
|
+
//# sourceMappingURL=histogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/histogram.ts"],"names":[],"mappings":";;;AAeA,SAAgB,kBAAkB,CAAC,OAA0B,EAAE,YAAoB,EAAE,OAAe;IAClG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACjC,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAA;IAEhC,gBAAgB;IAChB,MAAM,IAAI,GAAmB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACjG,KAAK,EAAE,CAAC;KACT,CAAC,CAAC,CAAA;IAEH,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;QACxF,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,SAAS,EAAE,WAAW;QACtB,YAAY;QACZ,IAAI;KACL,CAAA;AACH,CAAC;AAxBD,gDAwBC","sourcesContent":["interface HistogramSample {\n value: number\n}\n\ninterface HistogramBin {\n binRange: string // 구간을 나타내는 문자열, 예: \"0-1\"\n count: number // 해당 구간에 속하는 데이터의 개수\n}\n\ninterface HistogramResult {\n chartType: 'Histogram'\n variableName: string // 분석 대상 변수 이름\n bins: HistogramBin[] // 히스토그램의 각 구간과 해당 구간의 데이터 개수\n}\n\nexport function calculateHistogram(samples: HistogramSample[], variableName: string, numBins: number): HistogramResult {\n const values = samples.map(sample => sample.value)\n const minValue = Math.min(...values)\n const maxValue = Math.max(...values)\n const range = maxValue - minValue\n const binWidth = range / numBins\n\n // 초기화된 구간 배열 생성\n const bins: HistogramBin[] = Array.from({ length: numBins }, (_, i) => ({\n binRange: `${(minValue + i * binWidth).toFixed(2)}-${(minValue + (i + 1) * binWidth).toFixed(2)}`,\n count: 0\n }))\n\n // 각 샘플을 적절한 구간에 할당하고 개수를 세어 구간의 개수를 업데이트합니다.\n samples.forEach(sample => {\n const binIndex = Math.min(numBins - 1, Math.floor((sample.value - minValue) / binWidth))\n bins[binIndex].count++\n })\n\n return {\n chartType: 'Histogram',\n variableName,\n bins\n }\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateIChartAnalysisResult = void 0;
|
|
4
|
+
function calculateIChartAnalysisResult(samples, variableName) {
|
|
5
|
+
// 개별 측정값의 평균을 계산하여 중심선(CL)을 구합니다.
|
|
6
|
+
const CL = samples.reduce((acc, sample) => acc + sample.value, 0) / samples.length;
|
|
7
|
+
// 개별 측정값의 표준편차를 계산합니다.
|
|
8
|
+
const standardDeviation = Math.sqrt(samples.reduce((acc, sample) => acc + Math.pow(sample.value - CL, 2), 0) / samples.length);
|
|
9
|
+
// 공정 변동을 고려하여 상한 제어선(UCL)과 하한 제어선(LCL)을 계산합니다.
|
|
10
|
+
// 여기서는 3시그마(3 * 표준편차)를 사용합니다. 상황에 따라 적절한 시그마 수준을 조정할 수 있습니다.
|
|
11
|
+
const UCL = CL + 3 * standardDeviation;
|
|
12
|
+
const LCL = CL - 3 * standardDeviation;
|
|
13
|
+
return {
|
|
14
|
+
chartType: 'I',
|
|
15
|
+
variableName,
|
|
16
|
+
CL,
|
|
17
|
+
UCL,
|
|
18
|
+
LCL,
|
|
19
|
+
samples
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
exports.calculateIChartAnalysisResult = calculateIChartAnalysisResult;
|
|
23
|
+
//# sourceMappingURL=i.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/i.ts"],"names":[],"mappings":";;;AAcA,SAAgB,6BAA6B,CAAC,OAAkB,EAAE,YAAoB;IACpF,kCAAkC;IAClC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAElF,uBAAuB;IACvB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE9H,+CAA+C;IAC/C,6DAA6D;IAC7D,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAA;IACtC,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAA;IAEtC,OAAO;QACL,SAAS,EAAE,GAAG;QACd,YAAY;QACZ,EAAE;QACF,GAAG;QACH,GAAG;QACH,OAAO;KACR,CAAA;AACH,CAAC;AApBD,sEAoBC","sourcesContent":["interface ISample {\n sampleId: string\n value: number // 개별 측정값\n}\n\ninterface IChartResult {\n chartType: 'I'\n variableName: string\n CL: number // 중심선\n UCL: number // 상한 제어선\n LCL: number // 하한 제어선\n samples: ISample[] // 개별 측정값 배열\n}\n\nexport function calculateIChartAnalysisResult(samples: ISample[], variableName: string): IChartResult {\n // 개별 측정값의 평균을 계산하여 중심선(CL)을 구합니다.\n const CL = samples.reduce((acc, sample) => acc + sample.value, 0) / samples.length\n\n // 개별 측정값의 표준편차를 계산합니다.\n const standardDeviation = Math.sqrt(samples.reduce((acc, sample) => acc + Math.pow(sample.value - CL, 2), 0) / samples.length)\n\n // 공정 변동을 고려하여 상한 제어선(UCL)과 하한 제어선(LCL)을 계산합니다.\n // 여기서는 3시그마(3 * 표준편차)를 사용합니다. 상황에 따라 적절한 시그마 수준을 조정할 수 있습니다.\n const UCL = CL + 3 * standardDeviation\n const LCL = CL - 3 * standardDeviation\n\n return {\n chartType: 'I',\n variableName,\n CL,\n UCL,\n LCL,\n samples\n }\n}\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const result = {
|
|
2
|
+
dataset: {
|
|
3
|
+
id: 'aaa',
|
|
4
|
+
name: 'bbb'
|
|
5
|
+
},
|
|
6
|
+
query: {},
|
|
7
|
+
analysisResults: [
|
|
8
|
+
{
|
|
9
|
+
chartType: 'X-bar',
|
|
10
|
+
variables: [
|
|
11
|
+
{
|
|
12
|
+
name: 'variable1',
|
|
13
|
+
stats: {
|
|
14
|
+
mean: 22,
|
|
15
|
+
UCL: 25,
|
|
16
|
+
LCL: 19,
|
|
17
|
+
CL: 22
|
|
18
|
+
},
|
|
19
|
+
samples: [
|
|
20
|
+
{ sampleId: '1', value: 22 },
|
|
21
|
+
{ sampleId: '2', value: 23 }
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
chartType: 'R',
|
|
28
|
+
variables: [
|
|
29
|
+
{
|
|
30
|
+
name: 'variable2',
|
|
31
|
+
stats: {
|
|
32
|
+
range: 1.3,
|
|
33
|
+
UCL: 2.1,
|
|
34
|
+
LCL: 0.5,
|
|
35
|
+
CL: 1.3
|
|
36
|
+
},
|
|
37
|
+
samples: [
|
|
38
|
+
{ sampleId: '1', value: 1.2 },
|
|
39
|
+
{ sampleId: '2', value: 1.3 }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
chartType: 'p',
|
|
46
|
+
variables: [
|
|
47
|
+
{
|
|
48
|
+
name: 'variable3',
|
|
49
|
+
stats: {
|
|
50
|
+
proportion: 0.05,
|
|
51
|
+
UCL: 0.1,
|
|
52
|
+
LCL: 0.01
|
|
53
|
+
},
|
|
54
|
+
samples: [
|
|
55
|
+
{ sampleId: '1', value: 0.05 },
|
|
56
|
+
{ sampleId: '2', value: 0.06 }
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
chartType: 'np',
|
|
63
|
+
variables: [
|
|
64
|
+
{
|
|
65
|
+
name: 'variable4',
|
|
66
|
+
stats: {
|
|
67
|
+
nonconforming: 5,
|
|
68
|
+
UCL: 10,
|
|
69
|
+
LCL: 1
|
|
70
|
+
},
|
|
71
|
+
samples: [
|
|
72
|
+
{ sampleId: '1', value: 5 },
|
|
73
|
+
{ sampleId: '2', value: 4 }
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
chartType: 'c',
|
|
80
|
+
variables: [
|
|
81
|
+
{
|
|
82
|
+
name: 'variable5',
|
|
83
|
+
stats: {
|
|
84
|
+
count: 20,
|
|
85
|
+
UCL: 25,
|
|
86
|
+
LCL: 15
|
|
87
|
+
},
|
|
88
|
+
samples: [
|
|
89
|
+
{ sampleId: '1', value: 20 },
|
|
90
|
+
{ sampleId: '2', value: 21 }
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
chartType: 'u',
|
|
97
|
+
variables: [
|
|
98
|
+
{
|
|
99
|
+
name: 'variable6',
|
|
100
|
+
stats: {
|
|
101
|
+
defectsPerUnit: 1.2,
|
|
102
|
+
UCL: 1.5,
|
|
103
|
+
LCL: 0.9
|
|
104
|
+
},
|
|
105
|
+
samples: [
|
|
106
|
+
{ sampleId: '1', value: 1.2 },
|
|
107
|
+
{ sampleId: '2', value: 1.1 }
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
chartType: 'I',
|
|
114
|
+
variables: [
|
|
115
|
+
{
|
|
116
|
+
name: 'variable7',
|
|
117
|
+
stats: {
|
|
118
|
+
individualValue: 10,
|
|
119
|
+
UCL: 12,
|
|
120
|
+
LCL: 8
|
|
121
|
+
},
|
|
122
|
+
samples: [
|
|
123
|
+
{ sampleId: '1', value: 10 },
|
|
124
|
+
{ sampleId: '2', value: 11 }
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
chartType: 'MR',
|
|
131
|
+
variables: [
|
|
132
|
+
{
|
|
133
|
+
name: 'variable8',
|
|
134
|
+
stats: {
|
|
135
|
+
movingRange: 2,
|
|
136
|
+
UCL: 3,
|
|
137
|
+
LCL: 1
|
|
138
|
+
},
|
|
139
|
+
samples: [
|
|
140
|
+
{ sampleId: '1', value: 2 },
|
|
141
|
+
{ sampleId: '2', value: 2.5 }
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
chartType: 'Histogram',
|
|
148
|
+
variables: [
|
|
149
|
+
{
|
|
150
|
+
name: 'variable9',
|
|
151
|
+
bins: [
|
|
152
|
+
{ binRange: '0-1', count: 5 },
|
|
153
|
+
{ binRange: '1-2', count: 10 }
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
chartType: 'Pareto',
|
|
160
|
+
variables: [
|
|
161
|
+
{
|
|
162
|
+
name: 'defectType',
|
|
163
|
+
categories: [
|
|
164
|
+
{ category: 'Scratch', count: 20 },
|
|
165
|
+
{ category: 'Dent', count: 15 }
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/index.ts"],"names":[],"mappings":"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","sourcesContent":["const result = {\n dataset: {\n id: 'aaa',\n name: 'bbb'\n },\n query: {},\n analysisResults: [\n {\n chartType: 'X-bar',\n variables: [\n {\n name: 'variable1',\n stats: {\n mean: 22,\n UCL: 25,\n LCL: 19,\n CL: 22\n },\n samples: [\n { sampleId: '1', value: 22 },\n { sampleId: '2', value: 23 }\n ]\n }\n ]\n },\n {\n chartType: 'R',\n variables: [\n {\n name: 'variable2',\n stats: {\n range: 1.3,\n UCL: 2.1,\n LCL: 0.5,\n CL: 1.3\n },\n samples: [\n { sampleId: '1', value: 1.2 },\n { sampleId: '2', value: 1.3 }\n ]\n }\n ]\n },\n {\n chartType: 'p',\n variables: [\n {\n name: 'variable3',\n stats: {\n proportion: 0.05,\n UCL: 0.1,\n LCL: 0.01\n },\n samples: [\n { sampleId: '1', value: 0.05 },\n { sampleId: '2', value: 0.06 }\n ]\n }\n ]\n },\n {\n chartType: 'np',\n variables: [\n {\n name: 'variable4',\n stats: {\n nonconforming: 5,\n UCL: 10,\n LCL: 1\n },\n samples: [\n { sampleId: '1', value: 5 },\n { sampleId: '2', value: 4 }\n ]\n }\n ]\n },\n {\n chartType: 'c',\n variables: [\n {\n name: 'variable5',\n stats: {\n count: 20,\n UCL: 25,\n LCL: 15\n },\n samples: [\n { sampleId: '1', value: 20 },\n { sampleId: '2', value: 21 }\n ]\n }\n ]\n },\n {\n chartType: 'u',\n variables: [\n {\n name: 'variable6',\n stats: {\n defectsPerUnit: 1.2,\n UCL: 1.5,\n LCL: 0.9\n },\n samples: [\n { sampleId: '1', value: 1.2 },\n { sampleId: '2', value: 1.1 }\n ]\n }\n ]\n },\n {\n chartType: 'I',\n variables: [\n {\n name: 'variable7',\n stats: {\n individualValue: 10,\n UCL: 12,\n LCL: 8\n },\n samples: [\n { sampleId: '1', value: 10 },\n { sampleId: '2', value: 11 }\n ]\n }\n ]\n },\n {\n chartType: 'MR',\n variables: [\n {\n name: 'variable8',\n stats: {\n movingRange: 2,\n UCL: 3,\n LCL: 1\n },\n samples: [\n { sampleId: '1', value: 2 },\n { sampleId: '2', value: 2.5 }\n ]\n }\n ]\n },\n {\n chartType: 'Histogram',\n variables: [\n {\n name: 'variable9',\n bins: [\n { binRange: '0-1', count: 5 },\n { binRange: '1-2', count: 10 }\n ]\n }\n ]\n },\n {\n chartType: 'Pareto',\n variables: [\n {\n name: 'defectType',\n categories: [\n { category: 'Scratch', count: 20 },\n { category: 'Dent', count: 15 }\n ]\n }\n ]\n }\n ]\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateMRChartAnalysisResult = void 0;
|
|
4
|
+
function calculateMRChartAnalysisResult(samples, variableName) {
|
|
5
|
+
// 연속된 측정값 간의 변동 범위를 계산합니다.
|
|
6
|
+
const movingRanges = samples.slice(1).map((sample, index) => Math.abs(sample.value - samples[index].value));
|
|
7
|
+
// 변동 범위의 평균을 계산하여 중심선(CL)을 구합니다.
|
|
8
|
+
const CL = movingRanges.reduce((acc, range) => acc + range, 0) / movingRanges.length;
|
|
9
|
+
// 공정 변동을 고려하여 상한 제어선(UCL)을 계산합니다.
|
|
10
|
+
// MR 차트에서는 3.267 * MR-Bar을 사용합니다 (2개의 측정값을 사용하는 경우).
|
|
11
|
+
const UCL = 3.267 * CL;
|
|
12
|
+
// MR 차트에서 하한 제어선(LCL)은 일반적으로 사용되지 않거나 0으로 설정됩니다.
|
|
13
|
+
const LCL = 0; // 하한 제어선
|
|
14
|
+
return {
|
|
15
|
+
chartType: 'MR',
|
|
16
|
+
variableName,
|
|
17
|
+
CL,
|
|
18
|
+
UCL,
|
|
19
|
+
LCL,
|
|
20
|
+
movingRanges
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
exports.calculateMRChartAnalysisResult = calculateMRChartAnalysisResult;
|
|
24
|
+
//# sourceMappingURL=mr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mr.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/mr.ts"],"names":[],"mappings":";;;AAcA,SAAgB,8BAA8B,CAAC,OAAmB,EAAE,YAAoB;IACtF,2BAA2B;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IAE3G,iCAAiC;IACjC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAA;IAEpF,kCAAkC;IAClC,qDAAqD;IACrD,MAAM,GAAG,GAAG,KAAK,GAAG,EAAE,CAAA;IAEtB,iDAAiD;IACjD,MAAM,GAAG,GAAG,CAAC,CAAA,CAAC,SAAS;IAEvB,OAAO;QACL,SAAS,EAAE,IAAI;QACf,YAAY;QACZ,EAAE;QACF,GAAG;QACH,GAAG;QACH,YAAY;KACb,CAAA;AACH,CAAC;AAtBD,wEAsBC","sourcesContent":["interface MRSample {\n sampleId: string\n value: number // 측정값\n}\n\ninterface MRChartResult {\n chartType: 'MR'\n variableName: string\n CL: number // 중심선\n UCL: number // 상한 제어선\n LCL: number // 하한 제어선 (MR 차트에서는 일반적으로 0으로 설정됩니다)\n movingRanges: number[] // 연속된 측정값 간의 변동 범위\n}\n\nexport function calculateMRChartAnalysisResult(samples: MRSample[], variableName: string): MRChartResult {\n // 연속된 측정값 간의 변동 범위를 계산합니다.\n const movingRanges = samples.slice(1).map((sample, index) => Math.abs(sample.value - samples[index].value))\n\n // 변동 범위의 평균을 계산하여 중심선(CL)을 구합니다.\n const CL = movingRanges.reduce((acc, range) => acc + range, 0) / movingRanges.length\n\n // 공정 변동을 고려하여 상한 제어선(UCL)을 계산합니다.\n // MR 차트에서는 3.267 * MR-Bar을 사용합니다 (2개의 측정값을 사용하는 경우).\n const UCL = 3.267 * CL\n\n // MR 차트에서 하한 제어선(LCL)은 일반적으로 사용되지 않거나 0으로 설정됩니다.\n const LCL = 0 // 하한 제어선\n\n return {\n chartType: 'MR',\n variableName,\n CL,\n UCL,\n LCL,\n movingRanges\n }\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateNPChartAnalysisResult = void 0;
|
|
4
|
+
function calculateNPChartAnalysisResult(sampleGroups, variableName) {
|
|
5
|
+
const totalNonConforming = sampleGroups.reduce((acc, group) => acc + group.nonConforming, 0);
|
|
6
|
+
const totalUnits = sampleGroups.reduce((acc, group) => acc + group.totalUnits, 0);
|
|
7
|
+
const NPBar = totalNonConforming / sampleGroups.length; // 평균 불량품 수
|
|
8
|
+
// p 차트 공식을 사용하여 UCL과 LCL을 계산합니다.
|
|
9
|
+
const pBar = totalNonConforming / totalUnits; // 전체 불량품 비율
|
|
10
|
+
const UCL = NPBar + 3 * Math.sqrt(NPBar * (1 - pBar));
|
|
11
|
+
let LCL = NPBar - 3 * Math.sqrt(NPBar * (1 - pBar));
|
|
12
|
+
LCL = LCL < 0 ? 0 : LCL; // LCL이 음수인 경우 0으로 설정
|
|
13
|
+
return {
|
|
14
|
+
chartType: 'NP',
|
|
15
|
+
variableName,
|
|
16
|
+
NPBar,
|
|
17
|
+
UCL,
|
|
18
|
+
LCL,
|
|
19
|
+
sampleGroups
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
exports.calculateNPChartAnalysisResult = calculateNPChartAnalysisResult;
|
|
23
|
+
//# sourceMappingURL=np.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"np.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/np.ts"],"names":[],"mappings":";;;AAeA,SAAgB,8BAA8B,CAAC,YAA6B,EAAE,YAAoB;IAChG,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;IAC5F,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACjF,MAAM,KAAK,GAAG,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAC,WAAW;IAElE,iCAAiC;IACjC,MAAM,IAAI,GAAG,kBAAkB,GAAG,UAAU,CAAA,CAAC,YAAY;IACzD,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACrD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACnD,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA,CAAC,qBAAqB;IAE7C,OAAO;QACL,SAAS,EAAE,IAAI;QACf,YAAY;QACZ,KAAK;QACL,GAAG;QACH,GAAG;QACH,YAAY;KACb,CAAA;AACH,CAAC;AAnBD,wEAmBC","sourcesContent":["interface NPSampleGroup {\n groupId: string\n nonConforming: number // 각 샘플 그룹의 불량품 수\n totalUnits: number // 샘플 그룹의 총 단위 수\n}\n\ninterface NPChartResult {\n chartType: 'NP'\n variableName: string\n NPBar: number // 샘플 그룹의 평균 불량품 수\n UCL: number\n LCL: number\n sampleGroups: NPSampleGroup[]\n}\n\nexport function calculateNPChartAnalysisResult(sampleGroups: NPSampleGroup[], variableName: string): NPChartResult {\n const totalNonConforming = sampleGroups.reduce((acc, group) => acc + group.nonConforming, 0)\n const totalUnits = sampleGroups.reduce((acc, group) => acc + group.totalUnits, 0)\n const NPBar = totalNonConforming / sampleGroups.length // 평균 불량품 수\n\n // p 차트 공식을 사용하여 UCL과 LCL을 계산합니다.\n const pBar = totalNonConforming / totalUnits // 전체 불량품 비율\n const UCL = NPBar + 3 * Math.sqrt(NPBar * (1 - pBar))\n let LCL = NPBar - 3 * Math.sqrt(NPBar * (1 - pBar))\n LCL = LCL < 0 ? 0 : LCL // LCL이 음수인 경우 0으로 설정\n\n return {\n chartType: 'NP',\n variableName,\n NPBar,\n UCL,\n LCL,\n sampleGroups\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculatePChartAnalysisResult = void 0;
|
|
4
|
+
function calculatePChartAnalysisResult(sampleGroups, variableName) {
|
|
5
|
+
// 결함 있는 단위의 평균 비율(PBar)을 계산합니다.
|
|
6
|
+
const totalDefectiveUnits = sampleGroups.reduce((acc, group) => acc + group.defectiveUnits, 0);
|
|
7
|
+
const totalUnits = sampleGroups.reduce((acc, group) => acc + group.totalUnits, 0);
|
|
8
|
+
const PBar = totalDefectiveUnits / totalUnits;
|
|
9
|
+
// 샘플 그룹의 크기(n)에 따라 UCL과 LCL을 계산합니다.
|
|
10
|
+
const UCL = PBar + 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits);
|
|
11
|
+
const LCL = PBar - 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits) < 0 ? 0 : PBar - 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits); // LCL이 음수가 되지 않도록 처리
|
|
12
|
+
return {
|
|
13
|
+
chartType: 'P',
|
|
14
|
+
variableName,
|
|
15
|
+
PBar,
|
|
16
|
+
UCL,
|
|
17
|
+
LCL,
|
|
18
|
+
sampleGroups
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
exports.calculatePChartAnalysisResult = calculatePChartAnalysisResult;
|
|
22
|
+
//# sourceMappingURL=p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/p.ts"],"names":[],"mappings":";;;AAeA,SAAgB,6BAA6B,CAAC,YAA4B,EAAE,YAAoB;IAC9F,gCAAgC;IAChC,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;IAC9F,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACjF,MAAM,IAAI,GAAG,mBAAmB,GAAG,UAAU,CAAA;IAE7C,oCAAoC;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA,CAAC,qBAAqB;IAEzJ,OAAO;QACL,SAAS,EAAE,GAAG;QACd,YAAY;QACZ,IAAI;QACJ,GAAG;QACH,GAAG;QACH,YAAY;KACb,CAAA;AACH,CAAC;AAlBD,sEAkBC","sourcesContent":["interface PSampleGroup {\n groupId: string // 샘플 그룹 ID\n defectiveUnits: number // 그룹 내 결함 있는 단위 수\n totalUnits: number // 그룹 내 총 단위 수\n}\n\ninterface PChartResult {\n chartType: 'P'\n variableName: string\n PBar: number // 결함 있는 단위의 평균 비율\n UCL: number // 상한 제어선\n LCL: number // 하한 제어선\n sampleGroups: PSampleGroup[]\n}\n\nexport function calculatePChartAnalysisResult(sampleGroups: PSampleGroup[], variableName: string): PChartResult {\n // 결함 있는 단위의 평균 비율(PBar)을 계산합니다.\n const totalDefectiveUnits = sampleGroups.reduce((acc, group) => acc + group.defectiveUnits, 0)\n const totalUnits = sampleGroups.reduce((acc, group) => acc + group.totalUnits, 0)\n const PBar = totalDefectiveUnits / totalUnits\n\n // 샘플 그룹의 크기(n)에 따라 UCL과 LCL을 계산합니다.\n const UCL = PBar + 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits)\n const LCL = PBar - 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits) < 0 ? 0 : PBar - 3 * Math.sqrt((PBar * (1 - PBar)) / totalUnits) // LCL이 음수가 되지 않도록 처리\n\n return {\n chartType: 'P',\n variableName,\n PBar,\n UCL,\n LCL,\n sampleGroups\n }\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculatePareto = void 0;
|
|
4
|
+
function calculatePareto(data, variableName) {
|
|
5
|
+
// 각 카테고리별 데이터 개수 계산
|
|
6
|
+
const categoryCounts = {};
|
|
7
|
+
data.forEach(item => {
|
|
8
|
+
const category = item.category;
|
|
9
|
+
categoryCounts[category] = (categoryCounts[category] || 0) + 1;
|
|
10
|
+
});
|
|
11
|
+
// 카테고리와 데이터 개수를 배열로 변환
|
|
12
|
+
const categories = Object.keys(categoryCounts).map(category => ({
|
|
13
|
+
category,
|
|
14
|
+
count: categoryCounts[category]
|
|
15
|
+
}));
|
|
16
|
+
// 데이터 개수에 따라 내림차순으로 정렬
|
|
17
|
+
categories.sort((a, b) => b.count - a.count);
|
|
18
|
+
return {
|
|
19
|
+
chartType: 'Pareto',
|
|
20
|
+
variableName,
|
|
21
|
+
categories
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
exports.calculatePareto = calculatePareto;
|
|
25
|
+
//# sourceMappingURL=pareto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pareto.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/pareto.ts"],"names":[],"mappings":";;;AAWA,SAAgB,eAAe,CAAC,IAA4B,EAAE,YAAoB;IAChF,oBAAoB;IACpB,MAAM,cAAc,GAAmC,EAAE,CAAA;IACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,uBAAuB;IACvB,MAAM,UAAU,GAAqB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChF,QAAQ;QACR,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC;KAChC,CAAC,CAAC,CAAA;IAEH,uBAAuB;IACvB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;IAE5C,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,YAAY;QACZ,UAAU;KACX,CAAA;AACH,CAAC;AAtBD,0CAsBC","sourcesContent":["interface ParetoCategory {\n category: string // 카테고리 이름\n count: number // 해당 카테고리의 데이터 개수 또는 중요도\n}\n\ninterface ParetoResult {\n chartType: 'Pareto'\n variableName: string // 분석 대상 변수 이름\n categories: ParetoCategory[] // Pareto 차트에 표시될 카테고리 및 중요도 정보\n}\n\nexport function calculatePareto(data: { category: string }[], variableName: string): ParetoResult {\n // 각 카테고리별 데이터 개수 계산\n const categoryCounts: { [category: string]: number } = {}\n data.forEach(item => {\n const category = item.category\n categoryCounts[category] = (categoryCounts[category] || 0) + 1\n })\n\n // 카테고리와 데이터 개수를 배열로 변환\n const categories: ParetoCategory[] = Object.keys(categoryCounts).map(category => ({\n category,\n count: categoryCounts[category]\n }))\n\n // 데이터 개수에 따라 내림차순으로 정렬\n categories.sort((a, b) => b.count - a.count)\n\n return {\n chartType: 'Pareto',\n variableName,\n categories\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateRChartAnalysisResult = void 0;
|
|
4
|
+
function calculateRChartAnalysisResult(sampleGroups, variableName) {
|
|
5
|
+
// 각 샘플 그룹의 범위를 계산합니다.
|
|
6
|
+
const ranges = sampleGroups.map(group => Math.max(...group.values) - Math.min(...group.values));
|
|
7
|
+
// 모든 샘플 그룹의 범위의 평균값(R-bar)을 계산합니다.
|
|
8
|
+
const RBar = ranges.reduce((acc, cur) => acc + cur, 0) / ranges.length;
|
|
9
|
+
// 샘플 그룹의 크기(n)에 따라 D3와 D4 값을 설정합니다.
|
|
10
|
+
// 예시에서는 n=5인 경우의 D3와 D4 값을 사용합니다. 실제 구현에서는 샘플 크기에 맞는 값을 사용해야 합니다.
|
|
11
|
+
const n = sampleGroups[0].values.length; // 가정: 모든 샘플 그룹의 크기가 동일합니다.
|
|
12
|
+
const D3 = 0; // n=5에 대한 D3 값
|
|
13
|
+
const D4 = 2.114; // n=5에 대한 D4 값
|
|
14
|
+
// UCL과 LCL을 계산합니다.
|
|
15
|
+
const UCL = D4 * RBar;
|
|
16
|
+
const LCL = D3 * RBar; // D3가 0인 경우, LCL은 0이 됩니다.
|
|
17
|
+
return {
|
|
18
|
+
chartType: 'R',
|
|
19
|
+
variableName,
|
|
20
|
+
RBar,
|
|
21
|
+
UCL,
|
|
22
|
+
LCL,
|
|
23
|
+
sampleGroups
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
exports.calculateRChartAnalysisResult = calculateRChartAnalysisResult;
|
|
27
|
+
//# sourceMappingURL=r.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/r.ts"],"names":[],"mappings":";;;AAcA,SAAgB,6BAA6B,CAAC,YAA2B,EAAE,YAAoB;IAC7F,sBAAsB;IACtB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/F,mCAAmC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IAEtE,oCAAoC;IACpC,kEAAkE;IAClE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA,CAAC,2BAA2B;IACnE,MAAM,EAAE,GAAG,CAAC,CAAA,CAAC,eAAe;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAA,CAAC,eAAe;IAEhC,mBAAmB;IACnB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;IACrB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,0BAA0B;IAEhD,OAAO;QACL,SAAS,EAAE,GAAG;QACd,YAAY;QACZ,IAAI;QACJ,GAAG;QACH,GAAG;QACH,YAAY;KACb,CAAA;AACH,CAAC;AAzBD,sEAyBC","sourcesContent":["interface SampleGroup {\n groupId: string\n values: number[]\n}\n\ninterface RChartResult {\n chartType: 'R'\n variableName: string\n RBar: number\n UCL: number\n LCL: number\n sampleGroups: SampleGroup[]\n}\n\nexport function calculateRChartAnalysisResult(sampleGroups: SampleGroup[], variableName: string): RChartResult {\n // 각 샘플 그룹의 범위를 계산합니다.\n const ranges = sampleGroups.map(group => Math.max(...group.values) - Math.min(...group.values))\n\n // 모든 샘플 그룹의 범위의 평균값(R-bar)을 계산합니다.\n const RBar = ranges.reduce((acc, cur) => acc + cur, 0) / ranges.length\n\n // 샘플 그룹의 크기(n)에 따라 D3와 D4 값을 설정합니다.\n // 예시에서는 n=5인 경우의 D3와 D4 값을 사용합니다. 실제 구현에서는 샘플 크기에 맞는 값을 사용해야 합니다.\n const n = sampleGroups[0].values.length // 가정: 모든 샘플 그룹의 크기가 동일합니다.\n const D3 = 0 // n=5에 대한 D3 값\n const D4 = 2.114 // n=5에 대한 D4 값\n\n // UCL과 LCL을 계산합니다.\n const UCL = D4 * RBar\n const LCL = D3 * RBar // D3가 0인 경우, LCL은 0이 됩니다.\n\n return {\n chartType: 'R',\n variableName,\n RBar,\n UCL,\n LCL,\n sampleGroups\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateUChartAnalysisResult = void 0;
|
|
4
|
+
function calculateUChartAnalysisResult(sampleGroups, variableName) {
|
|
5
|
+
// 단위당 결함 수의 평균(UBar)을 계산합니다.
|
|
6
|
+
const totalDefects = sampleGroups.reduce((acc, group) => acc + group.defects, 0);
|
|
7
|
+
const totalUnits = sampleGroups.reduce((acc, group) => acc + group.units, 0);
|
|
8
|
+
const UBar = totalDefects / totalUnits;
|
|
9
|
+
// 샘플 그룹의 크기(n)에 따라 상수를 결정합니다. 여기서는 일반적인 상수 값을 사용합니다.
|
|
10
|
+
const n = sampleGroups.length; // 샘플 그룹의 수
|
|
11
|
+
// UCL과 LCL 계산을 위한 상수. 실제 값은 샘플 크기와 분포에 따라 달라질 수 있습니다.
|
|
12
|
+
const UCL = UBar + 3 * Math.sqrt(UBar / totalUnits);
|
|
13
|
+
const LCL = UBar - 3 * Math.sqrt(UBar / totalUnits) < 0 ? 0 : UBar - 3 * Math.sqrt(UBar / totalUnits); // LCL이 음수가 되지 않도록 처리
|
|
14
|
+
return {
|
|
15
|
+
chartType: 'U',
|
|
16
|
+
variableName,
|
|
17
|
+
UBar,
|
|
18
|
+
UCL,
|
|
19
|
+
LCL,
|
|
20
|
+
sampleGroups
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
exports.calculateUChartAnalysisResult = calculateUChartAnalysisResult;
|
|
24
|
+
//# sourceMappingURL=u.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"u.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/u.ts"],"names":[],"mappings":";;;AAeA,SAAgB,6BAA6B,CAAC,YAA4B,EAAE,YAAoB;IAC9F,6BAA6B;IAC7B,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAChF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,IAAI,GAAG,YAAY,GAAG,UAAU,CAAA;IAEtC,qDAAqD;IACrD,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAA,CAAC,WAAW;IACzC,sDAAsD;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAA;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAA,CAAC,qBAAqB;IAE3H,OAAO;QACL,SAAS,EAAE,GAAG;QACd,YAAY;QACZ,IAAI;QACJ,GAAG;QACH,GAAG;QACH,YAAY;KACb,CAAA;AACH,CAAC;AApBD,sEAoBC","sourcesContent":["interface USampleGroup {\n groupId: string\n defects: number // 그룹 내의 총 결함 수\n units: number // 그룹 내의 단위 수\n}\n\ninterface UChartResult {\n chartType: 'U'\n variableName: string\n UBar: number // 단위당 결함 수의 평균\n UCL: number // 상한 제어선\n LCL: number // 하한 제어선\n sampleGroups: USampleGroup[]\n}\n\nexport function calculateUChartAnalysisResult(sampleGroups: USampleGroup[], variableName: string): UChartResult {\n // 단위당 결함 수의 평균(UBar)을 계산합니다.\n const totalDefects = sampleGroups.reduce((acc, group) => acc + group.defects, 0)\n const totalUnits = sampleGroups.reduce((acc, group) => acc + group.units, 0)\n const UBar = totalDefects / totalUnits\n\n // 샘플 그룹의 크기(n)에 따라 상수를 결정합니다. 여기서는 일반적인 상수 값을 사용합니다.\n const n = sampleGroups.length // 샘플 그룹의 수\n // UCL과 LCL 계산을 위한 상수. 실제 값은 샘플 크기와 분포에 따라 달라질 수 있습니다.\n const UCL = UBar + 3 * Math.sqrt(UBar / totalUnits)\n const LCL = UBar - 3 * Math.sqrt(UBar / totalUnits) < 0 ? 0 : UBar - 3 * Math.sqrt(UBar / totalUnits) // LCL이 음수가 되지 않도록 처리\n\n return {\n chartType: 'U',\n variableName,\n UBar,\n UCL,\n LCL,\n sampleGroups\n }\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateXBarAnalysisResult = void 0;
|
|
4
|
+
function getA2Value(sampleSize) {
|
|
5
|
+
const a2Values = {
|
|
6
|
+
2: 1.88,
|
|
7
|
+
3: 1.023,
|
|
8
|
+
4: 0.729,
|
|
9
|
+
5: 0.577,
|
|
10
|
+
6: 0.483
|
|
11
|
+
// 다른 샘플 크기에 대한 A2 값 추가...
|
|
12
|
+
};
|
|
13
|
+
return a2Values[sampleSize] || 0; // 샘플 크기에 대한 A2 값이 정의되지 않은 경우 0을 반환
|
|
14
|
+
}
|
|
15
|
+
function calculateXBarAnalysisResult(samples, variableName) {
|
|
16
|
+
// 샘플 그룹별로 데이터를 분류합니다.
|
|
17
|
+
const groupedSamples = samples.reduce((acc, sample) => {
|
|
18
|
+
acc[sample.groupId] = acc[sample.groupId] || [];
|
|
19
|
+
acc[sample.groupId].push(sample.value);
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
// 각 샘플 그룹의 평균을 계산합니다.
|
|
23
|
+
const groupMeans = Object.values(groupedSamples).map(values => {
|
|
24
|
+
return values.reduce((sum, val) => sum + val, 0) / values.length;
|
|
25
|
+
});
|
|
26
|
+
// 전체 평균(중심선, CL), 상한 제어선(UCL), 하한 제어선(LCL)을 계산합니다.
|
|
27
|
+
const overallMean = groupMeans.reduce((sum, val) => sum + val, 0) / groupMeans.length;
|
|
28
|
+
const standardDeviation = Math.sqrt(groupMeans.reduce((sum, mean) => sum + Math.pow(mean - overallMean, 2), 0) / groupMeans.length);
|
|
29
|
+
const sampleSize = Object.values(groupedSamples)[0].length; // 샘플 크기 추정(모든 그룹이 같은 크기를 가정)
|
|
30
|
+
const A2 = getA2Value(sampleSize);
|
|
31
|
+
const UCL = overallMean + A2 * standardDeviation;
|
|
32
|
+
const LCL = overallMean - A2 * standardDeviation;
|
|
33
|
+
return {
|
|
34
|
+
chartType: 'X-bar',
|
|
35
|
+
variables: [
|
|
36
|
+
{
|
|
37
|
+
name: variableName,
|
|
38
|
+
stats: {
|
|
39
|
+
mean: overallMean,
|
|
40
|
+
UCL: UCL,
|
|
41
|
+
LCL: LCL,
|
|
42
|
+
CL: overallMean
|
|
43
|
+
},
|
|
44
|
+
samples: samples
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
exports.calculateXBarAnalysisResult = calculateXBarAnalysisResult;
|
|
50
|
+
//# sourceMappingURL=x-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-bar.js","sourceRoot":"","sources":["../../../server/controllers/spc-\bchart/x-bar.ts"],"names":[],"mappings":";;;AAmBA,SAAS,UAAU,CAAC,UAAkB;IACpC,MAAM,QAAQ,GAA8B;QAC1C,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,0BAA0B;KAC3B,CAAA;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA,CAAC,mCAAmC;AACtE,CAAC;AAED,SAAgB,2BAA2B,CAAC,OAAiB,EAAE,YAAoB;IACjF,sBAAsB;IACtB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACpD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC/C,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtC,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAA8B,CAAC,CAAA;IAElC,sBAAsB;IACtB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,mDAAmD;IACnD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAA;IACrF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACnI,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA,CAAC,6BAA6B;IAExF,MAAM,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACjC,MAAM,GAAG,GAAG,WAAW,GAAG,EAAE,GAAG,iBAAiB,CAAA;IAChD,MAAM,GAAG,GAAG,WAAW,GAAG,EAAE,GAAG,iBAAiB,CAAA;IAEhD,OAAO;QACL,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,GAAG;oBACR,GAAG,EAAE,GAAG;oBACR,EAAE,EAAE,WAAW;iBAChB;gBACD,OAAO,EAAE,OAAO;aACjB;SACF;KACF,CAAA;AACH,CAAC;AArCD,kEAqCC","sourcesContent":["interface Sample {\n groupId: string // 샘플 그룹 ID\n value: number // 샘플 값\n}\n\ninterface XBarChartResult {\n chartType: 'X-bar'\n variables: Array<{\n name: string\n stats: {\n mean: number\n UCL: number\n LCL: number\n CL: number\n }\n samples: Sample[]\n }>\n}\n\nfunction getA2Value(sampleSize: number): number {\n const a2Values: { [key: number]: number } = {\n 2: 1.88,\n 3: 1.023,\n 4: 0.729,\n 5: 0.577,\n 6: 0.483\n // 다른 샘플 크기에 대한 A2 값 추가...\n }\n\n return a2Values[sampleSize] || 0 // 샘플 크기에 대한 A2 값이 정의되지 않은 경우 0을 반환\n}\n\nexport function calculateXBarAnalysisResult(samples: Sample[], variableName: string): XBarChartResult {\n // 샘플 그룹별로 데이터를 분류합니다.\n const groupedSamples = samples.reduce((acc, sample) => {\n acc[sample.groupId] = acc[sample.groupId] || []\n acc[sample.groupId].push(sample.value)\n return acc\n }, {} as Record<string, number[]>)\n\n // 각 샘플 그룹의 평균을 계산합니다.\n const groupMeans = Object.values(groupedSamples).map(values => {\n return values.reduce((sum, val) => sum + val, 0) / values.length\n })\n\n // 전체 평균(중심선, CL), 상한 제어선(UCL), 하한 제어선(LCL)을 계산합니다.\n const overallMean = groupMeans.reduce((sum, val) => sum + val, 0) / groupMeans.length\n const standardDeviation = Math.sqrt(groupMeans.reduce((sum, mean) => sum + Math.pow(mean - overallMean, 2), 0) / groupMeans.length)\n const sampleSize = Object.values(groupedSamples)[0].length // 샘플 크기 추정(모든 그룹이 같은 크기를 가정)\n\n const A2 = getA2Value(sampleSize)\n const UCL = overallMean + A2 * standardDeviation\n const LCL = overallMean - A2 * standardDeviation\n\n return {\n chartType: 'X-bar',\n variables: [\n {\n name: variableName,\n stats: {\n mean: overallMean,\n UCL: UCL,\n LCL: LCL,\n CL: overallMean\n },\n samples: samples\n }\n ]\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./service"), exports);
|
|
5
|
+
const dataset_1 = require("@things-factory/dataset");
|
|
6
|
+
const controllers_1 = require("./controllers");
|
|
7
|
+
process.on('bootstrap-module-start', async ({ app, config, schema }) => {
|
|
8
|
+
dataset_1.DataUseCase.registerUseCase('SPC', new controllers_1.DataUseCaseSPC());
|
|
9
|
+
console.log('[spc:bootstrap] SPC has just registered as a DataUseCase.');
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB;AAEzB,qDAAqD;AACrD,+CAA8C;AAE9C,OAAO,CAAC,EAAE,CAAC,wBAA+B,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAO,EAAE,EAAE;IACjF,qBAAW,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,4BAAc,EAAE,CAAC,CAAA;IAExD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;AAC1E,CAAC,CAAC,CAAA","sourcesContent":["export * from './service'\n\nimport { DataUseCase } from '@things-factory/dataset'\nimport { DataUseCaseSPC } from './controllers'\n\nprocess.on('bootstrap-module-start' as any, async ({ app, config, schema }: any) => {\n DataUseCase.registerUseCase('SPC', new DataUseCaseSPC())\n\n console.log('[spc:bootstrap] SPC has just registered as a DataUseCase.')\n})\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* EXPORT ENTITY TYPES */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.schema = exports.subscribers = exports.entities = void 0;
|
|
5
|
+
/* IMPORT ENTITIES AND RESOLVERS */
|
|
6
|
+
const spc_chart_1 = require("./spc-chart");
|
|
7
|
+
exports.entities = [
|
|
8
|
+
/* ENTITIES */
|
|
9
|
+
...spc_chart_1.entities
|
|
10
|
+
];
|
|
11
|
+
exports.subscribers = [
|
|
12
|
+
/* SUBSCRIBERS */
|
|
13
|
+
...spc_chart_1.subscribers
|
|
14
|
+
];
|
|
15
|
+
exports.schema = {
|
|
16
|
+
resolverClasses: [
|
|
17
|
+
/* RESOLVER CLASSES */
|
|
18
|
+
...spc_chart_1.resolvers
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;AAEzB,mCAAmC;AACnC,2CAA8H;AAEjH,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,iBAAiB;IACjB,GAAG,uBAAmB;CACvB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as SpcChartEntities, resolvers as SpcChartResolvers, subscribers as SpcChartSubscribers } from './spc-chart'\n\nexport const entities = [\n /* ENTITIES */\n ...SpcChartEntities\n]\n\nexport const subscribers = [\n /* SUBSCRIBERS */\n ...SpcChartSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...SpcChartResolvers\n ]\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.subscribers = exports.resolvers = exports.entities = void 0;
|
|
4
|
+
const spc_chart_query_1 = require("./spc-chart-query");
|
|
5
|
+
exports.entities = [];
|
|
6
|
+
exports.resolvers = [spc_chart_query_1.SpcChartQuery];
|
|
7
|
+
exports.subscribers = [];
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/spc-chart/index.ts"],"names":[],"mappings":";;;AAAA,uDAAiD;AAEpC,QAAA,QAAQ,GAAG,EAAE,CAAA;AACb,QAAA,SAAS,GAAG,CAAC,+BAAa,CAAC,CAAA;AAC3B,QAAA,WAAW,GAAG,EAAE,CAAA","sourcesContent":["import { SpcChartQuery } from './spc-chart-query'\n\nexport const entities = []\nexport const resolvers = [SpcChartQuery]\nexport const subscribers = []\n"]}
|