源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

384 lines
16 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 社团申请管理界面
  4. -- *>
  5. GuildApplyMgrView = GuildApplyMgrView or BaseClass(BaseView)
  6. local GuildApplyMgrView = GuildApplyMgrView
  7. function GuildApplyMgrView:__init()
  8. self.base_file = "guild"
  9. self.layout_file = "GuildApplyMgrView"
  10. self.layer_name = "Activity"
  11. self.destroy_imm = true
  12. self.use_background = G_USING_BG --全屏界面默认使用这个参数,非全屏界面自行设置
  13. self.change_scene_close = true --是否切换场景时关闭(弹出界面使用)
  14. self.blur_activity_bg = true
  15. self.use_show_anim = true
  16. self.use_hide_anim = true
  17. self.tab_list = {
  18. [1] = {id = 1, name = "入团申请", title = "申请列表"},
  19. [2] = {id = 2, name = "职位申请", title = "申请列表"},
  20. [3] = {id = 3, name = "社团合并", title = "社团合并"}, -- 只处理其他社团发送的合并请求
  21. }
  22. self.empty_tips_str_list = {
  23. [1] = "暂无申请,到世界频道发布团员招募吧!",
  24. [2] = "暂无职位申请,到职位分配中进行分配吧!",
  25. }
  26. self.tab_index = 1
  27. self.is_first_tab_merge = true -- 首次切换到合并界面需要请求一次社团信息
  28. self.model = GuildModel:getInstance()
  29. self.select_index = 0 -- 选中的社团index
  30. self.selected_guild_id = nil -- 选中的社团id
  31. self.merge_list = {} -- 当前筛选出来的满足条件的社团合并申请列表
  32. self.merge_condition = self.model:GetGuildMergeConditionCfg()
  33. -- 自动搜索社团功能参数
  34. self.last_change_input_time = Status.NowTime
  35. self.need_search = false
  36. -- 请求社团合并信息
  37. self.load_callback = function ()
  38. self:LoadSuccess()
  39. self:AddEvent()
  40. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT,40008)
  41. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT,40032)
  42. self:UpdateTabRed()
  43. end
  44. self.open_callback = function ( )
  45. self:OpenSuccess()
  46. end
  47. self.destroy_callback = function ( )
  48. self:DestroySuccess()
  49. end
  50. end
  51. function GuildApplyMgrView:Open(index)
  52. self.tab_index = index or self.tab_index
  53. BaseView.Open(self)
  54. end
  55. function GuildApplyMgrView:LoadSuccess()
  56. local nodes = {
  57. -- 主容器
  58. "content",
  59. -- 社团申请节点
  60. "content/join_node:obj",
  61. "content/join_node/join_scroll:obj", "content/join_node/join_scroll/Viewport/join_con",
  62. "content/join_node/join_setting_btn:obj",
  63. "content/join_node/join_all_reject_btn:obj",
  64. "content/join_node/join_all_pass_btn:obj",
  65. -- 职位申请节点
  66. "content/pos_node:obj",
  67. "content/pos_node/pos_scroll:obj", "content/pos_node/pos_scroll/Viewport/pos_con",
  68. "content/pos_node/pos_all_pass_btn:obj",
  69. "content/pos_node/pos_all_reject_btn:obj",
  70. -- 社团合并节点
  71. "content/merge_node:obj",
  72. "content/merge_node/merge_scroll:obj", "content/merge_node/merge_scroll/Viewport/merge_con",
  73. "content/merge_node/merge_btn_con2:obj", -- 按钮类型2
  74. "content/merge_node/merge_btn_con2/merge_cancel_btn:obj",
  75. "content/merge_node/merge_btn_con2/merge_cancel_btn/merge_cancel_lb:tmp",
  76. "content/merge_node/merge_btn_con2/agree_merge_btn:obj:imgex",
  77. -- 空节点
  78. "content/empty_node:obj",
  79. "content/empty_node/empty_girl:raw",
  80. "content/empty_node/posmgr_btn:obj",
  81. "content/empty_node/recruit_btn:obj",
  82. "content/empty_node/empty_tip:tmp",
  83. }
  84. self:GetChildren(nodes)
  85. lua_resM:setOutsideRawImage(self, self.empty_girl_raw, GameResPath.GetRoleBg("guild_empty_girl_697_560"), false)
  86. -- 2020年12月22日补充节点
  87. self.agree_merge_btn_lb_tmp = self:GetChild("content/merge_node/merge_btn_con2/agree_merge_btn/text"):GetComponent(typeof(TMPro.TextMeshProUGUI))
  88. self.merge_btn_con2_obj:SetActive(true)
  89. local function close_callback()
  90. self:Close()
  91. end
  92. local function select_callback(index)
  93. self:SwitchTab(index)
  94. end
  95. self.tabWindowComponent = UITabWindow.New(self.transform, self.tab_list, select_callback, close_callback, self.background_wnd, self.content, UITabWindow.SizeSmall, nil, nil, false)
  96. self.tabWindowComponent:SetTitleText(self.tab_list[self.tab_index].title)
  97. self.tabWindowComponent:SetBackgroundRes("WindowNew2_bg")
  98. end
  99. function GuildApplyMgrView:AddEvent()
  100. local function click_event(target)
  101. if target == self.join_setting_btn_obj then -- 申请设置按钮
  102. GlobalEventSystem:Fire(EventName.OPEN_GUILD_APPLY_SETTING_VIEW, true)
  103. elseif target == self.join_all_reject_btn_obj then -- 一键拒绝所有入团申请
  104. self.model:Fire(GuildModel.RequestAgreeApplyListEvt, 2)
  105. elseif target == self.join_all_pass_btn_obj then -- 一键通过所有入团申请
  106. self.model:Fire(GuildModel.RequestAgreeApplyListEvt, 1)
  107. elseif target == self.pos_all_reject_btn_obj then -- 一键拒绝所有职位申请
  108. self:ResponedPosApplyRequest(0)
  109. elseif target == self.pos_all_pass_btn_obj then -- 一键通过所有职位申请
  110. self:ResponedPosApplyRequest(1)
  111. elseif target == self.merge_cancel_btn_obj then -- 拒绝/取消合并请求
  112. self:RespondMergeRequest(0) -- 拒绝合并
  113. elseif target == self.agree_merge_btn_obj then -- 同意合并请求
  114. self:RespondMergeRequest(1)
  115. elseif target == self.posmgr_btn_obj then -- 打开职位任命界面
  116. self.model:Fire(GuildModel.OPEN_GUILD_POS_ALLOT_VIEW, true)
  117. elseif target == self.recruit_btn_obj then -- 一键招募社团成员
  118. self.model:SendRecruitMsg()
  119. end
  120. end
  121. AddClickEvent(self.join_setting_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  122. AddClickEvent(self.join_all_reject_btn_obj, click_event)
  123. AddClickEvent(self.join_all_pass_btn_obj, click_event)
  124. AddClickEvent(self.pos_all_reject_btn_obj, click_event)
  125. AddClickEvent(self.pos_all_pass_btn_obj, click_event)
  126. AddClickEvent(self.merge_cancel_btn_obj, click_event)
  127. AddClickEvent(self.agree_merge_btn_obj, click_event)
  128. AddClickEvent(self.posmgr_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  129. AddClickEvent(self.recruit_btn_obj, click_event)
  130. local function refresh_apply_result()
  131. if self.tab_index ~= 3 then
  132. self:UpdateView()
  133. end
  134. end
  135. self:BindEvent(self.model, GuildModel.RefreshMemberApplyListEvt, refresh_apply_result) -- 更新申请界面时刷新 40008
  136. self:BindEvent(self.model, GuildModel.RefreshtSetApplyMemberStateEvt, refresh_apply_result) -- 更新申请审批时刷新 40009
  137. local function update_red(view_type)
  138. if not view_type or view_type == Config.ConfigGuild.TabId.List then
  139. self:UpdateTabRed()
  140. end
  141. end
  142. self:BindEvent(self.model, GuildModel.UPDATE_RED_DOT_BY_TYPE, update_red)
  143. local function update_guild_merge_info()
  144. self:UpdateMergeGuildList(true)
  145. end
  146. self:BindEvent(self.model, GuildModel.UPDATE_GUILD_MERGE_INFO, update_guild_merge_info)
  147. end
  148. function GuildApplyMgrView:OpenSuccess()
  149. self:SwitchTab(self.tab_index)
  150. end
  151. function GuildApplyMgrView:UpdateView()
  152. self.join_node_obj:SetActive(self.tab_index == 1)
  153. self.pos_node_obj:SetActive(self.tab_index == 2)
  154. self.merge_node_obj:SetActive(self.tab_index == 3)
  155. if self.tab_index == 3 then -- 社团合并的文本需要动态加载
  156. local tip = ""
  157. if self.merge_condition then
  158. local guild_info = self.model:GetGuildBaseInfo()
  159. local guild_division = guild_info and guild_info.division or 0
  160. local division_lv_list = stringtotable(self.merge_condition.merge_lv)
  161. local can_merge = false
  162. for k,v in pairs(division_lv_list) do
  163. if v == guild_division then
  164. can_merge = true
  165. end
  166. end
  167. if not can_merge then -- 这个配置代表这个阶段天数内不开合并,后面需要+1天
  168. if self.merge_condition.id < #Config.Guildmerge then
  169. tip = string.format("开服第<color=#3be85c>%s</color>天开放社团合并!", self.merge_condition.max_day + 1)
  170. else
  171. tip = "社团评价为 <color=#66abff>一般</color> 时才可被合并!"
  172. end
  173. else
  174. tip = "暂无可合并社团信息"
  175. end
  176. else
  177. tip = "暂无可合并社团信息"
  178. end
  179. self.empty_tip_tmp.text = tip
  180. else
  181. self.empty_tip_tmp.text = self.empty_tips_str_list[self.tab_index]
  182. end
  183. self:UpdateJoinData()
  184. self:UpdatePosData()
  185. self:UpdateMergeGuildList()
  186. end
  187. function GuildApplyMgrView:SwitchTab( index )
  188. self.tab_index = index
  189. if self.tabWindowComponent then
  190. self.tabWindowComponent:SetTabBarIndex(self.tab_index)
  191. end
  192. self:UpdateView()
  193. end
  194. -- 更新入团申请界面数据
  195. function GuildApplyMgrView:UpdateJoinData( )
  196. if self.tab_index ~= 1 then return end
  197. local data = self.model:GetApplyGuildMemData()
  198. local empty_data = IsTableEmpty(data)
  199. self.empty_node_obj:SetActive(empty_data)
  200. self.recruit_btn_obj:SetActive(empty_data)
  201. self.posmgr_btn_obj:SetActive(false)
  202. self.join_scroll_obj:SetActive(not empty_data)
  203. if not empty_data then
  204. self.join_item_creator = self.join_item_creator or self:AddUIComponent(UI.ItemListCreator)
  205. local info = {
  206. data_list = data,
  207. item_con = self.join_con,
  208. scroll_view = self.join_scroll,
  209. item_class = GuildApplyMgrItem,
  210. item_height = 90,
  211. start_y = -2,
  212. create_frequency = 0.01,
  213. alignment = UnityEngine.TextAnchor.UpperLeft,
  214. on_update_item = function(item, i, v)
  215. item:SetData(self.tab_index, i, v)
  216. end,
  217. }
  218. self.join_item_creator:UpdateItems(info)
  219. end
  220. end
  221. -- 更新职位申请界面数据
  222. function GuildApplyMgrView:UpdatePosData( )
  223. if self.tab_index ~= 2 then return end
  224. local data = self.model:GetApplyPosMemData()
  225. local empty_data = IsTableEmpty(data)
  226. self.empty_node_obj:SetActive(empty_data)
  227. self.recruit_btn_obj:SetActive(false)
  228. self.posmgr_btn_obj:SetActive(empty_data)
  229. self.pos_scroll_obj:SetActive(not empty_data)
  230. if not empty_data then
  231. self.pos_item_creator = self.pos_item_creator or self:AddUIComponent(UI.ItemListCreator)
  232. local info = {
  233. data_list = data,
  234. item_con = self.pos_con,
  235. scroll_view = self.pos_scroll,
  236. item_class = GuildApplyMgrItem,
  237. item_height = 90,
  238. start_y = -2,
  239. create_frequency = 0.01,
  240. alignment = UnityEngine.TextAnchor.UpperLeft,
  241. on_update_item = function(item, i, v)
  242. item:SetData(self.tab_index, i, v)
  243. end,
  244. }
  245. self.pos_item_creator:UpdateItems(info)
  246. end
  247. end
  248. function GuildApplyMgrView:UpdateMergeGuildList(auto_selected)
  249. if self.tab_index ~= 3 then return end
  250. auto_selected = auto_selected or self.is_first_tab_merge
  251. self.recruit_btn_obj:SetActive(false)
  252. self.posmgr_btn_obj:SetActive(false)
  253. -- 筛选出合并信息
  254. local merge_info = self.model:GetGuildMergeInfo()
  255. self.merge_list = merge_info and merge_info.fapplys or {}
  256. local empty_data = IsTableEmpty(self.merge_list)
  257. self.empty_node_obj:SetActive(empty_data)
  258. self.merge_scroll_obj:SetActive(not empty_data)
  259. if empty_data then
  260. self.select_index = nil
  261. self.selected_guild_id = nil
  262. return
  263. end
  264. -----------------------
  265. local function callback(index, guild_id)
  266. self.select_index = index
  267. self.merge_item_creator:IterateItems(function( item, i )
  268. item:SetSelected(i == self.select_index)
  269. end)
  270. -- 记录选中的社团id
  271. self.selected_guild_id = guild_id
  272. end
  273. self.merge_item_creator = self.merge_item_creator or self:AddUIComponent(UI.ItemListCreator)
  274. local info = {
  275. data_list = self.merge_list,
  276. item_con = self.merge_con,
  277. scroll_view = self.merge_scroll,
  278. item_class = GuildApplyMergeItem,
  279. item_height = 90,
  280. start_x = 3,
  281. start_y = -5,
  282. space_y = 2,
  283. create_frequency = 0.01,
  284. alignment = UnityEngine.TextAnchor.UpperLeft,
  285. reuse_item_num = 7,
  286. on_update_item = function(item, i, v)
  287. item:SetData(v, i, callback)
  288. item:SetSelected(i == self.select_index)
  289. end,
  290. }
  291. self.merge_item_creator:UpdateItems(info)
  292. if auto_selected then
  293. callback(1, self.merge_list[1].guild_id)
  294. end
  295. self.is_first_tab_merge = false
  296. -- 更新按钮表现
  297. self:UpdateMergeNodeBtnCon()
  298. end
  299. -- 统一处理职位申请 opty:0全部拒绝 1:全部通过
  300. function GuildApplyMgrView:ResponedPosApplyRequest(opty)
  301. local data = self.model:GetApplyPosMemData()
  302. local role_pos = RoleManager.Instance.mainRoleInfo.position
  303. local pos_num_list = {} -- 职位已任命人数和最大任命缓存
  304. for k, v in ipairs(data) do
  305. if opty == 0 then -- 全部拒绝
  306. self.model:Fire(GuildModel.RequestSetApplyMemberStateEvt, v.role_id, 0)
  307. elseif opty == 1 then -- 全部通过,但理论上不可以对自己职位以上的职位进行任命,同时需要判断这个职位是否满人了
  308. pos_num_list[v.position] = pos_num_list[v.position] or {}
  309. local has_permission = self.model:HasAppointPremission(v.position, role_pos)
  310. local cur_pos_num = pos_num_list[v.position].cur_num or self.model:GetMemberNum(v.position)
  311. local cur_pos_max = pos_num_list[v.position].max_num or self.model:GetPositionNum(v.position)
  312. local is_max = cur_pos_num >= cur_pos_max
  313. if has_permission and not is_max then
  314. -- 这里不能等协议返回,需要前端做缓存
  315. self.model:Fire(GuildModel.RequestSetApplyMemberStateEvt, v.role_id, 1)
  316. pos_num_list[v.position].cur_num = cur_pos_num + 1
  317. pos_num_list[v.position].max_num = cur_pos_max
  318. end
  319. end
  320. end
  321. end
  322. -- 回复合并申请 opty:0拒绝 1同意
  323. function GuildApplyMgrView:RespondMergeRequest(opty)
  324. if #self.merge_list > 0 and self.select_index then
  325. local guild_data = self.merge_list[self.select_index]
  326. if not guild_data then return end
  327. local guild_name = guild_data.guild_name or ""
  328. local function ok( ... )
  329. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 40033, opty, guild_data.guild_id)
  330. end
  331. local ask_str = string.format("是否确定%s<color=#ff6519>%s</color>社团的合并请求?\n%s",
  332. opty == 0 and "拒绝" or "同意", guild_name,
  333. opty == 0 and "(拒绝之后3天内无法与同一社团进行合并)" or "(同意之后立即进行合并)")
  334. Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消")
  335. end
  336. end
  337. -- 更新合并页签下的按钮节点
  338. function GuildApplyMgrView:UpdateMergeNodeBtnCon()
  339. local gray = not self.select_index and true or false
  340. self.agree_merge_btn_imgex.gray = gray -- 主动请求合并时灰化同意按钮
  341. SetTMPSharedMaterial(self.agree_merge_btn_lb_tmp, gray
  342. and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
  343. end
  344. function GuildApplyMgrView:UpdateTabRed( )
  345. self.tabWindowComponent:ShowRedPoint(1, self.model:GetGuildMemberApplyRed())
  346. self.tabWindowComponent:ShowRedPoint(2, self.model:GetGuildPosApplyRed())
  347. self.tabWindowComponent:ShowRedPoint(3, self.model:GetGuildMemberMergeRed())
  348. end
  349. function GuildApplyMgrView:DestroySuccess( )
  350. if self.tabWindowComponent then
  351. self.tabWindowComponent:DeleteMe()
  352. self.tabWindowComponent = nil
  353. end
  354. self.model:CheckMemberRedDot()
  355. end