Модуль:Песочница/Pok: различия между версиями

мНет описания правки
мНет описания правки
Строка 43: Строка 43:
---------------------------------------------------------------------
---------------------------------------------------------------------


---------------------------------------------------------------------
local function findRelatedTables(initialList)
local function findRelatedTables(initialList)
     local results = {}  
     local results = {}  
Строка 70: Строка 69:
     return res
     return res
end
end
local function searchTableIdInStructure(struct, tableIds)
local function searchTableIdInStructure(struct, tableIds)
     if type(struct) ~= "table" then
     if type(struct) ~= "table" then
Строка 91: Строка 91:
end
end


function p.reverseContained(frame)
---------------------------------------------------------------------
    local targetId = frame.args[2]
-- Общая логика поиска хранилищ, содержащих указанный targetId
    if not targetId or targetId == "" then
---------------------------------------------------------------------
        return "Ошибка: не указан id предмета для обратного поиска."
local function findMatchingStorages(targetId)
    end
 
     local initialTables = {}
     local initialTables = {}
     for key, tblEntry in pairs(tableData) do
     for key, tblEntry in pairs(tableData) do
Строка 135: Строка 133:
     end
     end


    return matchingStorages
end
---------------------------------------------------------------------
function p.reverseContained(frame)
    local targetId = frame.args[2]
    if not targetId or targetId == "" then
        return "Ошибка: не указан id предмета для обратного поиска."
    end
    local matchingStorages = findMatchingStorages(targetId)
     local filteredStorages = {}
     local filteredStorages = {}
     for _, sid in ipairs(matchingStorages) do
     for _, sid in ipairs(matchingStorages) do
Строка 155: Строка 164:
     return "Найденные хранилища: " .. table.concat(filteredStorages, ", ")
     return "Найденные хранилища: " .. table.concat(filteredStorages, ", ")
end
end
---------------------------------------------------------------------


---------------------------------------------------------------------
---------------------------------------------------------------------
Строка 214: Строка 221:
                                 for _, g in ipairs(role.groups) do
                                 for _, g in ipairs(role.groups) do
                                     if g == foundGroupId then
                                     if g == foundGroupId then
                                         foundJob = role.id -- предполагается, что поле id присутствует
                                         foundJob = role.id
                                         break
                                         break
                                     end
                                     end
Строка 236: Строка 243:
     return "Найдено использование оборудования: " .. table.concat(results, "; ")
     return "Найдено использование оборудования: " .. table.concat(results, "; ")
end
end
---------------------------------------------------------------------


---------------------------------------------------------------------
---------------------------------------------------------------------
Строка 246: Строка 251:
     end
     end


     local foundIds = {}
    -- Сначала ищем прямые совпадения в cargoData по product
     local directCargo = {}
     for _, entry in ipairs(cargoData) do
     for _, entry in ipairs(cargoData) do
         if entry.product == searchValue then
         if entry.product == searchValue then
             table.insert(foundIds, entry.id)
             table.insert(directCargo, entry.id)
        end
    end
 
    if #directCargo > 0 then
        return "Найденные записи cargo: " .. table.concat(directCargo, ", ")
    end
 
    -- Если не найдено прямых совпадений, выполняем обратный поиск как в reverseContained,
    -- но оставляем только те хранилища, которые присутствуют в cargoData (т.е. имеют product равный их id)
    local matchingStorages = findMatchingStorages(searchValue)
    local cargoStorages = {}
    for _, sid in ipairs(matchingStorages) do
        for _, cargo in pairs(cargoData) do
            if type(cargo) == "table" and cargo.product == sid then
                table.insert(cargoStorages, sid)
                break
            end
         end
         end
     end
     end


     if #foundIds == 0 then
     if #cargoStorages == 0 then
         return "Запись для product со значением '" .. searchValue .. "' не найдена."
         return "Хранилище, содержащее предмет с id " .. searchValue .. ", не найдено."
     end
     end


     return "Найденные записи cargo: " .. table.concat(foundIds, ", ")
     return "Найденные хранилища cargo: " .. table.concat(cargoStorages, ", ")
end
end
---------------------------------------------------------------------


---------------------------------------------------------------------
---------------------------------------------------------------------
Строка 312: Строка 333:
     return "Найденные станки: " .. table.concat(matchingLathes, ", ")
     return "Найденные станки: " .. table.concat(matchingLathes, ", ")
end
end
---------------------------------------------------------------------


---------------------------------------------------------------------
---------------------------------------------------------------------
Строка 328: Строка 347:
         if inventory.id then
         if inventory.id then
             local found = false
             local found = false
            -- Если режим не указан, ищем во всех типах инвентарей
             if (invMode == "inventory" or invMode == "" or not invMode) and inventory.startingInventory and type(inventory.startingInventory) == "table" then
             if (invMode == "inventory" or invMode == "" or not invMode) and inventory.startingInventory and type(inventory.startingInventory) == "table" then
                 if inventory.startingInventory[targetId] then
                 if inventory.startingInventory[targetId] then
Строка 355: Строка 373:


     local matchingVendingMachines = {}
     local matchingVendingMachines = {}
    -- Поиск торговых автоматов, у которых поле VendingMachine.pack совпадает с id найденного инвентаря
     for _, vm in pairs(vendingMachinesData) do
     for _, vm in pairs(vendingMachinesData) do
         if vm.VendingMachine and vm.VendingMachine.pack then
         if vm.VendingMachine and vm.VendingMachine.pack then
Строка 383: Строка 400:
     local mode = frame.args[1]
     local mode = frame.args[1]
     if not mode or mode == "" then
     if not mode or mode == "" then
         return "Ошибка: не указан режим обратного поиска. Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe."
         return "Ошибка: не указан режим обратного поиска. Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe, reverseVending."
     end
     end


Строка 397: Строка 414:
         return p.reverseVending(frame)
         return p.reverseVending(frame)
     else
     else
         return "Неизвестный режим: " .. mode .. ". Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe."
         return "Неизвестный режим: " .. mode .. ". Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe, reverseVending."
     end
     end
end
end


return p
return p