@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.
Files changed (84) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/client/bootstrap.ts +1 -0
  3. package/client/index.ts +0 -0
  4. package/client/pages/spc-chart-page.ts +118 -0
  5. package/client/route.ts +7 -0
  6. package/client/tsconfig.json +13 -0
  7. package/dist-client/bootstrap.d.ts +1 -0
  8. package/dist-client/bootstrap.js +2 -0
  9. package/dist-client/bootstrap.js.map +1 -0
  10. package/dist-client/index.d.ts +0 -0
  11. package/dist-client/index.js +2 -0
  12. package/dist-client/index.js.map +1 -0
  13. package/dist-client/pages/spc-chart-page.d.ts +26 -0
  14. package/dist-client/pages/spc-chart-page.js +121 -0
  15. package/dist-client/pages/spc-chart-page.js.map +1 -0
  16. package/dist-client/route.d.ts +1 -0
  17. package/dist-client/route.js +8 -0
  18. package/dist-client/route.js.map +1 -0
  19. package/dist-client/tsconfig.tsbuildinfo +1 -0
  20. package/dist-server/controllers/data-use-case-spc.js +40 -0
  21. package/dist-server/controllers/data-use-case-spc.js.map +1 -0
  22. package/dist-server/controllers/index.js +5 -0
  23. package/dist-server/controllers/index.js.map +1 -0
  24. package/dist-server/controllers/spc-/bchart/c.js +21 -0
  25. package/dist-server/controllers/spc-/bchart/c.js.map +1 -0
  26. package/dist-server/controllers/spc-/bchart/histogram.js +27 -0
  27. package/dist-server/controllers/spc-/bchart/histogram.js.map +1 -0
  28. package/dist-server/controllers/spc-/bchart/i.js +23 -0
  29. package/dist-server/controllers/spc-/bchart/i.js.map +1 -0
  30. package/dist-server/controllers/spc-/bchart/index.js +172 -0
  31. package/dist-server/controllers/spc-/bchart/index.js.map +1 -0
  32. package/dist-server/controllers/spc-/bchart/mr.js +24 -0
  33. package/dist-server/controllers/spc-/bchart/mr.js.map +1 -0
  34. package/dist-server/controllers/spc-/bchart/np.js +23 -0
  35. package/dist-server/controllers/spc-/bchart/np.js.map +1 -0
  36. package/dist-server/controllers/spc-/bchart/p.js +22 -0
  37. package/dist-server/controllers/spc-/bchart/p.js.map +1 -0
  38. package/dist-server/controllers/spc-/bchart/pareto.js +25 -0
  39. package/dist-server/controllers/spc-/bchart/pareto.js.map +1 -0
  40. package/dist-server/controllers/spc-/bchart/r.js +27 -0
  41. package/dist-server/controllers/spc-/bchart/r.js.map +1 -0
  42. package/dist-server/controllers/spc-/bchart/u.js +24 -0
  43. package/dist-server/controllers/spc-/bchart/u.js.map +1 -0
  44. package/dist-server/controllers/spc-/bchart/x-bar.js +50 -0
  45. package/dist-server/controllers/spc-/bchart/x-bar.js.map +1 -0
  46. package/dist-server/index.js +11 -0
  47. package/dist-server/index.js.map +1 -0
  48. package/dist-server/service/index.js +21 -0
  49. package/dist-server/service/index.js.map +1 -0
  50. package/dist-server/service/spc-chart/index.js +8 -0
  51. package/dist-server/service/spc-chart/index.js.map +1 -0
  52. package/dist-server/service/spc-chart/spc-chart-query.js +198 -0
  53. package/dist-server/service/spc-chart/spc-chart-query.js.map +1 -0
  54. package/dist-server/service/spc-chart/spc-chart-type.js +148 -0
  55. package/dist-server/service/spc-chart/spc-chart-type.js.map +1 -0
  56. package/dist-server/tsconfig.tsbuildinfo +1 -0
  57. package/helps/spc/spc-chart-concept.md +59 -0
  58. package/helps/spc/spc-chart.md +68 -0
  59. package/package.json +36 -0
  60. package/server/controllers/data-use-case-spc.ts +44 -0
  61. package/server/controllers/index.ts +1 -0
  62. package/server/controllers/spc-/bchart/c.ts +31 -0
  63. package/server/controllers/spc-/bchart/histogram.ts +40 -0
  64. package/server/controllers/spc-/bchart/i.ts +35 -0
  65. package/server/controllers/spc-/bchart/index.ts +171 -0
  66. package/server/controllers/spc-/bchart/mr.ts +37 -0
  67. package/server/controllers/spc-/bchart/np.ts +35 -0
  68. package/server/controllers/spc-/bchart/p.ts +34 -0
  69. package/server/controllers/spc-/bchart/pareto.ts +34 -0
  70. package/server/controllers/spc-/bchart/r.ts +40 -0
  71. package/server/controllers/spc-/bchart/u.ts +36 -0
  72. package/server/controllers/spc-/bchart/x-bar.ts +70 -0
  73. package/server/index.ts +10 -0
  74. package/server/service/index.ts +21 -0
  75. package/server/service/spc-chart/index.ts +5 -0
  76. package/server/service/spc-chart/spc-chart-query.ts +192 -0
  77. package/server/service/spc-chart/spc-chart-type.ts +103 -0
  78. package/server/tsconfig.json +10 -0
  79. package/things-factory.config.js +11 -0
  80. package/translations/en.json +1 -0
  81. package/translations/ja.json +1 -0
  82. package/translations/ko.json +1 -0
  83. package/translations/ms.json +1 -0
  84. package/translations/zh.json +1 -0
@@ -0,0 +1,36 @@
1
+ interface USampleGroup {
2
+ groupId: string
3
+ defects: number // 그룹 내의 총 결함 수
4
+ units: number // 그룹 내의 단위 수
5
+ }
6
+
7
+ interface UChartResult {
8
+ chartType: 'U'
9
+ variableName: string
10
+ UBar: number // 단위당 결함 수의 평균
11
+ UCL: number // 상한 제어선
12
+ LCL: number // 하한 제어선
13
+ sampleGroups: USampleGroup[]
14
+ }
15
+
16
+ export function calculateUChartAnalysisResult(sampleGroups: USampleGroup[], variableName: string): UChartResult {
17
+ // 단위당 결함 수의 평균(UBar)을 계산합니다.
18
+ const totalDefects = sampleGroups.reduce((acc, group) => acc + group.defects, 0)
19
+ const totalUnits = sampleGroups.reduce((acc, group) => acc + group.units, 0)
20
+ const UBar = totalDefects / totalUnits
21
+
22
+ // 샘플 그룹의 크기(n)에 따라 상수를 결정합니다. 여기서는 일반적인 상수 값을 사용합니다.
23
+ const n = sampleGroups.length // 샘플 그룹의 수
24
+ // UCL과 LCL 계산을 위한 상수. 실제 값은 샘플 크기와 분포에 따라 달라질 수 있습니다.
25
+ const UCL = UBar + 3 * Math.sqrt(UBar / totalUnits)
26
+ const LCL = UBar - 3 * Math.sqrt(UBar / totalUnits) < 0 ? 0 : UBar - 3 * Math.sqrt(UBar / totalUnits) // LCL이 음수가 되지 않도록 처리
27
+
28
+ return {
29
+ chartType: 'U',
30
+ variableName,
31
+ UBar,
32
+ UCL,
33
+ LCL,
34
+ sampleGroups
35
+ }
36
+ }
@@ -0,0 +1,70 @@
1
+ interface Sample {
2
+ groupId: string // 샘플 그룹 ID
3
+ value: number // 샘플 값
4
+ }
5
+
6
+ interface XBarChartResult {
7
+ chartType: 'X-bar'
8
+ variables: Array<{
9
+ name: string
10
+ stats: {
11
+ mean: number
12
+ UCL: number
13
+ LCL: number
14
+ CL: number
15
+ }
16
+ samples: Sample[]
17
+ }>
18
+ }
19
+
20
+ function getA2Value(sampleSize: number): number {
21
+ const a2Values: { [key: number]: number } = {
22
+ 2: 1.88,
23
+ 3: 1.023,
24
+ 4: 0.729,
25
+ 5: 0.577,
26
+ 6: 0.483
27
+ // 다른 샘플 크기에 대한 A2 값 추가...
28
+ }
29
+
30
+ return a2Values[sampleSize] || 0 // 샘플 크기에 대한 A2 값이 정의되지 않은 경우 0을 반환
31
+ }
32
+
33
+ export function calculateXBarAnalysisResult(samples: Sample[], variableName: string): XBarChartResult {
34
+ // 샘플 그룹별로 데이터를 분류합니다.
35
+ const groupedSamples = samples.reduce((acc, sample) => {
36
+ acc[sample.groupId] = acc[sample.groupId] || []
37
+ acc[sample.groupId].push(sample.value)
38
+ return acc
39
+ }, {} as Record<string, number[]>)
40
+
41
+ // 각 샘플 그룹의 평균을 계산합니다.
42
+ const groupMeans = Object.values(groupedSamples).map(values => {
43
+ return values.reduce((sum, val) => sum + val, 0) / values.length
44
+ })
45
+
46
+ // 전체 평균(중심선, CL), 상한 제어선(UCL), 하한 제어선(LCL)을 계산합니다.
47
+ const overallMean = groupMeans.reduce((sum, val) => sum + val, 0) / groupMeans.length
48
+ const standardDeviation = Math.sqrt(groupMeans.reduce((sum, mean) => sum + Math.pow(mean - overallMean, 2), 0) / groupMeans.length)
49
+ const sampleSize = Object.values(groupedSamples)[0].length // 샘플 크기 추정(모든 그룹이 같은 크기를 가정)
50
+
51
+ const A2 = getA2Value(sampleSize)
52
+ const UCL = overallMean + A2 * standardDeviation
53
+ const LCL = overallMean - A2 * standardDeviation
54
+
55
+ return {
56
+ chartType: 'X-bar',
57
+ variables: [
58
+ {
59
+ name: variableName,
60
+ stats: {
61
+ mean: overallMean,
62
+ UCL: UCL,
63
+ LCL: LCL,
64
+ CL: overallMean
65
+ },
66
+ samples: samples
67
+ }
68
+ ]
69
+ }
70
+ }
@@ -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,5 @@
1
+ import { SpcChartQuery } from './spc-chart-query'
2
+
3
+ export const entities = []
4
+ export const resolvers = [SpcChartQuery]
5
+ export const subscribers = []
@@ -0,0 +1,192 @@
1
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { Attachment } from '@things-factory/attachment-base'
3
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
+ import { User } from '@things-factory/auth-base'
5
+ import { DataSet } from '@things-factory/dataset'
6
+
7
+ import { AnalysisResult } from './spc-chart-type'
8
+
9
+ @Resolver(DataSet)
10
+ export class SpcChartQuery {
11
+ @Query(returns => AnalysisResult!, { nullable: true, description: 'To fetch a SpcChart' })
12
+ async spcChart(
13
+ @Arg('dataSetId') dataSetId: string,
14
+ @Arg('startDate') startDate: string,
15
+ @Arg('endDate') endDate: string,
16
+ @Arg('variable') variable: string,
17
+ @Ctx() context: ResolverContext
18
+ ): Promise<AnalysisResult> {
19
+ const { domain } = context.state
20
+
21
+ return {
22
+ dataSet: {
23
+ id: 'aaa',
24
+ name: 'bbb'
25
+ },
26
+ analysisResults: [
27
+ {
28
+ chartType: 'X-bar',
29
+ variables: [
30
+ {
31
+ name: 'variable1',
32
+ stats: {
33
+ mean: 22,
34
+ UCL: 25,
35
+ LCL: 19,
36
+ CL: 22
37
+ },
38
+ samples: [
39
+ { sampleId: '1', value: 22 },
40
+ { sampleId: '2', value: 23 }
41
+ ]
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ chartType: 'R',
47
+ variables: [
48
+ {
49
+ name: 'variable2',
50
+ stats: {
51
+ range: 1.3,
52
+ UCL: 2.1,
53
+ LCL: 0.5,
54
+ CL: 1.3
55
+ },
56
+ samples: [
57
+ { sampleId: '1', value: 1.2 },
58
+ { sampleId: '2', value: 1.3 }
59
+ ]
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ chartType: 'p',
65
+ variables: [
66
+ {
67
+ name: 'variable3',
68
+ stats: {
69
+ proportion: 0.05,
70
+ UCL: 0.1,
71
+ LCL: 0.01
72
+ },
73
+ samples: [
74
+ { sampleId: '1', value: 0.05 },
75
+ { sampleId: '2', value: 0.06 }
76
+ ]
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ chartType: 'np',
82
+ variables: [
83
+ {
84
+ name: 'variable4',
85
+ stats: {
86
+ nonconforming: 5,
87
+ UCL: 10,
88
+ LCL: 1
89
+ },
90
+ samples: [
91
+ { sampleId: '1', value: 5 },
92
+ { sampleId: '2', value: 4 }
93
+ ]
94
+ }
95
+ ]
96
+ },
97
+ {
98
+ chartType: 'c',
99
+ variables: [
100
+ {
101
+ name: 'variable5',
102
+ stats: {
103
+ count: 20,
104
+ UCL: 25,
105
+ LCL: 15
106
+ },
107
+ samples: [
108
+ { sampleId: '1', value: 20 },
109
+ { sampleId: '2', value: 21 }
110
+ ]
111
+ }
112
+ ]
113
+ },
114
+ {
115
+ chartType: 'u',
116
+ variables: [
117
+ {
118
+ name: 'variable6',
119
+ stats: {
120
+ defectsPerUnit: 1.2,
121
+ UCL: 1.5,
122
+ LCL: 0.9
123
+ },
124
+ samples: [
125
+ { sampleId: '1', value: 1.2 },
126
+ { sampleId: '2', value: 1.1 }
127
+ ]
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ chartType: 'I',
133
+ variables: [
134
+ {
135
+ name: 'variable7',
136
+ stats: {
137
+ individualValue: 10,
138
+ UCL: 12,
139
+ LCL: 8
140
+ },
141
+ samples: [
142
+ { sampleId: '1', value: 10 },
143
+ { sampleId: '2', value: 11 }
144
+ ]
145
+ }
146
+ ]
147
+ },
148
+ {
149
+ chartType: 'MR',
150
+ variables: [
151
+ {
152
+ name: 'variable8',
153
+ stats: {
154
+ movingRange: 2,
155
+ UCL: 3,
156
+ LCL: 1
157
+ },
158
+ samples: [
159
+ { sampleId: '1', value: 2 },
160
+ { sampleId: '2', value: 2.5 }
161
+ ]
162
+ }
163
+ ]
164
+ },
165
+ {
166
+ chartType: 'Histogram',
167
+ variables: [
168
+ {
169
+ name: 'variable9',
170
+ bins: [
171
+ { binRange: '0-1', count: 5 },
172
+ { binRange: '1-2', count: 10 }
173
+ ]
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ chartType: 'Pareto',
179
+ variables: [
180
+ {
181
+ name: 'defectType',
182
+ categories: [
183
+ { category: 'Scratch', count: 20 },
184
+ { category: 'Dent', count: 15 }
185
+ ]
186
+ }
187
+ ]
188
+ }
189
+ ]
190
+ }
191
+ }
192
+ }
@@ -0,0 +1,103 @@
1
+ import { ObjectType, Field, ID, Int, Float } from 'type-graphql'
2
+
3
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
+ import { DataSet } from '@things-factory/dataset'
5
+
6
+ @ObjectType()
7
+ class Sample {
8
+ @Field(type => ID)
9
+ sampleId: string
10
+
11
+ @Field()
12
+ value: number
13
+ }
14
+
15
+ @ObjectType()
16
+ class Stats {
17
+ @Field(type => Float, { nullable: true })
18
+ mean?: number
19
+
20
+ @Field(type => Float, { nullable: true })
21
+ UCL?: number
22
+
23
+ @Field(type => Float, { nullable: true })
24
+ LCL?: number
25
+
26
+ @Field(type => Float, { nullable: true })
27
+ CL?: number
28
+
29
+ @Field(type => Float, { nullable: true })
30
+ range?: number
31
+
32
+ @Field(type => Float, { nullable: true })
33
+ proportion?: number
34
+
35
+ @Field(type => Float, { nullable: true })
36
+ nonconforming?: number
37
+
38
+ @Field(type => Float, { nullable: true })
39
+ defectsPerUnit?: number
40
+
41
+ @Field(type => Float, { nullable: true })
42
+ individualValue?: number
43
+
44
+ @Field(type => Float, { nullable: true })
45
+ movingRange?: number
46
+
47
+ @Field(type => Int, { nullable: true })
48
+ count?: number
49
+ }
50
+
51
+ @ObjectType()
52
+ class Variable {
53
+ @Field()
54
+ name: string
55
+
56
+ @Field(type => Stats)
57
+ stats?: Stats
58
+
59
+ @Field(type => [Sample])
60
+ samples?: Sample[]
61
+
62
+ @Field(type => [Bin], { nullable: true })
63
+ bins?: Bin[]
64
+
65
+ @Field(type => [Category], { nullable: true })
66
+ categories?: Category[]
67
+ }
68
+
69
+ @ObjectType()
70
+ class Bin {
71
+ @Field()
72
+ binRange: string
73
+
74
+ @Field()
75
+ count: number
76
+ }
77
+
78
+ @ObjectType()
79
+ class Category {
80
+ @Field()
81
+ category: string
82
+
83
+ @Field()
84
+ count: number
85
+ }
86
+
87
+ @ObjectType()
88
+ class ChartAnalysis {
89
+ @Field()
90
+ chartType: string
91
+
92
+ @Field(type => [Variable])
93
+ variables: Variable[]
94
+ }
95
+
96
+ @ObjectType()
97
+ export class AnalysisResult {
98
+ @Field(type => DataSet)
99
+ dataSet: DataSet
100
+
101
+ @Field(type => [ChartAnalysis])
102
+ analysisResults: ChartAnalysis[]
103
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }
@@ -0,0 +1,11 @@
1
+ import route from './dist-client/route'
2
+
3
+ export default {
4
+ route,
5
+ routes: [
6
+ {
7
+ tagname: 'spc-chart-page',
8
+ page: 'spc-chart'
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}