local ColorEnum = { Enable = XUiHelper.Hexcolor2Color("0D70BC"), Disable = XUiHelper.Hexcolor2Color("FF0000"), Up = XUiHelper.Hexcolor2Color("356C38"), Down = XUiHelper.Hexcolor2Color("CE453B"), } local XUiGridSkillItem = XClass(nil, "XUiGridSkillItem") function XUiGridSkillItem:Ctor(ui) XTool.InitUiObjectByUi(self, ui) end function XUiGridSkillItem:Refresh(product, skillAreaType, addition, isUrgent) self.GameObject:SetActiveEx(true) local unlock = product:IsUnlock() local isDefault = product:IsDefault() local unknown = not unlock and not isDefault self.PanelLock.gameObject:SetActiveEx(unknown) self.RImgIcon.gameObject:SetActiveEx(not unknown) self.ImgUpgrade.gameObject:SetActiveEx(not unknown) self.TxtUpgrade.gameObject:SetActiveEx(not unknown) if unknown then self.TxtName.text = "? ? ?" self.PanelUrgent.gameObject:SetActiveEx(false) self.PanelHot.gameObject:SetActiveEx(false) return end self.TxtName.text = product:GetProperty("_Name") self.RImgIcon:SetRawImage(product:GetProductIcon()) local icon = XRestaurantConfigs.GetUpOrDownArrowIcon( addition >= 0 and 1 or 2) self.ImgUpgrade:SetSprite(icon) self.TxtUpgrade.text = XRestaurantConfigs.GetCharacterSkillPercentAddition(addition, skillAreaType, product:GetProperty("_Id")) self.TxtUpgrade.color = addition >= 0 and ColorEnum.Up or ColorEnum.Down local isHot = product:GetProperty("_HotSale") self.PanelUrgent.gameObject:SetActiveEx(unlock and isUrgent) self.PanelHot.gameObject:SetActiveEx(unlock and isHot and not isUrgent) end ---@class XUiGridSkillButton local XUiGridSkillButton = XClass(nil, "XUiGridSkillButton") function XUiGridSkillButton:Ctor(ui, onClick) XTool.InitUiObjectByUi(self, ui) self.OnClick = onClick self.BtnClick = self.Transform:GetComponent("XUiButton") self.BtnClick.CallBack = function() self:OnBtnClick() end end function XUiGridSkillButton:Refresh(skillId) self.SkillId = skillId self.BtnClick:SetNameByGroup(0, XRestaurantConfigs.GetCharacterSkillName(skillId)) self:SetSelect(false) self.GameObject:SetActiveEx(true) end function XUiGridSkillButton:SetSelect(select) self.IsSelect = select self.BtnClick:SetButtonState(select and CS.UiButtonState.Select or CS.UiButtonState.Normal) end function XUiGridSkillButton:OnBtnClick() if self.IsSelect or not XTool.IsNumberValid(self.SkillId) then self.BtnClick:SetButtonState(self.IsSelect and CS.UiButtonState.Select or CS.UiButtonState.Normal) return end self:SetSelect(true) if self.OnClick then self.OnClick(self) end end ---@class XUiRestaurantCook : XLuaUi local XUiRestaurantCook = XLuaUiManager.Register(XLuaUi, "UiRestaurantCook") local XUiGridRecruitRole = require("XUi/XUiRestaurant/XUiGrid/XUiGridRecruitRole") local XUiGridLevelButton = require("XUi/XUiRestaurant/XUiGrid/XUiGridLevelButton") local TabIndex = { 0, XRestaurantConfigs.AreaType.IngredientArea, XRestaurantConfigs.AreaType.FoodArea, XRestaurantConfigs.AreaType.SaleArea, } local DefaultTabIndex = 1 function XUiRestaurantCook:OnAwake() self:InitUi() self:InitCb() end function XUiRestaurantCook:OnStart() self:InitView() end function XUiRestaurantCook:InitUi() self.DynamicTable = XDynamicTableNormal.New(self.PanelEmploymentList) self.DynamicTable:SetDelegate(self) self.DynamicTable:SetProxy(XUiGridRecruitRole, handler(self, self.OnSelectRole)) self.GridRole.gameObject:SetActiveEx(false) ---@type XUiGridLevelButton[] self.LevelButton = {} self.GridAreas = {} ---@type XUiGridSkillButton[] self.SkillButton = {} self.GridSkills = {} local tabBtn = {} for index, _ in ipairs(TabIndex) do local btn = index == 1 and self.BtnTab or XUiHelper.Instantiate(self.BtnTab, self.PanelTabCharacter.transform) btn:SetNameByGroup(0, XRestaurantConfigs.GetStaffTabText(index)) table.insert(tabBtn, btn) end self.PanelTabCharacter:Init(tabBtn, function(tabIndex) self:OnSelectTab(tabIndex) end) end function XUiRestaurantCook:InitCb() self.BtnClose.CallBack = function() self:Close() end self.BtnWndClose.CallBack = function() self:Close() end self.BtnDetermine.CallBack = function() self:OnBtnDetermineClick() end end function XUiRestaurantCook:InitView() local viewModel = XDataCenter.RestaurantManager.GetViewModel() self:BindViewModelPropertyToObj(viewModel, function(level) self:RefreshLimit() end, "_Level") self.PanelTabCharacter:SelectIndex(DefaultTabIndex) end function XUiRestaurantCook:OnSelectTab(tabIndex) if self.TabIndex == tabIndex then return end self.TabIndex = tabIndex if self.LastGrid then self.LastGrid:SetSelect(false) end self.SelectRoleId = nil self:SetupDynamicTable() end function XUiRestaurantCook:RefreshLimit() local viewModel = XDataCenter.RestaurantManager.GetViewModel() local level = viewModel:GetProperty("_Level") local limit = XRestaurantConfigs.GetCharacterLimit(level) local list = viewModel:GetRecruitStaffList() self.TxtCount.text = string.format("%s/%s", #list, limit) end function XUiRestaurantCook:SetupDynamicTable() if XTool.UObjIsNil(self.GameObject) then return end self.TabIndex = self.TabIndex or DefaultTabIndex local viewModel = XDataCenter.RestaurantManager.GetViewModel() local list = viewModel:GetStaffList(TabIndex[self.TabIndex]) list = self:SortStaffList(list, TabIndex[self.TabIndex]) self.DataList = list self.DynamicTable:SetDataSource(list) self.DynamicTable:ReloadDataASync(self:GetSelectIndex()) end function XUiRestaurantCook:OnDynamicTableEvent(evt, index, grid) if evt == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then grid:Refresh(self.DataList[index], self.SelectRoleId) elseif evt == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then local selectIndex = self:GetSelectIndex() if selectIndex > 0 then local girds = self.DynamicTable:GetGrids() local tmpGrid = girds[selectIndex] if tmpGrid then tmpGrid:SetSelect(false) tmpGrid:OnBtnClick() end end end end function XUiRestaurantCook:OnSelectRole(grid) if self.LastGrid and self.LastGrid.CharacterId == self.SelectRoleId then self.LastGrid:SetSelect(false) end self:PlayAnimation("QieHuan") self.LastGrid = grid self.SelectRoleId = grid.CharacterId self.LastLevelBtn = nil self.LastSkillBtn = nil self:RefreshDetails() end function XUiRestaurantCook:GetSelectIndex() if not XTool.IsNumberValid(self.SelectRoleId) then return 1 end if XTool.IsTableEmpty(self.DataList) then return -1 end for idx, staff in ipairs(self.DataList) do if staff:GetProperty("_Id") == self.SelectRoleId then return idx end end return 1 end function XUiRestaurantCook:RefreshDetails() if not XTool.IsNumberValid(self.SelectRoleId) then return end local viewModel = XDataCenter.RestaurantManager.GetViewModel() local character = viewModel:GetStaffViewModel(self.SelectRoleId) local isRecruit = character:GetProperty("_IsRecruit") local level = character:GetProperty("_Level") self.TxtName.text = character:GetName() self.RImgHead:SetRawImage(character:GetIcon()) self.TxtCode.text = XCharacterConfigs.GetCharacterCodeStr(self.SelectRoleId) local levelList = {} local btnIndex = 1 self:HideAllGrids(self.LevelButton) self.LastLevelBtn = nil local hasSelect = false local tabAreaType = TabIndex[self.TabIndex] for lv = level, XRestaurantConfigs.StaffLevel.Max do table.insert(levelList, lv) local grid = self.LevelButton[btnIndex] local isSelect = character:IsAdditionByAreaTypeWithLevel(tabAreaType, lv) if not grid then local btn = btnIndex == 1 and self.BtnLevel or XUiHelper.Instantiate(self.BtnLevel, self.PanelTab.transform) grid = XUiGridLevelButton.New(btn, handler(self, self.OnSelectLevel)) table.insert(self.LevelButton, grid) end grid:Refresh(lv, level, isRecruit, level ~= lv or not isRecruit, XRestaurantConfigs.GetCharacterLevelStr(lv)) if not hasSelect and isSelect then grid:OnBtnLevelClick() hasSelect = true end btnIndex = btnIndex + 1 end self.LevelList = levelList self.IsRecruit = isRecruit end function XUiRestaurantCook:OnSelectLevel(levelBtn) if self.LastLevelBtn then self.LastLevelBtn:SetSelect(false) end self.LastSkillBtn = nil self:HideAllGrids(self.GridAreas) self:HideAllGrids(self.SkillButton) self:PlayAnimation("QieHuan") self.LastLevelBtn = levelBtn local level, curLevel, isRecruit = levelBtn.Level, levelBtn.CurLevel, levelBtn.IsUnlock local skillIds = XRestaurantConfigs.GetCharacterSkillIds(self.SelectRoleId, level) local labelIndex = 1 local tabAreaType = TabIndex[self.TabIndex] local hasSelect = false for idx, skillId in pairs(skillIds or {}) do local additionMap = XRestaurantConfigs.GetCharacterSkillAddition(skillId) local showLabel = true for _, addition in pairs(additionMap or {}) do --策划需求:有技能加成小于0,则不显示推荐工作 if addition <= 0 then showLabel = false break end end local areaType = XRestaurantConfigs.GetCharacterSkillAreaType(skillId) if showLabel then local grid = self.GridAreas[labelIndex] if not grid then local ui = labelIndex == 1 and self.GridArea or XUiHelper.Instantiate(self.GridArea, self.PanelArea) grid = {} XTool.InitUiObjectByUi(grid, ui) self.GridAreas[labelIndex] = grid end grid.TxtName.text = XRestaurantConfigs.GetCharacterSkillTypeName(areaType) grid.ImgBg:SetSprite(XRestaurantConfigs.GetCharacterSkillLabelIcon(areaType)) grid.GameObject:SetActiveEx(true) labelIndex = labelIndex + 1 end local isSelect = tabAreaType == 0 and idx == 1 or tabAreaType == areaType local btn = self.SkillButton[idx] if not btn then local ui = idx == 1 and self.BtnSkill or XUiHelper.Instantiate(self.BtnSkill, self.PanelSkillGroup.transform) btn = XUiGridSkillButton.New(ui, handler(self, self.OnSelectSkill)) self.SkillButton[idx] = btn end btn:Refresh(skillId) if not hasSelect and isSelect then btn:SetSelect(false) btn:OnBtnClick() hasSelect = true end end if not hasSelect then local btn = self.SkillButton[1] btn:SetSelect(false) btn:OnBtnClick() end local coinId = XRestaurantConfigs.ItemId.RestaurantUpgradeCoin local isMax = isRecruit and curLevel == XRestaurantConfigs.StaffLevel.Max local subLevel = level - curLevel self.BtnDetermine.gameObject:SetActiveEx(false) if not isMax then self.RImgCoinIcon:SetRawImage(XDataCenter.ItemManager.GetItemIcon(coinId)) local btnText ---@type XConsumeData[] local consumeData local consume, price = 0, 0 local disable if isRecruit then btnText = XRestaurantConfigs.GetClientConfig("StaffStateBtnText", 1) consumeData = XRestaurantConfigs.GetCharacterLevelUpConsume(self.SelectRoleId, math.min(level, XRestaurantConfigs.StaffLevel.Max)) disable = subLevel > 1 else btnText = XRestaurantConfigs.GetClientConfig("StaffStateBtnText", 2) consumeData = XRestaurantConfigs.GetCharacterEmployConsume(self.SelectRoleId) end self.BtnDetermine:SetNameByGroup(0, btnText) for _, data in pairs(consumeData or {}) do if data.ItemId == coinId then price = price + data.Count end end consume = XDataCenter.ItemManager.GetCount(coinId) self.TxtConsume.text = consume self.TxtConsume.color = consume >= price and ColorEnum.Enable or ColorEnum.Disable self.TxtPrice.text = "/" .. price disable = disable or consume < price self.BtnDetermine:SetDisable(disable, not disable) self.BtnDetermine.gameObject:SetActiveEx(level == curLevel or not isRecruit) end end function XUiRestaurantCook:OnSelectSkill(skillBtn) if self.LastSkillBtn then self.LastSkillBtn:SetSelect(false) end self:HideAllGrids(self.GridSkills) self.LastSkillBtn = skillBtn local skillId = skillBtn.SkillId self.TxtSkillDesc.text = XRestaurantConfigs.GetCharacterSkillDesc(skillId) local skillList = self:_SortSkillProduct(XRestaurantConfigs.GetCharacterSkillAdditionList(skillId)) local areaType = XRestaurantConfigs.GetCharacterSkillAreaType(skillId) local viewModel = XDataCenter.RestaurantManager.GetViewModel() local gridIndex = 1 for _, data in pairs(skillList or {}) do local productId, addition = data.Id, data.Addition local grid = self.GridSkills[gridIndex] if not grid then local ui = gridIndex == 1 and self.GridSkill or XUiHelper.Instantiate(self.GridSkill, self.Container) grid = XUiGridSkillItem.New(ui) self.GridSkills[gridIndex] = grid end local product = viewModel:GetProduct(areaType, productId) grid:Refresh(product, areaType, addition, viewModel:IsUrgentProduct(areaType, productId)) gridIndex = gridIndex + 1 end end function XUiRestaurantCook:OnBtnDetermineClick() if not self.IsRecruit then XDataCenter.RestaurantManager.RequestEmployStaff(self.SelectRoleId, function() self:RefreshLimit() self:SetupDynamicTable() end) else XDataCenter.RestaurantManager.RequestLevelUpStaff(self.SelectRoleId, function(character) local role = self:GetCharacter(self.SelectRoleId) if self.LastGrid and role then self.LastGrid:Refresh(role, self.SelectRoleId) end self:RefreshDetails() end) end end function XUiRestaurantCook:GetCharacter(roleId) for _, role in pairs(self.DataList) do if role:GetProperty("_Id") == roleId then return role end end end function XUiRestaurantCook:HideAllGrids(container) if XTool.IsTableEmpty(container) then return end for _, grid in pairs(container or {}) do if grid and not XTool.UObjIsNil(grid.GameObject) then grid.GameObject:SetActiveEx(false) end end end function XUiRestaurantCook:SortStaffList(list, type) if type == 0 then return self:_SortAll(list) end return self:_SortTab(list, type) end function XUiRestaurantCook:_SortAll(list) list = list or {} table.sort(list, function(a, b) local recruitA = a:GetProperty("_IsRecruit") local recruitB = b:GetProperty("_IsRecruit") if recruitA ~= recruitB then return recruitA end local levelA = a:GetProperty("_Level") local levelB = b:GetProperty("_Level") if levelA ~= levelB then return levelA > levelB end --local additionUnlockA = a:IsAdditionOnUnlockProduct() --local additionUnlockB = b:IsAdditionOnUnlockProduct() -- --if additionUnlockA ~= additionUnlockB then -- return additionUnlockA --end local idA = a:GetProperty("_Id") local idB = b:GetProperty("_Id") local pA = XRestaurantConfigs.GetCharacterPriority(idA) local pB = XRestaurantConfigs.GetCharacterPriority(idB) if pA ~= pB then return pA < pB end return idA < idB end) return list end function XUiRestaurantCook:_SortTab(list, areaType) list = list or {} table.sort(list, function(a, b) local recruitA = a:GetProperty("_IsRecruit") local recruitB = b:GetProperty("_IsRecruit") if recruitA ~= recruitB then return recruitA end --已招募时,对比是否有加成效果 if recruitA then local isAdditionA = a:IsAdditionByAreaType(areaType) local isAdditionB = b:IsAdditionByAreaType(areaType) if isAdditionA ~= isAdditionB then return isAdditionA end else --未招募时,对比初级是否有加成效果 local isAdditionA = a:IsAdditionByAreaTypeWithLowLevel(areaType) local isAdditionB = b:IsAdditionByAreaTypeWithLowLevel(areaType) if isAdditionA ~= isAdditionB then return isAdditionA end end local levelA = a:GetProperty("_Level") local levelB = b:GetProperty("_Level") if levelA ~= levelB then return levelA > levelB end local idA = a:GetProperty("_Id") local idB = b:GetProperty("_Id") local pA = XRestaurantConfigs.GetCharacterPriority(idA) local pB = XRestaurantConfigs.GetCharacterPriority(idB) if pA ~= pB then return pA < pB end return idA < idB end) return list end function XUiRestaurantCook:_SortSkillProduct(skillList) skillList = skillList or {} local viewModel = XDataCenter.RestaurantManager.GetViewModel() table.sort(skillList, function(a, b) local productA = viewModel:GetProduct(a.AreaType, a.Id) local productB = viewModel:GetProduct(b.AreaType, b.Id) local isUnlockA = productA:IsUnlock() local isUnlockB = productB:IsUnlock() if isUnlockA ~= isUnlockB then return isUnlockA end local isDefaultA = productA:IsDefault() local isDefaultB = productB:IsDefault() if isDefaultA ~= isDefaultB then return isDefaultA end local isUrgentA = viewModel:IsUrgentProduct(a.AreaType, a.Id) local isUrgentB = viewModel:IsUrgentProduct(b.AreaType, b.Id) if isUrgentA ~= isUrgentB then return isUrgentA end local isHotA = productA:GetProperty("_HotSale") local isHotB = productB:GetProperty("_HotSale") if isHotA ~= isHotB then return isHotA end local priorityA = productA:GetPriority() local priorityB = productB:GetPriority() if priorityA ~= priorityB then return priorityA < priorityB end return a.Id < b.Id end) return skillList end