Fix add employee pc

This commit is contained in:
Vladimir 2026-07-05 12:51:26 +03:00
parent 66902a64de
commit e1d0faa1a4
3 changed files with 68 additions and 30 deletions

View File

@ -134,7 +134,7 @@
<h3>Ответственные сотрудники за сделку</h3>
<div class="flex w-full flex-wrap">
<EmployeeCard v-for="employee in selectedEmployees" :key="employee.id" :employee="employee" :url="url" @remove="removeEmployee" />
<EmployeeCard v-for="employee in selectedEmployees" :key="employee.id" :employee="employee" :url="url" :locked="isWhoWork(employee.id)" @remove="removeEmployee" />
<div class="sm:w-1/2 md:w-1/3 lg:w-1/4">
<button @click="openModalDealManager" class="w-full h-full p-5 rounded flex flex-col items-center justify-center add-employee-button">
<img src="@/shared/assets/icons/plus-green.svg" alt="Добавить сотрудника">
@ -659,7 +659,7 @@ async function loadDealData(dealId) {
// Обработка сотрудников
if (employeesRes.data) {
selectedEmployees.value = employeesRes.data.map(emp => ({
manualEmployees.value = employeesRes.data.map(emp => ({
...emp,
fullName: `${emp.last_name} ${emp.first_name} ${emp.middle_name}` || emp.fio,
}));
@ -701,7 +701,8 @@ function resetForm() {
counter_agent_phone: '',
deal_date: null,
};
selectedEmployees.value = [];
requisitionEmployees.value = [];
manualEmployees.value = [];
selectedRequisitionSideOneId.value = null;
selectedRequisitionSideTwoId.value = null;
selectedObjectSideOneId.value = null;
@ -930,8 +931,16 @@ onMounted(async () => {
// Получение деталей выбранной заявки 1 стороны
watch(selectedRequisitionSideOneId, async (newId) => {
watch(selectedRequisitionSideOneId, async (newId, oldId) => {
if (newId != null) {
// Убираем who_work старой заявки стороны 1 из requisitionEmployees
if (oldId) {
const oldRequisition = originalRequisitionsList.value.find(r => r.id === oldId);
if (oldRequisition?.who_work) {
requisitionEmployees.value = requisitionEmployees.value.filter(e => e.id !== oldRequisition.who_work);
}
}
console.log('watch selectedRequisitionSideOneId:' + newId)
try {
await fetchRequisitionSideOneDetails(`/requisitions/${newId}`);
@ -939,8 +948,8 @@ watch(selectedRequisitionSideOneId, async (newId) => {
selectedRequisitionSideOne.value = requisitionSideOneDetails.value;
deal.value.side_one_requisition_id = newId;
// Добавляем who_work только при создании сделки
if (newDealReqId.value && requisitionSideOneDetails.value.who_work) {
// Добавляем who_work заявки стороны 1
if (requisitionSideOneDetails.value.who_work) {
await addResponsibleEmployee(requisitionSideOneDetails.value.who_work);
}
@ -974,6 +983,12 @@ watch(selectedRequisitionSideTwoId, async (newId, oldId) => {
selectedObjectSideTwoId.value = null;
selectedObjectSideTwo.value = null;
deal.value.side_two_object_id = null;
// Убираем who_work старой заявки стороны 2 из requisitionEmployees
const oldRequisition = originalRequisitionsList.value.find(r => r.id === oldId);
if (oldRequisition?.who_work) {
requisitionEmployees.value = requisitionEmployees.value.filter(e => e.id !== oldRequisition.who_work);
}
}
if (newId) {
@ -985,6 +1000,11 @@ watch(selectedRequisitionSideTwoId, async (newId, oldId) => {
if (requisitionSideTwoDetails.value.object_id) {
selectedObjectSideTwoId.value = requisitionSideTwoDetails.value.object_id;
}
// Добавляем who_work заявки стороны 2 в selectedEmployees
if (requisitionSideTwoDetails.value.who_work) {
await addResponsibleEmployee(requisitionSideTwoDetails.value.who_work);
}
}
// Установка клиента в deal для стороны 2
@ -1070,7 +1090,23 @@ watch(selectedObjectSideTwoId, async (newId) => {
});
// Логика для управления модальным окном и выбранными сотрудниками
const selectedEmployees = ref([]);
const requisitionEmployees = ref([]);
const manualEmployees = ref([]);
const selectedEmployees = computed(() => {
return [...requisitionEmployees.value, ...manualEmployees.value];
});
const isWhoWork = (employeeId) => {
return requisitionEmployees.value.some(e => e.id === employeeId);
};
// Исключаем who_work заявок из списка выбора сотрудников
const filteredEmployeesList = computed(() => {
const excludeIds = requisitionEmployees.value.map(e => e.id);
if (excludeIds.length === 0) return employeesList.value;
return employeesList.value.filter(emp => !excludeIds.includes(emp.id));
});
const openModalDealManager = () => {
console.log('[openModalDealManager] Открываем EmployeeAddModal через DynamicDialog')
@ -1089,20 +1125,21 @@ const openModalDealManager = () => {
}
},
data: {
employees: employeesList.value,
selected: selectedEmployees.value
employees: filteredEmployeesList.value,
selected: manualEmployees.value
},
onClose: (opt) => {
console.log('[DynamicDialog] EmployeeAddModal закрыт:', opt?.data)
if (opt?.data) {
selectedEmployees.value = opt.data;
manualEmployees.value = opt.data;
}
}
})
};
const removeEmployee = (employeeId) => {
selectedEmployees.value = selectedEmployees.value.filter(e => e.id !== employeeId);
if (isWhoWork(employeeId)) return;
manualEmployees.value = manualEmployees.value.filter(e => e.id !== employeeId);
};
const selectedDocs = ref([]);
@ -1478,33 +1515,28 @@ const closeModel = () => {
async function addResponsibleEmployee(userId) {
// Проверяем, что список сотрудников загружен
if (!employeesList.value || employeesList.value.length === 0) {
console.warn('Список сотрудников не загружен!');
return;
}
// Ищем сотрудника
const employee = employeesList.value.find(emp => emp.id === userId);
if (!employee) return;
if (!employee) {
return;
if (requisitionEmployees.value.some(e => e.id === userId)) return;
const empData = {
...employee,
fullName: `${employee.last_name} ${employee.first_name}` || employee.fio,
};
// Если сотрудник уже в manualEmployees переносим в requisitionEmployees
const manualIdx = manualEmployees.value.findIndex(e => e.id === userId);
if (manualIdx >= 0) {
manualEmployees.value.splice(manualIdx, 1);
}
// Проверяем дублирование
if (selectedEmployees.value.some(e => e.id === userId)) {
console.log('Сотрудник уже добавлен');
return;
}
// Добавляем сотрудника
selectedEmployees.value = [
...selectedEmployees.value,
{
...employee,
fullName: `${employee.last_name} ${employee.first_name}` || employee.fio,
}
];
requisitionEmployees.value = [...requisitionEmployees.value, empData];
}
defineExpose({ closeModel });

View File

@ -14,6 +14,8 @@
:maxSelectedLabels="3"
:filter="true"
>
<template #chip></template>
<template #removetokenicon></template>
<template #dropdownicon>
<DropdownIcon />
</template>

View File

@ -19,7 +19,7 @@
</a>
</div>
</div>
<button @click="$emit('remove', employee.id)" class="ml-auto mt-2 px-4 py-2 rounded">
<button v-if="!locked" @click="$emit('remove', employee.id)" class="ml-auto mt-2 px-4 py-2 rounded">
<!-- <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">-->
<span class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>
</button>
@ -37,6 +37,10 @@ export default {
url: {
type: String,
required: true
},
locked: {
type: Boolean,
default: false
}
},
methods: {