Эх сурвалжийг харах

Merge branch 'master' of http://60.171.161.56:20000/tjf/zhengxie

wangmengwei 8 сар өмнө
parent
commit
aae0b1f9df
100 өөрчлөгдсөн 9980 нэмэгдсэн , 179 устгасан
  1. 6 0
      pom.xml
  2. 1 1
      ruoyi-admin/pom.xml
  3. 135 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/activity/ZxActivityController.java
  4. 106 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/assessment/ZxAssessmentController.java
  5. 102 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/bonus/ZxBonusController.java
  6. 84 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/AppletController.java
  7. 54 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java
  8. 143 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/conference/ZxConferenceController.java
  9. 107 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/investment/ZxInvestmentController.java
  10. 103 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/member/MemberAssessmentInfoController.java
  11. 165 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/member/MemberInfoController.java
  12. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
  13. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
  14. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
  15. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
  16. 97 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/notice/ZxNoticeController.java
  17. 127 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/CategoryProposalController.java
  18. 269 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalInfoController.java
  19. 118 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalUnitReplyController.java
  20. 115 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalUserController.java
  21. 97 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/speak/ZxSpeakController.java
  22. 226 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqmy/SqmyInfoController.java
  23. 117 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqmy/SqmyUnitReplyController.java
  24. 87 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/statistics/StatisticsController.java
  25. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
  26. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
  27. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
  28. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
  29. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
  30. 19 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  31. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
  32. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
  33. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
  34. 11 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
  35. 7 7
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  36. 23 13
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  37. 100 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UpdateAppController.java
  38. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZxFjController.java
  39. 23 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/Task.java
  40. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/urge/ZxUrgeController.java
  41. 1 1
      ruoyi-admin/src/main/resources/application-druid.yml
  42. 5 8
      ruoyi-admin/src/main/resources/application-prod.yml
  43. 4 45
      ruoyi-admin/src/main/resources/application.yml
  44. BIN
      ruoyi-admin/src/main/resources/font/simsun.ttc
  45. 44 7
      ruoyi-common/pom.xml
  46. 7 0
      ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
  47. 36 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java
  48. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  49. 24 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  50. 8 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  51. 138 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/CategoryProposal.java
  52. 10 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
  53. 12 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
  54. 45 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/BranchThreadUtils.java
  55. 218 6
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  56. 510 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/PDFUtil.java
  57. 174 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/PwdCheckUtil.java
  58. 239 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/QRCodeUtils.java
  59. 132 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java
  60. 90 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/StdRandom.java
  61. 3 1
      ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
  62. 140 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/AbstractJPushToolUtil.java
  63. 62 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushConfig.java
  64. 37 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushToolUtil.java
  65. 51 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushVO.java
  66. 2 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  67. 4 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
  68. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
  69. 75 54
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
  70. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java
  71. 1 1
      ruoyi-generator/src/main/resources/generator.yml
  72. 1 0
      ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
  73. 672 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalInfo.java
  74. 185 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalUnitReply.java
  75. 118 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalUser.java
  76. 11 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java
  77. 122 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/UpdateApp.java
  78. 118 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ZxFj.java
  79. 248 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivity.java
  80. 208 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivityUser.java
  81. 235 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/assessment/ZxAssessment.java
  82. 169 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/bonus/ZxBonus.java
  83. 216 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/conference/ZxConference.java
  84. 206 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/conference/ZxConferenceUser.java
  85. 169 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/investment/ZxInvestment.java
  86. 244 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberAssessmentInfo.java
  87. 266 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberInfo.java
  88. 50 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberInfoTree.java
  89. 211 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/notice/ZxNotice.java
  90. 77 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/notice/ZxUserNotice.java
  91. 221 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/speak/ZxSpeak.java
  92. 542 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/sqmy/SqmyInfo.java
  93. 196 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/sqmy/SqmyUnitReply.java
  94. 240 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/urge/ZxUrge.java
  95. 193 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MemberInfoVo.java
  96. 49 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MemberInfoVoTwo.java
  97. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/CategoryProposalMapper.java
  98. 63 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/MemberAssessmentInfoMapper.java
  99. 71 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/MemberInfoMapper.java
  100. 67 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProposalInfoMapper.java

+ 6 - 0
pom.xml

@@ -170,6 +170,12 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>cn.jpush.api</groupId>
+                <artifactId>jpush-client</artifactId>
+                <version>3.4.3</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 1 - 1
ruoyi-admin/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>jar</packaging>
-    <artifactId>ruoyi-admin</artifactId>
+    <artifactId>zhengxie</artifactId>
 
     <description>
         web服务入口

+ 135 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/activity/ZxActivityController.java

@@ -0,0 +1,135 @@
+package com.ruoyi.web.controller.activity;
+
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.activity.ZxActivity;
+import com.ruoyi.system.domain.activity.ZxActivityUser;
+import com.ruoyi.system.domain.conference.ZxConferenceUser;
+import com.ruoyi.system.service.IZxActivityService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协活动Controller
+ *
+ * @author boman
+ * @date 2024-03-14
+ */
+@RestController
+@RequestMapping("/zxActivity/activity")
+public class ZxActivityController extends BaseController {
+    @Autowired
+    private IZxActivityService zxActivityService;
+
+    /**
+     * 查询政协活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxActivity zxActivity) {
+        startPage();
+        List<ZxActivity> list = zxActivityService.selectZxActivityList(zxActivity);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询政协活动列表不分页
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:listNoPage')")
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(ZxActivity zxActivity) {
+        List<ZxActivity> list = zxActivityService.selectZxActivityList(zxActivity);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:export')")
+    @Log(title = "政协活动", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxActivity zxActivity) {
+        List<ZxActivity> list = zxActivityService.selectZxActivityList(zxActivity);
+        ExcelUtil<ZxActivity> util = new ExcelUtil<ZxActivity>(ZxActivity.class);
+        util.exportExcel(response, list, "政协活动数据");
+    }
+
+    /**
+     * 获取政协活动详细信息
+     */
+    @PostMapping(value = "/info")
+    public AjaxResult getInfo(@RequestBody ZxActivity zxActivity) {
+        return success(zxActivityService.selectZxActivityInfo(zxActivity));
+    }
+
+    /**
+     * 获取政协活动人员详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:getUserInfo')")
+    @PostMapping(value = "/getUserInfo")
+    public TableDataInfo getUserInfo(@RequestBody ZxActivityUser zxActivityUser) {
+        return getDataTable(zxActivityService.selectZxActivityUser(zxActivityUser));
+    }
+
+    /**
+     * 新增政协活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:add')")
+    @Log(title = "政协活动", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxActivity zxActivity) {
+        return toAjax(zxActivityService.insertZxActivity(zxActivity));
+    }
+
+    /**
+     * 修改活动答复信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:updateReply')")
+    @PostMapping(value = "/updateReply")
+    public AjaxResult updateReply(@RequestBody ZxActivityUser zxActivityUser) {
+        return success(zxActivityService.updateReply(zxActivityUser));
+    }
+
+    /**
+     * 修改请假审批
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:updateApproval')")
+    @PostMapping(value = "/updateApproval")
+    public AjaxResult updateApproval(@RequestBody ZxActivityUser zxActivityUser) {
+        return success(zxActivityService.updateApproval(zxActivityUser));
+    }
+    /**
+     * 修改政协活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:edit')")
+    @Log(title = "政协活动", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxActivity zxActivity) {
+        return toAjax(zxActivityService.updateZxActivity(zxActivity));
+    }
+
+    /**
+     * 删除政协活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxActivity:activity:remove')")
+    @Log(title = "政协活动", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{activityIds}")
+    public AjaxResult remove(@PathVariable Long[] activityIds) {
+        return toAjax(zxActivityService.deleteZxActivityByActivityIds(activityIds));
+    }
+}

+ 106 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/assessment/ZxAssessmentController.java

@@ -0,0 +1,106 @@
+package com.ruoyi.web.controller.assessment;
+
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.assessment.ZxAssessment;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxAssessmentService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协评价考核Controller
+ *
+ * @author boman
+ * @date 2024-03-19
+ */
+@RestController
+@RequestMapping("/zx/assessment")
+public class ZxAssessmentController extends BaseController {
+    @Autowired
+    private IZxAssessmentService zxAssessmentService;
+
+    /**
+     * 查询政协评价考核列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxAssessment zxAssessment) {
+
+        List<ZxAssessment> list = zxAssessmentService.selectZxAssessmentList(zxAssessment);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询政协评价考核列表(排除节点)
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:list')")
+    @GetMapping("/list/exclude/{assessmentId}")
+    public AjaxResult excludeChild(@PathVariable(value = "assessmentId", required = false) Long assessmentId) {
+        List<ZxAssessment> zxAssessments = zxAssessmentService.selectZxAssessmentList(new ZxAssessment());
+        zxAssessments.removeIf(d -> d.getAssessmentId().intValue() == assessmentId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), assessmentId + ""));
+        return success(zxAssessments);
+    }
+
+    /**
+     * 获取政协评价考核详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:query')")
+    @GetMapping(value = "/{assessmentId}")
+    public AjaxResult getInfo(@PathVariable("assessmentId") Long assessmentId) {
+        return success(zxAssessmentService.selectZxAssessmentByAssessmentId(assessmentId));
+    }
+
+    /**
+     * 新增政协评价考核
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:add')")
+    @Log(title = "政协评价考核", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxAssessment zxAssessment) {
+/*        if (!zxAssessmentService.checkAssessmentProjectUnique(zxAssessment)) {
+            return error("新增考核规则'" + zxAssessment.getAssessmentProject() + "'失败,考核规则已存在");
+        }*/
+        return toAjax(zxAssessmentService.insertZxAssessment(zxAssessment));
+    }
+
+    /**
+     * 修改政协评价考核
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:edit')")
+    @Log(title = "政协评价考核", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxAssessment zxAssessment) {
+/*        if (!zxAssessmentService.checkAssessmentProjectUnique(zxAssessment)) {
+            return error("修改考核规则'" + zxAssessment.getAssessmentProject() + "'失败,考核规则已存在");
+        }*/
+        return toAjax(zxAssessmentService.updateZxAssessment(zxAssessment));
+    }
+
+    /**
+     * 删除政协评价考核
+     */
+    @PreAuthorize("@ss.hasPermi('zxAssessment:assessment:remove')")
+    @Log(title = "政协评价考核", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{assessmentIds}")
+    public AjaxResult remove(@PathVariable Long[] assessmentIds) {
+        return toAjax(zxAssessmentService.deleteZxAssessmentByAssessmentIds(assessmentIds));
+    }
+}

+ 102 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/bonus/ZxBonusController.java

@@ -0,0 +1,102 @@
+package com.ruoyi.web.controller.bonus;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.bonus.ZxBonus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxBonusService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 政协履职加分Controller
+ *
+ * @author boman
+ * @date 2024-03-11
+ */
+@RestController
+@RequestMapping("/zxBonus/bonus")
+public class ZxBonusController extends BaseController
+{
+    @Autowired
+    private IZxBonusService zxBonusService;
+
+/**
+ * 查询政协履职加分列表
+ */
+@PreAuthorize("@ss.hasPermi('zxBonus:bonus:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ZxBonus zxBonus)
+    {
+        startPage();
+        List<ZxBonus> list = zxBonusService.selectZxBonusList(zxBonus);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协履职加分列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxBonus:bonus:export')")
+    @Log(title = "政协履职加分", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxBonus zxBonus)
+    {
+        List<ZxBonus> list = zxBonusService.selectZxBonusList(zxBonus);
+        ExcelUtil<ZxBonus> util = new ExcelUtil<ZxBonus>(ZxBonus.class);
+        util.exportExcel(response, list, "政协履职加分数据");
+    }
+
+    /**
+     * 获取政协履职加分详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxBonus:bonus:query')")
+    @GetMapping(value = "/{bonusId}")
+    public AjaxResult getInfo(@PathVariable("bonusId") Long bonusId)
+    {
+        return success(zxBonusService.selectZxBonusByBonusId(bonusId));
+    }
+
+    /**
+     * 新增政协履职加分
+     */
+    @PreAuthorize("@ss.hasPermi('zxBonus:bonus:add')")
+    @Log(title = "政协履职加分", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxBonus zxBonus)
+    {
+        return toAjax(zxBonusService.insertZxBonus(zxBonus));
+    }
+
+    /**
+     * 修改政协履职加分
+     */
+    @PreAuthorize("@ss.hasPermi('zxBonus:bonus:edit')")
+    @Log(title = "政协履职加分", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxBonus zxBonus)
+    {
+        return toAjax(zxBonusService.updateZxBonus(zxBonus));
+    }
+
+    /**
+     * 删除政协履职加分
+     */
+    @PreAuthorize("@ss.hasPermi('zxBonus:bonus:remove')")
+    @Log(title = "政协履职加分", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{bonusIds}")
+    public AjaxResult remove(@PathVariable Long[] bonusIds)
+    {
+        return toAjax(zxBonusService.deleteZxBonusByBonusIds(bonusIds));
+    }
+}

+ 84 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/AppletController.java

@@ -0,0 +1,84 @@
+package com.ruoyi.web.controller.common;
+
+
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCrypt;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
+import static com.ruoyi.common.constant.CommonConstants.ONE;
+
+/**小程序公共接口
+ * @Author: tjf
+ * @Date: 2023/5/25 11:46
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/applet")
+public class AppletController extends BaseController {
+    @Autowired
+    private ISysUserService userService;
+    @Resource
+    private RedisCache redisCache;
+
+
+    /**
+     *忘记密码发送验证短信
+     */
+    @RepeatSubmit(interval = 1000,message = "请求过于频繁")
+    @GetMapping("/appForgetPW/{phone}")
+    public AjaxResult appForgetPW(@PathVariable String phone)
+    {
+        SysUser sysUser = userService.selectUserByPhonenumber(phone);
+        if (sysUser == null || sysUser.getUserId() == null){
+            return  AjaxResult.error("当前手机号系统内不存在,无法修改密码");
+        }
+        String code = SendSmsUtils.getCode(6);
+        SendSmsUtils.sendSms(phone,"SMS_219525380","{\"code\":\"" + code + "\"}");
+        String key = "SMS_CODE:"+phone;
+        redisCache.setCacheObject(key,code, 5,TimeUnit.MINUTES);
+        return  AjaxResult.success();
+    }
+    /**
+     *忘记密码校验验证码,修改密码
+     */
+    @RepeatSubmit
+    @GetMapping("/appCheck")
+    public AjaxResult appCheck(@RequestParam("code") String code, @RequestParam("phone") String phone, @RequestParam("password") String password)
+    {
+        String key = "SMS_CODE:"+phone;
+        Object cacheObject = redisCache.getCacheObject(key);
+        if (ObjectUtils.isNotEmpty(cacheObject)){
+            if (code.equals(String.valueOf(cacheObject))){
+                redisCache.deleteObject(key);
+                SysUser user = new SysUser();
+                user.setPassword(password);
+               //修改密码
+                if (ONE.equals(userService.checkStrongPwd(user))) {
+                    return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
+                }
+                user.setPhonenumber(phone);
+                user.setPlaintext(user.getPassword());
+                user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+                //user.setUpdateBy(getUsername());
+                return toAjax(userService.resetUserPwdByPhonenumber(user));
+            }
+        }
+        return  AjaxResult.error();
+    }
+
+}

+ 54 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java

@@ -0,0 +1,54 @@
+package com.ruoyi.web.controller.common;
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/sendSms")
+public class SendSmsController {
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    /**
+     * 发送登录短信接口
+     * @return
+     */
+    @PostMapping("/sendLoginSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendLoginSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(4);
+        String username = user.getUsername();
+        SysUser sysUser = sysUserService.selectUserByPhonenumber(username);
+        if (sysUser != null){
+            redisCache.setCacheObject(LOGIN_USER_SMS + username, code,5, TimeUnit.MINUTES);
+            String msg = SendSmsUtils.sendPassword(code, username);
+            System.out.println(username+"登录短信发送回复:"+msg);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("当前手机号不存在");
+
+    }
+}

+ 143 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/conference/ZxConferenceController.java

@@ -0,0 +1,143 @@
+package com.ruoyi.web.controller.conference;
+
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.conference.ZxConference;
+import com.ruoyi.system.domain.conference.ZxConferenceUser;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxConferenceService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协会议活动Controller
+ *
+ * @author boman
+ * @date 2024-03-06
+ */
+@RestController
+@RequestMapping("/zxConference/conference")
+public class ZxConferenceController extends BaseController {
+    @Autowired
+    private IZxConferenceService zxConferenceService;
+
+    /**
+     * 查询政协会议活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxConference zxConference) {
+        startPage();
+        List<ZxConference> list = zxConferenceService.selectZxConferenceList(zxConference);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询政协会议活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:listNoPage')")
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(ZxConference zxConference) {
+        List<ZxConference> list = zxConferenceService.selectZxConferenceList(zxConference);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协会议活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:export')")
+    @Log(title = "政协会议活动", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxConference zxConference) {
+        List<ZxConference> list = zxConferenceService.selectZxConferenceList(zxConference);
+        ExcelUtil<ZxConference> util = new ExcelUtil<ZxConference>(ZxConference.class);
+        util.exportExcel(response, list, "政协会议活动数据");
+    }
+
+    /**
+     * 获取政协会议活动详细信息
+     */
+    @PostMapping(value = "/info")
+    public AjaxResult getInfo(@RequestBody ZxConference zxConference) {
+        return success(zxConferenceService.selectZxConferenceInfo(zxConference));
+    }
+
+    /**
+     * 获取政协会议活动人员详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:getUserInfo')")
+    @PostMapping(value = "/getUserInfo")
+    public TableDataInfo getUserInfo(@RequestBody ZxConferenceUser zxConferenceUser) {
+        return getDataTable(zxConferenceService.selectZxConferenceUser(zxConferenceUser));
+    }
+
+    /**
+     * 修改会议答复信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:updateReply')")
+    @PostMapping(value = "/updateReply")
+    public AjaxResult updateReply(@RequestBody ZxConferenceUser zxConferenceUser) {
+        return success(zxConferenceService.updateReply(zxConferenceUser));
+    }
+
+    /**
+     * 修改请假审批
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:updateApproval')")
+    @PostMapping(value = "/updateApproval")
+    public AjaxResult updateApproval(@RequestBody ZxConferenceUser zxConferenceUser) {
+        return success(zxConferenceService.updateApproval(zxConferenceUser));
+    }
+    /**
+     * 会议签到
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:signIn')")
+    @PostMapping(value = "/signIn")
+    public AjaxResult signIn(@RequestBody ZxConferenceUser zxConferenceUser) {
+        return success(zxConferenceService.signIn(zxConferenceUser));
+    }
+
+    /**
+     * 新增政协会议活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:add')")
+    @Log(title = "政协会议活动", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxConference zxConference) {
+        return toAjax(zxConferenceService.insertZxConference(zxConference));
+    }
+
+    /**
+     * 修改政协会议活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:edit')")
+    @Log(title = "政协会议活动", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxConference zxConference) {
+        return toAjax(zxConferenceService.updateZxConference(zxConference));
+    }
+
+    /**
+     * 删除政协会议活动
+     */
+    @PreAuthorize("@ss.hasPermi('zxConference:conference:remove')")
+    @Log(title = "政协会议活动", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{conferenceIds}")
+    public AjaxResult remove(@PathVariable Long[] conferenceIds) {
+        return toAjax(zxConferenceService.deleteZxConferenceByConferenceIds(conferenceIds));
+    }
+}

+ 107 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/investment/ZxInvestmentController.java

@@ -0,0 +1,107 @@
+package com.ruoyi.web.controller.investment;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.investment.ZxInvestment;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxInvestmentService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协委员招商引资Controller
+ *
+ * @author boman
+ * @date 2024-03-27
+ */
+@RestController
+@RequestMapping("/zx/investment")
+public class ZxInvestmentController extends BaseController {
+    @Autowired
+    private IZxInvestmentService zxInvestmentService;
+
+    /**
+     * 查询政协委员招商引资列表
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxInvestment zxInvestment) {
+        startPage();
+        List<ZxInvestment> list = zxInvestmentService.selectZxInvestmentList(zxInvestment);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协委员招商引资列表
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:export')")
+    @Log(title = "政协委员招商引资", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxInvestment zxInvestment) {
+        List<ZxInvestment> list = zxInvestmentService.selectZxInvestmentList(zxInvestment);
+        ExcelUtil<ZxInvestment> util = new ExcelUtil<ZxInvestment>(ZxInvestment.class);
+        util.exportExcel(response, list, "政协委员招商引资数据");
+    }
+
+    /**
+     * 获取政协委员招商引资详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:query')")
+    @GetMapping(value = "/{investmentId}")
+    public AjaxResult getInfo(@PathVariable("investmentId") Long investmentId) {
+        return success(zxInvestmentService.selectZxInvestmentByInvestmentId(investmentId));
+    }
+
+    /**
+     * 新增政协委员招商引资
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:add')")
+    @Log(title = "政协委员招商引资", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxInvestment zxInvestment) {
+        return toAjax(zxInvestmentService.insertZxInvestment(zxInvestment));
+    }
+
+    /**
+     * 修改政协委员招商引资
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:edit')")
+    @Log(title = "政协委员招商引资", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxInvestment zxInvestment) {
+        return zxInvestmentService.updateZxInvestment(zxInvestment);
+    }
+
+    /**
+     * 审核/签约按钮政协委员招商引资
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:examine')")
+    @Log(title = "政协委员招商引资", businessType = BusinessType.UPDATE)
+    @PostMapping("/examine")
+    public AjaxResult examine(@RequestBody ZxInvestment zxInvestment) {
+        return zxInvestmentService.updateZxInvestment(zxInvestment);
+    }
+
+    /**
+     * 删除政协委员招商引资
+     */
+    @PreAuthorize("@ss.hasPermi('zx:investment:remove')")
+    @Log(title = "政协委员招商引资", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{investmentIds}")
+    public AjaxResult remove(@PathVariable Long[] investmentIds) {
+        return toAjax(zxInvestmentService.deleteZxInvestmentByInvestmentIds(investmentIds));
+    }
+}

+ 103 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/member/MemberAssessmentInfoController.java

@@ -0,0 +1,103 @@
+package com.ruoyi.web.controller.member;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.member.MemberAssessmentInfo;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IMemberAssessmentInfoService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 委员考核分数Controller
+ *
+ * @author boman
+ * @date 2024-03-20
+ */
+@RestController
+@RequestMapping("/zx/assessmentInfo")
+public class MemberAssessmentInfoController extends BaseController
+{
+    @Autowired
+    private IMemberAssessmentInfoService memberAssessmentInfoService;
+
+/**
+ * 查询委员考核分数列表
+ */
+@PreAuthorize("@ss.hasPermi('zx:assessmentInfo:list')")
+@GetMapping("/list")
+    public TableDataInfo list(MemberAssessmentInfo memberAssessmentInfo)
+    {
+        startPage();
+        List<MemberAssessmentInfo> list = memberAssessmentInfoService.selectMemberAssessmentInfoList(memberAssessmentInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出委员考核分数列表
+     */
+    @PreAuthorize("@ss.hasPermi('zx:assessmentInfo:export')")
+    @Log(title = "委员考核分数", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, MemberAssessmentInfo memberAssessmentInfo)
+    {
+        List<MemberAssessmentInfo> list = memberAssessmentInfoService.selectMemberAssessmentInfoList(memberAssessmentInfo);
+        ExcelUtil<MemberAssessmentInfo> util = new ExcelUtil<MemberAssessmentInfo>(MemberAssessmentInfo.class);
+        util.exportExcel(response, list, "委员考核分数数据");
+    }
+
+    /**
+     * 获取委员考核分数详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zx:assessmentInfo:query')")
+    @GetMapping(value = "/{memberAssessmentId}")
+    public AjaxResult getInfo(@PathVariable("memberAssessmentId") Long memberAssessmentId)
+    {
+        return success(memberAssessmentInfoService.selectMemberAssessmentInfoByMemberAssessmentId(memberAssessmentId));
+    }
+
+    /**
+     * 新增委员考核分数
+     */
+    @PreAuthorize("@ss.hasPermi('zx:assessmentInfo:add')")
+    @Log(title = "委员考核分数", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MemberAssessmentInfo memberAssessmentInfo)
+    {
+        return toAjax(memberAssessmentInfoService.insertMemberAssessmentInfo(memberAssessmentInfo));
+    }
+
+    /**
+     * 修改委员考核分数
+     */
+    @PreAuthorize("@ss.hasPermi('zx:assessmentInfo:edit')")
+    @Log(title = "委员考核分数", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody MemberAssessmentInfo memberAssessmentInfo)
+    {
+        return toAjax(memberAssessmentInfoService.updateMemberAssessmentInfo(memberAssessmentInfo));
+    }
+
+    /**
+     * 删除委员考核分数
+     */
+    @PreAuthorize("@ss.hasPermi('zx:assessmentInfo:remove')")
+    @Log(title = "委员考核分数", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{memberAssessmentIds}")
+    public AjaxResult remove(@PathVariable Long[] memberAssessmentIds)
+    {
+        return toAjax(memberAssessmentInfoService.deleteMemberAssessmentInfoByMemberAssessmentIds(memberAssessmentIds));
+    }
+}

+ 165 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/member/MemberInfoController.java

@@ -0,0 +1,165 @@
+package com.ruoyi.web.controller.member;
+
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.domain.entity.SysMenu;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.member.MemberInfo;
+import com.ruoyi.system.service.impl.TaskService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IMemberInfoService;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 委员信息Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/member/info")
+public class MemberInfoController extends BaseController {
+    @Autowired
+    private IMemberInfoService memberInfoService;
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 查询委员信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(MemberInfo memberInfo) {
+        startPage();
+        List<MemberInfo> list = memberInfoService.selectMemberInfoList(memberInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取委员菜单下拉树列表
+     */
+    @GetMapping("/treeSelect")
+    public AjaxResult treeSelect(MemberInfo memberInfo) {
+        List<MemberInfo> list = memberInfoService.selectMemberInfoList(memberInfo);
+        return success(memberInfoService.buildMemberInfoTreeSelect(list));
+    }
+
+    /**
+     * 查询委员信息列表不分页
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:listNoPage')")
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(MemberInfo memberInfo) {
+        List<MemberInfo> list = memberInfoService.selectMemberInfoList(memberInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出委员信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:export')")
+    @Log(title = "委员信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, MemberInfo memberInfo) {
+        List<MemberInfo> list = memberInfoService.selectMemberInfoList(memberInfo);
+        ExcelUtil<MemberInfo> util = new ExcelUtil<MemberInfo>(MemberInfo.class);
+        util.exportExcel(response, list, "委员信息数据");
+    }
+
+
+    @Log(title = "委员信息", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('member:info:import')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<MemberInfo> util = new ExcelUtil<MemberInfo>(MemberInfo.class);
+        List<MemberInfo> list = util.importExcel(file.getInputStream());
+        String operName = getUsername();
+        String message = memberInfoService.importData(list, updateSupport, operName);
+        return success(message);
+    }
+
+
+    /**
+     * 获取委员信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:query')")
+    @GetMapping(value = "/{memberId}")
+    public AjaxResult getInfo(@PathVariable("memberId") Long memberId) {
+        return success(memberInfoService.selectMemberInfoByMemberId(memberId));
+    }
+
+    /**
+     * 获取委员履职信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:queryJop')")
+    @PostMapping(value = "/getInfoJop")
+    public AjaxResult getInfoJop(@RequestBody MemberInfo memberInfo) {
+        return success(memberInfoService.getInfoJop(memberInfo));
+    }
+
+    /**
+     * 获取委员履职年度报告
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:MemberReport')")
+    @PostMapping(value = "/getMemberReport")
+    public AjaxResult getMemberReport(@RequestBody MemberInfo memberInfo) {
+        return success(memberInfoService.getMemberReport(memberInfo));
+    }
+
+    /**
+     * 新增委员信息
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:add')")
+    @Log(title = "委员信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MemberInfo memberInfo) {
+        return memberInfoService.insertMemberInfo(memberInfo);
+    }
+
+    /**
+     * 修改委员信息
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:edit')")
+    @Log(title = "委员信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody MemberInfo memberInfo) {
+        return toAjax(memberInfoService.updateMemberInfo(memberInfo));
+    }
+
+    /**
+     * 删除委员信息
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:remove')")
+    @Log(title = "委员信息", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{memberIds}")
+    public AjaxResult remove(@PathVariable Long[] memberIds) {
+        return toAjax(memberInfoService.deleteMemberInfoByMemberIds(memberIds));
+    }
+
+    /**
+     * 手动更新所有委员分数,排名
+     */
+    @PreAuthorize("@ss.hasPermi('member:info:assessmentScore')")
+    @PostMapping("/assessmentScore")
+    public AjaxResult assessmentScore() {
+        taskService.assessmentScore();
+        return AjaxResult.success();
+    }
+}

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

@@ -93,7 +93,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheName/{cacheName}")
+    @GetMapping("/clearCacheName/{cacheName}")
     public AjaxResult clearCacheName(@PathVariable String cacheName)
     {
         Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
@@ -102,7 +102,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheKey/{cacheKey}")
+    @GetMapping("/clearCacheKey/{cacheKey}")
     public AjaxResult clearCacheKey(@PathVariable String cacheKey)
     {
         redisTemplate.delete(cacheKey);
@@ -110,7 +110,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheAll")
+    @GetMapping("/clearCacheAll")
     public AjaxResult clearCacheAll()
     {
         Collection<String> cacheKeys = redisTemplate.keys("*");

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java

@@ -56,7 +56,7 @@ public class SysLogininforController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{infoIds}")
+    @GetMapping("/delete/{infoIds}")
     public AjaxResult remove(@PathVariable Long[] infoIds)
     {
         return toAjax(logininforService.deleteLogininforByIds(infoIds));
@@ -64,7 +64,7 @@ public class SysLogininforController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
+    @GetMapping("/clean")
     public AjaxResult clean()
     {
         logininforService.cleanLogininfor();

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java

@@ -52,7 +52,7 @@ public class SysOperlogController extends BaseController
 
     @Log(title = "操作日志", businessType = BusinessType.DELETE)
     @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/{operIds}")
+    @GetMapping("/delete/{operIds}")
     public AjaxResult remove(@PathVariable Long[] operIds)
     {
         return toAjax(operLogService.deleteOperLogByIds(operIds));
@@ -60,7 +60,7 @@ public class SysOperlogController extends BaseController
 
     @Log(title = "操作日志", businessType = BusinessType.CLEAN)
     @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/clean")
+    @GetMapping("/clean")
     public AjaxResult clean()
     {
         operLogService.cleanOperLog();

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java

@@ -74,7 +74,7 @@ public class SysUserOnlineController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
-    @DeleteMapping("/{tokenId}")
+    @GetMapping("/delete/{tokenId}")
     public AjaxResult forceLogout(@PathVariable String tokenId)
     {
         redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);

+ 97 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/notice/ZxNoticeController.java

@@ -0,0 +1,97 @@
+package com.ruoyi.web.controller.notice;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.notice.ZxNotice;
+import com.ruoyi.system.service.IZxNoticeService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协通知公告Controller
+ *
+ * @author boman
+ * @date 2024-03-05
+ */
+@RestController
+@RequestMapping("/zxNotice/notice")
+public class ZxNoticeController extends BaseController {
+    @Autowired
+    private IZxNoticeService zxNoticeService;
+
+    /**
+     * 查询政协通知公告列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxNotice zxNotice) {
+        startPage();
+        List<ZxNotice> list = zxNoticeService.selectZxNoticeList(zxNotice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协通知公告列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:export')")
+    @Log(title = "政协通知公告", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxNotice zxNotice) {
+        List<ZxNotice> list = zxNoticeService.selectZxNoticeList(zxNotice);
+        ExcelUtil<ZxNotice> util = new ExcelUtil<ZxNotice>(ZxNotice.class);
+        util.exportExcel(response, list, "政协通知公告数据");
+    }
+
+    /**
+     * 获取政协通知公告详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:query')")
+    @GetMapping(value = "/{zxNoticeId}")
+    public AjaxResult getInfo(@PathVariable("zxNoticeId") Long zxNoticeId) {
+        return success(zxNoticeService.selectZxNoticeByZxNoticeId(zxNoticeId));
+    }
+
+    /**
+     * 新增政协通知公告
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:add')")
+    @Log(title = "政协通知公告", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxNotice zxNotice) {
+        return toAjax(zxNoticeService.insertZxNotice(zxNotice));
+    }
+
+    /**
+     * 修改政协通知公告
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:edit')")
+    @Log(title = "政协通知公告", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxNotice zxNotice) {
+        return toAjax(zxNoticeService.updateZxNotice(zxNotice));
+    }
+
+    /**
+     * 删除政协通知公告
+     */
+    @PreAuthorize("@ss.hasPermi('zxNotice:notice:remove')")
+    @Log(title = "政协通知公告", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{zxNoticeIds}")
+    public AjaxResult remove(@PathVariable Long[] zxNoticeIds) {
+        return toAjax(zxNoticeService.deleteZxNoticeByZxNoticeIds(zxNoticeIds));
+    }
+}

+ 127 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/CategoryProposalController.java

@@ -0,0 +1,127 @@
+package com.ruoyi.web.controller.proposal;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.domain.entity.CategoryProposal;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.utils.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.ICategoryProposalService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 提案类别Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/category/proposal")
+public class CategoryProposalController extends BaseController
+{
+    @Autowired
+    private ICategoryProposalService categoryProposalService;
+
+    /**
+     * 查询提案类别列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(CategoryProposal categoryProposal)
+    {
+        //startPage();
+        List<CategoryProposal> list = categoryProposalService.selectCategoryProposalList(categoryProposal);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出提案类别列表
+     */
+    @PreAuthorize("@ss.hasPermi('category:proposal:export')")
+    @Log(title = "提案类别", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CategoryProposal categoryProposal)
+    {
+        List<CategoryProposal> list = categoryProposalService.selectCategoryProposalList(categoryProposal);
+        ExcelUtil<CategoryProposal> util = new ExcelUtil<CategoryProposal>(CategoryProposal.class);
+        util.exportExcel(response, list, "提案类别数据");
+    }
+
+    /**
+     * 获取提案类别详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('category:proposal:query')")
+    @GetMapping(value = "/{categoryId}")
+    public AjaxResult getInfo(@PathVariable("categoryId") Long categoryId)
+    {
+        return success(categoryProposalService.selectCategoryProposalByCategoryId(categoryId));
+    }
+
+    /**
+     * 新增提案类别
+     */
+    @PreAuthorize("@ss.hasPermi('category:proposal:add')")
+    @Log(title = "提案类别", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CategoryProposal categoryProposal)
+    {
+        return toAjax(categoryProposalService.insertCategoryProposal(categoryProposal));
+    }
+
+    /**
+     * 修改提案类别
+     */
+    @PreAuthorize("@ss.hasPermi('category:proposal:edit')")
+    @Log(title = "提案类别", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody CategoryProposal categoryProposal)
+    {
+        return toAjax(categoryProposalService.updateCategoryProposal(categoryProposal));
+    }
+
+    /**
+     * 删除提案类别
+     */
+    @PreAuthorize("@ss.hasPermi('category:proposal:remove')")
+    @Log(title = "提案类别", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{categoryIds}")
+    public AjaxResult remove(@PathVariable Long[] categoryIds)
+    {
+        return toAjax(categoryProposalService.deleteCategoryProposalByCategoryIds(categoryIds));
+    }
+
+    /**
+     * 获取提案类别树列表
+     */
+    @GetMapping("/categoryTree")
+    public AjaxResult categoryTree(CategoryProposal categoryProposal)
+    {
+        return success(categoryProposalService.selectCategoryTreeList(categoryProposal));
+    }
+
+    /**
+     * 查询提案类别列表(排除节点)
+     */
+    @GetMapping("/list/exclude/{categoryId}")
+    public AjaxResult excludeChild(@PathVariable(value = "categoryId", required = false) Long categoryId)
+    {
+        List<CategoryProposal> list = categoryProposalService.selectCategoryProposalList(new CategoryProposal());
+        list.removeIf(d -> d.getCategoryId().intValue() == categoryId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), categoryId + ""));
+        return success(list);
+    }
+}

+ 269 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalInfoController.java

@@ -0,0 +1,269 @@
+package com.ruoyi.web.controller.proposal;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.system.domain.ProposalUnitReply;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ProposalInfo;
+import com.ruoyi.system.service.IProposalInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 提案信息Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/proposalInfo/info")
+public class ProposalInfoController extends BaseController
+{
+    @Autowired
+    private IProposalInfoService proposalInfoService;
+
+    /**
+     * 查询提案信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ProposalInfo proposalInfo)
+    {
+        startPage();
+        List<ProposalInfo> list = proposalInfoService.selectProposalInfoList(proposalInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 列表页统计
+     */
+    @GetMapping("/list/statistics")
+    public AjaxResult statistics(ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.statistics(proposalInfo);
+    }
+
+    /**
+     * 查询联名提案信息列表(只查询附议)
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:jointlyList')")
+    @GetMapping("/jointlyList")
+    public TableDataInfo jointlyList(ProposalInfo proposalInfo)
+    {
+        startPage();
+        List<ProposalInfo> list = proposalInfoService.jointlyList(proposalInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 催办列表
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:tacbList')")
+    @GetMapping("/tacbList")
+    public TableDataInfo tacbList(ProposalInfo proposalInfo)
+    {
+        startPage();
+        List<ProposalInfo> list = proposalInfoService.tacbList(proposalInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 联名提案信息列表导出(只查询附议)
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:jointlyExport')")
+    @Log(title = "提案信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/jointlyExport")
+    public void jointlyExport(HttpServletResponse response, ProposalInfo proposalInfo)
+    {
+        List<ProposalInfo> list = proposalInfoService.jointlyList(proposalInfo);
+        ExcelUtil<ProposalInfo> util = new ExcelUtil<ProposalInfo>(ProposalInfo.class);
+        util.exportExcel(response, list, "提案信息数据");
+    }
+
+    /**
+     * 根据单位查询
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:unitList')")
+    @GetMapping("/unitList")
+    public TableDataInfo unitList(ProposalInfo proposalInfo)
+    {
+        startPage();
+        List<ProposalInfo> list = proposalInfoService.unitList(proposalInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 联名提案信息列表导出(只查询附议)
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:unitListExport')")
+    @Log(title = "提案信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/unitListExport")
+    public void unitListExport(HttpServletResponse response, ProposalInfo proposalInfo)
+    {
+        List<ProposalInfo> list = proposalInfoService.unitList(proposalInfo);
+        ExcelUtil<ProposalInfo> util = new ExcelUtil<ProposalInfo>(ProposalInfo.class);
+        util.exportExcel(response, list, "提案信息数据");
+    }
+
+
+    /**
+     * 导出提案信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:export')")
+    @Log(title = "提案信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ProposalInfo proposalInfo)
+    {
+        List<ProposalInfo> list = proposalInfoService.selectProposalInfoList(proposalInfo);
+        ExcelUtil<ProposalInfo> util = new ExcelUtil<ProposalInfo>(ProposalInfo.class);
+        util.exportExcel(response, list, "提案信息数据");
+    }
+
+    /**
+     * 获取提案信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:query')")
+    @GetMapping(value = "/{proposalId}")
+    public AjaxResult getInfo(@PathVariable("proposalId") Long proposalId)
+    {
+        return success(proposalInfoService.selectProposalInfoByProposalId(proposalId));
+    }
+
+    /**
+     * 新增提案信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:add')")
+    @Log(title = "提案信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ProposalInfo proposalInfo)
+    {
+        return toAjax(proposalInfoService.insertProposalInfo(proposalInfo));
+    }
+
+    /**
+     * 修改提案信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:edit')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ProposalInfo proposalInfo)
+    {
+        return toAjax(proposalInfoService.updateProposalInfo(proposalInfo));
+    }
+
+    /**
+     * 删除提案信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:remove')")
+    @Log(title = "提案信息", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{proposalIds}")
+    public AjaxResult remove(@PathVariable Long[] proposalIds)
+    {
+        return toAjax(proposalInfoService.deleteProposalInfoByProposalIds(proposalIds));
+    }
+
+    /***
+     * 是否立案
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:isRecord')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/isRecord")
+    public AjaxResult isRecord(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.isRecord(proposalInfo);
+    }
+
+    /***
+     * 提案交办
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:assign')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/assign")
+    public AjaxResult assign(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.assign(proposalInfo);
+    }
+
+
+    /***
+     * 提案交办审核
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:assignsh')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/assignsh")
+    public AjaxResult assignsh(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.assignsh(proposalInfo);
+    }
+
+
+    /***
+     * 委员意见
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:idea')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/idea")
+    public AjaxResult idea(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.idea(proposalInfo);
+    }
+
+    /***
+     * 政协意见
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:zxIdea')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/zxIdea")
+    public AjaxResult zxIdea(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.zxIdea(proposalInfo);
+    }
+
+    /***
+     * 推荐重点
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:keyPoint')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/keyPoint")
+    public AjaxResult keyPoint(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.keyPoint(proposalInfo);
+    }
+
+    /***
+     * 推荐优秀
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:outstanding')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/outstanding")
+    public AjaxResult outstanding(@RequestBody ProposalInfo proposalInfo)
+    {
+        return proposalInfoService.outstanding(proposalInfo);
+    }
+
+    /***
+     * 承办单位答复委员
+     */
+    @PreAuthorize("@ss.hasPermi('proposalInfo:info:cbdwdfwy')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/cbdwdfwy")
+    public AjaxResult cbdwdfwy(@RequestBody ProposalInfo proposalInfo)
+    {
+        return toAjax(proposalInfoService.cbdwdfwy(proposalInfo));
+    }
+
+}

+ 118 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalUnitReplyController.java

@@ -0,0 +1,118 @@
+package com.ruoyi.web.controller.proposal;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.system.domain.ProposalInfo;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ProposalUnitReply;
+import com.ruoyi.system.service.IProposalUnitReplyService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 提案单位答复Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/proposal/unit")
+public class ProposalUnitReplyController extends BaseController
+{
+    @Autowired
+    private IProposalUnitReplyService proposalUnitReplyService;
+
+/**
+ * 查询提案单位答复列表
+ */
+@PreAuthorize("@ss.hasPermi('proposal:unit:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ProposalUnitReply proposalUnitReply)
+    {
+        startPage();
+        List<ProposalUnitReply> list = proposalUnitReplyService.selectProposalUnitReplyList(proposalUnitReply);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出提案单位答复列表
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:export')")
+    @Log(title = "提案单位答复", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ProposalUnitReply proposalUnitReply)
+    {
+        List<ProposalUnitReply> list = proposalUnitReplyService.selectProposalUnitReplyList(proposalUnitReply);
+        ExcelUtil<ProposalUnitReply> util = new ExcelUtil<ProposalUnitReply>(ProposalUnitReply.class);
+        util.exportExcel(response, list, "提案单位答复数据");
+    }
+
+    /**
+     * 获取提案单位答复详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(proposalUnitReplyService.selectProposalUnitReplyById(id));
+    }
+
+    /**
+     * 新增提案单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:add')")
+    @Log(title = "提案单位答复", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ProposalUnitReply proposalUnitReply)
+    {
+        return toAjax(proposalUnitReplyService.insertProposalUnitReply(proposalUnitReply));
+    }
+
+    /**
+     * 修改提案单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:edit')")
+    @Log(title = "提案单位答复", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ProposalUnitReply proposalUnitReply)
+    {
+        return toAjax(proposalUnitReplyService.updateProposalUnitReply(proposalUnitReply));
+    }
+
+    /**
+     * 删除提案单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:remove')")
+    @Log(title = "提案单位答复", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(proposalUnitReplyService.deleteProposalUnitReplyByIds(ids));
+    }
+
+    /***
+     * 提案答复
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:unit:reply')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/reply")
+    public AjaxResult reply(@RequestBody ProposalUnitReply proposalUnitReply)
+    {
+        return proposalUnitReplyService.reply(proposalUnitReply);
+    }
+
+}

+ 115 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/proposal/ProposalUserController.java

@@ -0,0 +1,115 @@
+package com.ruoyi.web.controller.proposal;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ProposalUser;
+import com.ruoyi.system.service.IProposalUserService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 提案人员Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/proposal/user")
+public class ProposalUserController extends BaseController
+{
+    @Autowired
+    private IProposalUserService proposalUserService;
+
+/**
+ * 查询提案人员列表
+ */
+@PreAuthorize("@ss.hasPermi('proposal:user:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ProposalUser proposalUser)
+    {
+        startPage();
+        List<ProposalUser> list = proposalUserService.selectProposalUserList(proposalUser);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出提案人员列表
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:export')")
+    @Log(title = "提案人员", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ProposalUser proposalUser)
+    {
+        List<ProposalUser> list = proposalUserService.selectProposalUserList(proposalUser);
+        ExcelUtil<ProposalUser> util = new ExcelUtil<ProposalUser>(ProposalUser.class);
+        util.exportExcel(response, list, "提案人员数据");
+    }
+
+    /**
+     * 获取提案人员详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(proposalUserService.selectProposalUserById(id));
+    }
+
+    /**
+     * 新增提案人员
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:add')")
+    @Log(title = "提案人员", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ProposalUser proposalUser)
+    {
+        return toAjax(proposalUserService.insertProposalUser(proposalUser));
+    }
+
+    /**
+     * 修改提案人员
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:edit')")
+    @Log(title = "提案人员", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ProposalUser proposalUser)
+    {
+        return toAjax(proposalUserService.updateProposalUser(proposalUser));
+    }
+
+    /**
+     * 删除提案人员
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:remove')")
+    @Log(title = "提案人员", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(proposalUserService.deleteProposalUserByIds(ids));
+    }
+
+    /**
+     * 联名提案人员确认
+     */
+    @PreAuthorize("@ss.hasPermi('proposal:user:verify')")
+    @Log(title = "提案人员", businessType = BusinessType.UPDATE)
+    @PostMapping("/verify")
+    public AjaxResult verify(@RequestBody ProposalUser proposalUser)
+    {
+        return toAjax(proposalUserService.verify(proposalUser));
+    }
+}

+ 97 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/speak/ZxSpeakController.java

@@ -0,0 +1,97 @@
+package com.ruoyi.web.controller.speak;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.speak.ZxSpeak;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxSpeakService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协发言Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/zx/speak")
+public class ZxSpeakController extends BaseController {
+    @Autowired
+    private IZxSpeakService zxSpeakService;
+
+    /**
+     * 查询政协发言列表
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ZxSpeak zxSpeak) {
+        startPage();
+        List<ZxSpeak> list = zxSpeakService.selectZxSpeakList(zxSpeak);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协发言列表
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:export')")
+    @Log(title = "政协发言", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxSpeak zxSpeak) {
+        List<ZxSpeak> list = zxSpeakService.selectZxSpeakList(zxSpeak);
+        ExcelUtil<ZxSpeak> util = new ExcelUtil<ZxSpeak>(ZxSpeak.class);
+        util.exportExcel(response, list, "政协发言数据");
+    }
+
+    /**
+     * 获取政协发言详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:query')")
+    @GetMapping(value = "/{speakId}")
+    public AjaxResult getInfo(@PathVariable("speakId") Long speakId) {
+        return success(zxSpeakService.selectZxSpeakBySpeakId(speakId));
+    }
+
+    /**
+     * 新增政协发言
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:add')")
+    @Log(title = "政协发言", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxSpeak zxSpeak) {
+        return toAjax(zxSpeakService.insertZxSpeak(zxSpeak));
+    }
+
+    /**
+     * 修改政协发言
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:edit')")
+    @Log(title = "政协发言", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxSpeak zxSpeak) {
+        return toAjax(zxSpeakService.updateZxSpeak(zxSpeak));
+    }
+
+    /**
+     * 删除政协发言
+     */
+    @PreAuthorize("@ss.hasPermi('zx:speak:remove')")
+    @Log(title = "政协发言", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{speakIds}")
+    public AjaxResult remove(@PathVariable Long[] speakIds) {
+        return toAjax(zxSpeakService.deleteZxSpeakBySpeakIds(speakIds));
+    }
+}

+ 226 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqmy/SqmyInfoController.java

@@ -0,0 +1,226 @@
+package com.ruoyi.web.controller.sqmy;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.ProposalInfo;
+import com.ruoyi.system.domain.sqmy.SqmyInfo;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.ISqmyInfoService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 社情民意信息Controller
+ *
+ * @author boman
+ * @date 2024-03-14
+ */
+@RestController
+@RequestMapping("/sqmyInfo/info")
+public class SqmyInfoController extends BaseController
+{
+    @Autowired
+    private ISqmyInfoService sqmyInfoService;
+
+    /**
+     * 查询社情民意信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SqmyInfo sqmyInfo)
+    {
+        startPage();
+        List<SqmyInfo> list = sqmyInfoService.selectSqmyInfoList(sqmyInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 列表页统计
+     */
+    @GetMapping("/list/statistics")
+    public AjaxResult statistics(SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.statistics(sqmyInfo);
+    }
+
+    /**
+     * 根据单位查询
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:unitList')")
+    @GetMapping("/unitList")
+    public TableDataInfo unitList(SqmyInfo sqmyInfo)
+    {
+        startPage();
+        List<SqmyInfo> list = sqmyInfoService.unitList(sqmyInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 催办列表
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:sqmycbList')")
+    @GetMapping("/sqmycbList")
+    public TableDataInfo sqmycbList(SqmyInfo sqmyInfo)
+    {
+        startPage();
+        List<SqmyInfo> list = sqmyInfoService.sqmycbList(sqmyInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出社情民意信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:export')")
+    @Log(title = "社情民意信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SqmyInfo sqmyInfo)
+    {
+        List<SqmyInfo> list = sqmyInfoService.selectSqmyInfoList(sqmyInfo);
+        ExcelUtil<SqmyInfo> util = new ExcelUtil<SqmyInfo>(SqmyInfo.class);
+        util.exportExcel(response, list, "社情民意信息数据");
+    }
+
+    /**
+     * 获取社情民意信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:query')")
+    @GetMapping(value = "/{sqmyId}")
+    public AjaxResult getInfo(@PathVariable("sqmyId") Long sqmyId)
+    {
+        return success(sqmyInfoService.selectSqmyInfoBySqmyId(sqmyId));
+    }
+
+    /**
+     * 新增社情民意信息
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:add')")
+    @Log(title = "社情民意信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return toAjax(sqmyInfoService.insertSqmyInfo(sqmyInfo));
+    }
+
+    /**
+     * 修改社情民意信息
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:edit')")
+    @Log(title = "社情民意信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return toAjax(sqmyInfoService.updateSqmyInfo(sqmyInfo));
+    }
+
+    /**
+     * 删除社情民意信息
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:remove')")
+    @Log(title = "社情民意信息", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{sqmyIds}")
+    public AjaxResult remove(@PathVariable Long[] sqmyIds)
+    {
+        return toAjax(sqmyInfoService.deleteSqmyInfoBySqmyIds(sqmyIds));
+    }
+
+    /***
+     * 是否立案
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:isRecord')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/isRecord")
+    public AjaxResult isRecord(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.isRecord(sqmyInfo);
+    }
+
+    /***
+     * 交办
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:assign')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/assign")
+    public AjaxResult assign(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.assign(sqmyInfo);
+    }
+
+    /***
+     * 交办审核
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:assignsh')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/assignsh")
+    public AjaxResult assignsh(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.assignsh(sqmyInfo);
+    }
+
+
+    /***
+     * 委员意见
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:idea')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/idea")
+    public AjaxResult idea(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.idea(sqmyInfo);
+    }
+
+    /***
+     * 政协意见
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:zxIdea')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/zxIdea")
+    public AjaxResult zxIdea(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.zxIdea(sqmyInfo);
+    }
+
+    /***
+     * 推荐重点
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:keyPoint')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/keyPoint")
+    public AjaxResult keyPoint(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.keyPoint(sqmyInfo);
+    }
+
+    /***
+     * 推荐优秀
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:outstanding')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/outstanding")
+    public AjaxResult outstanding(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return sqmyInfoService.outstanding(sqmyInfo);
+    }
+
+    /***
+     * 承办单位答复委员
+     */
+    @PreAuthorize("@ss.hasPermi('sqmyInfo:info:cbdwdfwy')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/cbdwdfwy")
+    public AjaxResult cbdwdfwy(@RequestBody SqmyInfo sqmyInfo)
+    {
+        return toAjax(sqmyInfoService.cbdwdfwy(sqmyInfo));
+    }
+}

+ 117 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqmy/SqmyUnitReplyController.java

@@ -0,0 +1,117 @@
+package com.ruoyi.web.controller.sqmy;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.system.domain.ProposalUnitReply;
+import com.ruoyi.system.domain.sqmy.SqmyUnitReply;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.ISqmyUnitReplyService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 社情民意单位答复Controller
+ *
+ * @author boman
+ * @date 2024-03-15
+ */
+@RestController
+@RequestMapping("/sqmy/unit")
+public class SqmyUnitReplyController extends BaseController
+{
+    @Autowired
+    private ISqmyUnitReplyService sqmyUnitReplyService;
+
+/**
+ * 查询社情民意单位答复列表
+ */
+@PreAuthorize("@ss.hasPermi('sqmy:unit:list')")
+@GetMapping("/list")
+    public TableDataInfo list(SqmyUnitReply sqmyUnitReply)
+    {
+        startPage();
+        List<SqmyUnitReply> list = sqmyUnitReplyService.selectSqmyUnitReplyList(sqmyUnitReply);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出社情民意单位答复列表
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:export')")
+    @Log(title = "社情民意单位答复", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SqmyUnitReply sqmyUnitReply)
+    {
+        List<SqmyUnitReply> list = sqmyUnitReplyService.selectSqmyUnitReplyList(sqmyUnitReply);
+        ExcelUtil<SqmyUnitReply> util = new ExcelUtil<SqmyUnitReply>(SqmyUnitReply.class);
+        util.exportExcel(response, list, "社情民意单位答复数据");
+    }
+
+    /**
+     * 获取社情民意单位答复详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(sqmyUnitReplyService.selectSqmyUnitReplyById(id));
+    }
+
+    /**
+     * 新增社情民意单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:add')")
+    @Log(title = "社情民意单位答复", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SqmyUnitReply sqmyUnitReply)
+    {
+        return toAjax(sqmyUnitReplyService.insertSqmyUnitReply(sqmyUnitReply));
+    }
+
+    /**
+     * 修改社情民意单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:edit')")
+    @Log(title = "社情民意单位答复", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody SqmyUnitReply sqmyUnitReply)
+    {
+        return toAjax(sqmyUnitReplyService.updateSqmyUnitReply(sqmyUnitReply));
+    }
+
+    /**
+     * 删除社情民意单位答复
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:remove')")
+    @Log(title = "社情民意单位答复", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sqmyUnitReplyService.deleteSqmyUnitReplyByIds(ids));
+    }
+
+    /***
+     * 社情民意答复
+     */
+    @PreAuthorize("@ss.hasPermi('sqmy:unit:reply')")
+    @Log(title = "提案信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/reply")
+    public AjaxResult reply(@RequestBody SqmyUnitReply sqmyUnitReply)
+    {
+        return sqmyUnitReplyService.reply(sqmyUnitReply);
+    }
+}

+ 87 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/statistics/StatisticsController.java

@@ -0,0 +1,87 @@
+package com.ruoyi.web.controller.statistics;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.system.domain.member.MemberInfo;
+import com.ruoyi.system.domain.sqmy.SqmyUnitReply;
+import com.ruoyi.system.service.ISqmyInfoService;
+import com.ruoyi.system.service.IStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/18 13:54
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/statistics")
+public class StatisticsController extends BaseController {
+    @Autowired
+    private IStatisticsService statisticsService;
+
+    /**
+     * 统计查询委员图形分析 界别
+     */
+    @PreAuthorize("@ss.hasPermi('statistics:boundary:find')")
+    @PostMapping("/boundary")
+    public AjaxResult boundary() {
+        AjaxResult boundary = statisticsService.boundary();
+        return AjaxResult.success(boundary);
+    }
+
+
+    /**
+     * 统计查询导出
+     */
+    @PreAuthorize("@ss.hasPermi('statistics:boundary:exportForm')")
+    @PostMapping("/exportForm")
+    public void exportForm(HttpServletResponse response, MemberInfo memberInfo) {
+        statisticsService.exportForm(response, memberInfo);
+    }
+
+
+    /**
+     * pc首页(近三月)
+     */
+    @PreAuthorize("@ss.hasPermi('statistics:boundary:threeWyta')")
+    @GetMapping("/threeData")
+    public AjaxResult threeData() throws ParseException {
+        return statisticsService.threeData();
+    }
+
+    /**
+     * pc首页(本周提案/社情民意统计)
+     */
+    @PreAuthorize("@ss.hasPermi('statistics:boundary:weekData')")
+    @GetMapping("/weekData")
+    public AjaxResult weekData() throws ParseException {
+        return statisticsService.weekData();
+    }
+
+    /**
+     * pc首页(本季度提案统计)
+     */
+    @PreAuthorize("@ss.hasPermi('statistics:boundary:quarterData')")
+    @GetMapping("/quarterData")
+    public AjaxResult quarterData() throws ParseException {
+        return statisticsService.quarterData();
+    }
+
+    /**
+     * pc首页(本季度提案统计)
+     */
+    @GetMapping("/personageData")
+    public AjaxResult personageData() throws ParseException {
+        return statisticsService.personageData();
+    }
+
+}

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java

@@ -96,7 +96,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:edit')")
     @Log(title = "参数管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysConfig config)
     {
         if (!configService.checkConfigKeyUnique(config))
@@ -112,7 +112,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{configIds}")
+    @GetMapping("/delete/{configIds}")
     public AjaxResult remove(@PathVariable Long[] configIds)
     {
         configService.deleteConfigByIds(configIds);
@@ -124,7 +124,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
+    @GetMapping("/refreshCache")
     public AjaxResult refreshCache()
     {
         configService.resetConfigCache();

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java

@@ -89,7 +89,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:edit')")
     @Log(title = "部门管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDept dept)
     {
         Long deptId = dept.getDeptId();
@@ -115,7 +115,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")
     @Log(title = "部门管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{deptId}")
+    @GetMapping("/delete/{deptId}")
     public AjaxResult remove(@PathVariable Long deptId)
     {
         if (deptService.hasChildByDeptId(deptId))

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java

@@ -100,7 +100,7 @@ public class SysDictDataController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典数据", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDictData dict)
     {
         dict.setUpdateBy(getUsername());
@@ -112,7 +112,7 @@ public class SysDictDataController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictCodes}")
+    @GetMapping("/delete/{dictCodes}")
     public AjaxResult remove(@PathVariable Long[] dictCodes)
     {
         dictDataService.deleteDictDataByIds(dictCodes);

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java

@@ -84,7 +84,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典类型", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDictType dict)
     {
         if (!dictTypeService.checkDictTypeUnique(dict))
@@ -100,7 +100,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictIds}")
+    @GetMapping("/delete/{dictIds}")
     public AjaxResult remove(@PathVariable Long[] dictIds)
     {
         dictTypeService.deleteDictTypeByIds(dictIds);
@@ -112,7 +112,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
+    @GetMapping("/refreshCache")
     public AjaxResult refreshCache()
     {
         dictTypeService.resetDictCache();

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java

@@ -24,6 +24,6 @@ public class SysIndexController
     @RequestMapping("/")
     public String index()
     {
-        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
+        return StringUtils.format("欢迎使用{}政协管理平台,当前版本:v{},请通过地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
     }
 }

+ 19 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -2,6 +2,9 @@ package com.ruoyi.web.controller.system;
 
 import java.util.List;
 import java.util.Set;
+
+import com.ruoyi.system.domain.member.MemberInfo;
+import com.ruoyi.system.service.IMemberInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -34,6 +37,9 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private IMemberInfoService memberInfoService;
+
     /**
      * 登录方法
      * 
@@ -46,7 +52,7 @@ public class SysLoginController
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+                loginBody.getUuid(),loginBody.getType());
         ajax.put(Constants.TOKEN, token);
         return ajax;
     }
@@ -64,8 +70,20 @@ public class SysLoginController
         Set<String> roles = permissionService.getRolePermission(user);
         // 权限集合
         Set<String> permissions = permissionService.getMenuPermission(user);
+        MemberInfo memberInfo = new MemberInfo();
+        memberInfo.setUserId(user.getUserId());
         AjaxResult ajax = AjaxResult.success();
+        Boolean flag = false;
+        List<MemberInfo> memberInfoList = memberInfoService.selectMemberInfoList(memberInfo);
+        if (memberInfoList != null && memberInfoList.size() > 0){
+            ajax.put("memberInfo", memberInfoList.get(0));
+        }else {
+            ajax.put("memberInfo", null);
+            //判断要不要弹框,首先判断是否是委员角色
+            flag = roles.contains("zxwy");
+        }
         ajax.put("user", user);
+        ajax.put("isMember", flag);
         ajax.put("roles", roles);
         ajax.put("permissions", permissions);
         return ajax;

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java

@@ -102,7 +102,7 @@ public class SysMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:edit')")
     @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysMenu menu)
     {
         if (!menuService.checkMenuNameUnique(menu))
@@ -126,7 +126,7 @@ public class SysMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:remove')")
     @Log(title = "菜单管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{menuId}")
+    @GetMapping("/delete/{menuId}")
     public AjaxResult remove(@PathVariable("menuId") Long menuId)
     {
         if (menuService.hasChildByMenuId(menuId))

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java

@@ -71,7 +71,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:edit')")
     @Log(title = "通知公告", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysNotice notice)
     {
         notice.setUpdateBy(getUsername());
@@ -83,7 +83,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:remove')")
     @Log(title = "通知公告", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{noticeIds}")
+    @GetMapping("/delete/{noticeIds}")
     public AjaxResult remove(@PathVariable Long[] noticeIds)
     {
         return toAjax(noticeService.deleteNoticeByIds(noticeIds));

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java

@@ -91,7 +91,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:edit')")
     @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysPost post)
     {
         if (!postService.checkPostNameUnique(post))
@@ -111,7 +111,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:remove')")
     @Log(title = "岗位管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{postIds}")
+    @GetMapping("/delete/{postIds}")
     public AjaxResult remove(@PathVariable Long[] postIds)
     {
         return toAjax(postService.deletePostByIds(postIds));

+ 11 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -23,6 +23,8 @@ import com.ruoyi.common.utils.file.MimeTypeUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.ONE;
+
 /**
  * 个人信息 业务处理
  * 
@@ -56,7 +58,7 @@ public class SysProfileController extends BaseController
      * 修改用户
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult updateProfile(@RequestBody SysUser user)
     {
         LoginUser loginUser = getLoginUser();
@@ -86,12 +88,17 @@ public class SysProfileController extends BaseController
      * 重置密码
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping("/updatePwd")
+    @PostMapping("/updatePwd")
     public AjaxResult updatePwd(String oldPassword, String newPassword)
     {
         LoginUser loginUser = getLoginUser();
         String userName = loginUser.getUsername();
         String password = loginUser.getPassword();
+        SysUser sysUser = new SysUser();
+        sysUser.setPassword(newPassword);
+        if (ONE.equals(userService.checkStrongPwd(sysUser))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
+        }
         if (!SecurityUtils.matchesPassword(oldPassword, password))
         {
             return error("修改密码失败,旧密码错误");
@@ -100,8 +107,9 @@ public class SysProfileController extends BaseController
         {
             return error("新密码不能与旧密码相同");
         }
+        String plaintext = newPassword;
         newPassword = SecurityUtils.encryptPassword(newPassword);
-        if (userService.resetUserPwd(userName, newPassword) > 0)
+        if (userService.resetUserPwd(userName, newPassword,plaintext) > 0)
         {
             // 更新缓存用户密码
             loginUser.getUser().setPassword(newPassword);

+ 7 - 7
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java

@@ -111,7 +111,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -146,7 +146,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/dataScope")
+    @PostMapping("/dataScope")
     public AjaxResult dataScope(@RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -159,7 +159,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
+    @PostMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -173,7 +173,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:remove')")
     @Log(title = "角色管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{roleIds}")
+    @GetMapping("/delete/{roleIds}")
     public AjaxResult remove(@PathVariable Long[] roleIds)
     {
         return toAjax(roleService.deleteRoleByIds(roleIds));
@@ -218,7 +218,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancel")
+    @PostMapping("/authUser/cancel")
     public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
     {
         return toAjax(roleService.deleteAuthUser(userRole));
@@ -229,7 +229,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancelAll")
+    @PostMapping("/authUser/cancelAll")
     public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
     {
         return toAjax(roleService.deleteAuthUsers(roleId, userIds));
@@ -240,7 +240,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/selectAll")
+    @PostMapping("/authUser/selectAll")
     public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
     {
         roleService.checkRoleDataScope(roleId);

+ 23 - 13
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -32,6 +32,8 @@ import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.ONE;
+
 /**
  * 用户信息
  * 
@@ -132,11 +134,11 @@ public class SysUserController extends BaseController
         {
             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        else if (ONE.equals(userService.checkStrongPwd(user))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
         }
         user.setCreateBy(getUsername());
+        user.setPlaintext(user.getPassword());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         return toAjax(userService.insertUser(user));
     }
@@ -146,7 +148,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -159,10 +161,6 @@ public class SysUserController extends BaseController
         {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
-        }
         user.setUpdateBy(getUsername());
         return toAjax(userService.updateUser(user));
     }
@@ -172,7 +170,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{userIds}")
+    @GetMapping("/delete/{userIds}")
     public AjaxResult remove(@PathVariable Long[] userIds)
     {
         if (ArrayUtils.contains(userIds, getUserId()))
@@ -187,11 +185,15 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/resetPwd")
+    @PostMapping("/resetPwd")
     public AjaxResult resetPwd(@RequestBody SysUser user)
     {
+        if (ONE.equals(userService.checkStrongPwd(user))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
+        }
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
+        user.setPlaintext(user.getPassword());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         user.setUpdateBy(getUsername());
         return toAjax(userService.resetPwd(user));
@@ -202,7 +204,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
+    @PostMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -231,7 +233,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authRole")
+    @PostMapping("/authRole")
     public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
     {
         userService.checkUserDataScope(userId);
@@ -242,10 +244,18 @@ public class SysUserController extends BaseController
     /**
      * 获取部门树列表
      */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
     public AjaxResult deptTree(SysDept dept)
     {
         return success(deptService.selectDeptTreeList(dept));
     }
+
+    /**
+     * 生成随机密码
+     */
+    @GetMapping("/sjmm")
+    public AjaxResult sjmm()
+    {
+        return userService.sjmm();
+    }
 }

+ 100 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UpdateAppController.java

@@ -0,0 +1,100 @@
+package com.ruoyi.web.controller.system;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.UpdateApp;
+import com.ruoyi.system.service.IUpdateAppService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-02-16
+ */
+@RestController
+@RequestMapping("/system/app")
+public class UpdateAppController extends BaseController
+{
+    @Autowired
+    private IUpdateAppService updateAppService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(UpdateApp updateApp)
+    {
+        startPage();
+        List<UpdateApp> list = updateAppService.selectUpdateAppList(updateApp);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, UpdateApp updateApp)
+    {
+        List<UpdateApp> list = updateAppService.selectUpdateAppList(updateApp);
+        ExcelUtil<UpdateApp> util = new ExcelUtil<UpdateApp>(UpdateApp.class);
+        util.exportExcel(response, list, "【请填写功能名称】数据");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(updateAppService.selectUpdateAppById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody UpdateApp updateApp)
+    {
+        return toAjax(updateAppService.insertUpdateApp(updateApp));
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody UpdateApp updateApp)
+    {
+        return toAjax(updateAppService.updateUpdateApp(updateApp));
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
+	@GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(updateAppService.deleteUpdateAppByIds(ids));
+    }
+
+    /**
+     * 获取当前最新版本数据
+     */
+    @GetMapping(value = "/new")
+    public AjaxResult getInfoNew(UpdateApp updateApp)
+    {
+        return success(updateAppService.getInfoNew(updateApp));
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZxFjController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.system;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ZxFj;
+import com.ruoyi.system.service.IZxFjService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 政协_附件Controller
+ *
+ * @author boman
+ * @date 2024-03-07
+ */
+@RestController
+@RequestMapping("/zx/fj")
+public class ZxFjController extends BaseController
+{
+    @Autowired
+    private IZxFjService zxFjService;
+
+/**
+ * 查询政协_附件列表
+ */
+@PreAuthorize("@ss.hasPermi('system:fj:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ZxFj zxFj)
+    {
+        startPage();
+        List<ZxFj> list = zxFjService.selectZxFjList(zxFj);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协_附件列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:fj:export')")
+    @Log(title = "政协_附件", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxFj zxFj)
+    {
+        List<ZxFj> list = zxFjService.selectZxFjList(zxFj);
+        ExcelUtil<ZxFj> util = new ExcelUtil<ZxFj>(ZxFj.class);
+        util.exportExcel(response, list, "政协_附件数据");
+    }
+
+    /**
+     * 获取政协_附件详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:fj:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(zxFjService.selectZxFjById(id));
+    }
+
+    /**
+     * 新增政协_附件
+     */
+    @PreAuthorize("@ss.hasPermi('system:fj:add')")
+    @Log(title = "政协_附件", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxFj zxFj)
+    {
+        return toAjax(zxFjService.insertZxFj(zxFj));
+    }
+
+    /**
+     * 修改政协_附件
+     */
+    @PreAuthorize("@ss.hasPermi('system:fj:edit')")
+    @Log(title = "政协_附件", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxFj zxFj)
+    {
+        return toAjax(zxFjService.updateZxFj(zxFj));
+    }
+
+    /**
+     * 删除政协_附件
+     */
+    @PreAuthorize("@ss.hasPermi('system:fj:remove')")
+    @Log(title = "政协_附件", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(zxFjService.deleteZxFjByIds(ids));
+    }
+}

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/Task.java

@@ -0,0 +1,23 @@
+package com.ruoyi.web.controller.task;
+
+
+
+import com.ruoyi.system.service.impl.TaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Task{
+    @Autowired
+    private TaskService taskService;
+
+    /***
+     * 生成委员分数排名
+     * */
+    @Async
+    //@Scheduled(cron = "0 19 0 * * ? ")
+    public void assessmentScore() {
+        taskService.assessmentScore();
+    }
+}

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/urge/ZxUrgeController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.urge;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.system.domain.urge.ZxUrge;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.service.IZxUrgeService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+import java.util.List;
+
+/**
+ * 政协催办Controller
+ *
+ * @author boman
+ * @date 2024-03-12
+ */
+@RestController
+@RequestMapping("/zxUrge/urge")
+public class ZxUrgeController extends BaseController
+{
+    @Autowired
+    private IZxUrgeService zxUrgeService;
+
+/**
+ * 查询政协催办列表
+ */
+@PreAuthorize("@ss.hasPermi('zxUrge:urge:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ZxUrge zxUrge)
+    {
+        startPage();
+        List<ZxUrge> list = zxUrgeService.selectZxUrgeList(zxUrge);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出政协催办列表
+     */
+    @PreAuthorize("@ss.hasPermi('zxUrge:urge:export')")
+    @Log(title = "政协催办", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ZxUrge zxUrge)
+    {
+        List<ZxUrge> list = zxUrgeService.selectZxUrgeList(zxUrge);
+        ExcelUtil<ZxUrge> util = new ExcelUtil<ZxUrge>(ZxUrge.class);
+        util.exportExcel(response, list, "政协催办数据");
+    }
+
+    /**
+     * 获取政协催办详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('zxUrge:urge:query')")
+    @GetMapping(value = "/{zxUrgeId}")
+    public AjaxResult getInfo(@PathVariable("zxUrgeId") Long zxUrgeId)
+    {
+        return success(zxUrgeService.selectZxUrgeByZxUrgeId(zxUrgeId));
+    }
+
+    /**
+     * 新增政协催办
+     */
+    @PreAuthorize("@ss.hasPermi('zxUrge:urge:add')")
+    @Log(title = "政协催办", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ZxUrge zxUrge)
+    {
+        return toAjax(zxUrgeService.insertZxUrge(zxUrge));
+    }
+
+    /**
+     * 修改政协催办
+     */
+    @PreAuthorize("@ss.hasPermi('zxUrge:urge:edit')")
+    @Log(title = "政协催办", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ZxUrge zxUrge)
+    {
+        return toAjax(zxUrgeService.updateZxUrge(zxUrge));
+    }
+
+    /**
+     * 删除政协催办
+     */
+    @PreAuthorize("@ss.hasPermi('zxUrge:urge:remove')")
+    @Log(title = "政协催办", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{zxUrgeIds}")
+    public AjaxResult remove(@PathVariable Long[] zxUrgeIds)
+    {
+        return toAjax(zxUrgeService.deleteZxUrgeByZxUrgeIds(zxUrgeIds));
+    }
+}

+ 1 - 1
ruoyi-admin/src/main/resources/application-druid.yml

@@ -41,7 +41,7 @@ spring:
         # 密码
         password: Boman123
         # 连接超时时间
-        timeout: 10s
+        timeout: 20s
         lettuce:
             pool:
                 # 连接池中的最小空闲连接

+ 5 - 8
ruoyi-admin/src/main/resources/application-prod.yml

@@ -5,9 +5,9 @@ ruoyi:
     # 版本
     version: 3.8.7
     # 版权年份
-    copyrightYear: 2023
+    copyrightYear: 2024
     # 实例演示开关
-    demoEnabled: true
+    demoEnabled: false
     # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
     profile: /home/ruoyi/uploadPath
     # 获取ip地址开关
@@ -102,8 +102,8 @@ spring:
                 allow:
                 url-pattern: /druid/*
                 # 控制台管理用户名和密码
-                login-username:
-                login-password:
+                login-username: admin
+                login-password: Boman123
             filter:
                 stat:
                     enabled: true
@@ -113,7 +113,4 @@ spring:
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
-
-
-#极光推送
+                        multi-statement-allow: true

+ 4 - 45
ruoyi-admin/src/main/resources/application.yml

@@ -20,7 +20,7 @@ spring:
     basename: i18n/messages
   profiles:
     active: druid
-  #    active: prod
+    #active: prod
   # 文件上传
   servlet:
     multipart:
@@ -41,7 +41,7 @@ token:
   # 令牌密钥
   secret: abcdefghijklmnopqrstuvwxyz
   # 令牌有效期(默认30分钟)
-  expireTime: 30
+  expireTime: 240
 
 # MyBatis配置
 mybatis:
@@ -70,47 +70,6 @@ xss:
   # 过滤开关
   enabled: true
   # 排除链接(多个用逗号分隔)
-  excludes: /system/notice,/new/news,/new/news/put
+  excludes: /system/notice,/zxNotice/*,/zxActivity/*
   # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
-
-# 微信小程序支付配置信息
-wx:
-  # 微信小程序appid
-  app-id: wx5d36c8939e36eaa6
-  # 小程序密钥
-  app-secret: 09e722ccf7f6bd5224816078536d8cec
-  # 商户号
-  mch-id: 1615686058
-  # 证书序列号
-  mch-serial-no: 5C7B3CAA15A5D622ED23B9DA9B9C4C351BDDF1D2
-  # apiV3密钥
-  api-key: tzsdmgtxcx1937879258888125555541
-  # 回调接口地址
-  notify-url: https://dmgt.qs163.cn/prod-api/wx/pay/payNotify
-  # 证书地址
-  key-path: apiclient_key.pem
-# 支付宝支付相关参数
-ali:
-  # 应用ID ,APPID
-  app-id: 2021000
-  # 商户PID
-  seller-id: 208862198
-  # 支付宝网关
-  gateway-url: https://openapi.alipaydev.com/gateway.do
-  #商户私钥 RSA2私钥
-  merchant-private-key: /IE7GuL7ncnxUFofSBQpS7vdbvVNqmuI+1aT8ratWN9QvPdjjrKXmo79iR+KHe+gz2NsC8nnjsV5sTA21mbnnnO3IUg1qJkbpL7lgKSE3GjH/f+8IGgllIKac/2UfWxbjaVjuSCxND5yHgpZLagO6DxkKID68czt/r602avcJtJ1x6TMwrYyvVrtuSBvy/9iNJPKN8aIt596znIAX+8XXJx7UJ9B1NwoaAUbwvu0Wdk4v9Vw55IOZGIUHVwfW3K3ol2QWPlxIb8cxK4pwvcnk0+dcZ2cU7YDNO0DYYoy4sIXLBvn52TR/FPAgMBAAECggEAQ8itCkCVOKb4O3g3WGCcwXAbQSjMcTuJAZGhEd5auKc0n4ZNYFVKmUg2tDhdzHoQbpV+sDUBZS9+5RVX538+AcKHlZaDCsmzEIHvG86MtYVTry69zZtzfEMASdvwH+VmJZD16NR8ctLJxPk4+iTYm1v1jONojizF4MuEV37NYs1CXcDPzg3iW3QYuTCgqzyD6U1XB8BwpzzxA0spvU97TuTtsuqom57fZVTwvqeyIUcR9t86m4Yt4oSH5k1cWc+rxvcsa+tIoXFo8x4NO/RB0H5Pnpxr5RkLz+PfJ2P4TnN2XunZHFI5GfuxWS6Dry81aV2yKeFp/sDUDED65h8wYQKBgQDPv/sZihsfRhFaCwAr/NWTgv12/rPbPULbsCOVO2mS7KDn4gM4b9xqUVtCmwjVAPVSK4K3RipcmKA4rNa0KH+0Ku109L5ydlErcHTnLJwFirwGezKHwCzT+yBYATLKg4NRJmDDcMJtTQA2tmA3YIC7HKFfjUqnWUR6z6bhucl/GQKBgQCg0q7HtX/a0FjB2RyCSnH03Ujeq250FuLPC/F5EiRx5YkGDnSvvaGdCwXHEYRwN75FIMAssi5hs1EU3OQVYgEtnGDwKvKgmdZySL4g+TfZezmMeoyokZV33KI/3lk16x9IYAR9LCGCMyghWbEd+4EM/WJJavdQ6vShC/sGy69IpwKBgHkhcwMdJ1tAu3VI3LzJGq57vdXYBH5cZdM6DEVC8vebyOXrPf12G4pSDWf0hV3MxT036Wt7GdALnb/t5vH8exlNvk5nNXP/0KwHUeJIfGAu2BrfUkMcpgajceReLoMt0y9JtTm/UV3xe6JrDAa92dE/jEfuVgzlW6xPzvnmHbphAoGAWHCDvT+KeAJrTO7gRqY51LZ8BDeyHhUX1VR0Dmhzsk7P84yvjpVx8rLFEpwHgM6my80e4XV7HC9IP3jZ1Qh4LWT5yhlUJA11aJOoOunSVL72/tHF2E13LNsgPo8/7+7E3UAwN8W1B6yqPOzeAeb1KPeOvWEdcFpE/OthuHL6ibECgYEArFSKaurnzbs01mFICz5P5kDoytM3cII9oZsDktdUVtB6roaVc4gbP4BSCwUH3Abkkm8mNJdcXZB0gRmn+JGhJ0m6CvGCLEefmMndxHuYQAtDYJO78XvAPHokx80U0RSWRQZ6/fEygHctmu9Bj/kHYXiH1lxIo1Dbcu4rvJb9LXc=
-  # 支付宝公钥
-  public-key: /+BlPxc8HG/4p2r+Z4EIzU7gFKkuE1I2xnDdJ+Dm1l//vYsArvtNwIKpOr0/oNfsNLhxhrswX7WEW3tyQopEU//KAhTXpsT0KTeKo8dxpl4FOJ9jrnkdVnxg/I2xY/oM7LeGoREiecJulcCa5cZbEct1OdnLzeQVomLlXUhBXZWyx1OVyzaQDk+X+yA2VY90uPvFcqFRBR5k3Y3fN7/39CTQvYWl+wvMcY4TFwO4j7hvLim9vgI3iyn2rOObMkGTJPlL9VNU5hBnRflBSjWAwIDAQAB
-  # 接口内容加密密钥 对此密钥
-  content-key: +ZyQ==
-  #页面跳转同步通知页面   测试地址  后期需要修改为实际地址
-  return-url: https://www.baidu.com/ali/pay/tradeNotify
-#顺风配置
-sf:
-  #此处替换为您在丰桥平台获取的顾客编码
-  client-code: ZXYJS48Y74BY
-  #生产校验码
-  check-word: BoSL7gKn7aFKht0E0OwEePsM1oo0oJxG
-  #生产环境的地址 -PRO
-  call-url-prod: https://bspgw.sf-express.com/std/service
+  urlPatterns: /system/*,/monitor/*,/tool/*,/zxNotice/*,/zxActivity/*,/category/*

BIN
ruoyi-admin/src/main/resources/font/simsun.ttc


+ 44 - 7
ruoyi-common/pom.xml

@@ -16,6 +16,37 @@
     </description>
 
     <dependencies>
+        <!--二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+
+        <!--pdf导出-->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13.3</version>
+        </dependency>
+        <!--pdf导出中文支持-->
+        <dependency>
+        <groupId>com.itextpdf</groupId>
+        <artifactId>itext-asian</artifactId>
+        <version>5.2.0</version>
+        </dependency>
+
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.23</version>
+        </dependency>
 
         <!-- Spring框架基本的核心工具 -->
         <dependency>
@@ -52,19 +83,19 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-  
+
         <!-- JSON工具类 -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
-        
+
         <!-- 动态数据源 -->
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-			<version>3.5.2</version>
-		</dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
 
         <!-- 阿里JSON解析器 -->
         <dependency>
@@ -126,6 +157,12 @@
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.4.3</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 7 - 0
ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java

@@ -119,4 +119,11 @@ public class RuoYiConfig
     {
         return getProfile() + "/upload";
     }
+
+    /**
+     * 获取系统生成二维码保存路径
+     */
+    public static String getUploadQrPath() {
+        return getProfile() + "/qrUpload";
+    }
 }

+ 36 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java

@@ -0,0 +1,36 @@
+package com.ruoyi.common.constant;
+
+/**公共常量
+ * @Author: tjf
+ * @Date: 2023/2/23 15:01
+ * @Describe:
+ */
+public class CommonConstants {
+    //数字常量
+    public static final String ONE = "1";
+    public static final String TWO = "2";
+    public static final String THR = "3";
+    public static final String FOR = "4";
+    public static final String FIV = "5";
+    public static final String SIX = "6";
+    public static final String SEV = "7";
+    public static final String EIG = "8";
+    public static final String NIN = "9";
+    public static final String TEN = "10";
+    public static final String ELE = "11";
+    public static final String TWE = "12";
+    public static final String YES = "是";
+    public static final String NO = "否";
+
+    //角色权限
+    //超级管理员
+    public static final String  ADMIN= "admin";
+    //平台管理员
+    public static final String  MANAGE= "manage";
+
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String LOGIN_USER_SMS = "login_user_sms:";
+
+}

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java

@@ -73,6 +73,6 @@ public class UserConstants
     /**
      * 密码长度限制
      */
-    public static final int PASSWORD_MIN_LENGTH = 5;
+    public static final int PASSWORD_MIN_LENGTH = 8;
     public static final int PASSWORD_MAX_LENGTH = 20;
 }

+ 24 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java

@@ -37,11 +37,35 @@ public class BaseEntity implements Serializable
 
     /** 备注 */
     private String remark;
+    /**
+     * 年份
+     */
+    private String year;
+    /**
+     * 分数
+     */
+    private Long score;
 
     /** 请求参数 */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Map<String, Object> params;
 
+    public Long getScore() {
+        return score;
+    }
+
+    public void setScore(Long score) {
+        this.score = score;
+    }
+
+    public String getYear() {
+        return year;
+    }
+
+    public void setYear(String year) {
+        this.year = year;
+    }
+
     public String getSearchValue()
     {
         return searchValue;

+ 8 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.stream.Collectors;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.common.core.domain.entity.CategoryProposal;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 
@@ -38,6 +39,13 @@ public class TreeSelect implements Serializable
         this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    public TreeSelect(CategoryProposal category)
+    {
+        this.id = category.getCategoryId();
+        this.label = category.getCategoryName();
+        this.children = category.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
     public TreeSelect(SysMenu menu)
     {
         this.id = menu.getMenuId();

+ 138 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/CategoryProposal.java

@@ -0,0 +1,138 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 提案类别对象 category_proposal
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class CategoryProposal extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 提案类别id */
+    private Long categoryId;
+
+    /** 父类id */
+    @Excel(name = "父类id")
+    private Long parentId;
+
+    /** 祖级列表 */
+    @Excel(name = "祖级列表")
+    private String ancestors;
+
+    /** 提案类别名称 */
+    @Excel(name = "提案类别名称")
+    private String categoryName;
+
+    /** 显示顺序 */
+    @Excel(name = "显示顺序")
+    private Integer orderNum;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 子部门 */
+    private List<CategoryProposal> children = new ArrayList<CategoryProposal>();
+
+    public List<CategoryProposal> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<CategoryProposal> children) {
+        this.children = children;
+    }
+
+    public void setCategoryId(Long categoryId)
+    {
+        this.categoryId = categoryId;
+    }
+
+    public Long getCategoryId() 
+    {
+        return categoryId;
+    }
+    public void setParentId(Long parentId) 
+    {
+        this.parentId = parentId;
+    }
+
+    public Long getParentId() 
+    {
+        return parentId;
+    }
+    public void setAncestors(String ancestors) 
+    {
+        this.ancestors = ancestors;
+    }
+
+    public String getAncestors() 
+    {
+        return ancestors;
+    }
+    public void setCategoryName(String categoryName) 
+    {
+        this.categoryName = categoryName;
+    }
+
+    public String getCategoryName() 
+    {
+        return categoryName;
+    }
+    public void setOrderNum(Integer orderNum) 
+    {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getOrderNum() 
+    {
+        return orderNum;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("categoryId", getCategoryId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("categoryName", getCategoryName())
+            .append("orderNum", getOrderNum())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 10 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -54,6 +54,8 @@ public class SysUser extends BaseEntity
 
     /** 密码 */
     private String password;
+    /** 明文密码 */
+    private String plaintext;
 
     /** 帐号状态(0正常 1停用) */
     @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
@@ -94,6 +96,14 @@ public class SysUser extends BaseEntity
 
     }
 
+    public String getPlaintext() {
+        return plaintext;
+    }
+
+    public void setPlaintext(String plaintext) {
+        this.plaintext = plaintext;
+    }
+
     public SysUser(Long userId)
     {
         this.userId = userId;

+ 12 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java

@@ -26,6 +26,18 @@ public class LoginBody
      * 唯一标识
      */
     private String uuid;
+    /**
+     * 登录模式:1:账号密码 2:短信验证码
+     */
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 
     public String getUsername()
     {

+ 45 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/BranchThreadUtils.java

@@ -0,0 +1,45 @@
+package com.ruoyi.common.utils;
+/**
+ * @author tjf
+ * @Date: 2022/07/13/15:44
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tjf
+ * @Date: 2022/07/13/15:44
+ */
+public class BranchThreadUtils {
+    /**
+     * 计算出需要多少个线程
+     *
+     * @param list
+     * @param pageSize
+     * @param <T>
+     * @return
+     */
+    public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
+        int listSize = list.size();
+        int page = (listSize + (pageSize - 1)) / pageSize;
+        List<List<T>> listArray = new ArrayList<List<T>>();
+        for (int i = 0; i < page; i++) {
+            List<T> subList = new ArrayList<T>();
+            for (int j = 0; j < listSize; j++) {
+                //获取当前循环的下标是多少
+                int pageIndex = ((j + 1) + (pageSize - 1)) / pageSize;
+                //判断当前的下标是否是对应线程的取值内
+                if (pageIndex == (i + 1)) {
+                    subList.add(list.get(j));
+                }
+                //判断当前的下标是否是对应线程的最大取值
+                if ((j + 1) == ((i + 1) * pageSize)) {
+                    break;
+                }
+            }
+            listArray.add(subList);
+        }
+        return listArray;
+    }
+}

+ 218 - 6
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -3,12 +3,11 @@ package com.ruoyi.common.utils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.Date;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+import com.alibaba.fastjson2.JSON;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
@@ -53,6 +52,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dateTimeNow(YYYY_MM_DD);
     }
 
+    /**
+     * 获取当前日期, 默认格式为yyyy-MM
+     *
+     * @return String
+     */
+    public static String getMonth()
+    {
+        return dateTimeNow(YYYY_MM);
+    }
+
     public static final String getTime()
     {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
@@ -188,4 +197,207 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+
+    /**
+     * 增加 Date ==> LocalDate
+     */
+    public static LocalDate toLocalDate(Date date)
+    {
+        Instant instant = date.toInstant();
+        ZoneId zone = ZoneId.systemDefault();
+        return instant.atZone(zone).toLocalDate();
+    }
+    /***
+     * 获取当前月份的前后N月份的开始时间
+     * @param dateStr 当前月份
+     * @param addMonth n,负数为以前
+     *
+     * @return
+     */
+    public static String lastMouth(String dateStr, int addMonth) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Date sourceDate = sdf.parse(dateStr);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(sourceDate);
+        cal.add(Calendar.MONTH, addMonth);
+        // 上个月的年和月
+        int month = cal.get(Calendar.MONTH) + 1;
+        int year = cal.get(Calendar.YEAR);
+        // 月第一天和最后一天
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        System.out.println(year+"-"+month);
+        return year+"-"+month;
+    }
+
+    /**
+     * 获取本周的第一天
+     *
+     * @return String
+     **/
+    public static String getThisWeekMonday() {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.WEEK_OF_MONTH, 0);
+        cal.set(Calendar.DAY_OF_WEEK, 2);
+        Date time = cal.getTime();
+        return new SimpleDateFormat("yyyy-MM-dd").format(time) + " 00:00:00";
+    }
+
+    /**
+     * 获取本周的最后一天
+     *
+     * @return String
+     **/
+    public static String getThisWeekSunday() {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.DAY_OF_WEEK, cal.getActualMaximum(Calendar.DAY_OF_WEEK));
+        cal.add(Calendar.DAY_OF_WEEK, 1);
+        Date time = cal.getTime();
+        return new SimpleDateFormat("yyyy-MM-dd").format(time) + " 23:59:59";
+    }
+    /**
+     * 获取上周的第一天
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String getPreviousWeekMonday() {
+        int week = -1;
+        int mondayPlus = getMondayPlus();
+
+        GregorianCalendar currentDate = new GregorianCalendar();
+        currentDate.add(5, mondayPlus + 7 * week);
+        Date preMonday = currentDate.getTime();
+        return new SimpleDateFormat("yyyy-MM-dd").format(preMonday) + " 00:00:00";
+    }
+
+    /**
+     * 获取上周的最后一天
+     *
+     * @return
+     */
+    public static String getPreviousWeekSunday() {
+        int weeks = -1;
+        int mondayPlus = getMondayPlus();
+        GregorianCalendar currentDate = new GregorianCalendar();
+        currentDate.add(5, mondayPlus + weeks);
+        Date preSunday = currentDate.getTime();
+        return new SimpleDateFormat("yyyy-MM-dd").format(preSunday) + " 23:59:59";
+    }
+
+    public static int getMondayPlus() {
+        Calendar cd = Calendar.getInstance();
+        int dayOfWeek = cd.get(7) - 1;
+        if (dayOfWeek == 1) {
+            return 0;
+        }
+        return (1 - dayOfWeek);
+    }
+
+
+    /**
+     * 获取本季度的第一天
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String getQuarterFirst() {
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        LocalDate date = LocalDate.now();
+        LocalDate quarterStart = getStartOrEndDayOfQuarter(date, true);
+        return quarterStart.format(fmt);
+    }
+
+    /**
+     * 获取本季度的最后一天
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String getQuarterEnd() {
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        LocalDate date = LocalDate.now();
+        LocalDate quarterEnd = getStartOrEndDayOfQuarter(date, false);
+        return quarterEnd.format(fmt);
+    }
+
+
+    public static LocalDate getStartOrEndDayOfQuarter(LocalDate today, Boolean isFirst) {
+        LocalDate resDate = LocalDate.now();
+        if (today == null) {
+            today = resDate;
+        }
+        Month month = today.getMonth();
+        Month firstMonthOfQuarter = month.firstMonthOfQuarter();
+        Month endMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
+        if (isFirst) {
+            resDate = LocalDate.of(today.getYear(), firstMonthOfQuarter, 1);
+        } else {
+            resDate = LocalDate.of(today.getYear(), endMonthOfQuarter, endMonthOfQuarter.length(today.isLeapYear()));
+        }
+        return resDate;
+    }
+
+
+
+    /**
+     * 判断时间是否在时间段内
+     * @param nowTime 判断时间
+     * @param startStr 开始时间
+     * @param endTStr 结束时间
+     * @return
+     * @throws ParseException
+     */
+    public static boolean isEffectiveDate(String nowTime, String startStr, String endTStr) throws ParseException {
+        // 将时间和范围的起止时间转换为Date对象
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date time = sdf.parse(nowTime);
+        Date startTime = sdf.parse(startStr);
+        Date endTime = sdf.parse(endTStr);
+
+        // 判断时间是否在范围内
+        boolean isInRange = time.after(startTime) && time.before(endTime);
+        return isInRange;
+    }
+
+    /**
+     * 获取指定时间 当前周的周一至周日的时间
+     * @return
+     */
+    public static List<String> getWeekData(String dataTime) throws ParseException {
+        /**
+         * 转为calendar格式
+         * calendar.get(Calendar.MONTH)+1  calendar中的月份以0开头
+         * Calendar.DAY_OF_WEEK 当前日期是所在周的第几天(以周日为一周的第一天)
+         * Calendar.DATE 当前日期是几号
+         *  */
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date time = sdf.parse(dataTime);
+        List<String> week = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(time);
+
+        // 如果是周日
+        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+            calendar.add(Calendar.DAY_OF_YEAR,-1);
+        }
+        // 获取当前日期是当周的第i天
+        int i = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+
+        // 获取当前日期所在周的第一天
+        calendar.add(Calendar.DATE , -i+1);
+        for (int j = 0; j < 7; j++) {
+            if(j >0){
+                calendar.add(Calendar.DATE , 1);
+            }
+            week.add(new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
+        }
+        return week;
+    }
+
+
 }

+ 510 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/PDFUtil.java

@@ -0,0 +1,510 @@
+package com.ruoyi.common.utils;
+
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/18 15:34
+ * @Describe:
+ */
+public class PDFUtil {
+    private static final Logger logger = LogManager.getLogger(PDFUtil.class);
+
+    /**
+     * fontSize_normal : (正文字体大小11号).
+     */
+    public static final float FONTSIZE_NORMAL = 11f;
+    /**
+     * fontSize_titile : (标题字体大小14号).
+     */
+    public static final float FONTSIZE_TITILE = 14f;
+    /**
+     * FONTSIZE_COVER : (封面字体大小32号).
+     */
+    public static final float FONTSIZE_COVER = 32f;
+
+    /**
+     * normalFont : (通用字体样式:宋体、11号).
+     */
+    private static Font normalFont = null;
+    /**
+     * titleFont : (通用标题字体样式:宋体、14号、加粗).
+     */
+    private static Font titleFont = null;
+    /**
+     * coverFont : (通用封面字体样式:宋体、28号、加粗).
+     */
+    private static Font coverFont = null;
+
+    /**
+     * 标题是否居中,true-居中、false-默认居左
+     */
+    private static final Boolean titleCenter = true;
+    /**
+     * getBaseFont : (获取可以解析中文的字体:使用宋体). <br/>
+     *
+     * @author
+     * @return
+     * @since JDK 1.8
+     */
+    public static BaseFont getBaseFontChinese()
+    {
+        try
+        {
+            // 宋体资源文件路径,可以从C://Windows//Fonts//simsun.ttc拷贝到相应目录下
+            URL path = PDFUtil.class.getResource("/font/simsun.ttc");
+            return BaseFont.createFont(path + ",0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
+
+            // 本地测试:使用windows自带的宋体文件
+             //return BaseFont.createFont("C://Windows//Fonts//simsun.ttc,0", BaseFont.IDENTITY_H, false);
+        }
+        catch (Exception e)
+        {
+            logger.error("设置字体样式失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * getNormalFont : (获取普通字体样式). <br/>
+     *
+     * @author
+     * @return
+     * @since JDK 1.8
+     */
+    public static Font getNormalFont()
+    {
+        if (normalFont == null)
+        {
+            BaseFont bfChinese = getBaseFontChinese();
+            normalFont = new Font(bfChinese, FONTSIZE_NORMAL, Font.NORMAL);
+        }
+        return normalFont;
+    }
+
+    /**
+     * getTitleFont : (获取标题通用字体). <br/>
+     *
+     * @author
+     * @return
+     * @since JDK 1.8
+     */
+    public static Font getTitleFont()
+    {
+        if (titleFont == null)
+        {
+            BaseFont bfChinese = getBaseFontChinese();
+            titleFont = new Font(bfChinese, FONTSIZE_TITILE, Font.BOLD);
+        }
+        return titleFont;
+    }
+
+    /**
+     * getTitleFont : (获取封面通用字体). <br/>
+     *
+     * @author
+     * @return
+     * @since JDK 1.8
+     */
+    public static Font getCoverFontFont()
+    {
+        if (coverFont == null)
+        {
+            BaseFont bfChinese = getBaseFontChinese();
+            coverFont = new Font(bfChinese, FONTSIZE_COVER, Font.BOLD);
+        }
+        return coverFont;
+    }
+
+    /**
+     * getfieldValue : (通过反射,根据方法名,执行方法,最终返回行结果的toString值). <br/>
+     *
+     * @author
+     * @param <T> 方法执行的入参
+     * @param object 对象
+     * @param methodName 方法名
+     * @param args 方法执行参数
+     * @since JDK 1.8
+     */
+    private static <T> String getfieldValue(T object, String methodName, Object... args)
+    {
+        try
+        {
+            Method method = object.getClass().getMethod(methodName);
+            Object value = method.invoke(object, args);
+            return value == null ? "" : value.toString();
+
+        }
+        catch (Exception e)
+        {
+            logger.error("getfieldValue error", e);
+            return "";
+        }
+    }
+
+    /**
+     * analysisPicBase64Info : (解析base64图片信息). <br/>
+     *
+     * @author
+     * @param picBase64Info 图片base64信息,或前台echart通过调用getDataURL()方法获取的图片信息
+     * @return 图片经过base64解码后的信息
+     * @since JDK 1.8
+     */
+    public static Element analysisPicBase64Info(String picBase64Info)
+    {
+        if (StringUtils.isEmpty(picBase64Info))
+        {
+            // 空段落
+            return new Paragraph();
+        }
+
+        // 1.获取图片base64字符串信息:若入参是通过前台echarts调用getDataURL()方法获取的,则该字符串包含逗号,且则逗号后面的内容才是图片的信息
+        String pictureInfoStr = picBase64Info.indexOf(",") == -1 ? picBase64Info : picBase64Info.split(",")[1];
+        // 2.将图片信息进行base64解密
+        byte[] imgByte = Base64.decodeBase64(pictureInfoStr);
+
+        // 对异常的数据进行处理
+        /**
+         * .图片的原始表达ascii码范围是0-255,
+         * .这里面有一些不可见的编码。然后为了图片正确传输才转成编码base64的0-63,
+         * .当从base64转成byte时,byte的范围是[-128,127],那么此时就会可能产生负数,而负数不是在ascii的范围里,所以需要转换一下
+         */
+        for (int i = 0; i < imgByte.length; i++)
+        {
+            if (imgByte[i] < 0)
+            {
+                imgByte[i] += 256;
+            }
+        }
+
+        try
+        {
+            return Image.getInstance(imgByte);
+        }
+        catch (Exception e)
+        {
+            logger.error("analysisPicBase64Info error", e);
+            return new Paragraph();
+        }
+    }
+
+    /**
+     * analysisPicBase64Info_batch : (批量解析base64加密的图片信息,生成Image对象). <br/>
+     *
+     * @author
+     * @param picBase64Infos 经过base64加密的图片信息
+     * @return
+     * @since JDK 1.8
+     */
+    public static List<Element> analysisPicBase64Info_batch(List<String> picBase64Infos)
+    {
+        List<Element> images = new ArrayList<Element>();
+        for (String li : picBase64Infos)
+        {
+            Element image = analysisPicBase64Info(li);
+            images.add(image);
+        }
+        return images;
+    }
+
+    /**
+     * createImage : (根据图片的base64加密文件创建pdf图片). <br/>
+     *
+     * @author
+     * @param picBase64Info base64加密后的图片信息(支持台echart通过调用getDataURL()方法获取的图片信息)
+     * @param title 段落标题
+     * @param percentX 图片缩放比例X轴
+     * @param percentY 图片缩放比例Y轴
+     * @param titleCenter 标题是否居中,true-居中、false-默认居左
+     * @return 返回图片段落
+     * @since JDK 1.8
+     */
+    public static Paragraph createImageFromEncodeBase64(String picBase64Info, String title, float percentX,
+                                                        float percentY, boolean titleCenter)
+    {
+        // 1.获取图片
+        Element element = analysisPicBase64Info(picBase64Info);
+        // 2.创建段落,并添加标题
+        Paragraph paragraph = new Paragraph(title, getTitleFont());
+        // 空行
+        paragraph.add(Chunk.NEWLINE);
+        paragraph.add(Chunk.NEWLINE);
+
+        if (!(element instanceof Image))
+        {
+            // 图片解析失败
+            return paragraph;
+        }
+
+        Image image = (Image) element;
+        // 3.设置图片缩放比例
+        image.scalePercent(percentX, percentY);
+
+        // 4.图片放入该段落
+        paragraph.add(image);
+
+        return paragraph;
+    }
+
+    /**
+     * createImageFromEncodeBase64_batch : (批量创建). <br/>
+     *
+     * @author
+     * @param picBase64Infos 图片base64加密后的信息(支持台echart通过调用getDataURL()方法获取的图片信息)
+     * @param titles 段落标题
+     * @param percentXs X轴缩放比例
+     * @param percentYs Y轴缩放比例
+     * @return
+     * @since JDK 1.8
+     */
+    public static Paragraph createImageFromEncodeBase64_batch(List<String> picBase64Infos, List<String> titles,
+                                                              List<Float> percentXs, List<Float> percentYs)
+    {
+        Paragraph paragraphs = new Paragraph();
+        for (int i = 0; i <= picBase64Infos.size(); i++)
+        {
+            Paragraph imagePara = createImageFromEncodeBase64(picBase64Infos.get(i), titles.get(i), percentXs.get(i),
+                    percentYs.get(i), titleCenter);
+            if (!imagePara.isEmpty())
+            {
+                paragraphs.add(imagePara);
+                // 空行
+                paragraphs.add(Chunk.NEWLINE);
+                paragraphs.add(Chunk.NEWLINE);
+            }
+        }
+        return paragraphs;
+    }
+
+    /**
+     * createTable : (创建table段落). <br/>
+     *
+     * @author
+     * @param <T>
+     * @param list 构建table的数据
+     * @param title 该段落取的名字
+     * @param methodNames 需要调用的方法名,用来获取单元格数据。通常是某个属性的get方法
+     * @return
+     * @since JDK 1.8
+     */
+    public static <T> Paragraph createTable(List<T> list, String title, String[] tableHead, List<String> methodNames)
+    {
+        return createTable(list, FONTSIZE_NORMAL, FONTSIZE_TITILE, title, tableHead, methodNames, false);
+    }
+
+    /**
+     * createTableByList : (创建table段落). <br/>
+     *
+     * @author
+     * @param <T>
+     * @param listData
+     * @param normalFontSize 正文字体大小
+     * @param titleFontSize 标题字体大小
+     * @param title 段落名称
+     * @param methodNames 获取表格属性的方法名
+     * @param b
+     * @return
+     * @since JDK 1.8
+     */
+    public static <T> Paragraph createTable(List<T> listData, float normalFontSize, float titleFontSize,
+                                            String title, String[] tableHead, List<String> methodNames, boolean b)
+    {
+        // 1.创建一个段落
+        Paragraph paragraph = new Paragraph(title, getTitleFont());
+        // 空行
+        paragraph.add(Chunk.NEWLINE);
+        paragraph.add(Chunk.NEWLINE);
+
+        // 3.创建一个表格
+        PdfPTable table = new PdfPTable(methodNames.size());// 列数
+        paragraph.add(table);
+
+        // 4.构造表头
+        for (String head : tableHead)
+        {
+            head = StringUtils.isEmpty(head) ? "" : head;
+            PdfPCell cell = new PdfPCell(new Paragraph(head, getNormalFont()));
+            cell.setBackgroundColor(
+                    new BaseColor(Integer.parseInt("124"), Integer.parseInt("185"), Integer.parseInt("252")));// 背景色
+            cell.setMinimumHeight(Float.parseFloat("15"));// 单元格最小高度
+            cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中
+            table.addCell(cell);
+        }
+
+        if (CollectionUtils.isEmpty(listData))
+        {
+            // 没有数据,添加一行空单元格,并返回
+            for (int i = 0; i < methodNames.size(); i++)
+            {
+                table.addCell(new Paragraph(" "));// 有一个空格,否则添加不了
+            }
+            return paragraph;
+        }
+
+        // 5.构造table数据
+        for (T li : listData)
+        {
+            for(String name : methodNames)
+            {
+                String valueStr = getfieldValue(li, name);
+                PdfPCell cell = new PdfPCell(new Paragraph(valueStr, getNormalFont()));
+                cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中
+                table.addCell(cell);
+            }
+        }
+        // 5.返回
+        return paragraph;
+    }
+
+    /**
+     * addToTable : (从段落中找到第一个table,向该table中追加数据). <br/>
+     * (). <br/>
+     *
+     * @author
+     * @param <T>
+     * @param paragraph
+     * @param listData
+     * @param methodNames
+     * @since JDK 1.8
+     */
+    public static <T> void addToTable(Paragraph paragraph, List<T> listData, List<String> methodNames)
+    {
+        for (Element ele : paragraph)
+        {
+            if (!(ele instanceof PdfPTable))
+            {
+                // 不是table元素,直接跳过
+                continue;
+            }
+
+            // 找到第一个table元素
+            PdfPTable table = (PdfPTable) ele;
+            for (T data : listData)
+            {
+                for (String name : methodNames)
+                {
+                    String valueStr = getfieldValue(data, name);
+                    PdfPCell cell = new PdfPCell(new Paragraph(valueStr, getNormalFont()));
+                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中
+                    table.addCell(cell);
+                }
+            }
+            break;
+        }
+
+    }
+
+    /**
+     * exportDocument : (生成并下载PDF文档). <br/>
+     * (). <br/>
+     *
+     * @author
+     * @param document 文档对象
+     * @param cover 封面:若不是null,则会先添加封面,并另起新页面添加段落
+     * @param paragraphs 需要组成PDF文件的段落
+     * @param response 请求的响应对象
+     * @param fileName 生成的文件名称,不需要加pdf后缀
+     * @since JDK 1.8
+     */
+    public static void exportDocument(Document document, Paragraph cover, List<Paragraph> paragraphs,
+                                      HttpServletResponse response, String fileName)
+    {
+        try (ServletOutputStream out = response.getOutputStream())
+        {
+            response.setContentType("application/binary;charset=UTF-8");
+            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName + ".pdf", "UTF-8"));
+
+            PdfWriter.getInstance(document, out);
+            // 打开文档
+            document.open();
+
+            if (cover != null)
+            {
+                document.add(cover);
+                // 起新页面
+                document.newPage();
+            }
+
+            StringBuilder errorMsg = new StringBuilder();
+            for (int i = 0; i < paragraphs.size(); i++)
+            {
+                try
+                {
+                    // 将段落添加到文档
+                    document.add(paragraphs.get(i));
+                    // 空行
+                    document.add(Chunk.NEWLINE);
+                    document.add(Chunk.NEWLINE);
+                }
+                catch (DocumentException e)
+                {
+                    errorMsg.append("PDF文件生成出错,请检查第:").append(i).append("个段落");
+                }
+            }
+
+            if (!StringUtils.isEmpty(errorMsg.toString()))
+            {
+                logger.error(errorMsg);
+            }
+
+            // 关闭文档
+            document.close();
+            out.flush();
+            out.close();
+        }
+        catch (Exception e)
+        {
+            logger.error("生成PDF文档并下载,出错:", e);
+        }
+
+    }
+
+    /**
+     * setDefaultIndentationLeft : (设置段落默认左边距). <br/>
+     *
+     * @author
+     * @param paragraph
+     * @since JDK 1.8
+     */
+    public static void setDefaultIndentationLeft(Paragraph paragraph)
+    {
+        paragraph.setIndentationLeft(Float.parseFloat("30"));
+    }
+
+    /**
+     * addBlankLine : (添加空行). <br/>
+     *
+     * @author
+     * @param paragraph 需要添加空行的段落
+     * @param lineNum 需要添加空行的个数
+     * @since JDK 1.8
+     */
+    public static void addBlankLine(Paragraph paragraph, int lineNum)
+    {
+        if (paragraph == null)
+        {
+            return;
+        }
+
+        for (int i = 0; i < lineNum; i++)
+        {
+            paragraph.add(Chunk.NEWLINE);
+        }
+    }
+}

+ 174 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/PwdCheckUtil.java

@@ -0,0 +1,174 @@
+package com.ruoyi.common.utils;
+
+import java.util.Random;
+
+/**
+ * @Author: tjf
+ * @Date: 2022/10/10 9:24
+ * @Describe:
+ */
+public class PwdCheckUtil {
+    //定义特殊字符
+    public static String SPECIAL_CHAR = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+
+    /**
+     * @return 符合长度要求 返回true
+     * @brief 检测密码中字符长度
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkPasswordLength(String password, String minNum, String maxNum) {
+        boolean flag = false;
+        if (StringUtils.isBlank(maxNum)) {
+            minNum = StringUtils.isBlank(minNum) ? "0" : minNum;
+            if (password.length() >= Integer.parseInt(minNum)) {
+                flag = true;
+            }
+        } else {
+            minNum = StringUtils.isBlank(minNum) ? "0" : minNum;
+            if (password.length() >= Integer.parseInt(minNum) &&
+                    password.length() <= Integer.parseInt(maxNum)) {
+                flag = true;
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * @return 包含数字 返回true
+     * @brief 检测密码中是否包含数字
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkContainDigit(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isDigit(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @return 包含字母 返回true
+     * @brief 检测密码中是否包含字母(不区分大小写)
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkContainCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isLetter(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @return 包含小写字母 返回true
+     * @brief 检测密码中是否包含小写字母
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkContainLowerCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isLowerCase(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @return 包含大写字母 返回true
+     * @brief 检测密码中是否包含大写字母
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkContainUpperCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isUpperCase(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @return 包含特殊符号 返回true
+     * @brief 检测密码中是否包含特殊符号
+     * @param[in] password            密码字符串
+     */
+    public static boolean checkContainSpecialChar(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (SPECIAL_CHAR.indexOf(chPass[i]) != -1) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     *
+     *   * 运行: java RandomStr 4  (生成长度为4的字符串)
+     *
+     */
+    public static void main(String[] args) {
+        int len = 8;
+        System.out.println(randomStr(len));
+    }
+
+    /**
+     * 返回随机字符串,同时包含数字、大小写字母
+     *
+     * @param len 字符串长度,不能小于3
+     * @return String 随机字符串
+     */
+    public static String randomStr(int len) {
+        if (len < 3) {
+            throw new IllegalArgumentException("字符串长度不能小于3");
+        }
+        Random random = new Random();
+        //数组,用于存放随机字符
+        char[] chArr = new char[len];
+        //为了保证必须包含数字、大小写字母
+        chArr[0] = (char) ('0' + StdRandom.uniform(0, 10));
+        chArr[1] = (char) ('A' + StdRandom.uniform(0, 26));
+        chArr[2] = (char) ('a' + StdRandom.uniform(0, 26));
+        //"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+        char[] chars = {'@', '!', '%', '$', '*', '?', '&','.','|','#','+','-',':',';','='};
+        int index = random.nextInt(15);
+        chArr[3] = chars[index];
+
+
+
+        char[] codes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
+                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+                'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
+                'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+                'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
+                'y', 'z','@', '!', '%', '$', '*', '?', '&','.','|','#','+','-',':',';','='};
+        //charArr[3..len-1]随机生成codes中的字符
+        for (int i = 4; i < len; i++) {
+            chArr[i] = codes[StdRandom.uniform(0, codes.length)];
+        }
+
+
+
+        //将数组chArr随机排序
+        for (int i = 0; i < len; i++) {
+            int r = i + StdRandom.uniform(len - i);
+            char temp = chArr[i];
+            chArr[i] = chArr[r];
+            chArr[r] = temp;
+        }
+
+        return new String(chArr);
+    }
+
+}

+ 239 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/QRCodeUtils.java

@@ -0,0 +1,239 @@
+package com.ruoyi.common.utils;
+
+import com.google.zxing.*;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.common.HybridBinarizer;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.ruoyi.common.utils.uuid.UUID;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.OutputStream;
+import java.util.Hashtable;
+
+/**
+ * @author tjf
+ * @Date: 2021/12/29/15:09
+ */
+public class QRCodeUtils {
+    private static final String CHARSET = "utf-8";
+    private static final String FORMAT_NAME = "JPG";
+    // 二维码尺寸
+    private static final int QRCODE_SIZE = 300;
+    // LOGO宽度
+    private static final int WIDTH = 60;
+    // LOGO高度
+    private static final int HEIGHT = 60;
+
+    private static BufferedImage createImage(String content, String imgPath,
+                                             boolean needCompress) throws Exception {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
+                BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000
+                        : 0xFFFFFFFF);
+            }
+        }
+        if (imgPath == null || "".equals(imgPath)) {
+            return image;
+        }
+        // 插入图片
+        QRCodeUtils.insertImage(image, imgPath, needCompress);
+        return image;
+    }
+
+    /**
+     * 插入LOGO
+     *
+     * @param source       二维码图片
+     * @param imgPath      LOGO图片地址
+     * @param needCompress 是否压缩
+     * @throws Exception
+     */
+    private static void insertImage(BufferedImage source, String imgPath,
+                                    boolean needCompress) throws Exception {
+        File file = new File(imgPath);
+        if (!file.exists()) {
+            System.err.println("" + imgPath + "   该文件不存在!");
+            return;
+        }
+        Image src = ImageIO.read(new File(imgPath));
+        int width = src.getWidth(null);
+        int height = src.getHeight(null);
+        if (needCompress) { // 压缩LOGO
+            if (width > WIDTH) {
+                width = WIDTH;
+            }
+            if (height > HEIGHT) {
+                height = HEIGHT;
+            }
+            Image image = src.getScaledInstance(width, height,
+                    Image.SCALE_SMOOTH);
+            BufferedImage tag = new BufferedImage(width, height,
+                    BufferedImage.TYPE_INT_RGB);
+            Graphics g = tag.getGraphics();
+            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
+            g.dispose();
+            src = image;
+        }
+        // 插入LOGO
+        Graphics2D graph = source.createGraphics();
+        int x = (QRCODE_SIZE - width) / 2;
+        int y = (QRCODE_SIZE - height) / 2;
+        graph.drawImage(src, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content      内容
+     * @param imgPath      LOGO地址
+     * @param destPath     存放目录
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public static String encode(String content, String imgPath, String destPath,
+                                boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
+                needCompress);
+        String date = DateUtils.datePath();
+        destPath = destPath+"/" + date;
+        mkdirs(destPath);
+        String file = UUID.randomUUID() + ".jpg";
+        File fileQR = new File(destPath + "/" + file);
+        ImageIO.write(image, FORMAT_NAME, fileQR);
+        return "/profile/qrUpload/"+date+"/"+file;
+    }
+
+
+    /**
+     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+     *
+     * @param destPath 存放目录
+     * @date 2013-12-11 上午10:16:36
+     */
+    public static void mkdirs(String destPath) {
+        File file = new File(destPath);
+        //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+        if (!file.exists() && !file.isDirectory()) {
+            file.mkdirs();
+        }
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content  内容
+     * @param imgPath  LOGO地址
+     * @param destPath 存储地址
+     * @throws Exception
+     */
+    public static void encode(String content, String imgPath, String destPath)
+            throws Exception {
+        QRCodeUtils.encode(content, imgPath, destPath, false);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content      内容
+     * @param destPath     存储地址
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public static void encode(String content, String destPath,
+                              boolean needCompress) throws Exception {
+        QRCodeUtils.encode(content, null, destPath, needCompress);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content  内容
+     * @param destPath 存储地址
+     * @throws Exception
+     */
+    public static void encode(String content, String destPath) throws Exception {
+        QRCodeUtils.encode(content, null, destPath, false);
+    }
+
+    /**
+     * 生成二维码(内嵌LOGO)
+     *
+     * @param content      内容
+     * @param imgPath      LOGO地址
+     * @param output       输出流
+     * @param needCompress 是否压缩LOGO
+     * @throws Exception
+     */
+    public static void encode(String content, String imgPath,
+                              OutputStream output, boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
+                needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * 生成二维码
+     *
+     * @param content 内容
+     * @param output  输出流
+     * @throws Exception
+     */
+    public static void encode(String content, OutputStream output)
+            throws Exception {
+        QRCodeUtils.encode(content, null, output, false);
+    }
+
+    /**
+     * 解析二维码
+     *
+     * @param file 二维码图片
+     * @return
+     * @throws Exception
+     */
+    public static String decode(File file) throws Exception {
+        BufferedImage image;
+        image = ImageIO.read(file);
+        if (image == null) {
+            return null;
+        }
+        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(
+                image);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+        Result result;
+        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
+        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
+        result = new MultiFormatReader().decode(bitmap, hints);
+        String resultStr = result.getText();
+        return resultStr;
+    }
+
+    /**
+     * 解析二维码
+     *
+     * @param path 二维码图片地址
+     * @return
+     * @throws Exception
+     */
+    public static String decode(String path) throws Exception {
+        return QRCodeUtils.decode(new File(path));
+    }
+}

+ 132 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java

@@ -0,0 +1,132 @@
+package com.ruoyi.common.utils;
+
+
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+
+/**
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    //短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+
+
+    //生成X位验证码
+    public static String getCode(Integer num) {
+        String[] codes = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            int j = (int) (Math.random() * 10);
+            if (j <= 0) {
+                j = 1;
+            }
+            code.append(codes[j - 1]);
+
+        }
+        return code.toString();
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+            // 必填,您的 AccessKey ID
+            .setAccessKeyId(ACCESS_KEY_ID)
+            // 必填,您的 AccessKey Secret
+            .setAccessKeySecret(ACCESS_KEY_SECRET);
+        // 访问的域名
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+
+    /**
+     * 发送短信消息
+     *
+     * @return
+     */
+    public static String sendSms(String phone, String templateCode, String smsCode) {
+        String code = "";
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                //手机号码
+                .setPhoneNumbers(phone)
+                //短信签名名称。中新云
+                .setSignName("潜山市政协办公室")
+                //短信模板变量对应的实际值{"name": code}
+                .setTemplateParam(smsCode)
+                //短信模板CODE
+                .setTemplateCode(templateCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest){
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            RuntimeOptions runtime = new RuntimeOptions();
+            SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
+            return sendBatchSmsResponse;
+            // 复制代码运行请自行打印 API 的返回值
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+
+    /**
+     * 发送注册的随机密码
+     *
+     * @return
+     */
+    public static String sendPassword(String code, String phone) {
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            String smsCode = "{\"code\":\"" + code + "\"}";
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                //手机号码
+                .setPhoneNumbers(phone)
+                //短信签名名称。潜山市数据资源局
+                .setSignName("潜山市政协办公室")
+                //短信模板CODE
+                .setTemplateCode("SMS_219525380")
+                //短信模板变量对应的实际值{"name": code}
+                .setTemplateParam(smsCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+

+ 90 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/StdRandom.java

@@ -0,0 +1,90 @@
+package com.ruoyi.common.utils;
+
+import java.util.Random;
+
+public class StdRandom {
+
+    //随机数生成器
+    private static Random random;
+    //种子值
+    private static long seed;
+
+    //静态代码块,初始化种子值及随机数生成器
+    static {
+        seed = System.currentTimeMillis();
+        random = new Random(seed);
+    }
+
+    //私有构造函数,禁止实例化
+    private StdRandom() {
+    }
+
+    /**
+     * 设置种子值
+     *
+     * @param s 随机数生成器的种子值
+     */
+    public static void setSeed(long s) {
+        seed = s;
+        random = new Random(seed);
+    }
+
+    /**
+     * 获取种子值
+     *
+     * @return long 随机数生成器的种子值
+     */
+    public static long getSeed() {
+        return seed;
+    }
+
+    /**
+     * 随机返回0到1之间的实数 [0,1)
+     *
+     * @return double 随机数
+     */
+    public static double uniform() {
+        return random.nextDouble();
+    }
+
+    /**
+     * 随机返回0到N-1之间的整数 [0,N)
+     *
+     * @param N 上限
+     * @return int 随机数
+     */
+    public static int uniform(int N) {
+        return random.nextInt(N);
+    }
+
+    /**
+     * 随机返回0到1之间的实数 [0,1)
+     *
+     * @return double 随机数
+     */
+    public static double random() {
+        return uniform();
+    }
+
+    /**
+     * 随机返回a到b-1之间的整数 [a,b)
+     *
+     * @param a 下限
+     * @param b 上限
+     * @return int 随机数
+     */
+    public static int uniform(int a, int b) {
+        return a + uniform(b - a);
+    }
+
+    /**
+     * 随机返回a到b之间的实数
+     *
+     * @param a 下限
+     * @param b 上限
+     * @return double 随机数
+     */
+    public static double uniform(double a, double b) {
+        return a + uniform() * (b - a);
+    }
+}

+ 3 - 1
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java

@@ -36,7 +36,9 @@ public class MimeTypeUtils
             // 视频格式
             "mp4", "avi", "rmvb",
             // pdf
-            "pdf" };
+            "pdf" ,
+            //app
+            "wgt","apk"};
 
     public static String getExtension(String prefix)
     {

+ 140 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/AbstractJPushToolUtil.java

@@ -0,0 +1,140 @@
+package com.ruoyi.common.utils.jPush;
+
+import cn.jiguang.common.resp.APIConnectionException;
+import cn.jiguang.common.resp.APIRequestException;
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Message;
+import cn.jpush.api.push.model.Options;
+import cn.jpush.api.push.model.Platform;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.audience.Audience;
+import cn.jpush.api.push.model.notification.AndroidNotification;
+import cn.jpush.api.push.model.notification.IosAlert;
+import cn.jpush.api.push.model.notification.Notification;
+import com.alibaba.fastjson2.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public abstract class AbstractJPushToolUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(AbstractJPushToolUtil.class);
+
+    /*@Autowired
+    private JPushConfig jPush;*/
+
+    protected static AbstractJPushToolUtil abstractJPushToolUtils;
+
+    @PostConstruct
+    public void init() {
+        abstractJPushToolUtils = this;
+    }
+
+
+    private final static String appKey = "275af46e0d888270da3cfd1d";
+
+    private final static String masterSecret = "47047dfe7509f243bb8e25c7";
+
+    private static JPushClient jPushClient = new JPushClient(masterSecret, appKey);
+
+    /**
+     * 发送给指定极光Id
+     *
+     * @param registrationId
+     * @param notificationTitle
+     * @param msgTitle
+     * @param msgContent
+     * @param jPushVO
+     * @return
+     */
+    public static boolean sendToRegistrationId1(String notificationTitle, String
+            msgTitle, String msgContent, String jPushVO, String... registrationId) {
+        boolean result = false;
+        try {
+            PushPayload pushPayload = buildPushObject_all_registrationId_alertWithTitle
+                    (notificationTitle, msgTitle, msgContent, jPushVO, registrationId);
+            //TODO
+            if(pushPayload == null){
+                return result;
+            }
+            log.info("极光推送入参信息pushPayload:{}", JSON.toJSONString(pushPayload));
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            log.info("极光推送出参信息pushResult:{}", JSON.toJSONString(pushResult));
+            if (pushResult.getResponseCode() == 200) {
+                result = true;
+            }
+        } catch (APIConnectionException e) {
+            e.printStackTrace();
+        } catch (APIRequestException e) {
+            e.printStackTrace();
+        }
+        return result;
+
+    }
+    /**
+     * 给指定设备id推送
+     *
+     * @param notificationTitle 通知标题
+     * @param msgTitle          消息标题
+     * @param msgContent        消息内容
+     * @param jPushVO       附加字段
+     * @param registrationId     设备id
+     * @return
+     */
+
+    private static PushPayload buildPushObject_all_registrationId_alertWithTitle(
+            String notificationTitle, String msgTitle, String msgContent, String jPushVO, String... registrationId) {
+        return PushPayload.newBuilder()
+                //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
+                .setPlatform(Platform.all())
+                //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
+                .setAudience(Audience.registrationId(registrationId))
+                //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
+                .setNotification(Notification.newBuilder()
+                        //指定当前推送的android通知
+                        .addPlatformNotification(
+                                AndroidNotification.newBuilder()
+                                        .setTitle(notificationTitle)
+                                        .setAlert(msgContent)
+                                        //此字段为透传字段(类型被极光限定,不能传object),不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                        .addExtra("data", JSON.toJSONString(jPushVO))
+                                        .build())
+                        .build())
+
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msgContent)
+                        .setTitle(msgTitle)
+                        .addExtra("data", JSON.toJSONString(jPushVO))
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(false)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+
+    /**
+     * 获取IOS的IosAlert
+     *
+     * @param notificationTitle
+     * @param subTitle
+     * @param msgContent
+     * @return
+     */
+    private static IosAlert queryIosAlert(String notificationTitle, String subTitle, String msgContent) {
+        return IosAlert.newBuilder().setTitleAndBody(notificationTitle, subTitle, msgContent).build();
+    }
+
+    }

+ 62 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushConfig.java

@@ -0,0 +1,62 @@
+package com.ruoyi.common.utils.jPush;/*
+package com.ruoyi.common.utils.jPush;
+
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JPushConfig {
+
+    */
+/**
+     * 极光官网-个人管理中心-点击查看-secret
+     *//*
+
+    @Value("${jpush.masterSecret}")
+    private String masterSecret;
+
+    */
+/**
+     * 指定本推送要推送的apns环境,true表示生产,false表示开发
+     *//*
+
+    @Value("${jpush.environment}")
+    private boolean environment;
+
+    */
+/**
+     * 极光官网-个人管理中心-appkey
+     *//*
+
+    @Value("${push.appKey}")
+    private String appKey;
+
+    public String getMasterSecret() {
+        return masterSecret;
+    }
+
+    public boolean isEnvironment() {
+        return environment;
+    }
+
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public void setMasterSecret(String masterSecret) {
+        this.masterSecret = masterSecret;
+    }
+
+    public void setEnvironment(boolean environment) {
+        this.environment = environment;
+    }
+
+    public void setAppKey(String appKey) {
+        this.appKey = appKey;
+    }
+
+
+
+}
+*/

+ 37 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushToolUtil.java

@@ -0,0 +1,37 @@
+package com.ruoyi.common.utils.jPush;
+
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class JPushToolUtil extends AbstractJPushToolUtil {
+    /**
+     * 发送给指定的极光ID
+     * @param notificationTitle  通知标题
+     * @param msgTitle 内容标题
+     * @param msgContent 内容
+     * @param jPushVO 扩展的json
+     * @param registrationId 极光id
+     * @return
+     */
+    public static boolean sendToRegistrationId(
+            String notificationTitle,
+            String msgTitle,
+            String msgContent,
+            String jPushVO,
+            String... registrationId) {
+        return sendToRegistrationId1(notificationTitle,msgTitle,msgContent,jPushVO,registrationId);
+    }
+
+    /*public static void main(String[] args) {
+        String num = "-0405-别名";
+        String notificationTitle = "推送测试-通知标题" + num;
+        String msgTitle = "推送测试-内容标题" + num;
+        String msgContent = "我是内容" + num;
+        String jPushVO = "我是扩展的json" + num;
+        String[]  registrationId = {"", ""};
+        boolean b = JPushToolUtil.sendToRegistrationId(notificationTitle, msgTitle, msgContent, jPushVO, registrationId);
+        System.out.println("i="+b);
+    }*/
+}
+

+ 51 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/jPush/JPushVO.java

@@ -0,0 +1,51 @@
+package com.ruoyi.common.utils.jPush;
+
+
+/**
+ * 极光拓展字段不能传输object,限制了类型,所以封装更好些
+ * 此类为极光推送拓展字段封装类(目前字段是暂定,你也可以拓展)
+ *
+ * @author juzi
+ * @date 2022-12-2
+ */
+public class JPushVO {
+    private Long id;
+
+    private String userName;
+
+    private String content;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "JPushVO{" +
+                "id=" + id +
+                ", userName='" + userName + '\'' +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
+

+ 2 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,7 +111,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage").permitAll()
+                .antMatchers("/login", "/register", "/captchaImage","/system/app/new").permitAll()
+                .antMatchers("/sendSms/**","/applet/**").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 4 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java

@@ -27,14 +27,15 @@ public class AsyncFactory
 
     /**
      * 记录登录信息
-     * 
+     *
      * @param username 用户名
+     * @param username 昵称
      * @param status 状态
      * @param message 消息
      * @param args 列表
      * @return 任务task
      */
-    public static TimerTask recordLogininfor(final String username, final String status, final String message,
+    public static TimerTask recordLogininfor(final String username, final String nickname, final String status, final String message,
             final Object... args)
     {
         final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
@@ -60,6 +61,7 @@ public class AsyncFactory
                 // 封装对象
                 SysLogininfor logininfor = new SysLogininfor();
                 logininfor.setUserName(username);
+                logininfor.setNickName(nickname);
                 logininfor.setIpaddr(ip);
                 logininfor.setLoginLocation(address);
                 logininfor.setBrowser(browser);

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java

@@ -46,7 +46,7 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
             // 记录用户退出日志
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName,loginUser.getUser().getNickName(),  Constants.LOGOUT, MessageUtils.message("user.logout.success")));
         }
         ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"))));
     }

+ 75 - 54
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.framework.web.service;
 
 import javax.annotation.Resource;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -29,14 +30,16 @@ import com.ruoyi.framework.security.context.AuthenticationContextHolder;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+import static com.ruoyi.common.constant.CommonConstants.TWO;
+
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private TokenService tokenService;
 
@@ -45,7 +48,7 @@ public class SysLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
@@ -54,47 +57,46 @@ public class SysLoginService
 
     /**
      * 登录验证
-     * 
+     *
      * @param username 用户名
      * @param password 密码
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
+     * @param type     登录类型
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid)
-    {
+    public String login(String username, String password, String code, String uuid, String type) {
         // 验证码校验
         validateCaptcha(username, code, uuid);
+        //登录类型校验 如果是短信验证码登录,校验短信验证码是否正确,给密码 查询用户信息后赋值
+        String[] strings = validateType(username, type, password, code);
+        if (strings != null && strings.length > 0){
+            password = strings[0];
+            username = strings[1];
+        }
         // 登录前置校验
         loginPreCheck(username, password);
         // 用户验证
         Authentication authentication = null;
-        try
-        {
+        try {
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
             AuthenticationContextHolder.setContext(authenticationToken);
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager.authenticate(authenticationToken);
-        }
-        catch (Exception e)
-        {
-            if (e instanceof BadCredentialsException)
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+        } catch (Exception e) {
+            if (e instanceof BadCredentialsException) {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"", Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                 throw new UserPasswordNotMatchException();
-            }
-            else
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+            } else {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, e.getMessage()));
                 throw new ServiceException(e.getMessage());
             }
-        }
-        finally
-        {
+        } finally {
             AuthenticationContextHolder.clearContext();
         }
-        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,loginUser.getUser().getNickName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+
         recordLoginInfo(loginUser.getUserId());
         // 生成token
         return tokenService.createToken(loginUser);
@@ -102,28 +104,24 @@ public class SysLoginService
 
     /**
      * 校验验证码
-     * 
+     *
      * @param username 用户名
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
      * @return 结果
      */
-    public void validateCaptcha(String username, String code, String uuid)
-    {
+    public void validateCaptcha(String username, String code, String uuid) {
         boolean captchaEnabled = configService.selectCaptchaEnabled();
-        if (captchaEnabled)
-        {
+        if (captchaEnabled) {
             String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
             String captcha = redisCache.getCacheObject(verifyKey);
             redisCache.deleteObject(verifyKey);
-            if (captcha == null)
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
+            if (captcha == null) {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
                 throw new CaptchaExpireException();
             }
-            if (!code.equalsIgnoreCase(captcha))
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
+            if (!code.equalsIgnoreCase(captcha)) {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
                 throw new CaptchaException();
             }
         }
@@ -131,47 +129,70 @@ public class SysLoginService
 
     /**
      * 登录前置校验
+     *
      * @param username 用户名
      * @param password 用户密码
      */
-    public void loginPreCheck(String username, String password)
-    {
+    public void loginPreCheck(String username, String password) {
         // 用户名或密码为空 错误
-        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
+        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
             throw new UserNotExistsException();
         }
         // 密码如果不在指定范围内 错误
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
-                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
             throw new UserPasswordNotMatchException();
         }
         // 用户名不在指定范围内 错误
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
-                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
             throw new UserPasswordNotMatchException();
         }
         // IP黑名单校验
         String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
-        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
+        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"",  Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
             throw new BlackListException();
         }
     }
 
+    /**
+     * 登录类型校验 如果是短信验证码登录,校验短信验证码是否正确,给密码 查询用户信息后赋值
+     *
+     * @param username 用户名
+     * @param type     登录类型
+     * @param password 用户密码
+     * @param code     短信验证码
+     */
+    public String[] validateType(String username, String type, String password, String code) {
+        if (TWO.equals(type)) {
+            //校验短信验证码
+            Object cacheObject = redisCache.getCacheObject(LOGIN_USER_SMS + username);
+            if (code.equals(cacheObject)) {
+                //根据手机号查询用户信息
+                SysUser sysUser = userService.selectUserByPhonenumber(username);
+                if (sysUser == null) {
+                    throw new UserPasswordNotMatchException();
+                }
+                password = sysUser.getPlaintext();
+                username = sysUser.getUserName();
+                redisCache.deleteObject(LOGIN_USER_SMS + username);
+            } else {
+                throw new CaptchaExpireException();
+            }
+        }
+        return new String[]{password,username};
+    }
+
     /**
      * 记录登录信息
      *
      * @param userId 用户ID
      */
-    public void recordLoginInfo(Long userId)
-    {
+    public void recordLoginInfo(Long userId) {
         SysUser sysUser = new SysUser();
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr());

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java

@@ -84,7 +84,7 @@ public class SysRegisterService
             }
             else
             {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,"", Constants.REGISTER, MessageUtils.message("user.register.success")));
             }
         }
         return msg;

+ 1 - 1
ruoyi-generator/src/main/resources/generator.yml

@@ -1,7 +1,7 @@
 # 代码生成
 gen:
   # 作者
-  author: ruoyi
+  author: boman
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
   packageName: com.ruoyi.system
   # 自动去除表前缀,默认是false

+ 1 - 0
ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml

@@ -74,6 +74,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				AND date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
 			</if>
 		</where>
+		order by create_time desc
 	</select>
 
 	<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">

+ 672 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalInfo.java

@@ -0,0 +1,672 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.List;
+
+/**
+ * 提案信息对象 proposal_info
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class ProposalInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 提案ID */
+    private Long proposalId;
+
+    /** 提案人ID */
+    //@Excel(name = "提案人ID")
+    private Long proposalUserId;
+
+    /** 提案号 */
+    @Excel(name = "提案号")
+    private String proposalNumber;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 提案人姓名 */
+    @Excel(name = "提案人姓名")
+    private String proposalName;
+
+    /** 提案人手机号码 */
+    @Excel(name = "提案人手机号码")
+    private String proposalPhone;
+
+    /** 界别 */
+    @Excel(name = "界别")
+    private String boundary;
+
+    /** 党派 */
+    //@Excel(name = "党派")
+    private String partyAffiliation;
+
+    /** 联系地址 */
+    @Excel(name = "联系地址")
+    private String contactAddress;
+
+    /** 提案类别id */
+    //@Excel(name = "提案类别id")
+    private Long categoryId;
+
+    /** 提案类别 */
+    @Excel(name = "提案类别")
+    private String categoryName;
+
+    /** 提案类型(0大会提案 1平时提案) */
+    @Excel(name = "提案类型", readConverterExp = "0=大会提案,1=平时提案")
+    private String proposalType;
+
+    /** 提案内容 */
+    @Excel(name = "提案内容")
+    private String proposalContent;
+
+    /** 联名提案(0是 1否) */
+    @Excel(name = "联名提案" )
+    private String isJointly;
+
+    /** 同意公开(0是 1否) */
+    //@Excel(name = "同意公开", readConverterExp = "0=是,1=否")
+    private String isPublicity;
+
+    /** 内容公开(0是 1否) */
+    //@Excel(name = "内容公开", readConverterExp = "0=是,1=否")
+    private String contentPublicity;
+
+    /** 经过调研(0是 1否) */
+    //@Excel(name = "经过调研", readConverterExp = "0=是,1=否")
+    private String isSurvey;
+
+    /** 第一次提出(0是 1否) */
+    //@Excel(name = "第一次提出", readConverterExp = "0=是,1=否")
+    private String isFirst;
+
+    /** 由本人撰写(0是 1否) */
+    //@Excel(name = "由本人撰写", readConverterExp = "0=是,1=否")
+    private String isPerson;
+
+    /** 是否立案(0是 1否) */
+    @Excel(name = "是否立案", readConverterExp = "0=是,1=否")
+    private String isRecord;
+
+    /** 需要办理的协商方式 */
+    @Excel(name = "需要办理的协商方式")
+    private String negotiateType;
+
+    /** 建议承办单位 */
+    @Excel(name = "建议承办单位")
+    private String proposedContractor;
+
+    /** 提案进度(0:提交提案,1:提案审查,2:提案立案,3:提案不立案,4:提案办理,5:提案审核,6:审核不通过,7:审核通过,8:已办结) */
+    @Excel(name = "提案进度", readConverterExp = "0=提交提案,1=提案审查,2=提案立案,3=提案不立案,4=提案办理,5=提案审核,6=审核不通过,7=审核通过,8=已办结")
+    private String proposalProgress;
+
+    //@Excel(name = "打回理由")
+    private String backReason;
+
+    /** 滚动办理(0是 1否) */
+    //@Excel(name = "滚动办理", readConverterExp = "0=是,1=否")
+    private String rollingProcess;
+
+    /** 提案答复类型(A:A类,B:B类,C:C类) */
+    @Excel(name = "提案答复类型(A:A类,B:B类,C:C类)")
+    private String complexType;
+
+    /** 是否被并案(0是 1否) */
+    //@Excel(name = "是否被并案", readConverterExp = "0=是,1=否")
+    private String isCasesTogether;
+
+    /** 被并案的案件id */
+    //@Excel(name = "被并案的案件id")
+    private Long uniteProposalId;
+
+    /** 承办单位答复委员 */
+    @Excel(name = "承办单位答复委员")
+    private String cbdwdfwy;
+
+    /** 委员满意程度(0:不满意,1:一般,2:满意,3:非常满意) */
+    @Excel(name = "委员满意程度", readConverterExp = "0=不满意,1=基本满意,2=满意")
+    private String satisfaction;
+
+    /** 委员意见 */
+    @Excel(name = "委员意见")
+    private String membersOpinion;
+
+    /** 政协满意程度(0:不满意,1:一般,2:满意,3:非常满意) */
+    //@Excel(name = "政协满意程度", readConverterExp = "0=:不满意,1:一般,2:满意,3:非常满意")
+    private String zxSatisfaction;
+
+    /** 政协意见 */
+    //@Excel(name = "政协意见")
+    private String zxOpinion;
+
+    /** 是否推荐重点(0是 1否) */
+    @Excel(name = "是否推荐重点", readConverterExp = "0=是,1=否")
+    private String isKeyPoint;
+
+    /** 推荐重点理由 */
+    @Excel(name = "推荐重点理由")
+    private String keyPointArgument;
+
+    /** 是否推荐优秀(0是 1否) */
+    //@Excel(name = "是否推荐优秀", readConverterExp = "0=是,1=否")
+    private String isOutstanding;
+
+    /** 推荐优秀理由 */
+    //@Excel(name = "推荐优秀理由")
+    private String outstandingArgument;
+
+
+    /** 提案人员 */
+    private List<ProposalUser> proposalUserList;
+    /** 附件 */
+    private List<ZxFj> zxFjList;
+    /** 答复委员附件附件 */
+    private List<ZxFj> dfFjList;
+    /** 单位回复 */
+    private List<ProposalUnitReply> proposalUnitReplyList;
+    /**主办单位*/
+    private ProposalUnitReply zbUnitReply;
+    /** 回复单位 */
+    private ProposalUnitReply hfProposalUnitReply;
+
+
+    /** 是否同意联名 */
+    private String isAgree;
+
+    /** 部门id */
+    private Long deptId;
+
+    /** 单位类型 */
+    private String dwType;
+
+
+    private String endTime;
+    private String startTime;
+    /**
+     * 冗余字段
+     */
+    private String type;
+    /** 单位是否答复(0:是,1:否) */
+    private String isReply;
+
+    public List<ZxFj> getDfFjList() {
+        return dfFjList;
+    }
+
+    public void setDfFjList(List<ZxFj> dfFjList) {
+        this.dfFjList = dfFjList;
+    }
+
+    public String getIsReply() {
+        return isReply;
+    }
+
+    public void setIsReply(String isReply) {
+        this.isReply = isReply;
+    }
+
+    public ProposalUnitReply getHfProposalUnitReply() {
+        return hfProposalUnitReply;
+    }
+
+    public void setHfProposalUnitReply(ProposalUnitReply hfProposalUnitReply) {
+        this.hfProposalUnitReply = hfProposalUnitReply;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getBackReason() {
+        return backReason;
+    }
+
+    public void setBackReason(String backReason) {
+        this.backReason = backReason;
+    }
+
+    public String getDwType() {
+        return dwType;
+    }
+
+    public void setDwType(String dwType) {
+        this.dwType = dwType;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getIsAgree() {
+        return isAgree;
+    }
+
+    public void setIsAgree(String isAgree) {
+        this.isAgree = isAgree;
+    }
+
+    public ProposalUnitReply getZbUnitReply() {
+        return zbUnitReply;
+    }
+
+    public void setZbUnitReply(ProposalUnitReply zbUnitReply) {
+        this.zbUnitReply = zbUnitReply;
+    }
+
+
+    public String getIsKeyPoint() {
+        return isKeyPoint;
+    }
+
+    public void setIsKeyPoint(String isKeyPoint) {
+        this.isKeyPoint = isKeyPoint;
+    }
+
+    public String getKeyPointArgument() {
+        return keyPointArgument;
+    }
+
+    public void setKeyPointArgument(String keyPointArgument) {
+        this.keyPointArgument = keyPointArgument;
+    }
+
+    public String getIsOutstanding() {
+        return isOutstanding;
+    }
+
+    public void setIsOutstanding(String isOutstanding) {
+        this.isOutstanding = isOutstanding;
+    }
+
+    public String getOutstandingArgument() {
+        return outstandingArgument;
+    }
+
+    public void setOutstandingArgument(String outstandingArgument) {
+        this.outstandingArgument = outstandingArgument;
+    }
+
+    public List<ProposalUnitReply> getProposalUnitReplyList() {
+        return proposalUnitReplyList;
+    }
+
+
+    public String getZxSatisfaction() {
+        return zxSatisfaction;
+    }
+
+    public void setZxSatisfaction(String zxSatisfaction) {
+        this.zxSatisfaction = zxSatisfaction;
+    }
+
+    public String getZxOpinion() {
+        return zxOpinion;
+    }
+
+    public void setZxOpinion(String zxOpinion) {
+        this.zxOpinion = zxOpinion;
+    }
+
+    public void setProposalUnitReplyList(List<ProposalUnitReply> proposalUnitReplyList) {
+        this.proposalUnitReplyList = proposalUnitReplyList;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public List<ProposalUser> getProposalUserList() {
+        return proposalUserList;
+    }
+
+    public void setProposalUserList(List<ProposalUser> proposalUserList) {
+        this.proposalUserList = proposalUserList;
+    }
+
+    public void setProposalId(Long proposalId)
+    {
+        this.proposalId = proposalId;
+    }
+
+    public Long getProposalId() 
+    {
+        return proposalId;
+    }
+    public void setProposalUserId(Long proposalUserId) 
+    {
+        this.proposalUserId = proposalUserId;
+    }
+
+    public Long getProposalUserId() 
+    {
+        return proposalUserId;
+    }
+    public void setProposalNumber(String proposalNumber) 
+    {
+        this.proposalNumber = proposalNumber;
+    }
+
+    public String getProposalNumber() 
+    {
+        return proposalNumber;
+    }
+    public void setTitle(String title) 
+    {
+        this.title = title;
+    }
+
+    public String getTitle() 
+    {
+        return title;
+    }
+    public void setProposalName(String proposalName) 
+    {
+        this.proposalName = proposalName;
+    }
+
+    public String getProposalName() 
+    {
+        return proposalName;
+    }
+    public void setProposalPhone(String proposalPhone) 
+    {
+        this.proposalPhone = proposalPhone;
+    }
+
+    public String getProposalPhone() 
+    {
+        return proposalPhone;
+    }
+    public void setBoundary(String boundary) 
+    {
+        this.boundary = boundary;
+    }
+
+    public String getBoundary() 
+    {
+        return boundary;
+    }
+    public void setPartyAffiliation(String partyAffiliation) 
+    {
+        this.partyAffiliation = partyAffiliation;
+    }
+
+    public String getPartyAffiliation() 
+    {
+        return partyAffiliation;
+    }
+    public void setContactAddress(String contactAddress) 
+    {
+        this.contactAddress = contactAddress;
+    }
+
+    public String getContactAddress() 
+    {
+        return contactAddress;
+    }
+    public void setCategoryId(Long categoryId) 
+    {
+        this.categoryId = categoryId;
+    }
+
+    public Long getCategoryId() 
+    {
+        return categoryId;
+    }
+    public void setCategoryName(String categoryName) 
+    {
+        this.categoryName = categoryName;
+    }
+
+    public String getCategoryName() 
+    {
+        return categoryName;
+    }
+    public void setProposalType(String proposalType) 
+    {
+        this.proposalType = proposalType;
+    }
+
+    public String getProposalType() 
+    {
+        return proposalType;
+    }
+    public void setProposalContent(String proposalContent) 
+    {
+        this.proposalContent = proposalContent;
+    }
+
+    public String getProposalContent() 
+    {
+        return proposalContent;
+    }
+    public void setIsJointly(String isJointly) 
+    {
+        this.isJointly = isJointly;
+    }
+
+    public String getIsJointly() 
+    {
+        return isJointly;
+    }
+    public void setIsPublicity(String isPublicity) 
+    {
+        this.isPublicity = isPublicity;
+    }
+
+    public String getIsPublicity() 
+    {
+        return isPublicity;
+    }
+    public void setContentPublicity(String contentPublicity) 
+    {
+        this.contentPublicity = contentPublicity;
+    }
+
+    public String getContentPublicity() 
+    {
+        return contentPublicity;
+    }
+    public void setIsSurvey(String isSurvey) 
+    {
+        this.isSurvey = isSurvey;
+    }
+
+    public String getIsSurvey() 
+    {
+        return isSurvey;
+    }
+    public void setIsFirst(String isFirst) 
+    {
+        this.isFirst = isFirst;
+    }
+
+    public String getIsFirst() 
+    {
+        return isFirst;
+    }
+    public void setIsPerson(String isPerson) 
+    {
+        this.isPerson = isPerson;
+    }
+
+    public String getIsPerson() 
+    {
+        return isPerson;
+    }
+    public void setIsRecord(String isRecord) 
+    {
+        this.isRecord = isRecord;
+    }
+
+    public String getIsRecord() 
+    {
+        return isRecord;
+    }
+    public void setNegotiateType(String negotiateType) 
+    {
+        this.negotiateType = negotiateType;
+    }
+
+    public String getNegotiateType() 
+    {
+        return negotiateType;
+    }
+    public void setProposedContractor(String proposedContractor) 
+    {
+        this.proposedContractor = proposedContractor;
+    }
+
+    public String getProposedContractor() 
+    {
+        return proposedContractor;
+    }
+    public void setProposalProgress(String proposalProgress) 
+    {
+        this.proposalProgress = proposalProgress;
+    }
+
+    public String getProposalProgress() 
+    {
+        return proposalProgress;
+    }
+    public void setRollingProcess(String rollingProcess) 
+    {
+        this.rollingProcess = rollingProcess;
+    }
+
+    public String getRollingProcess() 
+    {
+        return rollingProcess;
+    }
+    public void setComplexType(String complexType) 
+    {
+        this.complexType = complexType;
+    }
+
+    public String getComplexType() 
+    {
+        return complexType;
+    }
+    public void setIsCasesTogether(String isCasesTogether) 
+    {
+        this.isCasesTogether = isCasesTogether;
+    }
+
+    public String getIsCasesTogether() 
+    {
+        return isCasesTogether;
+    }
+    public void setUniteProposalId(Long uniteProposalId) 
+    {
+        this.uniteProposalId = uniteProposalId;
+    }
+
+    public Long getUniteProposalId() 
+    {
+        return uniteProposalId;
+    }
+    public void setSatisfaction(String satisfaction) 
+    {
+        this.satisfaction = satisfaction;
+    }
+
+    public String getSatisfaction() 
+    {
+        return satisfaction;
+    }
+    public void setMembersOpinion(String membersOpinion) 
+    {
+        this.membersOpinion = membersOpinion;
+    }
+
+    public String getMembersOpinion() 
+    {
+        return membersOpinion;
+    }
+
+    public String getCbdwdfwy() {
+        return cbdwdfwy;
+    }
+
+    public void setCbdwdfwy(String cbdwdfwy) {
+        this.cbdwdfwy = cbdwdfwy;
+    }
+
+    @Override
+    public String toString() {
+        return "ProposalInfo{" +
+                "proposalId=" + proposalId +
+                ", proposalUserId=" + proposalUserId +
+                ", proposalNumber='" + proposalNumber + '\'' +
+                ", title='" + title + '\'' +
+                ", proposalName='" + proposalName + '\'' +
+                ", proposalPhone='" + proposalPhone + '\'' +
+                ", boundary='" + boundary + '\'' +
+                ", partyAffiliation='" + partyAffiliation + '\'' +
+                ", contactAddress='" + contactAddress + '\'' +
+                ", categoryId=" + categoryId +
+                ", categoryName='" + categoryName + '\'' +
+                ", proposalType='" + proposalType + '\'' +
+                ", proposalContent='" + proposalContent + '\'' +
+                ", isJointly='" + isJointly + '\'' +
+                ", isPublicity='" + isPublicity + '\'' +
+                ", contentPublicity='" + contentPublicity + '\'' +
+                ", isSurvey='" + isSurvey + '\'' +
+                ", isFirst='" + isFirst + '\'' +
+                ", isPerson='" + isPerson + '\'' +
+                ", isRecord='" + isRecord + '\'' +
+                ", negotiateType='" + negotiateType + '\'' +
+                ", proposedContractor='" + proposedContractor + '\'' +
+                ", proposalProgress='" + proposalProgress + '\'' +
+                ", rollingProcess='" + rollingProcess + '\'' +
+                ", complexType='" + complexType + '\'' +
+                ", isCasesTogether='" + isCasesTogether + '\'' +
+                ", uniteProposalId=" + uniteProposalId +
+                ", satisfaction='" + satisfaction + '\'' +
+                ", membersOpinion='" + membersOpinion + '\'' +
+                ", zxSatisfaction='" + zxSatisfaction + '\'' +
+                ", zxOpinion='" + zxOpinion + '\'' +
+                ", isKeyPoint='" + isKeyPoint + '\'' +
+                ", keyPointArgument='" + keyPointArgument + '\'' +
+                ", isOutstanding='" + isOutstanding + '\'' +
+                ", outstandingArgument='" + outstandingArgument + '\'' +
+                '}';
+    }
+}

+ 185 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalUnitReply.java

@@ -0,0 +1,185 @@
+package com.ruoyi.system.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 提案单位答复对象 proposal_unit_reply
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class ProposalUnitReply extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 单位id */
+    @Excel(name = "单位id")
+    private Long deptId;
+
+    /** 单位名称 */
+    @Excel(name = "单位名称")
+    private String deptName;
+
+    /** 提案id */
+    @Excel(name = "提案id")
+    private Long proposalId;
+
+    /** 是否答复(0:是,1:否) */
+    @Excel(name = "是否答复(0:是,1:否)")
+    private String isReply;
+
+
+    /** 答复内容 */
+    @Excel(name = "答复内容")
+    private String content;
+
+    /** 单位类型 1:答复单位,2:主办单位,3:协办单位 */
+    @Excel(name = "单位类型 1:答复单位,2:主办单位,3:协办单位")
+    private String type;
+
+    /** 接收时间 */
+    @Excel(name = "接收时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /** 办结时间 */
+    @Excel(name = "办结时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /** 处理方式 */
+    @Excel(name = "处理方式")
+    private String handling;
+
+    /** 办理程度 */
+    @Excel(name = "办理程度")
+    private String degree;
+
+
+    /** 附件 */
+    private List<ZxFj> zxFjList;
+
+    public void setIsReply(String isReply) {
+        this.isReply = isReply;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setDeptId(Long deptId) 
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId() 
+    {
+        return deptId;
+    }
+    public void setProposalId(Long proposalId) 
+    {
+        this.proposalId = proposalId;
+    }
+
+    public Long getProposalId() 
+    {
+        return proposalId;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public String getIsReply() {
+        return isReply;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getHandling() {
+        return handling;
+    }
+
+    public void setHandling(String handling) {
+        this.handling = handling;
+    }
+
+    public String getDegree() {
+        return degree;
+    }
+
+    public void setDegree(String degree) {
+        this.degree = degree;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deptId", getDeptId())
+            .append("proposalId", getProposalId())
+            .append("content", getContent())
+            .append("type", getType())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 118 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ProposalUser.java

@@ -0,0 +1,118 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 提案人员对象 proposal_user
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class ProposalUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+
+    /** 提案id */
+    @Excel(name = "提案id")
+    private Long userId;
+
+    /** 提案id */
+    @Excel(name = "提案id")
+    private Long proposalId;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String name;
+
+    /** 职务 */
+    @Excel(name = "职务")
+    private String unit;
+
+    /** 地址类型 1:领衔,2:附议 */
+    @Excel(name = "地址类型 1:领衔,2:附议")
+    private String type;
+
+    /** 是否同意联名(0:待选择,1:同意,2:不同意) */
+    private String isAgree;
+
+    public String getIsAgree() {
+        return isAgree;
+    }
+
+    public void setIsAgree(String isAgree) {
+        this.isAgree = isAgree;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setProposalId(Long proposalId) 
+    {
+        this.proposalId = proposalId;
+    }
+
+    public Long getProposalId() 
+    {
+        return proposalId;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public void setType(String type)
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("proposalId", getProposalId())
+            .append("name", getName())
+            .append("unit", getUnit())
+            .append("type", getType())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 11 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java

@@ -22,6 +22,9 @@ public class SysLogininfor extends BaseEntity
     /** 用户账号 */
     @Excel(name = "用户账号")
     private String userName;
+    /** 用户昵称 */
+    @Excel(name = "用户昵称")
+    private String nickName;
 
     /** 登录状态 0成功 1失败 */
     @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败")
@@ -52,6 +55,14 @@ public class SysLogininfor extends BaseEntity
     @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date loginTime;
 
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
     public Long getInfoId()
     {
         return infoId;

+ 122 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/UpdateApp.java

@@ -0,0 +1,122 @@
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 【请填写功能名称】对象 update_app
+ * 
+ * @author ruoyi
+ * @date 2023-02-16
+ */
+public class UpdateApp extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /**  */
+    private Long id;
+
+    /** 系统:Android:安卓系统,Apple:苹果系统 */
+    @Excel(name = "系统:Android:安卓系统,Apple:苹果系统")
+    private String model;
+
+    /** 版本名称 */
+    @Excel(name = "版本名称")
+    private String name;
+
+    /** 版本号 */
+    @Excel(name = "版本号")
+    private String code;
+
+    /** 版本描述 */
+    @Excel(name = "版本描述")
+    private String description;
+
+    /** 下载地址 */
+    @Excel(name = "下载地址")
+    private String path;
+
+    /** 是否有效 0:失效 1:有效 */
+    @Excel(name = "是否有效 0:失效 1:有效")
+    private String isDel;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setModel(String model) 
+    {
+        this.model = model;
+    }
+
+    public String getModel() 
+    {
+        return model;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+    public void setPath(String path) 
+    {
+        this.path = path;
+    }
+
+    public String getPath() 
+    {
+        return path;
+    }
+    public void setIsDel(String isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public String getIsDel() 
+    {
+        return isDel;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("model", getModel())
+            .append("name", getName())
+            .append("code", getCode())
+            .append("description", getDescription())
+            .append("path", getPath())
+            .append("isDel", getIsDel())
+            .append("createTime", getCreateTime())
+            .toString();
+    }
+}

+ 118 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ZxFj.java

@@ -0,0 +1,118 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协_附件对象 zx_fj
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class ZxFj extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 附件ID */
+    private Long id;
+
+
+    /** 主体id(提案id或者社情民意id) */
+    private Long mainId;
+
+    /** 数据id */
+    @Excel(name = "数据id")
+    private Long sourceId;
+
+    /** 附件名称 */
+    @Excel(name = "附件名称")
+    private String name;
+
+    /** 附件地址 */
+    @Excel(name = "附件地址")
+    private String url;
+
+    /** 地址类型 1:提案附件,2:社情民意附件 */
+    @Excel(name = "地址类型 1:提案附件,2:社情民意附件")
+    private String type;
+
+
+    /** 附件归属类型 1:填报附件,2:答复附件,3:主办单位答复附件,4:协办单位答复附件 */
+    @Excel(name = "地址类型 1:答复附件,2:主办单位答复附件,3:协办单位答复附件,4:填报附件")
+    private String stytle;
+
+    public Long getMainId() {
+        return mainId;
+    }
+
+    public void setMainId(Long mainId) {
+        this.mainId = mainId;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setSourceId(Long sourceId) 
+    {
+        this.sourceId = sourceId;
+    }
+
+    public Long getSourceId() 
+    {
+        return sourceId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public void setType(String type)
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    public String getStytle() {
+        return stytle;
+    }
+
+    public void setStytle(String stytle) {
+        this.stytle = stytle;
+    }
+
+    @Override
+    public String toString() {
+        return "ZxFj{" +
+                "id=" + id +
+                ", sourceId=" + sourceId +
+                ", name='" + name + '\'' +
+                ", url='" + url + '\'' +
+                ", type='" + type + '\'' +
+                ", stytle='" + stytle + '\'' +
+                '}';
+    }
+}

+ 248 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivity.java

@@ -0,0 +1,248 @@
+package com.ruoyi.system.domain.activity;
+
+import java.util.List;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协活动对象 zx_activity
+ * 
+ * @author boman
+ * @date 2024-03-14
+ */
+public class ZxActivity extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 活动ID */
+    private Long activityId;
+
+    /** 活动名称 */
+    @Excel(name = "活动名称")
+    private String activityTitle;
+
+    /** 活动日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "活动日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date activityDate;
+
+    /** 活动时间 */
+    @Excel(name = "活动时间")
+    private String activityTime;
+
+    /** 活动地点 */
+    @Excel(name = "活动地点")
+    private String activityAddress;
+
+    /** 活动类型 */
+    @Excel(name = "活动类型")
+    private String activityType;
+
+    /** 活动内容 */
+    @Excel(name = "活动内容")
+    private String activityDetails;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date publishTime;
+
+    /** 发布人部门 */
+    @Excel(name = "发布人部门")
+    private String publishDept;
+
+    /** 发布人部门id */
+    @Excel(name = "发布人部门id")
+    private Long publishDeptId;
+    /**
+     * 已读人数
+     */
+    private String read;
+    /**
+     * 未读人数
+     */
+    private String noRead;
+
+    /** 政协活动-用户关联信息 */
+    private List<ZxActivityUser> zxActivityUserList;
+    /**
+     * 活动通知查询列表使用,不在数据库中
+     */
+    private Long userId;
+
+    /**
+     * 附件
+     */
+    private List<ZxFj> zxFjList;
+
+    /** 是否参会 N:不参加 Y:参加 不在数据库中*/
+    private String isJoin;
+
+    public String getIsJoin() {
+        return isJoin;
+    }
+
+    public void setIsJoin(String isJoin) {
+        this.isJoin = isJoin;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getRead() {
+        return read;
+    }
+
+    public void setRead(String read) {
+        this.read = read;
+    }
+
+    public String getNoRead() {
+        return noRead;
+    }
+
+    public void setNoRead(String noRead) {
+        this.noRead = noRead;
+    }
+
+    public void setActivityId(Long activityId)
+    {
+        this.activityId = activityId;
+    }
+
+    public Long getActivityId() 
+    {
+        return activityId;
+    }
+    public void setActivityTitle(String activityTitle) 
+    {
+        this.activityTitle = activityTitle;
+    }
+
+    public String getActivityTitle() 
+    {
+        return activityTitle;
+    }
+    public void setActivityDate(Date activityDate) 
+    {
+        this.activityDate = activityDate;
+    }
+
+    public Date getActivityDate() 
+    {
+        return activityDate;
+    }
+    public void setActivityTime(String activityTime) 
+    {
+        this.activityTime = activityTime;
+    }
+
+    public String getActivityTime() 
+    {
+        return activityTime;
+    }
+    public void setActivityAddress(String activityAddress) 
+    {
+        this.activityAddress = activityAddress;
+    }
+
+    public String getActivityAddress() 
+    {
+        return activityAddress;
+    }
+    public void setActivityType(String activityType) 
+    {
+        this.activityType = activityType;
+    }
+
+    public String getActivityType() 
+    {
+        return activityType;
+    }
+    public void setActivityDetails(String activityDetails) 
+    {
+        this.activityDetails = activityDetails;
+    }
+
+    public String getActivityDetails() 
+    {
+        return activityDetails;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+    public void setPublishDept(String publishDept) 
+    {
+        this.publishDept = publishDept;
+    }
+
+    public String getPublishDept() 
+    {
+        return publishDept;
+    }
+    public void setPublishDeptId(Long publishDeptId) 
+    {
+        this.publishDeptId = publishDeptId;
+    }
+
+    public Long getPublishDeptId() 
+    {
+        return publishDeptId;
+    }
+
+    public List<ZxActivityUser> getZxActivityUserList()
+    {
+        return zxActivityUserList;
+    }
+
+    public void setZxActivityUserList(List<ZxActivityUser> zxActivityUserList)
+    {
+        this.zxActivityUserList = zxActivityUserList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("activityId", getActivityId())
+            .append("activityTitle", getActivityTitle())
+            .append("activityDate", getActivityDate())
+            .append("activityTime", getActivityTime())
+            .append("activityAddress", getActivityAddress())
+            .append("activityType", getActivityType())
+            .append("activityDetails", getActivityDetails())
+            .append("publishTime", getPublishTime())
+            .append("publishDept", getPublishDept())
+            .append("publishDeptId", getPublishDeptId())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .append("zxActivityUserList", getZxActivityUserList())
+            .toString();
+    }
+}

+ 208 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivityUser.java

@@ -0,0 +1,208 @@
+package com.ruoyi.system.domain.activity;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协活动-用户关联对象 zx_activity_user
+ * 
+ * @author boman
+ * @date 2024-03-14
+ */
+public class ZxActivityUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 活动ID */
+    private Long activityId;
+
+    /** 用户ID/委员信息表id */
+    private Long userId;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String userName;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /** 委员职务 */
+    @Excel(name = "委员职务")
+    private String postName;
+
+    /** 级别 */
+    @Excel(name = "级别")
+    private String userLevel;
+
+    /**
+     * 父级别
+     */
+    private String parentGrade;
+    /** 答复时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "答复时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date replyTime;
+
+    /** 是否参会 N:不参加 Y:参加 */
+    @Excel(name = "是否参会 N:不参加 Y:参加")
+    private String isJoin;
+
+    /** 请假类型 */
+    @Excel(name = "请假类型")
+    private String leaveType;
+
+    /** 请假原因 */
+    @Excel(name = "请假原因")
+    private String leaveReason;
+
+    /** 签到时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "签到时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date signIn;
+
+    /**
+     * 是否审批 1:待审批 2:已同意 3:未同意
+     */
+    private String approval;
+
+    public String getApproval() {
+        return approval;
+    }
+
+    public void setApproval(String approval) {
+        this.approval = approval;
+    }
+
+    public String getParentGrade() {
+        return parentGrade;
+    }
+
+    public void setParentGrade(String parentGrade) {
+        this.parentGrade = parentGrade;
+    }
+
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
+    public void setActivityId(Long activityId)
+    {
+        this.activityId = activityId;
+    }
+
+    public Long getActivityId() 
+    {
+        return activityId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setUserName(String userName) 
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName() 
+    {
+        return userName;
+    }
+    public void setPostName(String postName) 
+    {
+        this.postName = postName;
+    }
+
+    public String getPostName() 
+    {
+        return postName;
+    }
+    public void setUserLevel(String userLevel) 
+    {
+        this.userLevel = userLevel;
+    }
+
+    public String getUserLevel() 
+    {
+        return userLevel;
+    }
+    public void setReplyTime(Date replyTime) 
+    {
+        this.replyTime = replyTime;
+    }
+
+    public Date getReplyTime() 
+    {
+        return replyTime;
+    }
+    public void setIsJoin(String isJoin) 
+    {
+        this.isJoin = isJoin;
+    }
+
+    public String getIsJoin() 
+    {
+        return isJoin;
+    }
+    public void setLeaveType(String leaveType) 
+    {
+        this.leaveType = leaveType;
+    }
+
+    public String getLeaveType() 
+    {
+        return leaveType;
+    }
+    public void setLeaveReason(String leaveReason) 
+    {
+        this.leaveReason = leaveReason;
+    }
+
+    public String getLeaveReason() 
+    {
+        return leaveReason;
+    }
+    public void setSignIn(Date signIn) 
+    {
+        this.signIn = signIn;
+    }
+
+    public Date getSignIn() 
+    {
+        return signIn;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("activityId", getActivityId())
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("postName", getPostName())
+            .append("userLevel", getUserLevel())
+            .append("replyTime", getReplyTime())
+            .append("isJoin", getIsJoin())
+            .append("leaveType", getLeaveType())
+            .append("leaveReason", getLeaveReason())
+            .append("signIn", getSignIn())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 235 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/assessment/ZxAssessment.java

@@ -0,0 +1,235 @@
+package com.ruoyi.system.domain.assessment;
+
+import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 政协评价考核对象 zx_assessment
+ * 
+ * @author boman
+ * @date 2024-03-19
+ */
+public class ZxAssessment extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 考核ID */
+    private Long assessmentId;
+
+    /** 父部门id */
+    @Excel(name = "父部门id")
+    private Long parentId;
+
+    /** 祖级列表 */
+    @Excel(name = "祖级列表")
+    private String ancestors;
+
+    /** 考核项目名称 */
+    @Excel(name = "考核项目")
+    private String assessmentProject;
+    /**
+     * 考核项目id
+     */
+    private String assessmentProjectId;
+
+    /** 考核标准 */
+    @Excel(name = "考核标准")
+    private String assessmentStandard;
+
+    /** 考核类型 */
+    @Excel(name = "考核类型")
+    private String assessmentType;
+    /**
+     * 子类考核类型(字典值value值)
+     */
+    private String assessmentTypeId;
+
+    /** 项目总分 */
+    @Excel(name = "项目总分")
+    private Long assessmentTotal;
+
+    /** 分数类型 1:加分 2:减分 */
+    @Excel(name = "分数类型 1:加分 2:减分")
+    private String scoreType;
+
+    /** 单项分数 */
+    @Excel(name = "单项分数")
+    private Long assessmentScore;
+
+    /** 参与次数 */
+    @Excel(name = "参与次数")
+    private String assessmentCount;
+
+    /** 分数说明 */
+    @Excel(name = "分数说明")
+    private String assessmentExplain;
+
+    /** 是否启用(Y代表启用 n代表不启用) */
+    @Excel(name = "是否启用", readConverterExp = "Y=代表启用,n=代表不启用")
+    private String isUse;
+
+    /** 子考核 */
+    private List<ZxAssessment> children = new ArrayList<ZxAssessment>();
+
+    public List<ZxAssessment> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ZxAssessment> children) {
+        this.children = children;
+    }
+
+    public String getAssessmentTypeId() {
+        return assessmentTypeId;
+    }
+
+    public void setAssessmentTypeId(String assessmentTypeId) {
+        this.assessmentTypeId = assessmentTypeId;
+    }
+
+    public String getAssessmentProjectId() {
+        return assessmentProjectId;
+    }
+
+    public void setAssessmentProjectId(String assessmentProjectId) {
+        this.assessmentProjectId = assessmentProjectId;
+    }
+
+    public void setAssessmentId(Long assessmentId)
+    {
+        this.assessmentId = assessmentId;
+    }
+
+    public Long getAssessmentId() 
+    {
+        return assessmentId;
+    }
+    public void setParentId(Long parentId) 
+    {
+        this.parentId = parentId;
+    }
+
+    public Long getParentId() 
+    {
+        return parentId;
+    }
+    public void setAncestors(String ancestors) 
+    {
+        this.ancestors = ancestors;
+    }
+
+    public String getAncestors() 
+    {
+        return ancestors;
+    }
+    public void setAssessmentProject(String assessmentProject) 
+    {
+        this.assessmentProject = assessmentProject;
+    }
+
+    public String getAssessmentProject() 
+    {
+        return assessmentProject;
+    }
+    public void setAssessmentStandard(String assessmentStandard) 
+    {
+        this.assessmentStandard = assessmentStandard;
+    }
+
+    public String getAssessmentStandard() 
+    {
+        return assessmentStandard;
+    }
+    public void setAssessmentType(String assessmentType) 
+    {
+        this.assessmentType = assessmentType;
+    }
+
+    public String getAssessmentType() 
+    {
+        return assessmentType;
+    }
+
+    public Long getAssessmentTotal() {
+        return assessmentTotal;
+    }
+
+    public void setAssessmentTotal(Long assessmentTotal) {
+        this.assessmentTotal = assessmentTotal;
+    }
+
+    public Long getAssessmentScore() {
+        return assessmentScore;
+    }
+
+    public void setAssessmentScore(Long assessmentScore) {
+        this.assessmentScore = assessmentScore;
+    }
+
+    public void setScoreType(String scoreType)
+    {
+        this.scoreType = scoreType;
+    }
+
+    public String getScoreType() 
+    {
+        return scoreType;
+    }
+
+    public void setAssessmentCount(String assessmentCount) 
+    {
+        this.assessmentCount = assessmentCount;
+    }
+
+    public String getAssessmentCount() 
+    {
+        return assessmentCount;
+    }
+    public void setAssessmentExplain(String assessmentExplain) 
+    {
+        this.assessmentExplain = assessmentExplain;
+    }
+
+    public String getAssessmentExplain() 
+    {
+        return assessmentExplain;
+    }
+    public void setIsUse(String isUse) 
+    {
+        this.isUse = isUse;
+    }
+
+    public String getIsUse() 
+    {
+        return isUse;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("assessmentId", getAssessmentId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("assessmentProject", getAssessmentProject())
+            .append("assessmentStandard", getAssessmentStandard())
+            .append("assessmentType", getAssessmentType())
+            .append("assessmentTotal", getAssessmentTotal())
+            .append("scoreType", getScoreType())
+            .append("assessmentScore", getAssessmentScore())
+            .append("assessmentCount", getAssessmentCount())
+            .append("assessmentExplain", getAssessmentExplain())
+            .append("isUse", getIsUse())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 169 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/bonus/ZxBonus.java

@@ -0,0 +1,169 @@
+package com.ruoyi.system.domain.bonus;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协履职加分对象 zx_bonus
+ * 
+ * @author boman
+ * @date 2024-03-11
+ */
+public class ZxBonus extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 履职加分ID */
+    private Long bonusId;
+
+    /** 委员账号id */
+    @Excel(name = "委员账号id")
+    private Long userId;
+
+    /** 考核界次 */
+    @Excel(name = "考核界次")
+    private String boundary;
+    /**
+     * 委员姓名
+     */
+    private String name;
+
+    /** 考核类型 */
+    @Excel(name = "考核类型")
+    private String checkType;
+    /**
+     * 是否审核 1:待审核 2:已审核 3:已驳回
+     */
+    private String type;
+
+    /** 加分类型 */
+    @Excel(name = "加分类型")
+    private String bonusType;
+
+    /** 加分事由 */
+    @Excel(name = "加分事由")
+    private String bonusReason;
+
+    /** 加分时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "加分时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date bonusTime;
+    /**
+     * 附件
+     */
+    private List<ZxFj> zxFjList;
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setBonusId(Long bonusId)
+    {
+        this.bonusId = bonusId;
+    }
+
+    public Long getBonusId() 
+    {
+        return bonusId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setBoundary(String boundary) 
+    {
+        this.boundary = boundary;
+    }
+
+    public String getBoundary() 
+    {
+        return boundary;
+    }
+    public void setCheckType(String checkType) 
+    {
+        this.checkType = checkType;
+    }
+
+    public String getCheckType() 
+    {
+        return checkType;
+    }
+    public void setBonusType(String bonusType) 
+    {
+        this.bonusType = bonusType;
+    }
+
+    public String getBonusType() 
+    {
+        return bonusType;
+    }
+    public void setBonusReason(String bonusReason) 
+    {
+        this.bonusReason = bonusReason;
+    }
+
+    public String getBonusReason() 
+    {
+        return bonusReason;
+    }
+    public void setBonusTime(Date bonusTime) 
+    {
+        this.bonusTime = bonusTime;
+    }
+
+    public Date getBonusTime() 
+    {
+        return bonusTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("bonusId", getBonusId())
+            .append("userId", getUserId())
+            .append("boundary", getBoundary())
+            .append("checkType", getCheckType())
+            .append("bonusType", getBonusType())
+            .append("bonusReason", getBonusReason())
+            .append("bonusTime", getBonusTime())
+            .append("score", getScore())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 216 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/conference/ZxConference.java

@@ -0,0 +1,216 @@
+package com.ruoyi.system.domain.conference;
+
+import java.util.List;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协会议活动对象 zx_conference
+ * 
+ * @author boman
+ * @date 2024-03-06
+ */
+public class ZxConference extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 会议活动ID */
+    private Long conferenceId;
+    /**
+     * 会议通知时查询列表使用,不在数据库中
+     */
+    private Long userId;
+
+    /** 会议名称 */
+    @Excel(name = "会议名称")
+    private String conferenceTitle;
+
+    /** 会议日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "会议日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date conferenceDate;
+
+    /** 会议时间 */
+    @Excel(name = "会议时间")
+    private String conferenceTime;
+
+    /** 会议地点 */
+    @Excel(name = "会议地点")
+    private String conferenceAddress;
+    /**
+     * 会议类型
+     */
+    private String conferenceType;
+    /**
+     * 已读人数
+     */
+    private String read;
+    /**
+     * 未读人数
+     */
+    private String noRead;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date publishTime;
+
+    /** 政协会议活动-用户关联信息 */
+    private List<ZxConferenceUser> zxConferenceUserList;
+    /**
+     * 会议二维码
+     */
+    private String conferenceQr;
+
+    /**
+     * 附件
+     */
+    private List<ZxFj> zxFjList;
+
+    /** 是否参会 N:不参加 Y:参加 不在数据库中*/
+    private String isJoin;
+
+    public String getIsJoin() {
+        return isJoin;
+    }
+
+    public void setIsJoin(String isJoin) {
+        this.isJoin = isJoin;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public String getConferenceType() {
+        return conferenceType;
+    }
+
+    public void setConferenceType(String conferenceType) {
+        this.conferenceType = conferenceType;
+    }
+
+    public String getConferenceQr() {
+        return conferenceQr;
+    }
+
+    public void setConferenceQr(String conferenceQr) {
+        this.conferenceQr = conferenceQr;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getNoRead() {
+        return noRead;
+    }
+
+    public void setNoRead(String noRead) {
+        this.noRead = noRead;
+    }
+
+    public String getRead() {
+        return read;
+    }
+
+    public void setRead(String read) {
+        this.read = read;
+    }
+
+    public void setConferenceId(Long conferenceId)
+    {
+        this.conferenceId = conferenceId;
+    }
+
+    public Long getConferenceId() 
+    {
+        return conferenceId;
+    }
+    public void setConferenceTitle(String conferenceTitle) 
+    {
+        this.conferenceTitle = conferenceTitle;
+    }
+
+    public String getConferenceTitle() 
+    {
+        return conferenceTitle;
+    }
+    public void setConferenceDate(Date conferenceDate) 
+    {
+        this.conferenceDate = conferenceDate;
+    }
+
+    public Date getConferenceDate() 
+    {
+        return conferenceDate;
+    }
+    public void setConferenceTime(String conferenceTime) 
+    {
+        this.conferenceTime = conferenceTime;
+    }
+
+    public String getConferenceTime() 
+    {
+        return conferenceTime;
+    }
+    public void setConferenceAddress(String conferenceAddress) 
+    {
+        this.conferenceAddress = conferenceAddress;
+    }
+
+    public String getConferenceAddress() 
+    {
+        return conferenceAddress;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+
+    public List<ZxConferenceUser> getZxConferenceUserList()
+    {
+        return zxConferenceUserList;
+    }
+
+    public void setZxConferenceUserList(List<ZxConferenceUser> zxConferenceUserList)
+    {
+        this.zxConferenceUserList = zxConferenceUserList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("conferenceId", getConferenceId())
+            .append("conferenceTitle", getConferenceTitle())
+            .append("conferenceDate", getConferenceDate())
+            .append("conferenceTime", getConferenceTime())
+            .append("conferenceAddress", getConferenceAddress())
+            .append("publishTime", getPublishTime())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .append("zxConferenceUserList", getZxConferenceUserList())
+            .toString();
+    }
+}

+ 206 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/conference/ZxConferenceUser.java

@@ -0,0 +1,206 @@
+package com.ruoyi.system.domain.conference;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协会议活动-用户关联对象 zx_conference_user
+ * 
+ * @author boman
+ * @date 2024-03-06
+ */
+public class ZxConferenceUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 会议活动ID */
+    private Long conferenceId;
+
+    /** 用户ID/委员信息表id */
+    private Long userId;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    private String userName;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /** 委员职务 */
+    @Excel(name = "委员职务")
+    private String postName;
+
+    /** 级别 */
+    @Excel(name = "级别")
+    private String userLevel;
+    /**
+     * 父级别
+     */
+    private String parentGrade;
+
+
+    /** 答复时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "答复时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date replyTime;
+
+    /** 签到时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "签到时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date signIn;
+
+    /** 是否参会 N:不参加 Y:参加 */
+    @Excel(name = "是否参会 N:不参加 Y:参加")
+    private String isJoin;
+
+    /** 请假类型 */
+    @Excel(name = "请假类型")
+    private String leaveType;
+
+    /** 请假原因 */
+    @Excel(name = "请假原因")
+    private String leaveReason;
+    /**
+     * 是否审批 1:待审批 2:已同意 3:未同意
+     */
+    private String approval;
+
+    public String getApproval() {
+        return approval;
+    }
+
+    public void setApproval(String approval) {
+        this.approval = approval;
+    }
+
+    public String getParentGrade() {
+        return parentGrade;
+    }
+
+    public void setParentGrade(String parentGrade) {
+        this.parentGrade = parentGrade;
+    }
+
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
+    public Date getSignIn() {
+        return signIn;
+    }
+
+    public void setSignIn(Date signIn) {
+        this.signIn = signIn;
+    }
+
+    public void setConferenceId(Long conferenceId)
+    {
+        this.conferenceId = conferenceId;
+    }
+
+    public Long getConferenceId() 
+    {
+        return conferenceId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setUserName(String userName) 
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName() 
+    {
+        return userName;
+    }
+    public void setPostName(String postName) 
+    {
+        this.postName = postName;
+    }
+
+    public String getPostName() 
+    {
+        return postName;
+    }
+    public void setUserLevel(String userLevel) 
+    {
+        this.userLevel = userLevel;
+    }
+
+    public String getUserLevel() 
+    {
+        return userLevel;
+    }
+    public void setReplyTime(Date replyTime) 
+    {
+        this.replyTime = replyTime;
+    }
+
+    public Date getReplyTime() 
+    {
+        return replyTime;
+    }
+    public void setIsJoin(String isJoin) 
+    {
+        this.isJoin = isJoin;
+    }
+
+    public String getIsJoin() 
+    {
+        return isJoin;
+    }
+    public void setLeaveType(String leaveType) 
+    {
+        this.leaveType = leaveType;
+    }
+
+    public String getLeaveType() 
+    {
+        return leaveType;
+    }
+    public void setLeaveReason(String leaveReason) 
+    {
+        this.leaveReason = leaveReason;
+    }
+
+    public String getLeaveReason() 
+    {
+        return leaveReason;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("conferenceId", getConferenceId())
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("postName", getPostName())
+            .append("userLevel", getUserLevel())
+            .append("replyTime", getReplyTime())
+            .append("isJoin", getIsJoin())
+            .append("leaveType", getLeaveType())
+            .append("leaveReason", getLeaveReason())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 169 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/investment/ZxInvestment.java

@@ -0,0 +1,169 @@
+package com.ruoyi.system.domain.investment;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协委员招商引资对象 zx_investment
+ * 
+ * @author boman
+ * @date 2024-03-27
+ */
+public class ZxInvestment extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 政协委员招商引资ID */
+    private Long investmentId;
+
+    /** 委员账号id */
+    @Excel(name = "委员账号id")
+    private Long userId;
+
+    /** 委员姓名 */
+    @Excel(name = "委员姓名")
+    private String name;
+
+    /** 项目线索名称 */
+    @Excel(name = "项目线索名称")
+    private String clueName;
+
+    /** 拟投资额 */
+    @Excel(name = "拟投资额")
+    private String investmentAmount;
+
+    /** 联系人 */
+    @Excel(name = "联系人")
+    private String contactsName;
+
+    /** 联系方式 */
+    @Excel(name = "联系方式")
+    private String contactsPhone;
+
+    /** 联系内容 */
+    @Excel(name = "联系内容")
+    private String contactsContent;
+    /**
+     * 招商项目状态 1:未签约 2:已签约
+     */
+    private String type;
+
+    /** 录入时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "录入时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date publishTime;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setInvestmentId(Long investmentId)
+    {
+        this.investmentId = investmentId;
+    }
+
+    public Long getInvestmentId() 
+    {
+        return investmentId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setClueName(String clueName) 
+    {
+        this.clueName = clueName;
+    }
+
+    public String getClueName() 
+    {
+        return clueName;
+    }
+    public void setInvestmentAmount(String investmentAmount) 
+    {
+        this.investmentAmount = investmentAmount;
+    }
+
+    public String getInvestmentAmount() 
+    {
+        return investmentAmount;
+    }
+    public void setContactsName(String contactsName) 
+    {
+        this.contactsName = contactsName;
+    }
+
+    public String getContactsName() 
+    {
+        return contactsName;
+    }
+    public void setContactsPhone(String contactsPhone) 
+    {
+        this.contactsPhone = contactsPhone;
+    }
+
+    public String getContactsPhone() 
+    {
+        return contactsPhone;
+    }
+    public void setContactsContent(String contactsContent) 
+    {
+        this.contactsContent = contactsContent;
+    }
+
+    public String getContactsContent() 
+    {
+        return contactsContent;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("investmentId", getInvestmentId())
+            .append("userId", getUserId())
+            .append("name", getName())
+            .append("clueName", getClueName())
+            .append("investmentAmount", getInvestmentAmount())
+            .append("contactsName", getContactsName())
+            .append("contactsPhone", getContactsPhone())
+            .append("contactsContent", getContactsContent())
+            .append("publishTime", getPublishTime())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 244 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberAssessmentInfo.java

@@ -0,0 +1,244 @@
+package com.ruoyi.system.domain.member;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 委员考核分数对象 member_assessment_info
+ * 
+ * @author boman
+ * @date 2024-03-20
+ */
+public class MemberAssessmentInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 委员考核分数ID */
+    private Long memberAssessmentId;
+
+    /** 账号表ID */
+    @Excel(name = "账号表ID")
+    private Long userId;
+
+    /** 提案分数 */
+    @Excel(name = "提案分数")
+    private Long proposalScore;
+
+    /** 社情民意分数 */
+    @Excel(name = "社情民意分数")
+    private Long sqmyScore;
+
+    /** 会议分数 */
+    @Excel(name = "会议分数")
+    private Long conferenceScore;
+
+    /** 活动分数 */
+    @Excel(name = "活动分数")
+    private Long activityScore;
+    /**
+     * 活动视察调研
+     */
+    private Long activityScdyScore;
+    /**
+     * 活动活动联络组调研
+     */
+    private Long activityLlzScore;
+    /**
+     * 活动界别调研
+     */
+    private Long activityJbScore;
+
+    /**
+     * 活动办实事调研
+     */
+    private Long activityBssScore;
+    /**
+     * 招商
+     */
+    private Long investmentScore;
+
+    /** 加分(其他分数) */
+    @Excel(name = "加分(其他分数)")
+    private Long bonusScore;
+
+    /** 总分 */
+    @Excel(name = "总分")
+    private Long totalScore;
+    /**
+     * 满分
+     */
+    private Long fullScore;
+
+    /** 排名 */
+    @Excel(name = "排名")
+    private String rank;
+    /**
+     * 总人数
+     */
+    private int totalPeople;
+
+    /** 年份 */
+    @Excel(name = "年份")
+    private String year;
+
+    public Long getInvestmentScore() {
+        return investmentScore;
+    }
+
+    public void setInvestmentScore(Long investmentScore) {
+        this.investmentScore = investmentScore;
+    }
+
+    public Long getActivityScdyScore() {
+        return activityScdyScore;
+    }
+
+    public void setActivityScdyScore(Long activityScdyScore) {
+        this.activityScdyScore = activityScdyScore;
+    }
+
+    public Long getActivityLlzScore() {
+        return activityLlzScore;
+    }
+
+    public void setActivityLlzScore(Long activityLlzScore) {
+        this.activityLlzScore = activityLlzScore;
+    }
+
+    public Long getActivityJbScore() {
+        return activityJbScore;
+    }
+
+    public void setActivityJbScore(Long activityJbScore) {
+        this.activityJbScore = activityJbScore;
+    }
+
+    public Long getActivityBssScore() {
+        return activityBssScore;
+    }
+
+    public void setActivityBssScore(Long activityBssScore) {
+        this.activityBssScore = activityBssScore;
+    }
+
+    public Long getFullScore() {
+        return fullScore;
+    }
+
+    public void setFullScore(Long fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public int getTotalPeople() {
+        return totalPeople;
+    }
+
+    public void setTotalPeople(int totalPeople) {
+        this.totalPeople = totalPeople;
+    }
+
+    public Long getMemberAssessmentId() {
+        return memberAssessmentId;
+    }
+
+    public void setMemberAssessmentId(Long memberAssessmentId) {
+        this.memberAssessmentId = memberAssessmentId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getProposalScore() {
+        return proposalScore;
+    }
+
+    public void setProposalScore(Long proposalScore) {
+        this.proposalScore = proposalScore;
+    }
+
+    public Long getSqmyScore() {
+        return sqmyScore;
+    }
+
+    public void setSqmyScore(Long sqmyScore) {
+        this.sqmyScore = sqmyScore;
+    }
+
+    public Long getConferenceScore() {
+        return conferenceScore;
+    }
+
+    public void setConferenceScore(Long conferenceScore) {
+        this.conferenceScore = conferenceScore;
+    }
+
+    public Long getActivityScore() {
+        return activityScore;
+    }
+
+    public void setActivityScore(Long activityScore) {
+        this.activityScore = activityScore;
+    }
+
+    public Long getBonusScore() {
+        return bonusScore;
+    }
+
+    public void setBonusScore(Long bonusScore) {
+        this.bonusScore = bonusScore;
+    }
+
+    public Long getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Long totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getRank() {
+        return rank;
+    }
+
+    public void setRank(String rank) {
+        this.rank = rank;
+    }
+
+    @Override
+    public String getYear() {
+        return year;
+    }
+
+    @Override
+    public void setYear(String year) {
+        this.year = year;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("memberAssessmentId", getMemberAssessmentId())
+            .append("userId", getUserId())
+            .append("proposalScore", getProposalScore())
+            .append("sqmyScore", getSqmyScore())
+            .append("conferenceScore", getConferenceScore())
+            .append("activityScore", getActivityScore())
+            .append("bonusScore", getBonusScore())
+            .append("totalScore", getTotalScore())
+            .append("rank", getRank())
+            .append("year", getYear())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 266 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberInfo.java

@@ -0,0 +1,266 @@
+package com.ruoyi.system.domain.member;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 委员信息对象 member_info
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class MemberInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 委员ID */
+    private Long memberId;
+
+    /** 账号表ID */
+    @Excel(name = "账号表ID")
+    private Long userId;
+
+    /** 委员姓名 */
+    @Excel(name = "委员姓名")
+    private String name;
+
+    /** 委员身份证号 */
+    @Excel(name = "委员身份证号")
+    private String card;
+
+    /** 界别 */
+    @Excel(name = "界别")
+    private String boundary;
+
+    /** 党派 */
+    @Excel(name = "党派")
+    private String partyAffiliation;
+
+    /** 手机号码 */
+    @Excel(name = "手机号码")
+    private String phonenumber;
+
+    /** 委员照片地址 */
+    @Excel(name = "委员照片地址")
+    private String avatar;
+
+    /** 工作单位及职务 */
+    @Excel(name = "工作单位及职务")
+    private String unit;
+
+    /** 乡镇(经开区)委员工作室 */
+    @Excel(name = "乡镇", readConverterExp = "经=开区")
+    private String studio;
+    /**
+     * 委员地址
+     */
+    private String address;
+    /**
+     * 是否是常委
+     */
+    @Excel(name = "是否是常委")
+    private String isMember;
+    /**
+     * 排名
+     */
+    private String ranking;
+    /**
+     * 级别,多选
+     */
+    @Excel(name = "委员级别")
+    private String grade;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 地址类型 1:领衔,2:附议 */
+    private String type;
+    /**
+     * 柱状图base64编码
+     */
+    private String ele;
+    /**
+     * 饼状图base64编码
+     */
+    private String pie;
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getIsMember() {
+        return isMember;
+    }
+
+    public void setIsMember(String isMember) {
+        this.isMember = isMember;
+    }
+
+    public String getEle() {
+        return ele;
+    }
+
+    public void setEle(String ele) {
+        this.ele = ele;
+    }
+
+    public String getPie() {
+        return pie;
+    }
+
+    public void setPie(String pie) {
+        this.pie = pie;
+    }
+
+    public String getGrade() {
+        return grade;
+    }
+
+    public void setGrade(String grade) {
+        this.grade = grade;
+    }
+
+
+    public String getRanking() {
+        return ranking;
+    }
+
+    public void setRanking(String ranking) {
+        this.ranking = ranking;
+    }
+
+    public void setMemberId(Long memberId)
+    {
+        this.memberId = memberId;
+    }
+
+    public Long getMemberId() 
+    {
+        return memberId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCard() {
+        return card;
+    }
+
+    public void setCard(String card) {
+        this.card = card;
+    }
+
+    public void setBoundary(String boundary)
+    {
+        this.boundary = boundary;
+    }
+
+    public String getBoundary() 
+    {
+        return boundary;
+    }
+    public void setPartyAffiliation(String partyAffiliation) 
+    {
+        this.partyAffiliation = partyAffiliation;
+    }
+
+    public String getPartyAffiliation() 
+    {
+        return partyAffiliation;
+    }
+    public void setPhonenumber(String phonenumber) 
+    {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getPhonenumber() 
+    {
+        return phonenumber;
+    }
+    public void setAvatar(String avatar) 
+    {
+        this.avatar = avatar;
+    }
+
+    public String getAvatar() 
+    {
+        return avatar;
+    }
+    public void setUnit(String unit) 
+    {
+        this.unit = unit;
+    }
+
+    public String getUnit() 
+    {
+        return unit;
+    }
+    public void setStudio(String studio) 
+    {
+        this.studio = studio;
+    }
+
+    public String getStudio() 
+    {
+        return studio;
+    }
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("memberId", getMemberId())
+            .append("userId", getUserId())
+            .append("name", getName())
+            .append("card", getCard())
+            .append("boundary", getBoundary())
+            .append("partyAffiliation", getPartyAffiliation())
+            .append("phonenumber", getPhonenumber())
+            .append("avatar", getAvatar())
+            .append("unit", getUnit())
+            .append("studio", getStudio())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 50 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberInfoTree.java

@@ -0,0 +1,50 @@
+package com.ruoyi.system.domain.member;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/15 10:47
+ * @Describe:
+ */
+public class MemberInfoTree implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 节点ID */
+    private String userId;
+
+    /** 节点名称 */
+    private String name;
+
+    /** 子节点 */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<MemberInfo> children;
+
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<MemberInfo> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<MemberInfo> children) {
+        this.children = children;
+    }
+}

+ 211 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/notice/ZxNotice.java

@@ -0,0 +1,211 @@
+package com.ruoyi.system.domain.notice;
+
+import java.util.List;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.springframework.beans.factory.annotation.Value;
+
+/**
+ * 政协通知公告对象 zx_notice
+ * 
+ * @author boman
+ * @date 2024-03-05
+ */
+public class ZxNotice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 公告ID */
+    private Long zxNoticeId;
+    /**
+     * 用户id查询时使用
+     */
+    private Long userId;
+
+    /** 公告标题 */
+    @Excel(name = "公告标题")
+    private String noticeTitle;
+
+    /** 公告类型(字典值) */
+    @Excel(name = "公告类型", readConverterExp = "字=典值")
+    private String noticeType;
+
+    /** 公告内容 */
+    @Excel(name = "公告内容")
+    private String noticeContent;
+
+    /** 公告状态(0正常 1关闭) */
+    @Excel(name = "公告状态", readConverterExp = "0=正常,1=关闭")
+    private String status;
+
+    /** 发布人 */
+    @Excel(name = "发布人")
+    private String issuer;
+
+    /** 发布单位 */
+    @Excel(name = "发布单位")
+    private String issuerDept;
+
+    /** 发布单位id */
+    @Excel(name = "发布单位id")
+    private Long issuerDeptId;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date issuerTime;
+    /**
+     * 判断已读未读
+     */
+    @Value("N")
+    private String type;
+
+    /** 用户与政协通知公告关联信息 */
+    private List<ZxUserNotice> zxUserNoticeList;
+    /**
+     * 附件
+     */
+    private List<ZxFj> zxFjList;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setZxNoticeId(Long zxNoticeId)
+    {
+        this.zxNoticeId = zxNoticeId;
+    }
+
+    public Long getZxNoticeId() 
+    {
+        return zxNoticeId;
+    }
+    public void setNoticeTitle(String noticeTitle) 
+    {
+        this.noticeTitle = noticeTitle;
+    }
+
+    public String getNoticeTitle() 
+    {
+        return noticeTitle;
+    }
+    public void setNoticeType(String noticeType) 
+    {
+        this.noticeType = noticeType;
+    }
+
+    public String getNoticeType() 
+    {
+        return noticeType;
+    }
+    public void setNoticeContent(String noticeContent) 
+    {
+        this.noticeContent = noticeContent;
+    }
+
+    public String getNoticeContent() 
+    {
+        return noticeContent;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setIssuer(String issuer) 
+    {
+        this.issuer = issuer;
+    }
+
+    public String getIssuer() 
+    {
+        return issuer;
+    }
+    public void setIssuerDept(String issuerDept) 
+    {
+        this.issuerDept = issuerDept;
+    }
+
+    public String getIssuerDept() 
+    {
+        return issuerDept;
+    }
+    public void setIssuerDeptId(Long issuerDeptId) 
+    {
+        this.issuerDeptId = issuerDeptId;
+    }
+
+    public Long getIssuerDeptId() 
+    {
+        return issuerDeptId;
+    }
+    public void setIssuerTime(Date issuerTime) 
+    {
+        this.issuerTime = issuerTime;
+    }
+
+    public Date getIssuerTime() 
+    {
+        return issuerTime;
+    }
+
+    public List<ZxUserNotice> getZxUserNoticeList()
+    {
+        return zxUserNoticeList;
+    }
+
+    public void setZxUserNoticeList(List<ZxUserNotice> zxUserNoticeList)
+    {
+        this.zxUserNoticeList = zxUserNoticeList;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("zxNoticeId", getZxNoticeId())
+            .append("noticeTitle", getNoticeTitle())
+            .append("noticeType", getNoticeType())
+            .append("noticeContent", getNoticeContent())
+            .append("status", getStatus())
+            .append("issuer", getIssuer())
+            .append("issuerDept", getIssuerDept())
+            .append("issuerDeptId", getIssuerDeptId())
+            .append("issuerTime", getIssuerTime())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .append("zxUserNoticeList", getZxUserNoticeList())
+            .toString();
+    }
+}

+ 77 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/notice/ZxUserNotice.java

@@ -0,0 +1,77 @@
+package com.ruoyi.system.domain.notice;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 用户与政协通知公告关联对象 zx_user_notice
+ * 
+ * @author boman
+ * @date 2024-03-05
+ */
+public class ZxUserNotice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 用户名称 */
+    @Excel(name = "用户名称")
+    private String userName;
+    /**
+     * Y:已读
+     */
+    private String zxNoticeType;
+
+    /** 公告ID */
+    private Long zxNoticeId;
+
+    public String getZxNoticeType() {
+        return zxNoticeType;
+    }
+
+    public void setZxNoticeType(String zxNoticeType) {
+        this.zxNoticeType = zxNoticeType;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+    public void setUserName(String userName) 
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName() 
+    {
+        return userName;
+    }
+    public void setZxNoticeId(Long zxNoticeId) 
+    {
+        this.zxNoticeId = zxNoticeId;
+    }
+
+    public Long getZxNoticeId() 
+    {
+        return zxNoticeId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("zxNoticeId", getZxNoticeId())
+            .append("createTime", getCreateTime())
+            .toString();
+    }
+}

+ 221 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/speak/ZxSpeak.java

@@ -0,0 +1,221 @@
+package com.ruoyi.system.domain.speak;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协发言对象 zx_speak
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public class ZxSpeak extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 我的发言id */
+    private Long speakId;
+
+    /** 发言标题 */
+    @Excel(name = "发言标题")
+    private String speakTitle;
+
+    /** 发言人 */
+    @Excel(name = "发言人")
+    private String name;
+    /** 发言人id */
+    private Long userId;
+    /** 录入人 */
+    @Excel(name = "录入人")
+    private String inputName;
+
+    /** 会议活动id */
+    @Excel(name = "会议活动id")
+    private Long conferenceId;
+    /**
+     * 会议活动名称
+     */
+    private String conferenceTitle;
+
+    /** 发言单位 */
+    @Excel(name = "发言单位")
+    private String speakUnit;
+    /**
+     * 发言单位id
+     */
+    private Long deptId;
+
+    /** 发言类型(字典值) */
+    @Excel(name = "发言类型(字典值)")
+    private String speakType;
+
+    /** 发言时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发言时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date speakTime;
+
+    /** 录入时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "录入时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date publishTime;
+
+    /** 状态 1:待审核 2:已审核 */
+    @Excel(name = "状态 1:待审核 2:已审核")
+    private String speakStatus;
+    /**
+     * 附件
+     */
+    private List<ZxFj> zxFjList;
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getConferenceTitle() {
+        return conferenceTitle;
+    }
+
+    public void setConferenceTitle(String conferenceTitle) {
+        this.conferenceTitle = conferenceTitle;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public void setSpeakId(Long speakId)
+    {
+        this.speakId = speakId;
+    }
+
+    public Long getSpeakId() 
+    {
+        return speakId;
+    }
+    public void setSpeakTitle(String speakTitle) 
+    {
+        this.speakTitle = speakTitle;
+    }
+
+    public String getSpeakTitle() 
+    {
+        return speakTitle;
+    }
+
+    public void setInputName(String inputName) 
+    {
+        this.inputName = inputName;
+    }
+
+    public String getInputName() 
+    {
+        return inputName;
+    }
+    public void setConferenceId(Long conferenceId) 
+    {
+        this.conferenceId = conferenceId;
+    }
+
+    public Long getConferenceId() 
+    {
+        return conferenceId;
+    }
+    public void setSpeakUnit(String speakUnit) 
+    {
+        this.speakUnit = speakUnit;
+    }
+
+    public String getSpeakUnit() 
+    {
+        return speakUnit;
+    }
+    public void setSpeakType(String speakType) 
+    {
+        this.speakType = speakType;
+    }
+
+    public String getSpeakType() 
+    {
+        return speakType;
+    }
+    public void setSpeakTime(Date speakTime) 
+    {
+        this.speakTime = speakTime;
+    }
+
+    public Date getSpeakTime() 
+    {
+        return speakTime;
+    }
+    public void setPublishTime(Date publishTime) 
+    {
+        this.publishTime = publishTime;
+    }
+
+    public Date getPublishTime() 
+    {
+        return publishTime;
+    }
+    public void setSpeakStatus(String speakStatus) 
+    {
+        this.speakStatus = speakStatus;
+    }
+
+    public String getSpeakStatus() 
+    {
+        return speakStatus;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("speakId", getSpeakId())
+            .append("speakTitle", getSpeakTitle())
+            .append("name", getName())
+            .append("userId", getUserId())
+            .append("inputName", getInputName())
+            .append("conferenceId", getConferenceId())
+            .append("speakUnit", getSpeakUnit())
+            .append("speakType", getSpeakType())
+            .append("speakTime", getSpeakTime())
+            .append("publishTime", getPublishTime())
+            .append("speakStatus", getSpeakStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 542 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/sqmy/SqmyInfo.java

@@ -0,0 +1,542 @@
+package com.ruoyi.system.domain.sqmy;
+
+import com.ruoyi.system.domain.ProposalUnitReply;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.List;
+
+/**
+ * 社情民意信息对象 sqmy_info
+ *
+ * @author boman
+ * @date 2024-03-15
+ */
+public class SqmyInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 社情民意ID */
+    private Long sqmyId;
+
+    /** 上报人ID */
+    //@Excel(name = "上报人ID")
+    private Long sqmyUserId;
+
+    /** 编号 */
+    @Excel(name = "编号")
+    private String sqmyNumber;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 主题类型1:经济建设类,2:政治建设类,3:文化建设类,4:社会建设类,5:生态文明建设类,6:其他 */
+    @Excel(name = "主题类型",readConverterExp = "1=经济建设类,2=政治建设类,3=文化建设类,4=社会建设类,5=生态文明建设类,6=其他")
+    private String topicType;
+
+    /** 打回理由 */
+    //@Excel(name = "打回理由")
+    private String backReason;
+
+    /** 联系人姓名 */
+    //@Excel(name = "联系人姓名")
+    private String lxrName;
+
+    /** 联系人手机号码 */
+    //@Excel(name = "联系人手机号码")
+    private String lxrPhone;
+
+    /** 上报人姓名 */
+    @Excel(name = "上报人姓名")
+    private String sqmyName;
+
+    /** 上报人手机号码 */
+    @Excel(name = "上报人手机号码")
+    private String sqmyPhone;
+
+    /** 社情民意内容 */
+    //@Excel(name = "社情民意内容")
+    private String sqmyContent;
+
+    /** 同意公开(0是 1否) */
+    @Excel(name = "同意公开", readConverterExp = "0=是,1=否")
+    private String isPublicity;
+
+    /** 是否涉密(0是 1否) */
+    @Excel(name = "是否涉密", readConverterExp = "0=是,1=否")
+    private String isSecret;
+
+    /** 工作单位及职务 */
+    @Excel(name = "工作单位及职务")
+    private String unit;
+
+    /** 是否采用(0是 1否) */
+    @Excel(name = "是否立案", readConverterExp = "0=已采用,1=未采用")
+    private String isRecord;
+
+    /**
+     * 状态(0:已读,1:未读)
+     */
+    @Excel(name = "状态", readConverterExp = "0=已读,1=未读")
+    private String isRead;
+
+    /** 社情民意进度(0:提交社情民意,1:社情民意审查,2:已采用,3:未采用)*/
+    @Excel(name = "社情民意进度", readConverterExp = "0=提交社情民意,1=社情民意审查,2=已采用,3=未采用" )
+    private String sqmyProgress;
+
+    /** 滚动办理(0是 1否) */
+    //@Excel(name = "滚动办理", readConverterExp = "0=是,1=否")
+    private String rollingProcess;
+
+    /** 提案答复类型(A:A类,B:B类,C:C类) */
+    //@Excel(name = "提案答复类型(A:A类,B:B类,C:C类)")
+    private String complexType;
+
+    /** 是否被并案(0是 1否) */
+    //@Excel(name = "是否被并案", readConverterExp = "0=是,1=否")
+    private String isCasesTogether;
+
+    /** 被并案的案件id */
+    //@Excel(name = "被并案的案件id")
+    private Long uniteSqmyId;
+
+    /** 承办单位答复委员 */
+    //@Excel(name = "承办单位答复委员")
+    private String cbdwdfwy;
+
+    /** 委员满意程度(0:不满意,1:一般,2:满意,3:非常满意) */
+    //@Excel(name = "委员满意程度", readConverterExp = "0=:不满意,1:一般,2:满意,3:非常满意")
+    private String satisfaction;
+
+    /** 委员意见 */
+    //@Excel(name = "委员意见")
+    private String membersOpinion;
+
+    /** 政协满意程度(0:不满意,1:一般,2:满意,3:非常满意) */
+    //@Excel(name = "政协满意程度", readConverterExp = "0=:不满意,1:一般,2:满意,3:非常满意")
+    private String zxSatisfaction;
+
+    /** 政协意见 */
+    //@Excel(name = "政协意见")
+    private String zxOpinion;
+
+    /** 是否推荐重点(0是 1否) */
+    //@Excel(name = "是否推荐重点", readConverterExp = "0=是,1=否")
+    private String isKeyPoint;
+
+    /** 推荐重点理由 */
+    //@Excel(name = "推荐重点理由")
+    private String keyPointArgument;
+
+    /** 是否推荐优秀(0是 1否) */
+    //@Excel(name = "是否推荐优秀", readConverterExp = "0=是,1=否")
+    private String isOutstanding;
+
+    /** 推荐优秀理由 */
+    //@Excel(name = "推荐优秀理由")
+    private String outstandingArgument;
+
+    /** 附件 */
+    private List<ZxFj> zxFjList;
+    /** 答复委员附件附件 */
+    private List<ZxFj> dfFjList;
+    /** 单位回复 */
+    private List<SqmyUnitReply> sqmyUnitReplyList;
+    /**主办单位*/
+    private SqmyUnitReply zbUnitReply;
+
+
+    /** 部门id */
+    private Long deptId;
+
+    /** 单位类型 */
+    private String dwType;
+    /** 单位是否答复(0:是,1:否) */
+    private String isReply;
+
+    private String endTime;
+    private String startTime;
+
+    public String getIsRead() {
+        return isRead;
+    }
+
+    public void setIsRead(String isRead) {
+        this.isRead = isRead;
+    }
+
+    public List<ZxFj> getDfFjList() {
+        return dfFjList;
+    }
+
+    public void setDfFjList(List<ZxFj> dfFjList) {
+        this.dfFjList = dfFjList;
+    }
+
+    public String getIsReply() {
+        return isReply;
+    }
+
+    public void setIsReply(String isReply) {
+        this.isReply = isReply;
+    }
+
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getBackReason() {
+        return backReason;
+    }
+
+    public void setBackReason(String backReason) {
+        this.backReason = backReason;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getDwType() {
+        return dwType;
+    }
+
+    public void setDwType(String dwType) {
+        this.dwType = dwType;
+    }
+
+    public SqmyUnitReply getZbUnitReply() {
+        return zbUnitReply;
+    }
+
+    public void setZbUnitReply(SqmyUnitReply zbUnitReply) {
+        this.zbUnitReply = zbUnitReply;
+    }
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public List<SqmyUnitReply> getSqmyUnitReplyList() {
+        return sqmyUnitReplyList;
+    }
+
+    public void setSqmyUnitReplyList(List<SqmyUnitReply> sqmyUnitReplyList) {
+        this.sqmyUnitReplyList = sqmyUnitReplyList;
+    }
+
+    public void setSqmyId(Long sqmyId)
+    {
+        this.sqmyId = sqmyId;
+    }
+
+    public Long getSqmyId()
+    {
+        return sqmyId;
+    }
+    public void setSqmyUserId(Long sqmyUserId)
+    {
+        this.sqmyUserId = sqmyUserId;
+    }
+
+    public Long getSqmyUserId()
+    {
+        return sqmyUserId;
+    }
+    public void setSqmyNumber(String sqmyNumber)
+    {
+        this.sqmyNumber = sqmyNumber;
+    }
+
+    public String getSqmyNumber()
+    {
+        return sqmyNumber;
+    }
+    public void setTitle(String title)
+    {
+        this.title = title;
+    }
+
+    public String getTitle()
+    {
+        return title;
+    }
+    public void setLxrName(String lxrName)
+    {
+        this.lxrName = lxrName;
+    }
+
+    public String getLxrName()
+    {
+        return lxrName;
+    }
+    public void setLxrPhone(String lxrPhone)
+    {
+        this.lxrPhone = lxrPhone;
+    }
+
+    public String getLxrPhone()
+    {
+        return lxrPhone;
+    }
+    public void setSqmyName(String sqmyName)
+    {
+        this.sqmyName = sqmyName;
+    }
+
+    public String getSqmyName()
+    {
+        return sqmyName;
+    }
+    public void setSqmyPhone(String sqmyPhone)
+    {
+        this.sqmyPhone = sqmyPhone;
+    }
+
+    public String getSqmyPhone()
+    {
+        return sqmyPhone;
+    }
+    public void setSqmyContent(String sqmyContent)
+    {
+        this.sqmyContent = sqmyContent;
+    }
+
+    public String getSqmyContent()
+    {
+        return sqmyContent;
+    }
+    public void setIsPublicity(String isPublicity)
+    {
+        this.isPublicity = isPublicity;
+    }
+
+    public String getIsPublicity()
+    {
+        return isPublicity;
+    }
+    public void setIsSecret(String isSecret)
+    {
+        this.isSecret = isSecret;
+    }
+
+    public String getIsSecret()
+    {
+        return isSecret;
+    }
+    public void setUnit(String unit)
+    {
+        this.unit = unit;
+    }
+
+    public String getUnit()
+    {
+        return unit;
+    }
+    public void setIsRecord(String isRecord)
+    {
+        this.isRecord = isRecord;
+    }
+
+    public String getIsRecord()
+    {
+        return isRecord;
+    }
+    public void setSqmyProgress(String sqmyProgress)
+    {
+        this.sqmyProgress = sqmyProgress;
+    }
+
+    public String getSqmyProgress()
+    {
+        return sqmyProgress;
+    }
+    public void setRollingProcess(String rollingProcess)
+    {
+        this.rollingProcess = rollingProcess;
+    }
+
+    public String getRollingProcess()
+    {
+        return rollingProcess;
+    }
+    public void setComplexType(String complexType)
+    {
+        this.complexType = complexType;
+    }
+
+    public String getComplexType()
+    {
+        return complexType;
+    }
+    public void setIsCasesTogether(String isCasesTogether)
+    {
+        this.isCasesTogether = isCasesTogether;
+    }
+
+    public String getIsCasesTogether()
+    {
+        return isCasesTogether;
+    }
+    public void setUniteSqmyId(Long uniteSqmyId)
+    {
+        this.uniteSqmyId = uniteSqmyId;
+    }
+
+    public Long getUniteSqmyId()
+    {
+        return uniteSqmyId;
+    }
+    public void setCbdwdfwy(String cbdwdfwy)
+    {
+        this.cbdwdfwy = cbdwdfwy;
+    }
+
+    public String getCbdwdfwy()
+    {
+        return cbdwdfwy;
+    }
+    public void setSatisfaction(String satisfaction)
+    {
+        this.satisfaction = satisfaction;
+    }
+
+    public String getSatisfaction()
+    {
+        return satisfaction;
+    }
+    public void setMembersOpinion(String membersOpinion)
+    {
+        this.membersOpinion = membersOpinion;
+    }
+
+    public String getMembersOpinion()
+    {
+        return membersOpinion;
+    }
+    public void setZxSatisfaction(String zxSatisfaction)
+    {
+        this.zxSatisfaction = zxSatisfaction;
+    }
+
+    public String getZxSatisfaction()
+    {
+        return zxSatisfaction;
+    }
+    public void setZxOpinion(String zxOpinion)
+    {
+        this.zxOpinion = zxOpinion;
+    }
+
+    public String getZxOpinion()
+    {
+        return zxOpinion;
+    }
+    public void setIsKeyPoint(String isKeyPoint)
+    {
+        this.isKeyPoint = isKeyPoint;
+    }
+
+    public String getIsKeyPoint()
+    {
+        return isKeyPoint;
+    }
+    public void setKeyPointArgument(String keyPointArgument)
+    {
+        this.keyPointArgument = keyPointArgument;
+    }
+
+    public String getKeyPointArgument()
+    {
+        return keyPointArgument;
+    }
+    public void setIsOutstanding(String isOutstanding)
+    {
+        this.isOutstanding = isOutstanding;
+    }
+
+    public String getIsOutstanding()
+    {
+        return isOutstanding;
+    }
+    public void setOutstandingArgument(String outstandingArgument)
+    {
+        this.outstandingArgument = outstandingArgument;
+    }
+
+    public String getOutstandingArgument()
+    {
+        return outstandingArgument;
+    }
+
+    public String getTopicType() {
+        return topicType;
+    }
+
+    public void setTopicType(String topicType) {
+        this.topicType = topicType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("sqmyId", getSqmyId())
+                .append("sqmyUserId", getSqmyUserId())
+                .append("sqmyNumber", getSqmyNumber())
+                .append("title", getTitle())
+                .append("lxrName", getLxrName())
+                .append("lxrPhone", getLxrPhone())
+                .append("sqmyName", getSqmyName())
+                .append("sqmyPhone", getSqmyPhone())
+                .append("sqmyContent", getSqmyContent())
+                .append("isPublicity", getIsPublicity())
+                .append("isSecret", getIsSecret())
+                .append("unit", getUnit())
+                .append("isRecord", getIsRecord())
+                .append("sqmyProgress", getSqmyProgress())
+                .append("rollingProcess", getRollingProcess())
+                .append("complexType", getComplexType())
+                .append("isCasesTogether", getIsCasesTogether())
+                .append("uniteSqmyId", getUniteSqmyId())
+                .append("cbdwdfwy", getCbdwdfwy())
+                .append("satisfaction", getSatisfaction())
+                .append("membersOpinion", getMembersOpinion())
+                .append("zxSatisfaction", getZxSatisfaction())
+                .append("zxOpinion", getZxOpinion())
+                .append("isKeyPoint", getIsKeyPoint())
+                .append("keyPointArgument", getKeyPointArgument())
+                .append("isOutstanding", getIsOutstanding())
+                .append("outstandingArgument", getOutstandingArgument())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("remark", getRemark())
+                .toString();
+    }
+}

+ 196 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/sqmy/SqmyUnitReply.java

@@ -0,0 +1,196 @@
+package com.ruoyi.system.domain.sqmy;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.domain.ZxFj;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 社情民意单位答复对象 sqmy_unit_reply
+ * 
+ * @author boman
+ * @date 2024-03-15
+ */
+public class SqmyUnitReply extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 单位id */
+    @Excel(name = "单位id")
+    private Long deptId;
+
+    /** 单位名称 */
+    @Excel(name = "单位名称")
+    private String deptName;
+
+    /** 提案id */
+    @Excel(name = "提案id")
+    private Long sqmyId;
+
+    /** 是否答复(0:是,1:否) */
+    @Excel(name = "是否答复", readConverterExp = "0=:是,1:否")
+    private String isReply;
+
+    /** 答复内容 */
+    @Excel(name = "答复内容")
+    private String content;
+
+    /** 单位类型 1:答复单位,2:主办单位,3:协办单位 */
+    @Excel(name = "单位类型 1:答复单位,2:主办单位,3:协办单位")
+    private String type;
+
+    /** 接收时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "接收时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /** 办结时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "办结时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endTime;
+
+    /** 处理方式 */
+    @Excel(name = "处理方式")
+    private String handling;
+
+    /** 办理程度 */
+    @Excel(name = "办理程度")
+    private String degree;
+
+    /** 附件 */
+    private List<ZxFj> zxFjList;
+
+    public List<ZxFj> getZxFjList() {
+        return zxFjList;
+    }
+
+    public void setZxFjList(List<ZxFj> zxFjList) {
+        this.zxFjList = zxFjList;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setDeptId(Long deptId) 
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId() 
+    {
+        return deptId;
+    }
+    public void setDeptName(String deptName) 
+    {
+        this.deptName = deptName;
+    }
+
+    public String getDeptName() 
+    {
+        return deptName;
+    }
+    public void setSqmyId(Long sqmyId) 
+    {
+        this.sqmyId = sqmyId;
+    }
+
+    public Long getSqmyId() 
+    {
+        return sqmyId;
+    }
+    public void setIsReply(String isReply) 
+    {
+        this.isReply = isReply;
+    }
+
+    public String getIsReply() 
+    {
+        return isReply;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setStartTime(Date startTime) 
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime() 
+    {
+        return startTime;
+    }
+    public void setEndTime(Date endTime) 
+    {
+        this.endTime = endTime;
+    }
+
+    public Date getEndTime() 
+    {
+        return endTime;
+    }
+    public void setHandling(String handling) 
+    {
+        this.handling = handling;
+    }
+
+    public String getHandling() 
+    {
+        return handling;
+    }
+    public void setDegree(String degree) 
+    {
+        this.degree = degree;
+    }
+
+    public String getDegree() 
+    {
+        return degree;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deptId", getDeptId())
+            .append("deptName", getDeptName())
+            .append("sqmyId", getSqmyId())
+            .append("isReply", getIsReply())
+            .append("content", getContent())
+            .append("type", getType())
+            .append("startTime", getStartTime())
+            .append("endTime", getEndTime())
+            .append("handling", getHandling())
+            .append("degree", getDegree())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 240 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/urge/ZxUrge.java

@@ -0,0 +1,240 @@
+package com.ruoyi.system.domain.urge;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 政协催办对象 zx_urge
+ * 
+ * @author boman
+ * @date 2024-03-12
+ */
+public class ZxUrge extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 催办ID */
+    private Long zxUrgeId;
+
+    /** 提案/社情民意id */
+    @Excel(name = "提案/社情民意id")
+    private Long scoreId;
+
+    /** 催办标题 */
+    @Excel(name = "催办标题")
+    private String urgeTitle;
+
+    /** 催办类型(字典值)1:提案催办 2:社情名义催办 */
+    @Excel(name = "催办类型", readConverterExp = "字=典值")
+    private String urgeType;
+
+    /** 催办内容 */
+    @Excel(name = "催办内容")
+    private String urgeContent;
+
+    /** 催办状态 */
+    private String status;
+
+    /** 发布人 */
+    @Excel(name = "发布人")
+    private String issuer;
+
+    /** 发布人id */
+    @Excel(name = "发布人id")
+    private Long issuerId;
+
+    /** 发布单位 */
+    @Excel(name = "发布单位")
+    private String issuerDept;
+
+    /** 发布单位id */
+    @Excel(name = "发布单位id")
+    private Long issuerDeptId;
+
+    /** 接收人 */
+    @Excel(name = "接收人")
+    private String acceptUser;
+
+    /** 接收人id */
+    @Excel(name = "接收人id")
+    private Long acceptUserId;
+
+    /** 接收单位 */
+    @Excel(name = "接收单位")
+    private String acceptDept;
+
+    /** 接收单位id */
+    @Excel(name = "接收单位id")
+    private Long acceptDeptId;
+
+    /** 催办时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "催办时间", width = 30, dateFormat = "HH:mm:ss")
+    private Date urgeTime;
+
+    public void setZxUrgeId(Long zxUrgeId) 
+    {
+        this.zxUrgeId = zxUrgeId;
+    }
+
+    public Long getZxUrgeId() 
+    {
+        return zxUrgeId;
+    }
+    public void setScoreId(Long scoreId) 
+    {
+        this.scoreId = scoreId;
+    }
+
+    public Long getScoreId() 
+    {
+        return scoreId;
+    }
+    public void setUrgeTitle(String urgeTitle) 
+    {
+        this.urgeTitle = urgeTitle;
+    }
+
+    public String getUrgeTitle() 
+    {
+        return urgeTitle;
+    }
+    public void setUrgeType(String urgeType) 
+    {
+        this.urgeType = urgeType;
+    }
+
+    public String getUrgeType() 
+    {
+        return urgeType;
+    }
+    public void setUrgeContent(String urgeContent) 
+    {
+        this.urgeContent = urgeContent;
+    }
+
+    public String getUrgeContent() 
+    {
+        return urgeContent;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setIssuer(String issuer) 
+    {
+        this.issuer = issuer;
+    }
+
+    public String getIssuer() 
+    {
+        return issuer;
+    }
+    public void setIssuerId(Long issuerId) 
+    {
+        this.issuerId = issuerId;
+    }
+
+    public Long getIssuerId() 
+    {
+        return issuerId;
+    }
+    public void setIssuerDept(String issuerDept) 
+    {
+        this.issuerDept = issuerDept;
+    }
+
+    public String getIssuerDept() 
+    {
+        return issuerDept;
+    }
+    public void setIssuerDeptId(Long issuerDeptId) 
+    {
+        this.issuerDeptId = issuerDeptId;
+    }
+
+    public Long getIssuerDeptId() 
+    {
+        return issuerDeptId;
+    }
+    public void setAcceptUser(String acceptUser) 
+    {
+        this.acceptUser = acceptUser;
+    }
+
+    public String getAcceptUser() 
+    {
+        return acceptUser;
+    }
+    public void setAcceptUserId(Long acceptUserId) 
+    {
+        this.acceptUserId = acceptUserId;
+    }
+
+    public Long getAcceptUserId() 
+    {
+        return acceptUserId;
+    }
+    public void setAcceptDept(String acceptDept) 
+    {
+        this.acceptDept = acceptDept;
+    }
+
+    public String getAcceptDept() 
+    {
+        return acceptDept;
+    }
+    public void setAcceptDeptId(Long acceptDeptId) 
+    {
+        this.acceptDeptId = acceptDeptId;
+    }
+
+    public Long getAcceptDeptId() 
+    {
+        return acceptDeptId;
+    }
+    public void setUrgeTime(Date urgeTime) 
+    {
+        this.urgeTime = urgeTime;
+    }
+
+    public Date getUrgeTime() 
+    {
+        return urgeTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("zxUrgeId", getZxUrgeId())
+            .append("scoreId", getScoreId())
+            .append("urgeTitle", getUrgeTitle())
+            .append("urgeType", getUrgeType())
+            .append("urgeContent", getUrgeContent())
+            .append("status", getStatus())
+            .append("issuer", getIssuer())
+            .append("issuerId", getIssuerId())
+            .append("issuerDept", getIssuerDept())
+            .append("issuerDeptId", getIssuerDeptId())
+            .append("acceptUser", getAcceptUser())
+            .append("acceptUserId", getAcceptUserId())
+            .append("acceptDept", getAcceptDept())
+            .append("acceptDeptId", getAcceptDeptId())
+            .append("urgeTime", getUrgeTime())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 193 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MemberInfoVo.java

@@ -0,0 +1,193 @@
+package com.ruoyi.system.domain.vo;
+
+import com.ruoyi.system.domain.ProposalInfo;
+import com.ruoyi.system.domain.activity.ZxActivity;
+import com.ruoyi.system.domain.conference.ZxConference;
+import com.ruoyi.system.domain.investment.ZxInvestment;
+import com.ruoyi.system.domain.member.MemberAssessmentInfo;
+import com.ruoyi.system.domain.member.MemberInfo;
+import com.ruoyi.system.domain.speak.ZxSpeak;
+import com.ruoyi.system.domain.sqmy.SqmyInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/14 11:05
+ * @Describe:
+ */
+public class MemberInfoVo {
+    /**
+     * 基本信息
+     */
+    private MemberInfo memberInfo;
+    /**
+     * 委员分数信息对象
+     */
+    private MemberAssessmentInfo memberAssessmentInfo;
+    /**
+     * 提案集合
+     */
+    private List<ProposalInfo> proposalInfoList;
+    /**
+     * 社情民意集合
+     */
+    private List<SqmyInfo> sqmyInfoList;
+
+    /**
+     * 会议集合
+     */
+    private List<ZxConference> zxConferenceList;
+    /**
+     * 活动集合
+     */
+    private List<ZxActivity> zxActivityList;
+    /**
+     * 视察调研集合
+     */
+    private List<ZxActivity> activityScdyList;
+
+    /**
+     * 联络组活动集合
+     */
+    private List<ZxActivity> activityLlzList;
+
+    /**
+     * 界别集合
+     */
+    private List<ZxActivity> activityJbList;
+
+    /**
+     * 为群众办实事集合
+     */
+    private List<ZxActivity> activityBssList;
+    /**
+     * 发言集合
+     */
+    private List<ZxSpeak> zxSpeakList;
+    /**
+     * 政协委员招商
+     */
+    private List<ZxInvestment> zxInvestmentList;
+    /**
+     * 相关集合
+     */
+    private Map<String,Object> map;
+
+    public List<ZxActivity> getActivityScdyList() {
+        return activityScdyList;
+    }
+
+    public void setActivityScdyList(List<ZxActivity> activityScdyList) {
+        this.activityScdyList = activityScdyList;
+    }
+
+    public List<ZxActivity> getActivityLlzList() {
+        return activityLlzList;
+    }
+
+    public void setActivityLlzList(List<ZxActivity> activityLlzList) {
+        this.activityLlzList = activityLlzList;
+    }
+
+    public List<ZxActivity> getActivityJbList() {
+        return activityJbList;
+    }
+
+    public void setActivityJbList(List<ZxActivity> activityJbList) {
+        this.activityJbList = activityJbList;
+    }
+
+    public List<ZxActivity> getActivityBssList() {
+        return activityBssList;
+    }
+
+    public void setActivityBssList(List<ZxActivity> activityBssList) {
+        this.activityBssList = activityBssList;
+    }
+
+    public List<ZxInvestment> getZxInvestmentList() {
+        return zxInvestmentList;
+    }
+
+    public void setZxInvestmentList(List<ZxInvestment> zxInvestmentList) {
+        this.zxInvestmentList = zxInvestmentList;
+    }
+
+    public MemberAssessmentInfo getMemberAssessmentInfo() {
+        return memberAssessmentInfo;
+    }
+
+    public void setMemberAssessmentInfo(MemberAssessmentInfo memberAssessmentInfo) {
+        this.memberAssessmentInfo = memberAssessmentInfo;
+    }
+
+    public Map<String, Object> getMap() {
+        return map;
+    }
+
+    public void setMap(Map<String, Object> map) {
+        this.map = map;
+    }
+
+    public MemberInfo getMemberInfo() {
+        return memberInfo;
+    }
+
+    public void setMemberInfo(MemberInfo memberInfo) {
+        this.memberInfo = memberInfo;
+    }
+
+    public List<ProposalInfo> getProposalInfoList() {
+        return proposalInfoList;
+    }
+
+    public void setProposalInfoList(List<ProposalInfo> proposalInfoList) {
+        this.proposalInfoList = proposalInfoList;
+    }
+
+    public List<SqmyInfo> getSqmyInfoList() {
+        return sqmyInfoList;
+    }
+
+    public void setSqmyInfoList(List<SqmyInfo> sqmyInfoList) {
+        this.sqmyInfoList = sqmyInfoList;
+    }
+
+    public List<ZxConference> getZxConferenceList() {
+        return zxConferenceList;
+    }
+
+    public void setZxConferenceList(List<ZxConference> zxConferenceList) {
+        this.zxConferenceList = zxConferenceList;
+    }
+
+    public List<ZxActivity> getZxActivityList() {
+        return zxActivityList;
+    }
+
+    public void setZxActivityList(List<ZxActivity> zxActivityList) {
+        this.zxActivityList = zxActivityList;
+    }
+
+    public List<ZxSpeak> getZxSpeakList() {
+        return zxSpeakList;
+    }
+
+    public void setZxSpeakList(List<ZxSpeak> zxSpeakList) {
+        this.zxSpeakList = zxSpeakList;
+    }
+
+    @Override
+    public String toString() {
+        return "MemberInfoVo{" +
+                "memberInfo=" + memberInfo +
+                ", proposalInfoList=" + proposalInfoList +
+                ", sqmyInfoList=" + sqmyInfoList +
+                ", zxConferenceList=" + zxConferenceList +
+                ", zxActivityList=" + zxActivityList +
+                ", zxSpeakList=" + zxSpeakList +
+                '}';
+    }
+}

+ 49 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MemberInfoVoTwo.java

@@ -0,0 +1,49 @@
+package com.ruoyi.system.domain.vo;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/18 14:24
+ * @Describe:
+ */
+public class MemberInfoVoTwo {
+
+
+    /**
+     * 序号
+     */
+    private Long sort;
+    /**
+     * 界别
+     */
+    private String boundary;
+    /**
+     * 人数
+     */
+    private Integer num;
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getBoundary() {
+        return boundary;
+    }
+
+    public void setBoundary(String boundary) {
+        this.boundary = boundary;
+    }
+
+
+
+    public Long getSort() {
+        return sort;
+    }
+
+    public void setSort(Long sort) {
+        this.sort = sort;
+    }
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CategoryProposalMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.common.core.domain.entity.CategoryProposal;
+
+import java.util.List;
+
+/**
+ * 提案类别Mapper接口
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public interface CategoryProposalMapper 
+{
+    /**
+     * 查询提案类别
+     * 
+     * @param categoryId 提案类别主键
+     * @return 提案类别
+     */
+    public CategoryProposal selectCategoryProposalByCategoryId(Long categoryId);
+
+    /**
+     * 查询提案类别列表
+     * 
+     * @param categoryProposal 提案类别
+     * @return 提案类别集合
+     */
+    public List<CategoryProposal> selectCategoryProposalList(CategoryProposal categoryProposal);
+
+    /**
+     * 新增提案类别
+     * 
+     * @param categoryProposal 提案类别
+     * @return 结果
+     */
+    public int insertCategoryProposal(CategoryProposal categoryProposal);
+
+    /**
+     * 修改提案类别
+     * 
+     * @param categoryProposal 提案类别
+     * @return 结果
+     */
+    public int updateCategoryProposal(CategoryProposal categoryProposal);
+
+    /**
+     * 删除提案类别
+     * 
+     * @param categoryId 提案类别主键
+     * @return 结果
+     */
+    public int deleteCategoryProposalByCategoryId(Long categoryId);
+
+    /**
+     * 批量删除提案类别
+     * 
+     * @param categoryIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCategoryProposalByCategoryIds(Long[] categoryIds);
+}

+ 63 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/MemberAssessmentInfoMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.system.domain.member.MemberAssessmentInfo;
+
+import java.util.List;
+
+
+/**
+ * 委员考核分数Mapper接口
+ * 
+ * @author boman
+ * @date 2024-03-20
+ */
+public interface MemberAssessmentInfoMapper 
+{
+    /**
+     * 查询委员考核分数
+     * 
+     * @param memberAssessmentId 委员考核分数主键
+     * @return 委员考核分数
+     */
+    public MemberAssessmentInfo selectMemberAssessmentInfoByMemberAssessmentId(Long memberAssessmentId);
+
+    /**
+     * 查询委员考核分数列表
+     * 
+     * @param memberAssessmentInfo 委员考核分数
+     * @return 委员考核分数集合
+     */
+    public List<MemberAssessmentInfo> selectMemberAssessmentInfoList(MemberAssessmentInfo memberAssessmentInfo);
+
+    /**
+     * 新增委员考核分数
+     * 
+     * @param memberAssessmentInfo 委员考核分数
+     * @return 结果
+     */
+    public int insertMemberAssessmentInfo(MemberAssessmentInfo memberAssessmentInfo);
+
+    /**
+     * 修改委员考核分数
+     * 
+     * @param memberAssessmentInfo 委员考核分数
+     * @return 结果
+     */
+    public int updateMemberAssessmentInfo(MemberAssessmentInfo memberAssessmentInfo);
+
+    /**
+     * 删除委员考核分数
+     * 
+     * @param memberAssessmentId 委员考核分数主键
+     * @return 结果
+     */
+    public int deleteMemberAssessmentInfoByMemberAssessmentId(Long memberAssessmentId);
+
+    /**
+     * 批量删除委员考核分数
+     * 
+     * @param memberAssessmentIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMemberAssessmentInfoByMemberAssessmentIds(Long[] memberAssessmentIds);
+}

+ 71 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/MemberInfoMapper.java

@@ -0,0 +1,71 @@
+package com.ruoyi.system.mapper;
+
+
+import com.ruoyi.system.domain.member.MemberInfo;
+
+import java.util.List;
+
+/**
+ * 委员信息Mapper接口
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public interface MemberInfoMapper 
+{
+    /**
+     * 查询委员信息
+     * 
+     * @param memberId 委员信息主键
+     * @return 委员信息
+     */
+    public MemberInfo selectMemberInfoByMemberId(Long memberId);
+    /**
+     * 查询委员信息
+     *
+     * @param userId 委员账号主键
+     * @return 委员信息
+     */
+    public MemberInfo selectMemberInfoByUserId(Long userId);
+
+    /**
+     * 查询委员信息列表
+     * 
+     * @param memberInfo 委员信息
+     * @return 委员信息集合
+     */
+    public List<MemberInfo> selectMemberInfoList(MemberInfo memberInfo);
+
+    /**
+     * 新增委员信息
+     * 
+     * @param memberInfo 委员信息
+     * @return 结果
+     */
+    public int insertMemberInfo(MemberInfo memberInfo);
+
+    /**
+     * 修改委员信息
+     * 
+     * @param memberInfo 委员信息
+     * @return 结果
+     */
+    public int updateMemberInfo(MemberInfo memberInfo);
+    public int updateMemberInfoByUserId(MemberInfo memberInfo);
+
+    /**
+     * 删除委员信息
+     * 
+     * @param memberId 委员信息主键
+     * @return 结果
+     */
+    public int deleteMemberInfoByMemberId(Long memberId);
+
+    /**
+     * 批量删除委员信息
+     * 
+     * @param memberIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMemberInfoByMemberIds(Long[] memberIds);
+}

+ 67 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProposalInfoMapper.java

@@ -0,0 +1,67 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ProposalInfo;
+
+/**
+ * 提案信息Mapper接口
+ * 
+ * @author boman
+ * @date 2024-03-07
+ */
+public interface ProposalInfoMapper 
+{
+    /**
+     * 查询提案信息
+     * 
+     * @param proposalId 提案信息主键
+     * @return 提案信息
+     */
+    public ProposalInfo selectProposalInfoByProposalId(Long proposalId);
+
+    /**
+     * 查询提案信息列表
+     * 
+     * @param proposalInfo 提案信息
+     * @return 提案信息集合
+     */
+    public List<ProposalInfo> selectProposalInfoList(ProposalInfo proposalInfo);
+
+    /**
+     * 新增提案信息
+     * 
+     * @param proposalInfo 提案信息
+     * @return 结果
+     */
+    public int insertProposalInfo(ProposalInfo proposalInfo);
+
+    /**
+     * 修改提案信息
+     * 
+     * @param proposalInfo 提案信息
+     * @return 结果
+     */
+    public int updateProposalInfo(ProposalInfo proposalInfo);
+
+    /**
+     * 删除提案信息
+     * 
+     * @param proposalId 提案信息主键
+     * @return 结果
+     */
+    public int deleteProposalInfoByProposalId(Long proposalId);
+
+    /**
+     * 批量删除提案信息
+     * 
+     * @param proposalIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteProposalInfoByProposalIds(Long[] proposalIds);
+
+    List<ProposalInfo> selectProposalInfoListByUser(ProposalInfo proposalInfo);
+
+    List<ProposalInfo> selectProposalInfoListByUnit(ProposalInfo proposalInfo);
+
+    List<ProposalInfo> tacbList(ProposalInfo proposalInfo);
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно