99 lines
2.2 KiB
TypeScript
99 lines
2.2 KiB
TypeScript
import { Feature } from '@/modules/feature/feature'
|
|
import { FeatureStep } from '@/modules/feature/feature-steps'
|
|
import { features } from '@/modules/feature/feature.fixture'
|
|
import { pickRandomElement, popNElement, shuffleArray } from '@/utils'
|
|
|
|
const hasQualityIssue = (
|
|
complexity: number,
|
|
tasksInParallel: number
|
|
): boolean => {
|
|
let probabilityOfQualityIssue = 0
|
|
|
|
switch (complexity) {
|
|
case 1:
|
|
probabilityOfQualityIssue = 0.8
|
|
break
|
|
case 2:
|
|
probabilityOfQualityIssue = 0.7
|
|
break
|
|
case 3:
|
|
probabilityOfQualityIssue = 0.6
|
|
break
|
|
|
|
default:
|
|
probabilityOfQualityIssue = 0.5
|
|
break
|
|
}
|
|
|
|
let multiplicator = 1
|
|
|
|
switch (tasksInParallel) {
|
|
case 1:
|
|
multiplicator = 1
|
|
case 2:
|
|
multiplicator = 1.05
|
|
case 3:
|
|
multiplicator = 1.08
|
|
case 4:
|
|
multiplicator = 1.1
|
|
case 5:
|
|
multiplicator = 1.15
|
|
}
|
|
|
|
return Math.random() > probabilityOfQualityIssue / multiplicator
|
|
}
|
|
|
|
export const createFeatureBoard = () => {
|
|
const boardFeatures = shuffleArray(features)
|
|
|
|
const initBoard = (steps: FeatureStep[]): Feature[] => {
|
|
const initialFeatures = popNElement(boardFeatures, 10)
|
|
|
|
initialFeatures.forEach((feature) => {
|
|
const step = pickRandomElement(steps)
|
|
feature.status = pickRandomElement(['doing', 'done'])
|
|
feature.step = step.stepIndex
|
|
})
|
|
|
|
return initialFeatures
|
|
}
|
|
|
|
const nextDay = (features: Feature[]): Feature[] => {
|
|
features.forEach((feature) => {
|
|
const isFeatureLive = feature.step === 0 && feature.status === 'done'
|
|
if (isFeatureLive) {
|
|
return
|
|
}
|
|
|
|
feature.leadTime++
|
|
|
|
switch (feature.status) {
|
|
case 'doing':
|
|
feature.status = 'done'
|
|
break
|
|
case 'done':
|
|
feature.status = 'doing'
|
|
|
|
if (
|
|
hasQualityIssue(
|
|
feature.complexity,
|
|
features.filter(
|
|
(f) => f.status === 'doing' && f.step === feature.step
|
|
).length
|
|
)
|
|
) {
|
|
feature.step = Math.min(4, feature.step + 1)
|
|
feature.qualityIssue++
|
|
} else {
|
|
feature.step--
|
|
}
|
|
break
|
|
}
|
|
})
|
|
|
|
return features
|
|
}
|
|
|
|
return { initBoard, nextDay }
|
|
}
|