@things-factory/spc 7.0.0-alpha.18
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 +322 -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 +44 -0
- package/dist-client/pages/spc-chart-page.js +309 -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/rules/cp-cpk.js +21 -0
- package/dist-server/controllers/rules/cp-cpk.js.map +1 -0
- package/dist-server/controllers/spc-chart/c.js +26 -0
- package/dist-server/controllers/spc-chart/c.js.map +1 -0
- package/dist-server/controllers/spc-chart/histogram.js +26 -0
- package/dist-server/controllers/spc-chart/histogram.js.map +1 -0
- package/dist-server/controllers/spc-chart/i.js +26 -0
- package/dist-server/controllers/spc-chart/i.js.map +1 -0
- package/dist-server/controllers/spc-chart/index.js +172 -0
- package/dist-server/controllers/spc-chart/index.js.map +1 -0
- package/dist-server/controllers/spc-chart/mr.js +25 -0
- package/dist-server/controllers/spc-chart/mr.js.map +1 -0
- package/dist-server/controllers/spc-chart/np.js +26 -0
- package/dist-server/controllers/spc-chart/np.js.map +1 -0
- package/dist-server/controllers/spc-chart/p.js +25 -0
- package/dist-server/controllers/spc-chart/p.js.map +1 -0
- package/dist-server/controllers/spc-chart/pareto.js +24 -0
- package/dist-server/controllers/spc-chart/pareto.js.map +1 -0
- package/dist-server/controllers/spc-chart/r.js +31 -0
- package/dist-server/controllers/spc-chart/r.js.map +1 -0
- package/dist-server/controllers/spc-chart/u.js +27 -0
- package/dist-server/controllers/spc-chart/u.js.map +1 -0
- package/dist-server/controllers/spc-chart/x-bar-r.js +45 -0
- package/dist-server/controllers/spc-chart/x-bar-r.js.map +1 -0
- package/dist-server/controllers/spc-chart/x-bar.js +45 -0
- package/dist-server/controllers/spc-chart/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 +99 -0
- package/dist-server/service/spc-chart/spc-chart-query.js.map +1 -0
- package/dist-server/service/spc-chart/spc-chart-type.js +134 -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 +37 -0
- package/server/controllers/data-use-case-spc.ts +44 -0
- package/server/controllers/index.ts +1 -0
- package/server/controllers/rules/cp-cpk.ts +29 -0
- package/server/controllers/spc-chart/c.ts +31 -0
- package/server/controllers/spc-chart/histogram.ts +38 -0
- package/server/controllers/spc-chart/i.ts +31 -0
- package/server/controllers/spc-chart/index.ts +171 -0
- package/server/controllers/spc-chart/mr.ts +30 -0
- package/server/controllers/spc-chart/np.ts +30 -0
- package/server/controllers/spc-chart/p.ts +29 -0
- package/server/controllers/spc-chart/pareto.ts +32 -0
- package/server/controllers/spc-chart/r.ts +34 -0
- package/server/controllers/spc-chart/u.ts +31 -0
- package/server/controllers/spc-chart/x-bar-r.ts +53 -0
- package/server/controllers/spc-chart/x-bar.ts +53 -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 +102 -0
- package/server/service/spc-chart/spc-chart-type.ts +105 -0
- package/server/tsconfig.json +10 -0
- package/things-factory.config.js +11 -0
- package/translations/en.json +3 -0
- package/translations/ja.json +3 -0
- package/translations/ko.json +3 -0
- package/translations/ms.json +3 -0
- package/translations/zh.json +3 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SPCChartPlot, SPCChartAnalysis } from '../../service/spc-chart/spc-chart-type'
|
|
2
|
+
|
|
3
|
+
export function calculateUChartAnalysisResult(plots: SPCChartPlot[]): SPCChartAnalysis {
|
|
4
|
+
// 각 샘플의 평균을 계산
|
|
5
|
+
plots = plots.map(plot => ({
|
|
6
|
+
...plot,
|
|
7
|
+
defects: plot.values.map(Boolean).length,
|
|
8
|
+
n: plot.values.length
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
// 단위당 결함 수의 평균(UBar)을 계산합니다.
|
|
12
|
+
const totalDefects = plots.reduce((acc, plot) => acc + plot.defects, 0)
|
|
13
|
+
const totalUnits = plots.reduce((acc, plot) => acc + plot.n, 0)
|
|
14
|
+
const UBar = totalDefects / totalUnits
|
|
15
|
+
|
|
16
|
+
// 샘플 그룹의 크기(n)에 따라 상수를 결정합니다. 여기서는 일반적인 상수 값을 사용합니다.
|
|
17
|
+
const n = plots.length // 샘플 그룹의 수
|
|
18
|
+
// UCL과 LCL 계산을 위한 상수. 실제 값은 샘플 크기와 분포에 따라 달라질 수 있습니다.
|
|
19
|
+
const ucl = UBar + 3 * Math.sqrt(UBar / totalUnits)
|
|
20
|
+
const lcl = UBar - 3 * Math.sqrt(UBar / totalUnits) < 0 ? 0 : UBar - 3 * Math.sqrt(UBar / totalUnits) // LCL이 음수가 되지 않도록 처리
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
chartType: 'U',
|
|
24
|
+
controlLimits: {
|
|
25
|
+
ucl,
|
|
26
|
+
lcl,
|
|
27
|
+
cl: UBar
|
|
28
|
+
},
|
|
29
|
+
plots
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SPCChartPlot, SPCChartAnalysis } from '../../service/spc-chart/spc-chart-type'
|
|
2
|
+
|
|
3
|
+
function getA2Value(sampleSize: number): number {
|
|
4
|
+
const a2Values: { [key: number]: number } = {
|
|
5
|
+
2: 1.88,
|
|
6
|
+
3: 1.023,
|
|
7
|
+
4: 0.729,
|
|
8
|
+
5: 0.577,
|
|
9
|
+
6: 0.483
|
|
10
|
+
// 다른 샘플 크기에 대한 A2 값 추가...
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return a2Values[sampleSize] || 0 // 샘플 크기에 대한 A2 값이 정의되지 않은 경우 0을 반환
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function calculateXBarAnalysisResult(plots: SPCChartPlot[]): SPCChartAnalysis {
|
|
17
|
+
// 각 샘플의 평균을 계산
|
|
18
|
+
plots = plots.map(plot => ({
|
|
19
|
+
...plot,
|
|
20
|
+
xbar: plot.values ? plot.values.reduce((sum, val) => sum + val, 0) / plot.values.length : 0,
|
|
21
|
+
r: Math.max(...plot.values) - Math.min(...plot.values)
|
|
22
|
+
}))
|
|
23
|
+
|
|
24
|
+
const plotSize = plots[0]?.values?.length // 샘플 크기 추정(모든 그룹이 같은 크기를 가정)
|
|
25
|
+
|
|
26
|
+
// 각 샘플의 범위(R) 계산
|
|
27
|
+
const ranges = plots.map(plot => {
|
|
28
|
+
if (plot.values) {
|
|
29
|
+
return Math.max(...plot.values) - Math.min(...plot.values)
|
|
30
|
+
}
|
|
31
|
+
return 0
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// 범위(R)의 평균 계산
|
|
35
|
+
const averageRange = ranges.reduce((sum, r) => sum + r, 0) / ranges.length
|
|
36
|
+
|
|
37
|
+
// 전체 평균(중심선, CL) 계산
|
|
38
|
+
const overallMean = plots.reduce((sum, plot) => sum + plot.xbar, 0) / plots.length
|
|
39
|
+
|
|
40
|
+
const A2 = getA2Value(plotSize)
|
|
41
|
+
const ucl = overallMean + A2 * averageRange
|
|
42
|
+
const lcl = overallMean - A2 * averageRange
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
chartType: 'Xbar',
|
|
46
|
+
controlLimits: {
|
|
47
|
+
ucl,
|
|
48
|
+
lcl,
|
|
49
|
+
cl: overallMean
|
|
50
|
+
},
|
|
51
|
+
plots
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SPCChartPlot, SPCChartAnalysis } from '../../service/spc-chart/spc-chart-type'
|
|
2
|
+
|
|
3
|
+
function getA2Value(sampleSize: number): number {
|
|
4
|
+
const a2Values: { [key: number]: number } = {
|
|
5
|
+
2: 1.88,
|
|
6
|
+
3: 1.023,
|
|
7
|
+
4: 0.729,
|
|
8
|
+
5: 0.577,
|
|
9
|
+
6: 0.483
|
|
10
|
+
// 다른 샘플 크기에 대한 A2 값 추가...
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return a2Values[sampleSize] || 0 // 샘플 크기에 대한 A2 값이 정의되지 않은 경우 0을 반환
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function calculateXBarAnalysisResult(plots: SPCChartPlot[]): SPCChartAnalysis {
|
|
17
|
+
// 각 샘플의 평균을 계산
|
|
18
|
+
plots = plots.map(plot => ({
|
|
19
|
+
...plot,
|
|
20
|
+
xbar: plot.values ? plot.values.reduce((sum, val) => sum + val, 0) / plot.values.length : 0,
|
|
21
|
+
r: Math.max(...plot.values) - Math.min(...plot.values)
|
|
22
|
+
}))
|
|
23
|
+
|
|
24
|
+
const plotSize = plots[0]?.values?.length // 샘플 크기 추정(모든 그룹이 같은 크기를 가정)
|
|
25
|
+
|
|
26
|
+
// 각 샘플의 범위(R) 계산
|
|
27
|
+
const ranges = plots.map(plot => {
|
|
28
|
+
if (plot.values) {
|
|
29
|
+
return Math.max(...plot.values) - Math.min(...plot.values)
|
|
30
|
+
}
|
|
31
|
+
return 0
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// 범위(R)의 평균 계산
|
|
35
|
+
const averageRange = ranges.reduce((sum, r) => sum + r, 0) / ranges.length
|
|
36
|
+
|
|
37
|
+
// 전체 평균(중심선, CL) 계산
|
|
38
|
+
const overallMean = plots.reduce((sum, plot) => sum + plot.xbar, 0) / plots.length
|
|
39
|
+
|
|
40
|
+
const A2 = getA2Value(plotSize)
|
|
41
|
+
const ucl = overallMean + A2 * averageRange
|
|
42
|
+
const lcl = overallMean - A2 * averageRange
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
chartType: 'Xbar',
|
|
46
|
+
controlLimits: {
|
|
47
|
+
ucl,
|
|
48
|
+
lcl,
|
|
49
|
+
cl: overallMean
|
|
50
|
+
},
|
|
51
|
+
plots
|
|
52
|
+
}
|
|
53
|
+
}
|
package/server/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './service'
|
|
2
|
+
|
|
3
|
+
import { DataUseCase } from '@things-factory/dataset'
|
|
4
|
+
import { DataUseCaseSPC } from './controllers'
|
|
5
|
+
|
|
6
|
+
process.on('bootstrap-module-start' as any, async ({ app, config, schema }: any) => {
|
|
7
|
+
DataUseCase.registerUseCase('SPC', new DataUseCaseSPC())
|
|
8
|
+
|
|
9
|
+
console.log('[spc:bootstrap] SPC has just registered as a DataUseCase.')
|
|
10
|
+
})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* EXPORT ENTITY TYPES */
|
|
2
|
+
|
|
3
|
+
/* IMPORT ENTITIES AND RESOLVERS */
|
|
4
|
+
import { entities as SpcChartEntities, resolvers as SpcChartResolvers, subscribers as SpcChartSubscribers } from './spc-chart'
|
|
5
|
+
|
|
6
|
+
export const entities = [
|
|
7
|
+
/* ENTITIES */
|
|
8
|
+
...SpcChartEntities
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
export const subscribers = [
|
|
12
|
+
/* SUBSCRIBERS */
|
|
13
|
+
...SpcChartSubscribers
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
export const schema = {
|
|
17
|
+
resolverClasses: [
|
|
18
|
+
/* RESOLVER CLASSES */
|
|
19
|
+
...SpcChartResolvers
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Resolver, Query, Arg, Ctx } from 'type-graphql'
|
|
2
|
+
import { Between, In } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { getRepository } from '@things-factory/shell'
|
|
5
|
+
import { User } from '@things-factory/auth-base'
|
|
6
|
+
import { DataSet, DataSample } from '@things-factory/dataset'
|
|
7
|
+
|
|
8
|
+
import { SPCChartAnalysis, SPCChartAnalysisResult } from './spc-chart-type'
|
|
9
|
+
import { calculateXBarAnalysisResult } from '../../controllers/spc-chart/x-bar'
|
|
10
|
+
import { calculateRChartAnalysisResult } from '../../controllers/spc-chart/r'
|
|
11
|
+
import { calculateIChartAnalysisResult } from '../../controllers/spc-chart/i'
|
|
12
|
+
import { calculateMRChartAnalysisResult } from '../../controllers/spc-chart/mr'
|
|
13
|
+
import { calculateUChartAnalysisResult } from '../../controllers/spc-chart/u'
|
|
14
|
+
import { calculateCChartAnalysisResult } from '../../controllers/spc-chart/c'
|
|
15
|
+
import { calculatePChartAnalysisResult } from '../../controllers/spc-chart/p'
|
|
16
|
+
import { calculateNPChartAnalysisResult } from '../../controllers/spc-chart/np'
|
|
17
|
+
|
|
18
|
+
@Resolver(DataSet)
|
|
19
|
+
export class SpcChartQuery {
|
|
20
|
+
@Query(returns => SPCChartAnalysisResult!, { nullable: true, description: 'To fetch a SpcChart' })
|
|
21
|
+
async spcChart(
|
|
22
|
+
@Arg('dataSetId') dataSetId: string,
|
|
23
|
+
@Arg('variable') variable: string,
|
|
24
|
+
@Arg('chartType') chartType: string,
|
|
25
|
+
@Arg('fromDate') fromDate: string,
|
|
26
|
+
@Arg('toDate') toDate: string,
|
|
27
|
+
@Ctx() context: ResolverContext
|
|
28
|
+
): Promise<SPCChartAnalysisResult> {
|
|
29
|
+
const { domain } = context.state
|
|
30
|
+
|
|
31
|
+
const dataSet = (await getRepository(DataSet).findOne({
|
|
32
|
+
where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId }
|
|
33
|
+
})) as DataSet
|
|
34
|
+
|
|
35
|
+
if (!dataSet) {
|
|
36
|
+
throw 'no given dataset'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const dataItem = dataSet.dataItems.find(dataItem => dataItem.name == variable)
|
|
40
|
+
|
|
41
|
+
if (!dataItem) {
|
|
42
|
+
throw 'no given variables in the dataset'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// TODO timezone
|
|
46
|
+
const fromTime = new Date(fromDate) /* default: 30days before */
|
|
47
|
+
const toTime = new Date(toDate) /* default: today */
|
|
48
|
+
|
|
49
|
+
const dataSamples = (await getRepository(DataSample).find({
|
|
50
|
+
where: {
|
|
51
|
+
dataSet: { id: dataSet.id },
|
|
52
|
+
createdAt: Between(fromTime, toTime)
|
|
53
|
+
}
|
|
54
|
+
})) as DataSample[]
|
|
55
|
+
|
|
56
|
+
const tag = dataItem.tag
|
|
57
|
+
const samples = dataSamples
|
|
58
|
+
.map(dataSample => {
|
|
59
|
+
const data = dataSample.data[tag]
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
x: dataSample.createdAt,
|
|
63
|
+
values: Array.isArray(data) ? data : [data]
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
.filter(sample => {
|
|
67
|
+
const { x, values } = sample
|
|
68
|
+
return x && values && values.length > 0 && values.every(v => v ?? false)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const charts = [] as SPCChartAnalysis[]
|
|
72
|
+
|
|
73
|
+
switch (chartType) {
|
|
74
|
+
case 'Xbar-R':
|
|
75
|
+
charts.push(calculateXBarAnalysisResult(samples))
|
|
76
|
+
charts.push(calculateRChartAnalysisResult(samples))
|
|
77
|
+
break
|
|
78
|
+
case 'I-MR':
|
|
79
|
+
charts.push(calculateIChartAnalysisResult(samples))
|
|
80
|
+
charts.push(calculateMRChartAnalysisResult(samples))
|
|
81
|
+
break
|
|
82
|
+
case 'C':
|
|
83
|
+
charts.push(calculateUChartAnalysisResult(samples))
|
|
84
|
+
break
|
|
85
|
+
case 'U':
|
|
86
|
+
charts.push(calculateCChartAnalysisResult(samples))
|
|
87
|
+
break
|
|
88
|
+
case 'P':
|
|
89
|
+
charts.push(calculatePChartAnalysisResult(samples))
|
|
90
|
+
break
|
|
91
|
+
case 'NP':
|
|
92
|
+
charts.push(calculateNPChartAnalysisResult(samples))
|
|
93
|
+
break
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
dataSet,
|
|
98
|
+
variable,
|
|
99
|
+
charts
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ObjectType, Field, ID, Int, Float } from 'type-graphql'
|
|
2
|
+
|
|
3
|
+
import { DataSet } from '@things-factory/dataset'
|
|
4
|
+
|
|
5
|
+
@ObjectType()
|
|
6
|
+
export class SPCChartPlot {
|
|
7
|
+
@Field(type => ID)
|
|
8
|
+
x: string
|
|
9
|
+
|
|
10
|
+
@Field(type => [Float], { nullable: true })
|
|
11
|
+
values?: number[]
|
|
12
|
+
|
|
13
|
+
@Field(type => Float, { nullable: true })
|
|
14
|
+
xbar?: number
|
|
15
|
+
|
|
16
|
+
@Field(type => Float, { nullable: true })
|
|
17
|
+
r?: number
|
|
18
|
+
|
|
19
|
+
@Field(type => Float, { nullable: true })
|
|
20
|
+
i?: number
|
|
21
|
+
|
|
22
|
+
@Field(type => Float, { nullable: true })
|
|
23
|
+
mr?: number
|
|
24
|
+
|
|
25
|
+
@Field(type => Float, { nullable: true })
|
|
26
|
+
n?: number
|
|
27
|
+
|
|
28
|
+
@Field(type => Float, { nullable: true })
|
|
29
|
+
defects?: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@ObjectType()
|
|
33
|
+
class SPCControlLimits {
|
|
34
|
+
@Field(type => Float, { nullable: true })
|
|
35
|
+
ucl?: number
|
|
36
|
+
|
|
37
|
+
@Field(type => Float, { nullable: true })
|
|
38
|
+
lcl?: number
|
|
39
|
+
|
|
40
|
+
@Field(type => Float, { nullable: true })
|
|
41
|
+
cl?: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@ObjectType()
|
|
45
|
+
class SPCSpecLimits {
|
|
46
|
+
@Field(type => Float, { nullable: true })
|
|
47
|
+
target?: number
|
|
48
|
+
|
|
49
|
+
@Field(type => Float, { nullable: true })
|
|
50
|
+
lsl?: number
|
|
51
|
+
|
|
52
|
+
@Field(type => Float, { nullable: true })
|
|
53
|
+
usl?: number
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@ObjectType()
|
|
57
|
+
export class SPCChartAnalysis {
|
|
58
|
+
@Field()
|
|
59
|
+
chartType: string
|
|
60
|
+
|
|
61
|
+
@Field(type => SPCControlLimits, { nullable: true })
|
|
62
|
+
controlLimits?: SPCControlLimits
|
|
63
|
+
|
|
64
|
+
@Field(type => SPCSpecLimits, { nullable: true })
|
|
65
|
+
specLimits?: SPCSpecLimits
|
|
66
|
+
|
|
67
|
+
@Field(type => [SPCChartPlot], { nullable: true })
|
|
68
|
+
plots?: SPCChartPlot[]
|
|
69
|
+
|
|
70
|
+
// @Field(type => [Bin], { nullable: true })
|
|
71
|
+
// bins?: Bin[]
|
|
72
|
+
|
|
73
|
+
// @Field(type => [Category], { nullable: true })
|
|
74
|
+
// categories?: Category[]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// @ObjectType()
|
|
78
|
+
// class Bin {
|
|
79
|
+
// @Field()
|
|
80
|
+
// binRange: string
|
|
81
|
+
|
|
82
|
+
// @Field()
|
|
83
|
+
// count: number
|
|
84
|
+
// }
|
|
85
|
+
|
|
86
|
+
// @ObjectType()
|
|
87
|
+
// class Category {
|
|
88
|
+
// @Field()
|
|
89
|
+
// category: string
|
|
90
|
+
|
|
91
|
+
// @Field()
|
|
92
|
+
// count: number
|
|
93
|
+
// }
|
|
94
|
+
|
|
95
|
+
@ObjectType()
|
|
96
|
+
export class SPCChartAnalysisResult {
|
|
97
|
+
@Field(type => DataSet)
|
|
98
|
+
dataSet: DataSet
|
|
99
|
+
|
|
100
|
+
@Field()
|
|
101
|
+
variable: string
|
|
102
|
+
|
|
103
|
+
@Field(type => [SPCChartAnalysis])
|
|
104
|
+
charts: SPCChartAnalysis[]
|
|
105
|
+
}
|