diff --git a/src/main/java/com/budwk/app/zhgh/democratic/congress/h5controller/CongressH5Controller.java b/src/main/java/com/budwk/app/zhgh/democratic/congress/h5controller/CongressH5Controller.java index 29e270b1..068ba54a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/congress/h5controller/CongressH5Controller.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/congress/h5controller/CongressH5Controller.java @@ -37,6 +37,12 @@ public class CongressH5Controller { public void meetingListPage() { } + @At("/meeting/remark") + @Ok("beetl:/platform/zhghh5/democratic/congress/meeting/remark.html") + @SaCheckLogin + public void meetingRemarkPage() { + } + @At("/pdf") @Ok("beetl:/platform/zhghh5/democratic/congress/pdf.html") @SaCheckLogin @@ -69,14 +75,38 @@ public class CongressH5Controller { @At("/materialsList") @SaCheckLogin - public Result materialsList(@Param("typeId") String typeId, @Param("timeId") String timeId, @Param("emplid") String emplid) { - return Result.success(congressH5Service.materialsList(typeId, timeId, emplid)); + public Result materialsList(@Param("typeId") String typeId, + @Param("timeId") String timeId, + @Param("emplid") String emplid, + @Param("searchKeyword") String searchKeyword, + @Param("fileType") String fileType, + @Param("uploadTimeOrder") String uploadTimeOrder, + @Param("pageNumber") Integer pageNumber, + @Param("pageSize") Integer pageSize) { + return Result.success(congressH5Service.materialsList(typeId, timeId, emplid, searchKeyword, + fileType, uploadTimeOrder, pageNumber, pageSize)); } @At("/user/meetingList") @SaCheckLogin - public Result userMeetingList(@Param("timeId") String timeId, @Param("emplid") String emplid) { - return Result.success(congressH5Service.userMeetingList(timeId, emplid)); + public Result userMeetingList(@Param("timeId") String timeId, + @Param("emplid") String emplid, + @Param("searchKeyword") String searchKeyword, + @Param("signTimeStatus") String signTimeStatus, + @Param("signInCountStatus") String signInCountStatus, + @Param("signStatus") String signStatus, + @Param("pageNumber") Integer pageNumber, + @Param("pageSize") Integer pageSize) { + return Result.success(congressH5Service.userMeetingList(timeId, emplid, searchKeyword, + signTimeStatus, signInCountStatus, signStatus, pageNumber, pageSize)); + } + + @At("/user/meetingRemark") + @SaCheckLogin + public Result meetingRemark(@Param("meetingId") String meetingId, + @Param("timeId") String timeId, + @Param("emplid") String emplid) { + return Result.success(congressH5Service.meetingRemark(meetingId, timeId, emplid)); } @At("/signin") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/congress/service/CongressH5Service.java b/src/main/java/com/budwk/app/zhgh/democratic/congress/service/CongressH5Service.java index a7c2b366..f903129c 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/congress/service/CongressH5Service.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/congress/service/CongressH5Service.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.democratic.congress.service; import com.budwk.app.base.result.Result; +import com.budwk.app.base.page.Pagination; import org.nutz.lang.util.NutMap; import java.util.List; @@ -11,9 +12,14 @@ public interface CongressH5Service { List materialsTypeList(); - List materialsList(String typeId, String sessionId, String emplid); + Pagination materialsList(String typeId, String sessionId, String emplid, String searchKeyword, + String fileType, String uploadTimeOrder, Integer pageNumber, Integer pageSize); - List userMeetingList(String sessionId, String emplid); + Pagination userMeetingList(String sessionId, String emplid, String searchKeyword, + String signTimeStatus, String signInCountStatus, String signStatus, + Integer pageNumber, Integer pageSize); + + NutMap meetingRemark(String meetingId, String sessionId, String emplid); Result signin(String repId, String sessionId, String timeId, String meetingId); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/congress/service/impl/CongressH5ServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/congress/service/impl/CongressH5ServiceImpl.java index 373bb124..6a32a516 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/congress/service/impl/CongressH5ServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/congress/service/impl/CongressH5ServiceImpl.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.democratic.congress.service.impl; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.congress.service.CongressH5Service; @@ -44,6 +45,7 @@ public class CongressH5ServiceImpl implements CongressH5Service { AND COALESCE(dg.delFlag, 0) = 0 WHERE d.loginName = @emplid AND COALESCE(d.delFlag, 0) = 0 + AND COALESCE(s.enable, 0) = 1 ORDER BY s.startDate DESC, s.createdAt DESC, s.id DESC """); sql.setParam("emplid", loginName); @@ -90,9 +92,13 @@ public class CongressH5ServiceImpl implements CongressH5Service { } @Override - public List materialsList(String typeId, String sessionId, String emplid) { + public Pagination materialsList(String typeId, String sessionId, String emplid, String searchKeyword, + String fileType, String uploadTimeOrder, Integer pageNumber, Integer pageSize) { String loginName = loginName(emplid); - Sql sql = Sqls.create(""" + int currentPage = pageNumber == null || pageNumber < 1 ? 1 : pageNumber; + int currentSize = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50); + String orderBy = "asc".equalsIgnoreCase(uploadTimeOrder) ? "ASC" : "DESC"; + Sql sql = Sqls.create((""" SELECT cm.id, cm.session_id AS sessionId, @@ -126,19 +132,50 @@ public class CongressH5ServiceImpl implements CongressH5Service { WHERE COALESCE(cm.deleted, 0) = 0 AND cm.type_id = @typeId AND (cm.session_id = @sessionId OR cm.time_id = @sessionId) - ORDER BY cm.sort_no ASC, cm.create_time DESC - """); + AND (@searchKeyword = '' OR cm.name LIKE CONCAT('%%', @searchKeyword, '%%') + OR cm.file_name LIKE CONCAT('%%', @searchKeyword, '%%')) + AND (@fileType = '' OR FIND_IN_SET(LOWER(REPLACE(cm.file_type, '.', '')), @fileType) > 0 + OR FIND_IN_SET(LOWER(SUBSTRING_INDEX(cm.file_name, '.', -1)), @fileType) > 0) + ORDER BY cm.create_time %s, cm.id DESC + """).formatted(orderBy)); sql.setParam("typeId", typeId); sql.setParam("sessionId", sessionId); sql.setParam("emplid", loginName); + sql.setParam("searchKeyword", StrUtil.blankToDefault(searchKeyword, "")); + sql.setParam("fileType", StrUtil.blankToDefault(fileType, "")); + sql.setPager(dao.createPager(currentPage, currentSize)); sql.setCallback(Sqls.callback.maps()); dao.execute(sql); - return sql.getList(NutMap.class); + + int totalCount = count(""" + SELECT COUNT(DISTINCT cm.id) + FROM congress_materials cm + INNER JOIN teacher_congress_delegate d ON d.sessionId = cm.session_id + AND d.loginName = @emplid + AND COALESCE(d.delFlag, 0) = 0 + WHERE COALESCE(cm.deleted, 0) = 0 + AND cm.type_id = @typeId + AND (cm.session_id = @sessionId OR cm.time_id = @sessionId) + AND (@searchKeyword = '' OR cm.name LIKE CONCAT('%%', @searchKeyword, '%%') + OR cm.file_name LIKE CONCAT('%%', @searchKeyword, '%%')) + AND (@fileType = '' OR FIND_IN_SET(LOWER(REPLACE(cm.file_type, '.', '')), @fileType) > 0 + OR FIND_IN_SET(LOWER(SUBSTRING_INDEX(cm.file_name, '.', -1)), @fileType) > 0) + """, NutMap.NEW() + .addv("typeId", typeId) + .addv("sessionId", sessionId) + .addv("emplid", loginName) + .addv("searchKeyword", StrUtil.blankToDefault(searchKeyword, "")) + .addv("fileType", StrUtil.blankToDefault(fileType, ""))); + return new Pagination<>(currentPage, currentSize, totalCount, sql.getList(NutMap.class)); } @Override - public List userMeetingList(String sessionId, String emplid) { + public Pagination userMeetingList(String sessionId, String emplid, String searchKeyword, + String signTimeStatus, String signInCountStatus, String signStatus, + Integer pageNumber, Integer pageSize) { String loginName = loginName(emplid); + int currentPage = pageNumber == null || pageNumber < 1 ? 1 : pageNumber; + int currentSize = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50); Sql sql = Sqls.create(""" SELECT m.id, @@ -166,13 +203,93 @@ public class CongressH5ServiceImpl implements CongressH5Service { AND si.rep_id = d.id WHERE COALESCE(m.deleted, 0) = 0 AND (m.session_id = @sessionId OR m.time_id = @sessionId) + AND (@searchKeyword = '' OR m.meeting_name LIKE CONCAT('%', @searchKeyword, '%')) + AND (@signTimeStatus = '' + OR (@signTimeStatus = 'upcoming' AND m.sign_in_start_time > NOW()) + OR (@signTimeStatus = 'ongoing' AND m.sign_in_start_time <= NOW() AND m.sign_in_end_time >= NOW()) + OR (@signTimeStatus = 'ended' AND m.sign_in_end_time < NOW())) + AND (@signInCountStatus = '' + OR (@signInCountStatus = 'has' AND EXISTS ( + SELECT 1 FROM congress_sign_in count_si + WHERE count_si.meeting_id = m.id AND COALESCE(count_si.deleted, 0) = 0)) + OR (@signInCountStatus = 'none' AND NOT EXISTS ( + SELECT 1 FROM congress_sign_in count_si + WHERE count_si.meeting_id = m.id AND COALESCE(count_si.deleted, 0) = 0))) + AND (@signStatus = '' + OR (@signStatus = 'signed' AND si.id IS NOT NULL) + OR (@signStatus = 'unsigned' AND si.id IS NULL)) ORDER BY m.sign_in_start_time DESC, m.create_time DESC """); sql.setParam("sessionId", sessionId); sql.setParam("emplid", loginName); + sql.setParam("searchKeyword", StrUtil.blankToDefault(searchKeyword, "")); + sql.setParam("signTimeStatus", StrUtil.blankToDefault(signTimeStatus, "")); + sql.setParam("signInCountStatus", StrUtil.blankToDefault(signInCountStatus, "")); + sql.setParam("signStatus", StrUtil.blankToDefault(signStatus, "")); + sql.setPager(dao.createPager(currentPage, currentSize)); sql.setCallback(Sqls.callback.maps()); dao.execute(sql); - return sql.getList(NutMap.class); + + int totalCount = count(""" + SELECT COUNT(DISTINCT m.id) + FROM congress_sign_in_meeting m + INNER JOIN teacher_congress_delegate d ON d.sessionId = m.session_id + AND d.loginName = @emplid + AND COALESCE(d.delFlag, 0) = 0 + LEFT JOIN congress_sign_in si ON m.id = si.meeting_id + AND COALESCE(si.deleted, 0) = 0 + AND si.rep_id = d.id + WHERE COALESCE(m.deleted, 0) = 0 + AND (m.session_id = @sessionId OR m.time_id = @sessionId) + AND (@searchKeyword = '' OR m.meeting_name LIKE CONCAT('%', @searchKeyword, '%')) + AND (@signTimeStatus = '' + OR (@signTimeStatus = 'upcoming' AND m.sign_in_start_time > NOW()) + OR (@signTimeStatus = 'ongoing' AND m.sign_in_start_time <= NOW() AND m.sign_in_end_time >= NOW()) + OR (@signTimeStatus = 'ended' AND m.sign_in_end_time < NOW())) + AND (@signInCountStatus = '' + OR (@signInCountStatus = 'has' AND EXISTS ( + SELECT 1 FROM congress_sign_in count_si + WHERE count_si.meeting_id = m.id AND COALESCE(count_si.deleted, 0) = 0)) + OR (@signInCountStatus = 'none' AND NOT EXISTS ( + SELECT 1 FROM congress_sign_in count_si + WHERE count_si.meeting_id = m.id AND COALESCE(count_si.deleted, 0) = 0))) + AND (@signStatus = '' + OR (@signStatus = 'signed' AND si.id IS NOT NULL) + OR (@signStatus = 'unsigned' AND si.id IS NULL)) + """, NutMap.NEW() + .addv("sessionId", sessionId) + .addv("emplid", loginName) + .addv("searchKeyword", StrUtil.blankToDefault(searchKeyword, "")) + .addv("signTimeStatus", StrUtil.blankToDefault(signTimeStatus, "")) + .addv("signInCountStatus", StrUtil.blankToDefault(signInCountStatus, "")) + .addv("signStatus", StrUtil.blankToDefault(signStatus, ""))); + return new Pagination<>(currentPage, currentSize, totalCount, sql.getList(NutMap.class)); + } + + @Override + public NutMap meetingRemark(String meetingId, String sessionId, String emplid) { + Sql sql = Sqls.create(""" + SELECT + m.id, + m.meeting_name AS meetingName, + m.remark, + m.session_id AS sessionId, + COALESCE(m.time_id, m.session_id) AS timeId + FROM congress_sign_in_meeting m + INNER JOIN teacher_congress_delegate d ON d.sessionId = m.session_id + AND d.loginName = @emplid + AND COALESCE(d.delFlag, 0) = 0 + WHERE m.id = @meetingId + AND COALESCE(m.deleted, 0) = 0 + AND (m.session_id = @sessionId OR m.time_id = @sessionId) + LIMIT 1 + """); + sql.setParam("meetingId", meetingId); + sql.setParam("sessionId", sessionId); + sql.setParam("emplid", loginName(emplid)); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + return sql.getObject(NutMap.class); } @Override diff --git a/src/main/resources/static/images/congress/h5-congress-header.png b/src/main/resources/static/images/congress/h5-congress-header.png new file mode 100644 index 00000000..6e1e87a0 Binary files /dev/null and b/src/main/resources/static/images/congress/h5-congress-header.png differ diff --git a/src/main/resources/views/platform/zhghh5/democratic/congress/index.html b/src/main/resources/views/platform/zhghh5/democratic/congress/index.html index 4c0fc779..9b349572 100644 --- a/src/main/resources/views/platform/zhghh5/democratic/congress/index.html +++ b/src/main/resources/views/platform/zhghh5/democratic/congress/index.html @@ -15,12 +15,11 @@ layout("/layouts/platform_h5.html"){
@@ -29,6 +28,7 @@ layout("/layouts/platform_h5.html"){ v-for="module in moduleList" :key="module.id" class="module-card" + :class="resolveTheme(module.name)" @click="handleModuleClick(module)" >
@@ -47,7 +47,7 @@ layout("/layouts/platform_h5.html"){ - + -1) return "calendar-o" + if (name.indexOf("会议签到") > -1) return "completed" if (name.indexOf("评议") > -1) return "star" - if (name.indexOf("议题") > -1) return "todo-list-o" - if (name.indexOf("资料") > -1) return "notes-o" - if (name.indexOf("公告") > -1 || name.indexOf("结果") > -1) return "bullhorn-o" + if (name.indexOf("议题") > -1) return "todo-list" + if (name.indexOf("资料") > -1) return "notes" + if (name.indexOf("公告") > -1 || name.indexOf("结果") > -1) return "bell" if (name.indexOf("文件") > -1) return "description" - return "orders-o" + return "orders" }, resolveDesc(name) { if (!name) return "" @@ -203,6 +203,15 @@ layout("/layouts/platform_h5.html"){ if (name.indexOf("表决公告") > -1) return "查看表决结果公告" if (name.indexOf("资料") > -1) return "查看会议准备资料" return "" + }, + resolveTheme(name) { + if (!name) return "theme-blue" + if (name.indexOf("会议签到") > -1) return "theme-blue" + if (name.indexOf("文件") > -1) return "theme-blue" + if (name.indexOf("表决公告") > -1) return "theme-green" + if (name.indexOf("议题") > -1) return "theme-purple" + if (name.indexOf("评议") > -1) return "theme-orange module-card-wide" + return "theme-blue" } }, created() { @@ -213,60 +222,62 @@ layout("/layouts/platform_h5.html"){ + +
+ + +
+
+

{{ remarkData.meetingName }}

+
+
{{ remarkData.remark || "暂无备注" }}
+
+ +
+
+ + + + + + diff --git a/src/main/resources/views/platform/zhghh5/democratic/congress/vote.html b/src/main/resources/views/platform/zhghh5/democratic/congress/vote.html index 3614f409..b2af2978 100644 --- a/src/main/resources/views/platform/zhghh5/democratic/congress/vote.html +++ b/src/main/resources/views/platform/zhghh5/democratic/congress/vote.html @@ -3,7 +3,7 @@ layout("/layouts/platform_h5.html"){ #-->
- +
@@ -12,10 +12,10 @@ layout("/layouts/platform_h5.html"){
{{ voteTicketName }}
- + {{ sessionName }}
-
+ @@ -245,6 +245,7 @@ layout("/layouts/platform_h5.html"){ .vote-meta { display: flex; align-items: center; + justify-content: center; gap: 12px; padding-top: 8px; border-top: 1px solid #ebedf0; @@ -372,7 +373,6 @@ layout("/layouts/platform_h5.html"){ .vote-description { padding: 20px; - border-left: 4px solid #1989fa; } .description-header { @@ -412,6 +412,32 @@ layout("/layouts/platform_h5.html"){ border: 0; box-shadow: 0 4px 12px rgba(25, 137, 250, 0.3); } + .vote-table-container { + border-color: #dfe5ee; + border-radius: 12px; + box-shadow: 0 2px 12px rgba(30, 48, 80, 0.04); + } + + .vote-table { + border-collapse: separate; + border-spacing: 0; + table-layout: fixed; + } + + .vote-table th, + .vote-table td { + border: 0; + border-right: 1px solid #dfe5ee; + border-bottom: 1px solid #dfe5ee; + } + + .vote-table tr > :last-child { + border-right: 0; + } + + .vote-table tbody tr:last-child td { + border-bottom: 0; + }
- +
@@ -12,10 +12,10 @@ layout("/layouts/platform_h5.html"){
{{ voteTicketName }}
- + {{ sessionName }}
-
+ @@ -229,6 +229,7 @@ layout("/layouts/platform_h5.html"){ .vote-meta { display: flex; align-items: center; + justify-content: center; gap: 12px; padding-top: 8px; border-top: 1px solid #ebedf0; @@ -357,7 +358,6 @@ layout("/layouts/platform_h5.html"){ .vote-description { padding: 20px; - border-left: 4px solid #1989fa; } .description-header { @@ -402,6 +402,32 @@ layout("/layouts/platform_h5.html"){ border: 0; opacity: 1; } + .vote-table-container { + border-color: #dfe5ee; + border-radius: 12px; + box-shadow: 0 2px 12px rgba(30, 48, 80, 0.04); + } + + .vote-table { + border-collapse: separate; + border-spacing: 0; + table-layout: fixed; + } + + .vote-table th, + .vote-table td { + border: 0; + border-right: 1px solid #dfe5ee; + border-bottom: 1px solid #dfe5ee; + } + + .vote-table tr > :last-child { + border-right: 0; + } + + .vote-table tbody tr:last-child td { + border-bottom: 0; + }