diff --git a/models/process/src/index.ts b/models/process/src/index.ts index 65264b8626..70725f8e3f 100644 --- a/models/process/src/index.ts +++ b/models/process/src/index.ts @@ -74,6 +74,9 @@ export class TProcess extends TDoc implements Process { @Prop(ArrOf(TypeRef(process.class.State)), process.string.States) states!: Ref[] + @Prop(TypeBoolean(), process.string.ParallelExecutionForbidden) + parallelExecutionForbidden?: boolean + @Prop(TypeBoolean(), process.string.StartAutomatically) autoStart: boolean | undefined } diff --git a/plugins/card-resources/src/components/CardSelector.svelte b/plugins/card-resources/src/components/CardSelector.svelte index 3d66808d5d..95f00f91a7 100644 --- a/plugins/card-resources/src/components/CardSelector.svelte +++ b/plugins/card-resources/src/components/CardSelector.svelte @@ -35,6 +35,7 @@ export let readonly: boolean = false export let label: IntlString = card.string.Card export let _class: Ref> + export let ignoreObjects: Ref[] | undefined = undefined export let focusIndex: number | undefined = undefined export let kind: ButtonKind = 'no-border' @@ -53,7 +54,7 @@ return } - showPopup(CardsPopup, { selected: value, _class }, eventToHTMLElement(event), change) + showPopup(CardsPopup, { selected: value, _class, ignoreObjects }, eventToHTMLElement(event), change) } const change = (val: Card | undefined): void => { diff --git a/plugins/card-resources/src/components/CardsPopup.svelte b/plugins/card-resources/src/components/CardsPopup.svelte index 306c410f7d..d112ecd096 100644 --- a/plugins/card-resources/src/components/CardsPopup.svelte +++ b/plugins/card-resources/src/components/CardsPopup.svelte @@ -23,6 +23,7 @@ export let _class: Ref> export let selected: Ref | undefined export let selectedObjects: Ref[] | undefined + export let ignoreObjects: Ref[] | undefined = undefined export let multiSelect: boolean = false export let allowDeselect: boolean = true export let titleDeselect: IntlString | undefined = undefined @@ -41,6 +42,7 @@ {multiSelect} {allowDeselect} {titleDeselect} + {ignoreObjects} type={'object'} groupBy={'_class'} on:update diff --git a/plugins/process-assets/lang/cs.json b/plugins/process-assets/lang/cs.json index c7b239ce68..0b8b5ad93b 100644 --- a/plugins/process-assets/lang/cs.json +++ b/plugins/process-assets/lang/cs.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "První pracovní den po", "FallbackValueError": "Zobrazit chybu, pokud není k dispozici", "Required": "Povinné", + "ParallelExecutionForbidden": "Nedovoluj paralelní spuštění", "StartAutomatically": "Spustit automaticky", "Error": "Chyba", "Continue": "Pokračovat" diff --git a/plugins/process-assets/lang/de.json b/plugins/process-assets/lang/de.json index bb43c22cb6..e2e584c467 100644 --- a/plugins/process-assets/lang/de.json +++ b/plugins/process-assets/lang/de.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Erste Arbeitstag nach", "FallbackValueError": "Fehler anzeigen, wenn leer", "Required": "Erforderlich", + "ParallelExecutionForbidden": "Parallele Ausführung verboten", "StartAutomatically": "Automatisch starten", "Error": "Fehler", "Continue": "Fortsetzen" diff --git a/plugins/process-assets/lang/en.json b/plugins/process-assets/lang/en.json index 9dd8ca0b38..e2f5937ee3 100644 --- a/plugins/process-assets/lang/en.json +++ b/plugins/process-assets/lang/en.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "First working day after", "FallbackValueError": "Show error if empty", "Required": "Required", + "ParallelExecutionForbidden": "Parallel execution forbidden", "StartAutomatically": "Start automatically", "Error": "Error", "Continue": "Continue" diff --git a/plugins/process-assets/lang/es.json b/plugins/process-assets/lang/es.json index df7cc3c3c7..e4ec934cf6 100644 --- a/plugins/process-assets/lang/es.json +++ b/plugins/process-assets/lang/es.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Primer día de trabajo después", "FallbackValueError": "Mostrar error si está vacío", "Required": "Requerido", + "ParallelExecutionForbidden": "Ejecución paralela prohibida", "StartAutomatically": "Iniciar automáticamente", "Error": "Error", "Continue": "Continuar" diff --git a/plugins/process-assets/lang/fr.json b/plugins/process-assets/lang/fr.json index 80f5c1ff8f..8c701edf3d 100644 --- a/plugins/process-assets/lang/fr.json +++ b/plugins/process-assets/lang/fr.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Premier jour de travail après", "FallbackValueError": "Afficher l'erreur si vide", "Required": "Requis", + "ParallelExecutionForbidden": "Exécution parallèle interdite", "StartAutomatically": "Démarrer automatiquement", "Error": "Erreur", "Continue": "Continuer" diff --git a/plugins/process-assets/lang/it.json b/plugins/process-assets/lang/it.json index c3bdd25318..7ea5dacfa9 100644 --- a/plugins/process-assets/lang/it.json +++ b/plugins/process-assets/lang/it.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Primo giorno lavorativo dopo", "FallbackValueError": "Mostra errore se vuoto", "Required": "Obbligatorio", + "ParallelExecutionForbidden": "Esecuzione parallela vietata", "StartAutomatically": "Avvia automaticamente", "Error": "Errore", "Continue": "Continua" diff --git a/plugins/process-assets/lang/pt.json b/plugins/process-assets/lang/pt.json index 41d0680fe2..6bd6c2da2a 100644 --- a/plugins/process-assets/lang/pt.json +++ b/plugins/process-assets/lang/pt.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Primeiro Dia de Trabalho Após", "FallbackValueError": "Mostrar erro se vazio", "Required": "Obrigatório", + "ParallelExecutionForbidden": "Execução Paralela Proibida", "StartAutomatically": "Iniciar automaticamente", "Error": "Erro", "Continue": "Continuar" diff --git a/plugins/process-assets/lang/ru.json b/plugins/process-assets/lang/ru.json index 724f11484b..4d91573b43 100644 --- a/plugins/process-assets/lang/ru.json +++ b/plugins/process-assets/lang/ru.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "Первый рабочий день после", "FallbackValueError": "Показывать ошибку, если недоступно", "Required": "Обязательно", + "ParallelExecutionForbidden": "Одновременное выполнение запрещено", "StartAutomatically": "Запускать автоматически", "Error": "Ошибка", "Continue": "Продолжить" diff --git a/plugins/process-assets/lang/zh.json b/plugins/process-assets/lang/zh.json index 751512ddd6..e819595f21 100644 --- a/plugins/process-assets/lang/zh.json +++ b/plugins/process-assets/lang/zh.json @@ -43,6 +43,7 @@ "FirstWorkingDayAfter": "在之后的第一个工作日", "FallbackValueError": "显示错误,如果为空", "Required": "必需", + "ParallelExecutionForbidden": "禁止并行执行", "StartAutomatically": "自动启动", "Error": "错误", "Continue": "继续" diff --git a/plugins/process-resources/src/components/ProcessEditor.svelte b/plugins/process-resources/src/components/ProcessEditor.svelte index ddaeeda058..f4cae711f0 100644 --- a/plugins/process-resources/src/components/ProcessEditor.svelte +++ b/plugins/process-resources/src/components/ProcessEditor.svelte @@ -78,6 +78,12 @@ } } + async function saveRestriction (e: CustomEvent): Promise { + if (value !== undefined) { + await client.update(value, { parallelExecutionForbidden: e.detail }) + } + } + async function saveAutoStart (e: CustomEvent): Promise { if (value !== undefined) { await client.update(value, { autoStart: e.detail }) @@ -167,6 +173,13 @@ +
+ +
p._id === process) + + let ignoreObjects: Ref[] = [] + + $: void filter(process) + + async function filter (process: Ref | undefined): Promise { + if (process === undefined) { + ignoreObjects = [] + return + } + const pr = client.getModel().findObject(process) + if (pr === undefined) { + ignoreObjects = [] + return + } + if (pr.parallelExecutionForbidden !== true) { + ignoreObjects = [] + return + } + + const executions = await client.findAll(plugin.class.Execution, { process, done: false }, {}) + const cards = new Set(executions.map((it) => it.card)) + ignoreObjects = [...cards] + }
{#if selectedProcess !== undefined} - + {/if} diff --git a/plugins/process-resources/src/components/RunProcessPopup.svelte b/plugins/process-resources/src/components/RunProcessPopup.svelte index 93f6dd2374..2423f8bc44 100644 --- a/plugins/process-resources/src/components/RunProcessPopup.svelte +++ b/plugins/process-resources/src/components/RunProcessPopup.svelte @@ -33,6 +33,31 @@ const res = client.getModel().findAllSync(process.class.Process, {}) const processes = res.filter((it) => resClasses.includes(it.masterTag)) + async function filterProcesses (processes: Process[]): Promise { + const res: Process[] = [] + const shouldCheck: Process[] = [] + for (const val of processes) { + if (val.parallelExecutionForbidden === true) { + shouldCheck.push(val) + } else { + res.push(val) + } + } + if (shouldCheck.length === 0) return res + + const executions = await client.findAll(process.class.Execution, { + process: { $in: shouldCheck.map((it) => it._id) }, + done: false + }) + const notAllowed = new Set(executions.map((it) => it.process)) + for (const val of shouldCheck) { + if (!notAllowed.has(val._id)) { + res.push(val) + } + } + return res + } + const dispatch = createEventDispatcher() async function runProcess (_id: Ref): Promise { @@ -57,16 +82,18 @@