@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.
Files changed (90) 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 +322 -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 +44 -0
  14. package/dist-client/pages/spc-chart-page.js +309 -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/rules/cp-cpk.js +21 -0
  25. package/dist-server/controllers/rules/cp-cpk.js.map +1 -0
  26. package/dist-server/controllers/spc-chart/c.js +26 -0
  27. package/dist-server/controllers/spc-chart/c.js.map +1 -0
  28. package/dist-server/controllers/spc-chart/histogram.js +26 -0
  29. package/dist-server/controllers/spc-chart/histogram.js.map +1 -0
  30. package/dist-server/controllers/spc-chart/i.js +26 -0
  31. package/dist-server/controllers/spc-chart/i.js.map +1 -0
  32. package/dist-server/controllers/spc-chart/index.js +172 -0
  33. package/dist-server/controllers/spc-chart/index.js.map +1 -0
  34. package/dist-server/controllers/spc-chart/mr.js +25 -0
  35. package/dist-server/controllers/spc-chart/mr.js.map +1 -0
  36. package/dist-server/controllers/spc-chart/np.js +26 -0
  37. package/dist-server/controllers/spc-chart/np.js.map +1 -0
  38. package/dist-server/controllers/spc-chart/p.js +25 -0
  39. package/dist-server/controllers/spc-chart/p.js.map +1 -0
  40. package/dist-server/controllers/spc-chart/pareto.js +24 -0
  41. package/dist-server/controllers/spc-chart/pareto.js.map +1 -0
  42. package/dist-server/controllers/spc-chart/r.js +31 -0
  43. package/dist-server/controllers/spc-chart/r.js.map +1 -0
  44. package/dist-server/controllers/spc-chart/u.js +27 -0
  45. package/dist-server/controllers/spc-chart/u.js.map +1 -0
  46. package/dist-server/controllers/spc-chart/x-bar-r.js +45 -0
  47. package/dist-server/controllers/spc-chart/x-bar-r.js.map +1 -0
  48. package/dist-server/controllers/spc-chart/x-bar.js +45 -0
  49. package/dist-server/controllers/spc-chart/x-bar.js.map +1 -0
  50. package/dist-server/index.js +11 -0
  51. package/dist-server/index.js.map +1 -0
  52. package/dist-server/service/index.js +21 -0
  53. package/dist-server/service/index.js.map +1 -0
  54. package/dist-server/service/spc-chart/index.js +8 -0
  55. package/dist-server/service/spc-chart/index.js.map +1 -0
  56. package/dist-server/service/spc-chart/spc-chart-query.js +99 -0
  57. package/dist-server/service/spc-chart/spc-chart-query.js.map +1 -0
  58. package/dist-server/service/spc-chart/spc-chart-type.js +134 -0
  59. package/dist-server/service/spc-chart/spc-chart-type.js.map +1 -0
  60. package/dist-server/tsconfig.tsbuildinfo +1 -0
  61. package/helps/spc/spc-chart-concept.md +59 -0
  62. package/helps/spc/spc-chart.md +68 -0
  63. package/package.json +37 -0
  64. package/server/controllers/data-use-case-spc.ts +44 -0
  65. package/server/controllers/index.ts +1 -0
  66. package/server/controllers/rules/cp-cpk.ts +29 -0
  67. package/server/controllers/spc-chart/c.ts +31 -0
  68. package/server/controllers/spc-chart/histogram.ts +38 -0
  69. package/server/controllers/spc-chart/i.ts +31 -0
  70. package/server/controllers/spc-chart/index.ts +171 -0
  71. package/server/controllers/spc-chart/mr.ts +30 -0
  72. package/server/controllers/spc-chart/np.ts +30 -0
  73. package/server/controllers/spc-chart/p.ts +29 -0
  74. package/server/controllers/spc-chart/pareto.ts +32 -0
  75. package/server/controllers/spc-chart/r.ts +34 -0
  76. package/server/controllers/spc-chart/u.ts +31 -0
  77. package/server/controllers/spc-chart/x-bar-r.ts +53 -0
  78. package/server/controllers/spc-chart/x-bar.ts +53 -0
  79. package/server/index.ts +10 -0
  80. package/server/service/index.ts +21 -0
  81. package/server/service/spc-chart/index.ts +5 -0
  82. package/server/service/spc-chart/spc-chart-query.ts +102 -0
  83. package/server/service/spc-chart/spc-chart-type.ts +105 -0
  84. package/server/tsconfig.json +10 -0
  85. package/things-factory.config.js +11 -0
  86. package/translations/en.json +3 -0
  87. package/translations/ja.json +3 -0
  88. package/translations/ko.json +3 -0
  89. package/translations/ms.json +3 -0
  90. 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
+ }
@@ -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,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
+ }
@@ -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,3 @@
1
+ {
2
+ "title.spc-chart": "SPC chart"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "title.spc-chart": "SPC チャート"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "title.spc-chart": "SPC 차트"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "title.spc-chart": "Carta SPC"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "title.spc-chart": "SPC 图表"
3
+ }