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

Merge remote-tracking branch 'origin/master'

LIVE_YE 1 жил өмнө
parent
commit
d41a530055
16 өөрчлөгдсөн 719 нэмэгдсэн , 561 устгасан
  1. 13 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/member/MemberInfoController.java
  2. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  3. 3 319
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/Task.java
  4. 10 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  5. 13 1
      ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivityUser.java
  6. 12 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/conference/ZxConferenceUser.java
  7. 24 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/member/MemberAssessmentInfo.java
  8. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ZxNoticeMapper.java
  9. 22 227
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MemberInfoServiceImpl.java
  10. 379 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskService.java
  11. 110 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxActivityServiceImpl.java
  12. 106 6
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxConferenceServiceImpl.java
  13. 8 3
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxNoticeServiceImpl.java
  14. 9 1
      ruoyi-system/src/main/resources/mapper/system/MemberAssessmentInfoMapper.xml
  15. 1 1
      ruoyi-system/src/main/resources/mapper/system/ProposalInfoMapper.xml
  16. 5 1
      ruoyi-system/src/main/resources/mapper/system/ZxNoticeMapper.xml

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

@@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletResponse;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 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;
@@ -34,6 +35,8 @@ import java.util.List;
 public class MemberInfoController extends BaseController {
     @Autowired
     private IMemberInfoService memberInfoService;
+    @Autowired
+    private TaskService taskService;
 
     /**
      * 查询委员信息列表
@@ -133,4 +136,14 @@ public class MemberInfoController extends BaseController {
     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();
+    }
 }

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

@@ -161,9 +161,9 @@ public class SysUserController extends BaseController
         {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (ONE.equals(userService.checkStrongPwd(user))) {
+/*        else if (ONE.equals(userService.checkStrongPwd(user))) {
             return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
-        }
+        }*/
         user.setUpdateBy(getUsername());
         return toAjax(userService.updateUser(user));
     }

+ 3 - 319
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/Task.java

@@ -14,6 +14,7 @@ import com.ruoyi.system.domain.member.MemberAssessmentInfo;
 import com.ruoyi.system.domain.member.MemberInfo;
 import com.ruoyi.system.domain.sqmy.SqmyInfo;
 import com.ruoyi.system.mapper.*;
+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;
@@ -27,28 +28,8 @@ import static com.ruoyi.common.constant.CommonConstants.*;
 @Component
 public class Task {
     @Autowired
-    private MemberInfoMapper memberInfoMapper;
-    @Autowired
-    private ZxConferenceMapper zxConferenceMapper;
-    @Autowired
-    private ZxActivityMapper zxActivityMapper;
-
-    @Autowired
-    private ProposalInfoMapper proposalInfoMapper;
-
-    @Autowired
-    private SqmyInfoMapper sqmyInfoMapper;
-
-    @Autowired
-    private SysDictDataMapper dictDataMapper;
-
-    @Autowired
-    private ZxAssessmentMapper zxAssessmentMapper;
-    @Autowired
-    private ZxBonusMapper zxBonusMapper;
+    private TaskService taskService;
 
-    @Autowired
-    private MemberAssessmentInfoMapper memberAssessmentInfoMapper;
 
     /***
      * 生成委员分数排名
@@ -56,303 +37,6 @@ public class Task {
     @Async
     //@Scheduled(cron = "0 19 0 * * ? ")
     public void assessmentScore() {
-        System.out.println("开始计算委员分数定时任务");
-        //查询的年份
-        LocalDate currentDate = LocalDate.now();
-        String year = String.valueOf(currentDate.getYear());
-        //查询原先是否有数据
-        MemberAssessmentInfo memberAssessmentInfo = new MemberAssessmentInfo();
-        memberAssessmentInfo.setYear(year);
-        List<MemberAssessmentInfo> memberAssessmentInfoList = memberAssessmentInfoMapper.selectMemberAssessmentInfoList(memberAssessmentInfo);
-        //查询出所有委员信息
-        List<MemberInfo> memberInfoSelect = memberInfoMapper.selectMemberInfoList(new MemberInfo());
-        //查询履职考核标准
-        List<ZxAssessment> zxAssessments = zxAssessmentMapper.selectZxAssessmentList(new ZxAssessment());
-        if (memberInfoSelect != null && memberInfoSelect.size() > 0) {
-            List<MemberAssessmentInfo> memberAssessmentInfoListNew = new ArrayList<>();
-            for (MemberInfo memberInfo : memberInfoSelect) {
-                Long userId = memberInfo.getUserId();
-                MemberAssessmentInfo memberAssessmentInf = new MemberAssessmentInfo();
-                memberAssessmentInf.setUserId(userId);
-                memberAssessmentInf.setYear(year);
-                //查询提案情况
-                ProposalInfo proposalInfo = new ProposalInfo();
-                proposalInfo.setProposalUserId(userId);
-                proposalInfo.setYear(year);
-                List<ProposalInfo> proposalInfos = proposalInfoMapper.selectProposalInfoListByUser(proposalInfo);
-                //查询社情民意
-                SqmyInfo sqmyInfo = new SqmyInfo();
-                sqmyInfo.setSqmyUserId(userId);
-                sqmyInfo.setYear(year);
-                List<SqmyInfo> sqmyInfos = sqmyInfoMapper.selectSqmyInfoList(sqmyInfo);
-                //查询政协会议
-                ZxConference zxConference = new ZxConference();
-                zxConference.setUserId(SecurityUtils.getUserId());
-                zxConference.setYear(year);
-                List<ZxConference> zxConferences = zxConferenceMapper.selectZxConferenceList(zxConference);
-                //查询活动
-                ZxActivity zxActivity = new ZxActivity();
-                zxActivity.setUserId(SecurityUtils.getUserId());
-                zxActivity.setYear(year);
-                List<ZxActivity> zxActivities = zxActivityMapper.selectZxActivityList(zxActivity);
-                //计算得分 勿删
-                if (zxAssessments != null && zxAssessments.size() > 0) {
-                    //获取分值上限
-                    long assessmentTotal = 0L;
-                    //定义当前分数
-                    long nowScore = 0L;
-                    //设置的单项分数
-                    long assessmentScore = 0L;
-                    //符合条件的项目数量
-                    long proposalCount = 0L;
-                    //计算提案得分
-                    if (proposalInfos != null && proposalInfos.size() > 0) {
-                        //获取分值上限
-                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                                .get(0).getAssessmentTotal();
-                        //先去查询这个人是否有个人提案立案
-                        proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                        if (proposalCount > 0) {
-                            //获取对应类型的分值
-                            assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                    .get(0).getAssessmentScore();
-                            //计算当前分数
-                            nowScore = nowScore + proposalCount * assessmentScore;
-                        }
-                        //当前分数小于上限值,继续找下一个条件
-                        if (nowScore < assessmentTotal) {
-                            //查询这个人是否有个人提案未立案
-                            proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        //当前分数小于上限值,继续找下一个条件
-                        if (nowScore < assessmentTotal) {
-                            //查询这个人是否有联名提案、集体提案立案的,第一提案人,召集人
-                            proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && THR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        //当前分数小于上限值,继续找下一个条件
-                        if (nowScore < assessmentTotal) {
-                            //查询这个人是否有联名提案、集体提案立案的,其余联名、参与者
-                            proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        //当前分数小于上限值,继续找下一个条件
-                        if (nowScore < assessmentTotal) {
-                            //查询这个人是否有未立案联名提案、集体提案参与者
-                            proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        if (nowScore > assessmentTotal) {
-                            nowScore = assessmentTotal;
-                        }
-
-                        memberAssessmentInf.setProposalScore(nowScore);
-                    }
-                    //计算社情民义的分值
-                    if (sqmyInfos != null && sqmyInfos.size() > 0) {
-                        //获取分值上限
-                        assessmentTotal = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                                .get(0).getAssessmentTotal();
-                        //定义当前分数
-                        nowScore = 0L;
-                        //查询这个人撰写并上报社情民意信息,被采用
-                        proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && "0".equals(e.getIsRecord())).count();
-                        if (proposalCount > 0) {
-                            //获取对应类型的分值
-                            assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                    .get(0).getAssessmentScore();
-                            //计算当前分数
-                            nowScore = nowScore + proposalCount * assessmentScore;
-                        }
-                        //当前分数小于上限值,继续找下一个条件
-                        if (nowScore < assessmentTotal) {
-                            //查询这个人撰写并上报社情民意信息,未采用
-                            proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && ONE.equals(e.getIsRecord())).count();
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        if (nowScore > assessmentTotal) {
-                            nowScore = assessmentTotal;
-                        }
-
-                        memberAssessmentInf.setSqmyScore(nowScore);
-                    }
-                    //计算会议分值
-                    if (zxConferences != null && zxConferences.size() > 0) {
-                        //查询会议默认所有人一开始的20分,缺勤扣分
-                        //获取分值上限
-                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                                .get(0).getAssessmentTotal();
-                        //定义当前分数
-                        nowScore = 0L;
-                        //查询这个人是否有全体会议期间,无故缺席大会或分组讨论
-                        List<ZxConference> collect = zxConferences.stream().filter(e -> e.getConferenceType().equals(ONE)).collect(Collectors.toList());
-                        if (collect.size() > 0) {
-                            for (ZxConference conference : collect) {
-                                List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
-                                if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
-                                    //获取到不参加会议的数量
-                                    proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                                }
-                            }
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        //查询这个人是否无故缺席市政协办公室,各专委会,各界别组织召开的其他会议和学习培训活动
-                        List<ZxConference> collectTwo = zxConferences.stream().filter(e -> !e.getConferenceType().equals(ONE)).collect(Collectors.toList());
-                        if (collectTwo.size() > 0) {
-                            for (ZxConference conference : collectTwo) {
-                                List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
-                                if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
-                                    //获取到不参加会议的数量
-                                    proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                                }
-                            }
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                        }
-                        //判断分是否扣完
-                        nowScore = assessmentTotal + nowScore;
-                        if (nowScore < 0) {
-                            nowScore = 0;
-                        }
-
-                        memberAssessmentInf.setConferenceScore(nowScore);
-                    }
-                    //计算活动分值
-                    if (zxActivities != null && zxActivities.size() > 0) {
-                        //定义当前分数
-                        nowScore = 0L;
-                        //先去查询是否有学习培训活动未参加
-                        List<ZxActivity> collect = zxActivities.stream().filter(e -> e.getActivityType().equals(ONE)).collect(Collectors.toList());
-                        if (collect.size() > 0) {
-                            for (ZxActivity activity : collect) {
-                                List<ZxActivityUser> zxActivityUserList = activity.getZxActivityUserList();
-                                if (zxActivityUserList != null && zxActivityUserList.size() > 0) {
-                                    //获取到不参加会议的数量
-                                    proposalCount = proposalCount + zxActivityUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                                }
-                            }
-                            if (proposalCount > 0) {
-                                //获取对应类型的分值
-                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                        .get(0).getAssessmentScore();
-                                //计算当前分数
-                                nowScore = nowScore + proposalCount * assessmentScore;
-                            }
-                            Object sqmyInfoScore = memberAssessmentInf.getSqmyScore();
-                            if (Integer.parseInt(sqmyInfoScore.toString()) > 0) {
-                                //判断分是否扣完
-                                nowScore = assessmentTotal + nowScore;
-                                if (nowScore < 0) {
-                                    nowScore = 0;
-                                }
-                                memberAssessmentInf.setSqmyScore(nowScore);
-                            }
-                        }
-                        nowScore = 0L;
-                        //获取分值上限
-                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                                .get(0).getAssessmentTotal();
-                        //获取所有活动设置的子类分项
-                        List<ZxAssessment> collectZxAssessment = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 != e.getParentId()).collect(Collectors.toList());
-                        if (collectZxAssessment.size() > 0) {
-                            for (ZxAssessment zxAssessment : collectZxAssessment) {
-                                //获取到的对应活动分数
-                                Long assessmentScore1 = zxAssessment.getAssessmentScore();
-                                //判断是否参加过对应活动
-                                String assessmentTypeId = zxAssessment.getAssessmentTypeId();
-                                //获取参与数量
-                                proposalCount = zxActivities.stream().filter(e -> e.getActivityType().equals(assessmentTypeId)).count();
-                                if (proposalCount > 0) {
-                                    nowScore = nowScore + assessmentScore1;
-                                }
-                            }
-                            if (nowScore > assessmentTotal) {
-                                nowScore = assessmentTotal;
-                            }
-
-                            memberAssessmentInf.setActivityScore(nowScore);
-                        }
-                    }
-                    //计算加分
-                    ZxBonus zxBonus = new ZxBonus();
-                    zxBonus.setUserId(userId);
-                    List<ZxBonus> zxBonuses = zxBonusMapper.selectZxBonusList(zxBonus);
-                    if (zxBonuses != null && zxBonuses.size() > 0) {
-                        long bonusScore = zxBonuses.stream().filter(e -> e.getScore() != null).mapToLong(BaseEntity::getScore).sum();
-
-                        memberAssessmentInf.setBonusScore(bonusScore);
-                    }
-                }
-
-                //总分
-                long totalScore = memberAssessmentInf.getProposalScore() + memberAssessmentInf.getSqmyScore() + memberAssessmentInf.getConferenceScore() + memberAssessmentInf.getActivityScore() + memberAssessmentInf.getBonusScore();
-                memberAssessmentInf.setTotalScore(totalScore);
-                memberAssessmentInfoListNew.add(memberAssessmentInf);
-            }
-            //计算排名
-            int index = 0;
-            //最近的一次分数
-            Long lastScore = 0L;
-            List<MemberAssessmentInfo> collect = memberAssessmentInfoListNew.stream().sorted(Comparator.comparing(MemberAssessmentInfo::getTotalScore).reversed()).collect(Collectors.toList());
-            for (int i = 0; i < collect.size(); i++) {
-                MemberAssessmentInfo memberAssessmentInfoNew = collect.get(i);
-                Long totalScore = memberAssessmentInfo.getTotalScore();
-                if (!lastScore.equals(totalScore)) {
-                    lastScore = totalScore;
-                    index++;
-                }
-                memberAssessmentInfoNew.setRank(String.valueOf(index));
-                //判断是更新还是新增
-                if (memberAssessmentInfoList != null && memberAssessmentInfoList.size() > 0){
-                    //更新
-                    memberAssessmentInfoMapper.updateMemberAssessmentInfo(memberAssessmentInfoNew);
-                }else {
-                    memberAssessmentInfoMapper.insertMemberAssessmentInfo(memberAssessmentInfoNew);
-                }
-            }
-        }
-        System.out.println("定时任务结束");
+        taskService.assessmentScore();
     }
 }

+ 10 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -198,6 +198,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         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 当前月份

+ 13 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/activity/ZxActivityUser.java

@@ -26,6 +26,10 @@ public class ZxActivityUser extends BaseEntity
     /** 姓名 */
     @Excel(name = "姓名")
     private String userName;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
 
     /** 委员职务 */
     @Excel(name = "委员职务")
@@ -57,7 +61,15 @@ public class ZxActivityUser extends BaseEntity
     @Excel(name = "签到时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date signIn;
 
-    public void setActivityId(Long activityId) 
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
+    public void setActivityId(Long activityId)
     {
         this.activityId = activityId;
     }

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

@@ -26,6 +26,10 @@ public class ZxConferenceUser extends BaseEntity
     /** 姓名 */
     @Excel(name = "姓名")
     private String userName;
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
 
     /** 委员职务 */
     @Excel(name = "委员职务")
@@ -57,6 +61,14 @@ public class ZxConferenceUser extends BaseEntity
     @Excel(name = "请假原因")
     private String leaveReason;
 
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
     public Date getSignIn() {
         return signIn;
     }

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

@@ -45,15 +45,39 @@ public class MemberAssessmentInfo extends BaseEntity
     /** 总分 */
     @Excel(name = "总分")
     private Long totalScore;
+    /**
+     * 满分
+     */
+    private Long fullScore;
 
     /** 排名 */
     @Excel(name = "排名")
     private String rank;
+    /**
+     * 总人数
+     */
+    private int totalPeople;
 
     /** 年份 */
     @Excel(name = "年份")
     private String year;
 
+    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;
     }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ZxNoticeMapper.java

@@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
 
 import com.ruoyi.system.domain.notice.ZxNotice;
 import com.ruoyi.system.domain.notice.ZxUserNotice;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -83,6 +84,7 @@ public interface ZxNoticeMapper
      * @return 结果
      */
     public int insterZxUserNotice(ZxUserNotice zxUserNotice);
+    public int selectZxUserNoticeByUserIdAndNoticeId(@Param("userId") Long userId,@Param("zxNoticeId") Long zxNoticeId);
 
 
     /**

+ 22 - 227
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MemberInfoServiceImpl.java

@@ -127,42 +127,60 @@ public class MemberInfoServiceImpl implements IMemberInfoService {
         map.put("sqmyInfoNum", 0);
         //会议
         map.put("conferenceNum", 0);
+        //全会
+        map.put("plenarySessionNum", 0);
         //活动
         map.put("activityNum", 0);
         //发言数量
         map.put("speakNum", 0);
-/*        //查询履职考核标准
-        List<ZxAssessment> zxAssessments = zxAssessmentMapper.selectZxAssessmentList(new ZxAssessment());*/
         //查询提案情况
         ProposalInfo proposalInfo = new ProposalInfo();
         proposalInfo.setProposalUserId(userId);
         proposalInfo.setYear(year);
         List<ProposalInfo> proposalInfos = proposalInfoMapper.selectProposalInfoListByUser(proposalInfo);
         memberInfoVo.setProposalInfoList(proposalInfos);
+        if (proposalInfos != null && proposalInfos.size() >0){
+            map.put("proposalInfoNum", proposalInfos.size());
+        }
         //查询社情民意
         SqmyInfo sqmyInfo = new SqmyInfo();
         sqmyInfo.setSqmyUserId(userId);
         sqmyInfo.setYear(year);
         List<SqmyInfo> sqmyInfos = sqmyInfoMapper.selectSqmyInfoList(sqmyInfo);
         memberInfoVo.setSqmyInfoList(sqmyInfos);
+        if (sqmyInfos != null && sqmyInfos.size() >0){
+            map.put("sqmyInfoNum", sqmyInfos.size());
+        }
+
         //查询政协会议
         ZxConference zxConference = new ZxConference();
         zxConference.setUserId(SecurityUtils.getUserId());
         zxConference.setYear(year);
         List<ZxConference> zxConferences = zxConferenceMapper.selectZxConferenceList(zxConference);
         memberInfoVo.setZxConferenceList(zxConferences);
+        if (zxConferences != null && zxConferences.size() > 0){
+            long count = zxConferences.stream().filter(e -> e.getConferenceType().equals(ONE)).count();
+            map.put("plenarySessionNum", count);
+        }
         //查询活动
         ZxActivity zxActivity = new ZxActivity();
         zxActivity.setUserId(SecurityUtils.getUserId());
         zxActivity.setYear(year);
         List<ZxActivity> zxActivities = zxActivityMapper.selectZxActivityList(zxActivity);
         memberInfoVo.setZxActivityList(zxActivities);
+        if (zxActivities != null && zxActivities.size() >0){
+            map.put("activityNum", zxActivities.size());
+        }
+
         //查询发言不计算分
         ZxSpeak zxSpeak = new ZxSpeak();
         zxSpeak.setUserId(SecurityUtils.getUserId());
         zxSpeak.setYear(year);
         List<ZxSpeak> zxSpeaks = zxSpeakMapper.selectZxSpeakList(zxSpeak);
         memberInfoVo.setZxSpeakList(zxSpeaks);
+        if (zxSpeaks != null && zxSpeaks.size() >0){
+            map.put("speakNum", zxSpeaks.size());
+        }
         //查询委员得分和排名
         MemberAssessmentInfo memberAssessmentInfo = new MemberAssessmentInfo();
         memberAssessmentInfo.setUserId(userId);
@@ -171,232 +189,9 @@ public class MemberInfoServiceImpl implements IMemberInfoService {
         if (memberAssessmentInfos != null && memberAssessmentInfos.size() >0){
             MemberAssessmentInfo memberAssessmentInfoNew = memberAssessmentInfos.get(0);
             memberInfoVo.setMemberAssessmentInfo(memberAssessmentInfoNew);
+        }else {
+            memberInfoVo.setMemberAssessmentInfo(new MemberAssessmentInfo());
         }
-/*        //计算得分 勿删
-        if (zxAssessments != null && zxAssessments.size() > 0) {
-            //获取分值上限
-            long assessmentTotal = 0L;
-            //定义当前分数
-            long nowScore = 0L;
-            //设置的单项分数
-            long assessmentScore = 0L;
-            //符合条件的项目数量
-            long proposalCount = 0L;
-            //计算提案得分
-            if (proposalInfos != null && proposalInfos.size() > 0) {
-                //获取分值上限
-                assessmentTotal = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                        .get(0).getAssessmentTotal();
-                //先去查询这个人是否有个人提案立案
-                proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                if (proposalCount > 0) {
-                    //获取对应类型的分值
-                    assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                            .get(0).getAssessmentScore();
-                    //计算当前分数
-                    nowScore = nowScore + proposalCount * assessmentScore;
-                }
-                //当前分数小于上限值,继续找下一个条件
-                if (nowScore < assessmentTotal) {
-                    //查询这个人是否有个人提案未立案
-                    proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                //当前分数小于上限值,继续找下一个条件
-                if (nowScore < assessmentTotal) {
-                    //查询这个人是否有联名提案、集体提案立案的,第一提案人,召集人
-                    proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && THR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                //当前分数小于上限值,继续找下一个条件
-                if (nowScore < assessmentTotal) {
-                    //查询这个人是否有联名提案、集体提案立案的,其余联名、参与者
-                    proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                //当前分数小于上限值,继续找下一个条件
-                if (nowScore < assessmentTotal) {
-                    //查询这个人是否有未立案联名提案、集体提案参与者
-                    proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                if (nowScore > assessmentTotal) {
-                    nowScore = assessmentTotal;
-                }
-                map.put("proposalInfoScore", nowScore);
-            }
-            //计算社情民义的分值
-            if (sqmyInfos != null && sqmyInfos.size() > 0) {
-                //获取分值上限
-                assessmentTotal = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                        .get(0).getAssessmentTotal();
-                //定义当前分数
-                nowScore = 0L;
-                //查询这个人撰写并上报社情民意信息,被采用
-                proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && "0".equals(e.getIsRecord())).count();
-                if (proposalCount > 0) {
-                    //获取对应类型的分值
-                    assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                            .get(0).getAssessmentScore();
-                    //计算当前分数
-                    nowScore = nowScore + proposalCount * assessmentScore;
-                }
-                //当前分数小于上限值,继续找下一个条件
-                if (nowScore < assessmentTotal) {
-                    //查询这个人撰写并上报社情民意信息,未采用
-                    proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && ONE.equals(e.getIsRecord())).count();
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                if (nowScore > assessmentTotal) {
-                    nowScore = assessmentTotal;
-                }
-                map.put("sqmyInfoScore", nowScore);
-            }
-            //计算会议分值
-            if (zxConferences != null && zxConferences.size() > 0) {
-                //查询会议默认所有人一开始的20分,缺勤扣分
-                //获取分值上限
-                assessmentTotal = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                        .get(0).getAssessmentTotal();
-                //定义当前分数
-                nowScore = 0L;
-                //查询这个人是否有全体会议期间,无故缺席大会或分组讨论
-                List<ZxConference> collect = zxConferences.stream().filter(e -> e.getConferenceType().equals(ONE)).collect(Collectors.toList());
-                if (collect.size() > 0) {
-                    for (ZxConference conference : collect) {
-                        List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
-                        if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
-                            //获取到不参加会议的数量
-                            proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                        }
-                    }
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                //查询这个人是否无故缺席市政协办公室,各专委会,各界别组织召开的其他会议和学习培训活动
-                List<ZxConference> collectTwo = zxConferences.stream().filter(e -> !e.getConferenceType().equals(ONE)).collect(Collectors.toList());
-                if (collectTwo.size() > 0) {
-                    for (ZxConference conference : collectTwo) {
-                        List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
-                        if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
-                            //获取到不参加会议的数量
-                            proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                        }
-                    }
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                }
-                //判断分是否扣完
-                nowScore = assessmentTotal + nowScore;
-                if (nowScore < 0) {
-                    nowScore = 0;
-                }
-                map.put("sqmyInfoScore", nowScore);
-            }
-            //计算活动分值
-            if (zxActivities != null && zxActivities.size() > 0) {
-                //定义当前分数
-                nowScore = 0L;
-                //先去查询是否有学习培训活动未参加
-                List<ZxActivity> collect = zxActivities.stream().filter(e -> e.getActivityType().equals(ONE)).collect(Collectors.toList());
-                if (collect.size() > 0) {
-                    for (ZxActivity activity : collect) {
-                        List<ZxActivityUser> zxActivityUserList = activity.getZxActivityUserList();
-                        if (zxActivityUserList != null && zxActivityUserList.size() > 0) {
-                            //获取到不参加会议的数量
-                            proposalCount = proposalCount + zxActivityUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
-                        }
-                    }
-                    if (proposalCount > 0) {
-                        //获取对应类型的分值
-                        assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
-                                .get(0).getAssessmentScore();
-                        //计算当前分数
-                        nowScore = nowScore + proposalCount * assessmentScore;
-                    }
-                    Object sqmyInfoScore = map.get("sqmyInfoScore");
-                    if (Integer.parseInt(sqmyInfoScore.toString()) > 0) {
-                        //判断分是否扣完
-                        nowScore = assessmentTotal + nowScore;
-                        if (nowScore < 0) {
-                            nowScore = 0;
-                        }
-                        map.put("sqmyInfoScore", nowScore);
-                    }
-                }
-                nowScore = 0L;
-                //获取分值上限
-                assessmentTotal = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
-                        .get(0).getAssessmentTotal();
-                //获取所有活动设置的子类分项
-                List<ZxAssessment> collectZxAssessment = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 != e.getParentId()).collect(Collectors.toList());
-                if (collectZxAssessment.size() > 0) {
-                    for (ZxAssessment zxAssessment : collectZxAssessment) {
-                        //获取到的对应活动分数
-                        Long assessmentScore1 = zxAssessment.getAssessmentScore();
-                        //判断是否参加过对应活动
-                        String assessmentTypeId = zxAssessment.getAssessmentTypeId();
-                        //获取参与数量
-                        proposalCount = zxActivities.stream().filter(e -> e.getActivityType().equals(assessmentTypeId)).count();
-                        if (proposalCount > 0) {
-                            nowScore = nowScore + assessmentScore1;
-                        }
-                    }
-                    if (nowScore > assessmentTotal) {
-                        nowScore = assessmentTotal;
-                    }
-                    map.put("activityScore", nowScore);
-                }
-            }
-            //计算加分
-            ZxBonus zxBonus = new ZxBonus();
-            zxBonus.setUserId(userId);
-            List<ZxBonus> zxBonuses = zxBonusMapper.selectZxBonusList(zxBonus);
-            if (zxBonuses != null && zxBonuses.size() > 0){
-                long zxBonusNum = zxBonuses.stream().filter(e -> e.getScore() != null).mapToLong(BaseEntity::getScore).sum();
-                map.put("zxBonusScore",zxBonusNum);
-            }
-        }*/
         memberInfoVo.setMap(map);
         return memberInfoVo;
     }

+ 379 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TaskService.java

@@ -0,0 +1,379 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.domain.ProposalInfo;
+import com.ruoyi.system.domain.activity.ZxActivity;
+import com.ruoyi.system.domain.activity.ZxActivityUser;
+import com.ruoyi.system.domain.assessment.ZxAssessment;
+import com.ruoyi.system.domain.bonus.ZxBonus;
+import com.ruoyi.system.domain.conference.ZxConference;
+import com.ruoyi.system.domain.conference.ZxConferenceUser;
+import com.ruoyi.system.domain.member.MemberAssessmentInfo;
+import com.ruoyi.system.domain.member.MemberInfo;
+import com.ruoyi.system.domain.sqmy.SqmyInfo;
+import com.ruoyi.system.mapper.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.constant.CommonConstants.*;
+
+/**
+ * @Author: tjf
+ * @Date: 2024/3/21 8:48
+ * @Describe:
+ */
+@Service
+public class TaskService {
+    @Autowired
+    private MemberInfoMapper memberInfoMapper;
+    @Autowired
+    private ZxConferenceMapper zxConferenceMapper;
+    @Autowired
+    private ZxActivityMapper zxActivityMapper;
+
+    @Autowired
+    private ProposalInfoMapper proposalInfoMapper;
+
+    @Autowired
+    private SqmyInfoMapper sqmyInfoMapper;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    @Autowired
+    private ZxAssessmentMapper zxAssessmentMapper;
+    @Autowired
+    private ZxBonusMapper zxBonusMapper;
+
+    @Autowired
+    private MemberAssessmentInfoMapper memberAssessmentInfoMapper;
+
+    /**
+     * 更新所有委员分数,排名
+     */
+    public void assessmentScore() {
+        System.out.println("开始计算委员分数定时任务");
+        //查询的年份
+        LocalDate currentDate = LocalDate.now();
+        String year = String.valueOf(currentDate.getYear());
+        //查询原先是否有数据
+        MemberAssessmentInfo memberAssessmentInfo = new MemberAssessmentInfo();
+        memberAssessmentInfo.setYear(year);
+        List<MemberAssessmentInfo> memberAssessmentInfoList = memberAssessmentInfoMapper.selectMemberAssessmentInfoList(memberAssessmentInfo);
+        //查询出所有委员信息
+        List<MemberInfo> memberInfoSelect = memberInfoMapper.selectMemberInfoList(new MemberInfo());
+        //查询履职考核标准
+        List<ZxAssessment> zxAssessments = zxAssessmentMapper.selectZxAssessmentList(new ZxAssessment());
+        if (memberInfoSelect != null && memberInfoSelect.size() > 0) {
+            List<MemberAssessmentInfo> memberAssessmentInfoListNew = new ArrayList<>();
+            //获取分值上限
+            long assessmentTotal = 0L;
+            //定义当前分数
+            long nowScore = 0L;
+            //设置的单项分数
+            long assessmentScore = 0L;
+            //符合条件的项目数量
+            long proposalCount = 0L;
+            //满分
+            long fullScore = 0L;
+            for (MemberInfo memberInfo : memberInfoSelect) {
+                //定义当前分数
+                nowScore = 0L;
+                //满分
+                fullScore = 0L;
+                Long userId = memberInfo.getUserId();
+                MemberAssessmentInfo memberAssessmentInf = new MemberAssessmentInfo();
+                memberAssessmentInf.setUserId(userId);
+                memberAssessmentInf.setYear(year);
+                memberAssessmentInf.setTotalPeople(memberInfoSelect.size());
+                //查询提案情况
+                ProposalInfo proposalInfo = new ProposalInfo();
+                proposalInfo.setProposalUserId(userId);
+                proposalInfo.setYear(year);
+                List<ProposalInfo> proposalInfos = proposalInfoMapper.selectProposalInfoListByUser(proposalInfo);
+                //查询社情民意
+                SqmyInfo sqmyInfo = new SqmyInfo();
+                sqmyInfo.setSqmyUserId(userId);
+                sqmyInfo.setYear(year);
+                List<SqmyInfo> sqmyInfos = sqmyInfoMapper.selectSqmyInfoList(sqmyInfo);
+                //查询政协会议
+                ZxConference zxConference = new ZxConference();
+                zxConference.setUserId(SecurityUtils.getUserId());
+                zxConference.setYear(year);
+                List<ZxConference> zxConferences = zxConferenceMapper.selectZxConferenceList(zxConference);
+                //查询活动
+                ZxActivity zxActivity = new ZxActivity();
+                zxActivity.setUserId(SecurityUtils.getUserId());
+                zxActivity.setYear(year);
+                List<ZxActivity> zxActivities = zxActivityMapper.selectZxActivityList(zxActivity);
+                //计算得分 勿删
+                if (zxAssessments != null && zxAssessments.size() > 0) {
+
+                    //计算提案得分
+                    if (proposalInfos != null && proposalInfos.size() > 0) {
+                        //获取分值上限
+                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
+                                .get(0).getAssessmentTotal();
+                        //先去查询这个人是否有个人提案立案
+                        proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
+                        if (proposalCount > 0) {
+                            //获取对应类型的分值
+                            assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                    .get(0).getAssessmentScore();
+                            //计算当前分数
+                            nowScore = nowScore + proposalCount * assessmentScore;
+                        }
+                        //当前分数小于上限值,继续找下一个条件
+                        if (nowScore < assessmentTotal) {
+                            //查询这个人是否有个人提案未立案
+                            proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && e.getIsJointly().equals(ONE) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        //当前分数小于上限值,继续找下一个条件
+                        if (nowScore < assessmentTotal) {
+                            //查询这个人是否有联名提案、集体提案立案的,第一提案人,召集人
+                            proposalCount = proposalInfos.stream().filter(e -> e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && THR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        //当前分数小于上限值,继续找下一个条件
+                        if (nowScore < assessmentTotal) {
+                            //查询这个人是否有联名提案、集体提案立案的,其余联名、参与者
+                            proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && !ONE.equals(e.getProposalProgress()) && !THR.equals(e.getProposalProgress())).count();
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        //当前分数小于上限值,继续找下一个条件
+                        if (nowScore < assessmentTotal) {
+                            //查询这个人是否有未立案联名提案、集体提案参与者
+                            proposalCount = proposalInfos.stream().filter(e -> !e.getProposalUserId().equals(userId) && "0".equals(e.getIsJointly()) && (ONE.equals(e.getProposalProgress()) || THR.equals(e.getProposalProgress()))).count();
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_proposal".equals(e.getAssessmentProjectId()) && FOR.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        if (nowScore > assessmentTotal) {
+                            nowScore = assessmentTotal;
+                        }
+
+                        memberAssessmentInf.setProposalScore(nowScore);
+                        //计算满分上限
+                        fullScore = fullScore + assessmentTotal;
+                    }
+                    //计算社情民义的分值
+                    if (sqmyInfos != null && sqmyInfos.size() > 0) {
+                        //获取分值上限
+                        assessmentTotal = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
+                                .get(0).getAssessmentTotal();
+                        //定义当前分数
+                        nowScore = 0L;
+                        //查询这个人撰写并上报社情民意信息,被采用
+                        proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && "0".equals(e.getIsRecord())).count();
+                        if (proposalCount > 0) {
+                            //获取对应类型的分值
+                            assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                    .get(0).getAssessmentScore();
+                            //计算当前分数
+                            nowScore = nowScore + proposalCount * assessmentScore;
+                        }
+                        //当前分数小于上限值,继续找下一个条件
+                        if (nowScore < assessmentTotal) {
+                            //查询这个人撰写并上报社情民意信息,未采用
+                            proposalCount = sqmyInfos.stream().filter(e -> e.getSqmyUserId().equals(userId) && ONE.equals(e.getIsRecord())).count();
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "proposal_sqmy".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        if (nowScore > assessmentTotal) {
+                            nowScore = assessmentTotal;
+                        }
+
+                        memberAssessmentInf.setSqmyScore(nowScore);
+                        //计算满分上限
+                        fullScore = fullScore + assessmentTotal;
+                    }
+                    //计算会议分值
+                    if (zxConferences != null && zxConferences.size() > 0) {
+                        //查询会议默认所有人一开始的20分,缺勤扣分
+                        //获取分值上限
+                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
+                                .get(0).getAssessmentTotal();
+                        //定义当前分数
+                        nowScore = 0L;
+                        //查询这个人是否有全体会议期间,无故缺席大会或分组讨论
+                        List<ZxConference> collect = zxConferences.stream().filter(e -> e.getConferenceType().equals(ONE)).collect(Collectors.toList());
+                        if (collect.size() > 0) {
+                            for (ZxConference conference : collect) {
+                                List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
+                                if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
+                                    //获取到不参加会议的数量
+                                    proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
+                                }
+                            }
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && ONE.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        //查询这个人是否无故缺席市政协办公室,各专委会,各界别组织召开的其他会议和学习培训活动
+                        List<ZxConference> collectTwo = zxConferences.stream().filter(e -> !e.getConferenceType().equals(ONE)).collect(Collectors.toList());
+                        if (collectTwo.size() > 0) {
+                            for (ZxConference conference : collectTwo) {
+                                List<ZxConferenceUser> zxConferenceUserList = conference.getZxConferenceUserList();
+                                if (zxConferenceUserList != null && zxConferenceUserList.size() > 0) {
+                                    //获取到不参加会议的数量
+                                    proposalCount = proposalCount + zxConferenceUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
+                                }
+                            }
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                        }
+                        //判断分是否扣完
+                        nowScore = assessmentTotal + nowScore;
+                        if (nowScore < 0) {
+                            nowScore = 0;
+                        }
+                        memberAssessmentInf.setConferenceScore(nowScore);
+                        //计算满分上限
+                        fullScore = fullScore + assessmentTotal;
+                    }
+                    //计算活动分值
+                    if (zxActivities != null && zxActivities.size() > 0) {
+                        //定义当前分数
+                        nowScore = 0L;
+                        //先去查询是否有学习培训活动未参加
+                        List<ZxActivity> collect = zxActivities.stream().filter(e -> e.getActivityType().equals(ONE)).collect(Collectors.toList());
+                        if (collect.size() > 0) {
+                            for (ZxActivity activity : collect) {
+                                List<ZxActivityUser> zxActivityUserList = activity.getZxActivityUserList();
+                                if (zxActivityUserList != null && zxActivityUserList.size() > 0) {
+                                    //获取到不参加会议的数量
+                                    proposalCount = proposalCount + zxActivityUserList.stream().filter(e -> "N".equals(e.getIsJoin())).count();
+                                }
+                            }
+                            if (proposalCount > 0) {
+                                //获取对应类型的分值
+                                assessmentScore = zxAssessments.stream().filter(e -> "assessment_conference".equals(e.getAssessmentProjectId()) && TWO.equals(e.getAssessmentTypeId())).collect(Collectors.toList())
+                                        .get(0).getAssessmentScore();
+                                //计算当前分数
+                                nowScore = nowScore + proposalCount * assessmentScore;
+                            }
+                            Object sqmyInfoScore = memberAssessmentInf.getSqmyScore();
+                            if (Integer.parseInt(sqmyInfoScore.toString()) > 0) {
+                                //判断分是否扣完
+                                nowScore = assessmentTotal + nowScore;
+                                if (nowScore < 0) {
+                                    nowScore = 0;
+                                }
+                                memberAssessmentInf.setSqmyScore(nowScore);
+                            }
+                        }
+                        nowScore = 0L;
+                        //获取分值上限
+                        assessmentTotal = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 == e.getParentId()).collect(Collectors.toList())
+                                .get(0).getAssessmentTotal();
+                        //获取所有活动设置的子类分项
+                        List<ZxAssessment> collectZxAssessment = zxAssessments.stream().filter(e -> "assessment_activity".equals(e.getAssessmentProjectId()) && 0 != e.getParentId()).collect(Collectors.toList());
+                        if (collectZxAssessment.size() > 0) {
+                            for (ZxAssessment zxAssessment : collectZxAssessment) {
+                                //获取到的对应活动分数
+                                Long assessmentScore1 = zxAssessment.getAssessmentScore();
+                                //判断是否参加过对应活动
+                                String assessmentTypeId = zxAssessment.getAssessmentTypeId();
+                                //获取参与数量
+                                proposalCount = zxActivities.stream().filter(e -> e.getActivityType().equals(assessmentTypeId)).count();
+                                if (proposalCount > 0) {
+                                    nowScore = nowScore + assessmentScore1;
+                                }
+                            }
+                            if (nowScore > assessmentTotal) {
+                                nowScore = assessmentTotal;
+                            }
+                            memberAssessmentInf.setActivityScore(nowScore);
+                            //计算满分上限
+                            fullScore = fullScore + assessmentTotal;
+                        }
+                    }
+                    //计算加分
+                    ZxBonus zxBonus = new ZxBonus();
+                    zxBonus.setUserId(userId);
+                    List<ZxBonus> zxBonuses = zxBonusMapper.selectZxBonusList(zxBonus);
+                    if (zxBonuses != null && zxBonuses.size() > 0) {
+                        long bonusScore = zxBonuses.stream().filter(e -> e.getScore() != null).mapToLong(BaseEntity::getScore).sum();
+                        memberAssessmentInf.setBonusScore(bonusScore);
+                    }
+                    memberAssessmentInf.setFullScore(fullScore);
+                }
+
+                //总分 = 提案得分+社情民意得分+会议得分+活动得分+加分
+                long totalScore = memberAssessmentInf.getProposalScore() + memberAssessmentInf.getSqmyScore() + memberAssessmentInf.getConferenceScore() + memberAssessmentInf.getActivityScore() + memberAssessmentInf.getBonusScore();
+                //判断总分是否大于满分
+                if (totalScore > memberAssessmentInf.getFullScore()) {
+                    totalScore = memberAssessmentInf.getFullScore();
+                }
+                memberAssessmentInf.setTotalScore(totalScore);
+                memberAssessmentInfoListNew.add(memberAssessmentInf);
+            }
+            //计算排名
+            int index = 0;
+            //最近的一次分数
+            Long lastScore = 0L;
+            List<MemberAssessmentInfo> collect = memberAssessmentInfoListNew.stream().sorted(Comparator.comparing(MemberAssessmentInfo::getTotalScore).reversed()).collect(Collectors.toList());
+            for (int i = 0; i < collect.size(); i++) {
+                MemberAssessmentInfo memberAssessmentInfoNew = collect.get(i);
+                Long totalScore = memberAssessmentInfo.getTotalScore();
+                if (!lastScore.equals(totalScore)) {
+                    lastScore = totalScore;
+                    index++;
+                }
+                memberAssessmentInfoNew.setRank(String.valueOf(index));
+                //判断是更新还是新增
+                if (memberAssessmentInfoList != null && memberAssessmentInfoList.size() > 0) {
+                    //更新
+                    memberAssessmentInfoMapper.updateMemberAssessmentInfo(memberAssessmentInfoNew);
+                } else {
+                    memberAssessmentInfoMapper.insertMemberAssessmentInfo(memberAssessmentInfoNew);
+                }
+            }
+        }
+        System.out.println("定时任务结束");
+    }
+}

+ 110 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxActivityServiceImpl.java

@@ -1,8 +1,11 @@
 package com.ruoyi.system.service.impl;
 
 
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.SendSmsUtils;
 import com.ruoyi.system.domain.ZxFj;
 import com.ruoyi.system.domain.activity.ZxActivity;
 import com.ruoyi.system.domain.activity.ZxActivityUser;
@@ -17,8 +20,11 @@ import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.system.mapper.ZxActivityMapper;
 import com.ruoyi.system.service.IZxActivityService;
 
+import java.time.LocalDate;
+import java.time.format.TextStyle;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import static com.ruoyi.common.constant.CommonConstants.THR;
 
@@ -100,6 +106,9 @@ public class ZxActivityServiceImpl implements IZxActivityService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public int insertZxActivity(ZxActivity zxActivity) {
+        zxActivity.setPublishTime(DateUtils.getNowDate());
+        zxActivity.setPublishDeptId(SecurityUtils.getDeptId());
+        zxActivity.setPublishDept(SecurityUtils.getLoginUser().getUser().getDept().getDeptName());
         zxActivity.setCreateTime(DateUtils.getNowDate());
         int rows = zxActivityMapper.insertZxActivity(zxActivity);
         insertZxActivityUser(zxActivity);
@@ -169,13 +178,114 @@ public class ZxActivityServiceImpl implements IZxActivityService {
         Long activityId = zxActivity.getActivityId();
         if (StringUtils.isNotNull(zxActivityUserList)) {
             List<ZxActivityUser> list = new ArrayList<ZxActivityUser>();
+            LocalDate localDate = DateUtils.toLocalDate(zxActivity.getActivityDate());
+            String activityTime = zxActivity.getActivityTime();
+            String activityAddress = zxActivity.getActivityAddress();
+            String activityTitle = zxActivity.getActivityTitle();
+            List<String> phoneList = new ArrayList<>();
+            List<String> userNameList = new ArrayList<>();
             for (ZxActivityUser zxActivityUser : zxActivityUserList) {
                 zxActivityUser.setActivityId(activityId);
                 list.add(zxActivityUser);
+
+                String userName = zxActivityUser.getUserName();
+                //获取手机号
+                String phonenumber = zxActivityUser.getPhonenumber().trim();
+                if (StringUtils.isNotEmpty(phonenumber)){
+                    phoneList.add(phonenumber);
+                    userNameList.add(userName);
+                }
             }
             if (list.size() > 0) {
                 zxActivityMapper.batchZxActivityUser(list);
             }
+
+            if (phoneList.size() > 0) {
+                int maxNums = 100; //每次最多发送100条,我们一次批量发100条
+                int times = 0;// 循环几个100  用List的长度 除 100
+                int size = phoneList.size(); // 数据数量
+                //会议通知模板id
+                String templateCode = "SMS_465322668";
+                //签名
+                String SignName = "潜山市政协办公室";
+                List<String> signNameList = new ArrayList<>();
+                List<String> templateList = new ArrayList<>();
+                StringBuffer signNameJson;
+                StringBuffer phoneNumberJson;
+                StringBuffer templateParamJson;
+                //返回提示
+                String backResult = "";
+                if (size < maxNums) {
+                    times = 1;
+                } else {
+                    times = (size - 1) / maxNums + 1; //为什么要-1 因为如果是200的时候,理论上次数应该是2,而不是3,如果是101,那么次数也是2,这样就保证次数准确。
+                }
+                for (int j = 0; j < times; j++) {
+                    if (j > 0 && (j * maxNums + 1 > size)) { //边界判定,如果刚好是100条,那么times的值为2,这时候j 为1的时候 101 大于100结束循环,100条以内不生效
+                        break;
+                    } else {
+                        phoneNumberJson = new StringBuffer();
+                        signNameJson = new StringBuffer();
+                        templateParamJson = new StringBuffer();
+                        phoneNumberJson.append("[");
+                        signNameJson.append("[");
+                        for (int k = j * maxNums; k < size && k < (j + 1) * maxNums; k++) {
+                            // 防止有空行,手机号是必须要有的
+                            String phone = phoneList.get(k);
+                            if (StringUtils.isEmpty(phone)) {
+                                continue;
+                            }
+                            phoneNumberJson.append("\"" + phoneList.get(k) + "\",");
+                            signNameJson.append(SignName+",");
+                            /**
+                             * 活动:定于${monthname}月${dayname}日(星期${weekname)} ${time) 在${address}地点举行${content}活动,请${name}准时参加。
+                             */
+                            templateParamJson.append("{\"monthname\":\"" + localDate.getMonthValue() + "\",\"dayname\":\"" + localDate.getDayOfMonth() + "\",\"weekname\":\"" + localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE) + "\",\"time\":\"" + activityTime +  "\",\"address\":\"" + activityAddress + "\",\"content\":\"" + activityTitle + "\",\"name\":\"" + userNameList.get(k) + "\"},");
+                        }
+                        phoneNumberJson.deleteCharAt(phoneNumberJson.length() - 1);//移除最后一个逗号字符,
+                        signNameJson.deleteCharAt(signNameJson.length() - 1);
+                        templateParamJson.deleteCharAt(templateParamJson.length() - 1);//移除最后一个逗号字符
+                        phoneNumberJson.append("]");
+                        signNameJson.append("]");
+                        templateParamJson.append("]");
+                        phoneList.add(phoneNumberJson.toString());
+                        signNameList.add(signNameJson.toString());
+                        templateList.add(templateParamJson.toString());
+                    }
+                    //组装请求对象
+                    if (times == phoneList.size()) {
+                        for (int i = 0; i < times; i++) {
+                            long startTimeSql = System.currentTimeMillis();
+                            SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest();
+                            //组装电话号码
+                            sendBatchSmsRequest.setPhoneNumberJson(phoneList.get(i));
+                            //签名名称
+                            sendBatchSmsRequest.setSignNameJson(signNameList.get(i));
+                            //替换参数
+                            sendBatchSmsRequest.setTemplateParamJson(templateList.get(i));
+                            //固定的模板名称
+                            sendBatchSmsRequest.setTemplateCode(templateCode);
+                            long endTimeSql = System.currentTimeMillis() - startTimeSql;
+                            System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发活动短信通知计算:" + (i + 1) + "次,时间" + endTimeSql + "ms");
+                            long startTimeSend = System.currentTimeMillis();
+                            SendBatchSmsResponse sendBatchSmsResponse = SendSmsUtils.sendBatchSms(sendBatchSmsRequest);
+                            long endTimeSend = System.currentTimeMillis() - startTimeSend;
+                            System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发活动短信通知接口请求:" + (i + 1) + "次,时间" + endTimeSend + "ms");
+                            if (sendBatchSmsResponse != null) {
+                                String code = sendBatchSmsResponse.getBody().getCode();
+                                if (sendBatchSmsResponse.getBody().getCode() != null && "OK".equals(code)) {
+                                    //批量请求发送短信成功
+                                    System.out.println("批量活动短信发送成功:" + phoneList.get(i).split(",").length + "条");
+                                    backResult = backResult + "第" + i + "次批量成功  ";
+                                } else {
+                                    System.out.println("批量活动短信发送失败!");
+                                    backResult = backResult + "第" + i + "次批量失败  ";
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
 

+ 106 - 6
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxConferenceServiceImpl.java

@@ -1,10 +1,10 @@
 package com.ruoyi.system.service.impl;
 
 
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
 import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.QRCodeUtils;
-import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.*;
 import com.ruoyi.system.domain.ZxFj;
 import com.ruoyi.system.domain.conference.ZxConference;
 import com.ruoyi.system.domain.conference.ZxConferenceUser;
@@ -12,13 +12,16 @@ import com.ruoyi.system.domain.notice.ZxNotice;
 import com.ruoyi.system.mapper.ZxFjMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.common.utils.StringUtils;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.system.mapper.ZxConferenceMapper;
 import com.ruoyi.system.service.IZxConferenceService;
 
+import java.time.LocalDate;
+import java.time.format.TextStyle;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 
 import static com.ruoyi.common.constant.CommonConstants.FOR;
 import static com.ruoyi.common.constant.CommonConstants.THR;
@@ -103,7 +106,6 @@ public class ZxConferenceServiceImpl implements IZxConferenceService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public int insertZxConference(ZxConference zxConference) {
-        //todo 给参会人员发送短信
         zxConference.setCreateTime(DateUtils.getNowDate());
         int rows = zxConferenceMapper.insertZxConference(zxConference);
         insertZxConferenceUser(zxConference);
@@ -127,7 +129,6 @@ public class ZxConferenceServiceImpl implements IZxConferenceService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public int updateZxConference(ZxConference zxConference) {
-        //todo 给参会人员发送短信
         zxConference.setUpdateTime(DateUtils.getNowDate());
         zxConferenceMapper.deleteZxConferenceUserByConferenceId(zxConference.getConferenceId());
         zxFjMapper.deleteZxFjBySourceId(zxConference.getConferenceId());
@@ -180,14 +181,113 @@ public class ZxConferenceServiceImpl implements IZxConferenceService {
         List<ZxConferenceUser> zxConferenceUserList = zxConference.getZxConferenceUserList();
         Long conferenceId = zxConference.getConferenceId();
         if (StringUtils.isNotNull(zxConferenceUserList)) {
+            LocalDate localDate = DateUtils.toLocalDate(zxConference.getConferenceDate());
+            String conferenceTime = zxConference.getConferenceTime();
+            String conferenceAddress = zxConference.getConferenceAddress();
+            String conferenceTitle = zxConference.getConferenceTitle();
             List<ZxConferenceUser> list = new ArrayList<ZxConferenceUser>();
+            List<String> phoneList = new ArrayList<>();
+            List<String> userNameList = new ArrayList<>();
             for (ZxConferenceUser zxConferenceUser : zxConferenceUserList) {
+                String userName = zxConferenceUser.getUserName();
                 zxConferenceUser.setConferenceId(conferenceId);
                 list.add(zxConferenceUser);
+                //获取手机号
+                String phonenumber = zxConferenceUser.getPhonenumber().trim();
+                if (StringUtils.isNotEmpty(phonenumber)){
+                    phoneList.add(phonenumber);
+                    userNameList.add(userName);
+                }
             }
             if (list.size() > 0) {
                 zxConferenceMapper.batchZxConferenceUser(list);
             }
+            if (phoneList.size() > 0) {
+                int maxNums = 100; //每次最多发送100条,我们一次批量发100条
+                int times = 0;// 循环几个100  用List的长度 除 100
+                int size = phoneList.size(); // 数据数量
+                //会议通知模板id
+                String templateCode = "SMS_465407754";
+                //签名
+                String SignName = "潜山市政协办公室";
+                List<String> signNameList = new ArrayList<>();
+                List<String> templateList = new ArrayList<>();
+                StringBuffer signNameJson;
+                StringBuffer phoneNumberJson;
+                StringBuffer templateParamJson;
+                //返回提示
+                String backResult = "";
+                if (size < maxNums) {
+                    times = 1;
+                } else {
+                    times = (size - 1) / maxNums + 1; //为什么要-1 因为如果是200的时候,理论上次数应该是2,而不是3,如果是101,那么次数也是2,这样就保证次数准确。
+                }
+                for (int j = 0; j < times; j++) {
+                    if (j > 0 && (j * maxNums + 1 > size)) { //边界判定,如果刚好是100条,那么times的值为2,这时候j 为1的时候 101 大于100结束循环,100条以内不生效
+                        break;
+                    } else {
+                        phoneNumberJson = new StringBuffer();
+                        signNameJson = new StringBuffer();
+                        templateParamJson = new StringBuffer();
+                        phoneNumberJson.append("[");
+                        signNameJson.append("[");
+                        for (int k = j * maxNums; k < size && k < (j + 1) * maxNums; k++) {
+                            // 防止有空行,手机号是必须要有的
+                            String phone = phoneList.get(k);
+                            if (StringUtils.isEmpty(phone)) {
+                                continue;
+                            }
+                            phoneNumberJson.append("\"" + phoneList.get(k) + "\",");
+                            signNameJson.append(SignName+",");
+                            /**
+                             * 活动:定于${monthname}月${dayname}日(星期${weekname)} ${time) 在${address}地点举行${content}活动,请${name}准时参加。
+                             */
+                            templateParamJson.append("{\"monthname\":\"" + localDate.getMonthValue() + "\",\"dayname\":\"" + localDate.getDayOfMonth() + "\",\"weekname\":\"" + localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE) + "\",\"time\":\"" + conferenceTime +  "\",\"address\":\"" + conferenceAddress + "\",\"content\":\"" + conferenceTitle + "\",\"name\":\"" + userNameList.get(k) + "\"},");
+                        }
+                        phoneNumberJson.deleteCharAt(phoneNumberJson.length() - 1);//移除最后一个逗号字符,
+                        signNameJson.deleteCharAt(signNameJson.length() - 1);
+                        templateParamJson.deleteCharAt(templateParamJson.length() - 1);//移除最后一个逗号字符
+                        phoneNumberJson.append("]");
+                        signNameJson.append("]");
+                        templateParamJson.append("]");
+                        phoneList.add(phoneNumberJson.toString());
+                        signNameList.add(signNameJson.toString());
+                        templateList.add(templateParamJson.toString());
+                    }
+                    //组装请求对象
+                    if (times == phoneList.size()) {
+                        for (int i = 0; i < times; i++) {
+                            long startTimeSql = System.currentTimeMillis();
+                            SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest();
+                            //组装电话号码
+                            sendBatchSmsRequest.setPhoneNumberJson(phoneList.get(i));
+                            //签名名称
+                            sendBatchSmsRequest.setSignNameJson(signNameList.get(i));
+                            //替换参数
+                            sendBatchSmsRequest.setTemplateParamJson(templateList.get(i));
+                            //固定的模板名称
+                            sendBatchSmsRequest.setTemplateCode(templateCode);
+                            long endTimeSql = System.currentTimeMillis() - startTimeSql;
+                            System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发会议短信通知计算:" + (i + 1) + "次,时间" + endTimeSql + "ms");
+                            long startTimeSend = System.currentTimeMillis();
+                            SendBatchSmsResponse sendBatchSmsResponse = SendSmsUtils.sendBatchSms(sendBatchSmsRequest);
+                            long endTimeSend = System.currentTimeMillis() - startTimeSend;
+                            System.out.println("线程" + Thread.currentThread().getId() + "执行批量下发会议短信通知接口请求:" + (i + 1) + "次,时间" + endTimeSend + "ms");
+                            if (sendBatchSmsResponse != null) {
+                                String code = sendBatchSmsResponse.getBody().getCode();
+                                if (sendBatchSmsResponse.getBody().getCode() != null && "OK".equals(code)) {
+                                    //批量请求发送短信成功
+                                    System.out.println("批量会议短信发送成功:" + phoneList.get(i).split(",").length + "条");
+                                    backResult = backResult + "第" + i + "次批量成功  ";
+                                } else {
+                                    System.out.println("批量会议短信发送失败!");
+                                    backResult = backResult + "第" + i + "次批量失败  ";
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
 

+ 8 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZxNoticeServiceImpl.java

@@ -42,14 +42,19 @@ public class ZxNoticeServiceImpl implements IZxNoticeService
     @Override
     public ZxNotice selectZxNoticeByZxNoticeId(Long zxNoticeId)
     {
+
+        ZxNotice zxNotice = zxNoticeMapper.selectZxNoticeByZxNoticeId(zxNoticeId);
         //记录是谁看的
+        //先去查询是否已经看过
         ZxUserNotice zxUserNotice = new ZxUserNotice();
         SysUser user = SecurityUtils.getLoginUser().getUser();
-        ZxNotice zxNotice = zxNoticeMapper.selectZxNoticeByZxNoticeId(zxNoticeId);
         zxUserNotice.setUserId(user.getUserId());
-        zxUserNotice.setUserName(user.getUserName());
         zxUserNotice.setZxNoticeId(zxNoticeId);
-        zxNoticeMapper.insterZxUserNotice(zxUserNotice);
+        int i = zxNoticeMapper.selectZxUserNoticeByUserIdAndNoticeId(user.getUserId(), zxNoticeId);
+        if (i == 0){
+            zxUserNotice.setUserName(user.getUserName());
+            zxNoticeMapper.insterZxUserNotice(zxUserNotice);
+        }
         return zxNotice;
     }
 

+ 9 - 1
ruoyi-system/src/main/resources/mapper/system/MemberAssessmentInfoMapper.xml

@@ -13,7 +13,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="activityScore"    column="activity_score"    />
         <result property="bonusScore"    column="bonus_score"    />
         <result property="totalScore"    column="total_score"    />
+        <result property="fullScore"    column="full_score"    />
         <result property="rank"    column="rank"    />
+        <result property="totalPeople"    column="total_people"    />
         <result property="year"    column="year_data"    />
         <result property="createBy"    column="create_by"    />
         <result property="createTime"    column="create_time"    />
@@ -23,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectMemberAssessmentInfoVo">
-        select member_assessment_id, user_id, proposal_score, sqmy_score, conference_score, activity_score, bonus_score, total_score, rank, year_data, create_by, create_time, update_by, update_time, remark from member_assessment_info
+        select member_assessment_id, user_id, proposal_score,full_score,total_people, sqmy_score, conference_score, activity_score, bonus_score, total_score, rank, year_data, create_by, create_time, update_by, update_time, remark from member_assessment_info
     </sql>
 
     <select id="selectMemberAssessmentInfoList" parameterType="MemberAssessmentInfo" resultMap="MemberAssessmentInfoResult">
@@ -56,6 +58,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="activityScore != null">activity_score,</if>
             <if test="bonusScore != null">bonus_score,</if>
             <if test="totalScore != null">total_score,</if>
+            <if test="fullScore != null">full_score,</if>
+            <if test="totalPeople != null">total_people,</if>
             <if test="rank != null">rank,</if>
             <if test="year != null">year_data,</if>
             <if test="createBy != null">create_by,</if>
@@ -72,6 +76,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="activityScore != null">#{activityScore},</if>
             <if test="bonusScore != null">#{bonusScore},</if>
             <if test="totalScore != null">#{totalScore},</if>
+            <if test="fullScore != null">#{fullScore},</if>
+            <if test="totalPeople != null">#{totalPeople},</if>
             <if test="rank != null">#{rank},</if>
             <if test="year != null">#{year},</if>
             <if test="createBy != null">#{createBy},</if>
@@ -92,6 +98,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="activityScore != null">activity_score = #{activityScore},</if>
             <if test="bonusScore != null">bonus_score = #{bonusScore},</if>
             <if test="totalScore != null">total_score = #{totalScore},</if>
+            <if test="fullScore != null">full_score = #{fullScore},</if>
+            <if test="totalPeople != null">total_people = #{totalPeople},</if>
             <if test="rank != null">rank = #{rank},</if>
             <if test="year != null">year_data = #{year},</if>
             <if test="createBy != null">create_by = #{createBy},</if>

+ 1 - 1
ruoyi-system/src/main/resources/mapper/system/ProposalInfoMapper.xml

@@ -132,7 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
         <if test="isAgree != null  and isAgree != ''"> and u.is_agree = #{isAgree}</if>
         <if test="type != null  and type != ''"> and u.type = #{type}</if>
-        <if test="userId != null  "> and u.user_id = #{proposalUserId}</if>
+        <if test="proposalUserId != null  "> and u.user_id = #{proposalUserId}</if>
         <if test="proposalNumber != null  and proposalNumber != ''"> and p.proposal_number = #{proposalNumber}</if>
         <if test="title != null  and title != ''"> and p.title = #{title}</if>
         <if test="proposalName != null  and proposalName != ''"> and p.proposal_name like concat('%', #{proposalName}, '%')</if>

+ 5 - 1
ruoyi-system/src/main/resources/mapper/system/ZxNoticeMapper.xml

@@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             select * from ( select a.zx_notice_id, a.notice_title, a.notice_type, a.notice_content, a.status, a.issuer,
             a.issuer_dept, a.issuer_dept_id, a.issuer_time, a.create_by, a.create_time, a.update_by, a.update_time,
             a.remark,
+            b.user_id as sub_user_id,
             IFNULL( b.zx_notice_type, 'N' ) as type,
             f.id as fj_id,f.main_id as fj_main_id, f.source_id as fj_source_id, f.name as fj_name, f.url as fj_url, f.type as fj_type,f.stytle as fj_stytle
             from zx_notice a
@@ -88,7 +89,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join zx_fj f on f.source_id = a.zx_notice_id
         where a.zx_notice_id = #{zxNoticeId}
     </select>
-        
+    <select id="selectZxUserNoticeByUserIdAndNoticeId" resultType="java.lang.Integer">
+        select count(1) from zx_user_notice where user_id = #{userId} and zx_notice_id =#{zxNoticeId}
+    </select>
+
     <insert id="insertZxNotice" parameterType="ZxNotice" useGeneratedKeys="true" keyProperty="zxNoticeId">
         insert into zx_notice
         <trim prefix="(" suffix=")" suffixOverrides=",">