@things-factory/spc 7.0.0-alpha.6 → 7.0.0-alpha.8

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 (81) hide show
  1. package/client/pages/spc-chart-page.ts +251 -47
  2. package/dist-client/pages/spc-chart-page.d.ts +21 -3
  3. package/dist-client/pages/spc-chart-page.js +234 -46
  4. package/dist-client/pages/spc-chart-page.js.map +1 -1
  5. package/dist-client/tsconfig.tsbuildinfo +1 -1
  6. package/dist-server/controllers/rules/cp-cpk.js +21 -0
  7. package/dist-server/controllers/rules/cp-cpk.js.map +1 -0
  8. package/dist-server/controllers/spc-chart/c.js +26 -0
  9. package/dist-server/controllers/spc-chart/c.js.map +1 -0
  10. package/dist-server/controllers/{spc-/bchart → spc-chart}/histogram.js +1 -2
  11. package/dist-server/controllers/spc-chart/histogram.js.map +1 -0
  12. package/dist-server/controllers/spc-chart/i.js +26 -0
  13. package/dist-server/controllers/spc-chart/i.js.map +1 -0
  14. package/dist-server/controllers/{spc-/bchart → spc-chart}/index.js +17 -17
  15. package/dist-server/controllers/spc-chart/index.js.map +1 -0
  16. package/dist-server/controllers/{spc-/bchart → spc-chart}/mr.js +12 -11
  17. package/dist-server/controllers/spc-chart/mr.js.map +1 -0
  18. package/dist-server/controllers/spc-chart/np.js +26 -0
  19. package/dist-server/controllers/spc-chart/np.js.map +1 -0
  20. package/dist-server/controllers/spc-chart/p.js +25 -0
  21. package/dist-server/controllers/spc-chart/p.js.map +1 -0
  22. package/dist-server/controllers/{spc-/bchart → spc-chart}/pareto.js +1 -2
  23. package/dist-server/controllers/spc-chart/pareto.js.map +1 -0
  24. package/dist-server/controllers/{spc-/bchart → spc-chart}/r.js +15 -11
  25. package/dist-server/controllers/spc-chart/r.js.map +1 -0
  26. package/dist-server/controllers/{spc-/bchart → spc-chart}/u.js +14 -11
  27. package/dist-server/controllers/spc-chart/u.js.map +1 -0
  28. package/dist-server/controllers/spc-chart/x-bar-r.js +45 -0
  29. package/dist-server/controllers/spc-chart/x-bar-r.js.map +1 -0
  30. package/dist-server/controllers/spc-chart/x-bar.js +45 -0
  31. package/dist-server/controllers/spc-chart/x-bar.js.map +1 -0
  32. package/dist-server/service/spc-chart/spc-chart-query.js +76 -175
  33. package/dist-server/service/spc-chart/spc-chart-query.js.map +1 -1
  34. package/dist-server/service/spc-chart/spc-chart-type.js +71 -85
  35. package/dist-server/service/spc-chart/spc-chart-type.js.map +1 -1
  36. package/dist-server/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +5 -4
  38. package/server/controllers/rules/cp-cpk.ts +29 -0
  39. package/server/controllers/spc-chart/c.ts +31 -0
  40. package/server/controllers/{spc-/bchart → spc-chart}/histogram.ts +1 -3
  41. package/server/controllers/spc-chart/i.ts +31 -0
  42. package/server/controllers/{spc-/bchart → spc-chart}/index.ts +17 -17
  43. package/server/controllers/spc-chart/mr.ts +30 -0
  44. package/server/controllers/spc-chart/np.ts +30 -0
  45. package/server/controllers/spc-chart/p.ts +29 -0
  46. package/server/controllers/{spc-/bchart → spc-chart}/pareto.ts +1 -3
  47. package/server/controllers/spc-chart/r.ts +34 -0
  48. package/server/controllers/spc-chart/u.ts +31 -0
  49. package/server/controllers/spc-chart/x-bar-r.ts +53 -0
  50. package/server/controllers/spc-chart/x-bar.ts +53 -0
  51. package/server/service/spc-chart/spc-chart-query.ts +87 -177
  52. package/server/service/spc-chart/spc-chart-type.ts +57 -55
  53. package/translations/en.json +3 -1
  54. package/translations/ja.json +3 -1
  55. package/translations/ko.json +3 -1
  56. package/translations/ms.json +3 -1
  57. package/translations/zh.json +3 -1
  58. package/dist-server/controllers/spc-/bchart/c.js +0 -21
  59. package/dist-server/controllers/spc-/bchart/c.js.map +0 -1
  60. package/dist-server/controllers/spc-/bchart/histogram.js.map +0 -1
  61. package/dist-server/controllers/spc-/bchart/i.js +0 -23
  62. package/dist-server/controllers/spc-/bchart/i.js.map +0 -1
  63. package/dist-server/controllers/spc-/bchart/index.js.map +0 -1
  64. package/dist-server/controllers/spc-/bchart/mr.js.map +0 -1
  65. package/dist-server/controllers/spc-/bchart/np.js +0 -23
  66. package/dist-server/controllers/spc-/bchart/np.js.map +0 -1
  67. package/dist-server/controllers/spc-/bchart/p.js +0 -22
  68. package/dist-server/controllers/spc-/bchart/p.js.map +0 -1
  69. package/dist-server/controllers/spc-/bchart/pareto.js.map +0 -1
  70. package/dist-server/controllers/spc-/bchart/r.js.map +0 -1
  71. package/dist-server/controllers/spc-/bchart/u.js.map +0 -1
  72. package/dist-server/controllers/spc-/bchart/x-bar.js +0 -50
  73. package/dist-server/controllers/spc-/bchart/x-bar.js.map +0 -1
  74. package/server/controllers/spc-/bchart/c.ts +0 -31
  75. package/server/controllers/spc-/bchart/i.ts +0 -35
  76. package/server/controllers/spc-/bchart/mr.ts +0 -37
  77. package/server/controllers/spc-/bchart/np.ts +0 -35
  78. package/server/controllers/spc-/bchart/p.ts +0 -34
  79. package/server/controllers/spc-/bchart/r.ts +0 -40
  80. package/server/controllers/spc-/bchart/u.ts +0 -36
  81. package/server/controllers/spc-/bchart/x-bar.ts +0 -70
@@ -1,192 +1,102 @@
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'
1
+ import { Resolver, Query, Arg, Ctx } from 'type-graphql'
2
+ import { Between, In } from 'typeorm'
3
+
4
+ import { getRepository } from '@things-factory/shell'
4
5
  import { User } from '@things-factory/auth-base'
5
- import { DataSet } from '@things-factory/dataset'
6
+ import { DataSet, DataSample } from '@things-factory/dataset'
6
7
 
7
- import { AnalysisResult } from './spc-chart-type'
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'
8
17
 
9
18
  @Resolver(DataSet)
10
19
  export class SpcChartQuery {
11
- @Query(returns => AnalysisResult!, { nullable: true, description: 'To fetch a SpcChart' })
20
+ @Query(returns => SPCChartAnalysisResult!, { nullable: true, description: 'To fetch a SpcChart' })
12
21
  async spcChart(
13
22
  @Arg('dataSetId') dataSetId: string,
14
- @Arg('startDate') startDate: string,
15
- @Arg('endDate') endDate: string,
16
23
  @Arg('variable') variable: string,
24
+ @Arg('chartType') chartType: string,
25
+ @Arg('fromDate') fromDate: string,
26
+ @Arg('toDate') toDate: string,
17
27
  @Ctx() context: ResolverContext
18
- ): Promise<AnalysisResult> {
28
+ ): Promise<SPCChartAnalysisResult> {
19
29
  const { domain } = context.state
20
30
 
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
- ]
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]
188
64
  }
189
- ]
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
190
100
  }
191
101
  }
192
102
  }
@@ -1,103 +1,105 @@
1
1
  import { ObjectType, Field, ID, Int, Float } from 'type-graphql'
2
2
 
3
- import { ObjectRef, ScalarObject } from '@things-factory/shell'
4
3
  import { DataSet } from '@things-factory/dataset'
5
4
 
6
5
  @ObjectType()
7
- class Sample {
6
+ export class SPCChartPlot {
8
7
  @Field(type => ID)
9
- sampleId: string
8
+ x: string
10
9
 
11
- @Field()
12
- value: number
13
- }
10
+ @Field(type => [Float], { nullable: true })
11
+ values?: number[]
14
12
 
15
- @ObjectType()
16
- class Stats {
17
13
  @Field(type => Float, { nullable: true })
18
- mean?: number
14
+ xbar?: number
19
15
 
20
16
  @Field(type => Float, { nullable: true })
21
- UCL?: number
17
+ r?: number
22
18
 
23
19
  @Field(type => Float, { nullable: true })
24
- LCL?: number
20
+ i?: number
25
21
 
26
22
  @Field(type => Float, { nullable: true })
27
- CL?: number
23
+ mr?: number
28
24
 
29
25
  @Field(type => Float, { nullable: true })
30
- range?: number
26
+ n?: number
31
27
 
32
28
  @Field(type => Float, { nullable: true })
33
- proportion?: number
29
+ defects?: number
30
+ }
34
31
 
32
+ @ObjectType()
33
+ class SPCControlLimits {
35
34
  @Field(type => Float, { nullable: true })
36
- nonconforming?: number
35
+ ucl?: number
37
36
 
38
37
  @Field(type => Float, { nullable: true })
39
- defectsPerUnit?: number
38
+ lcl?: number
40
39
 
41
40
  @Field(type => Float, { nullable: true })
42
- individualValue?: number
41
+ cl?: number
42
+ }
43
43
 
44
+ @ObjectType()
45
+ class SPCSpecLimits {
44
46
  @Field(type => Float, { nullable: true })
45
- movingRange?: number
47
+ target?: number
46
48
 
47
- @Field(type => Int, { nullable: true })
48
- count?: number
49
+ @Field(type => Float, { nullable: true })
50
+ lsl?: number
51
+
52
+ @Field(type => Float, { nullable: true })
53
+ usl?: number
49
54
  }
50
55
 
51
56
  @ObjectType()
52
- class Variable {
57
+ export class SPCChartAnalysis {
53
58
  @Field()
54
- name: string
55
-
56
- @Field(type => Stats)
57
- stats?: Stats
59
+ chartType: string
58
60
 
59
- @Field(type => [Sample])
60
- samples?: Sample[]
61
+ @Field(type => SPCControlLimits, { nullable: true })
62
+ controlLimits?: SPCControlLimits
61
63
 
62
- @Field(type => [Bin], { nullable: true })
63
- bins?: Bin[]
64
+ @Field(type => SPCSpecLimits, { nullable: true })
65
+ specLimits?: SPCSpecLimits
64
66
 
65
- @Field(type => [Category], { nullable: true })
66
- categories?: Category[]
67
- }
67
+ @Field(type => [SPCChartPlot], { nullable: true })
68
+ plots?: SPCChartPlot[]
68
69
 
69
- @ObjectType()
70
- class Bin {
71
- @Field()
72
- binRange: string
70
+ // @Field(type => [Bin], { nullable: true })
71
+ // bins?: Bin[]
73
72
 
74
- @Field()
75
- count: number
73
+ // @Field(type => [Category], { nullable: true })
74
+ // categories?: Category[]
76
75
  }
77
76
 
78
- @ObjectType()
79
- class Category {
80
- @Field()
81
- category: string
77
+ // @ObjectType()
78
+ // class Bin {
79
+ // @Field()
80
+ // binRange: string
82
81
 
83
- @Field()
84
- count: number
85
- }
82
+ // @Field()
83
+ // count: number
84
+ // }
86
85
 
87
- @ObjectType()
88
- class ChartAnalysis {
89
- @Field()
90
- chartType: string
86
+ // @ObjectType()
87
+ // class Category {
88
+ // @Field()
89
+ // category: string
91
90
 
92
- @Field(type => [Variable])
93
- variables: Variable[]
94
- }
91
+ // @Field()
92
+ // count: number
93
+ // }
95
94
 
96
95
  @ObjectType()
97
- export class AnalysisResult {
96
+ export class SPCChartAnalysisResult {
98
97
  @Field(type => DataSet)
99
98
  dataSet: DataSet
100
99
 
101
- @Field(type => [ChartAnalysis])
102
- analysisResults: ChartAnalysis[]
100
+ @Field()
101
+ variable: string
102
+
103
+ @Field(type => [SPCChartAnalysis])
104
+ charts: SPCChartAnalysis[]
103
105
  }
@@ -1 +1,3 @@
1
- {}
1
+ {
2
+ "title.spc-chart": "SPC chart"
3
+ }
@@ -1 +1,3 @@
1
- {}
1
+ {
2
+ "title.spc-chart": "SPC チャート"
3
+ }
@@ -1 +1,3 @@
1
- {}
1
+ {
2
+ "title.spc-chart": "SPC 차트"
3
+ }
@@ -1 +1,3 @@
1
- {}
1
+ {
2
+ "title.spc-chart": "Carta SPC"
3
+ }
@@ -1 +1,3 @@
1
- {}
1
+ {
2
+ "title.spc-chart": "SPC 图表"
3
+ }
@@ -1,21 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,22 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}