Browse Source

1.评估一二三级校审页面添加项目详情信息按钮
2.评估添加归档超期功能(签发单完成后三天内必须归档,否则更改为超期未归档。并限制登记新的项目信息)(数据库表:program_archive 添加字段over_archive_status,默认值0。超期归档状态值(over_archive_status:0:未超期;1:已超期))
3.会计签字注师设置每个人最多选择100次限制
4.物资管理去除供应商联系方式必填验证
5.物资管理领用页面展示商品库存
6.待办数据量在页面top提醒处展示数量

user5 1 year ago
parent
commit
65f2c091e9
22 changed files with 644 additions and 116 deletions
  1. 1 1
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/collect/mapper/xml/CollectDetailedMapper.xml
  2. 10 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/controller/ProjectListController.java
  3. 22 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/ProjectListMapper.java
  4. 2 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProgramArchiveMapper.xml
  5. 122 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProjectListMapper.xml
  6. 47 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProjectListService.java
  7. 5 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramArchiveDto.java
  8. 5 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramAuditDto.java
  9. 86 94
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/config/WebSecurityConfig.java
  10. 26 19
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/service/CustomUserDetailsService.java
  11. 84 2
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/LoginController.java
  12. 13 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java
  13. 7 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java
  14. 5 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml
  15. 9 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java
  16. 10 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java
  17. 7 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/MyNoticeListMapper.java
  18. 28 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/xml/MyNoticeListMapper.xml
  19. 1 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java
  20. 9 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java
  21. 1 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/ProcessVo.java
  22. 144 0
      jeeplus-plugins/jeeplus-quartz/src/main/java/com/jeeplus/quartz/task/pg/ProjectArchiveTask.java

+ 1 - 1
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/collect/mapper/xml/CollectDetailedMapper.xml

@@ -38,7 +38,7 @@
 
              LEFT JOIN material_management_type d ON a.collect_type = d.id
              WHERE a.basic_id = #{id} AND a.del_flag = '0' and c.del_flag = '0' AND ( bas.`status` = '0' OR bas.`status` = '5')
-             group by a.goods_name;
+             group by a.goods_name,a.collect_type;
     </select>
     <select id="getByAttachmentId" resultType="com.jeeplus.test.workContract.service.dto.WorkAttachmentDto">
         SELECT

+ 10 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/controller/ProjectListController.java

@@ -536,4 +536,14 @@ public class ProjectListController {
     public ResponseEntity<ProgramAuditDto> findByProIdAndLevel(String programId, String auditLevel) {
         return projectListService.findByProIdAndLevel(programId, auditLevel);
     }
+
+    /**
+     * 查询当前登录人所属项目组的项目
+     * @return
+     */
+    @ApiOperation(value = "查询当前登录人所属项目组的项目")
+    @GetMapping(value = "/getOverArchiveFlag")
+    public ResponseEntity<String> getOverArchiveFlag() {
+        return projectListService.getOverArchiveFlag();
+    }
 }

+ 22 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/ProjectListMapper.java

@@ -37,4 +37,26 @@ public interface ProjectListMapper extends BaseMapper<ProgramProjectListInfo> {
     ProgramProjectListInfo getById(@Param("id")String id);
 
     List<String> getHaveProjectIds(@Param("currentUser") UserDTO currentUser);
+
+    /**
+     * 查询项目签发单完成后3天未归档项目信息
+     * @param threeDayAgo 签发单完成时间
+     * @return
+     */
+    List<ProgramProjectListInfo> getOverdueFilingProjectList(@Param("threeDayAgo") String threeDayAgo);
+
+    /**
+     * 修改报告归档 归档状态信息
+     * @param id
+     * @param archiveStatus 归档状态
+     * @param overArchiveStatus 超期归档状态值(over_archive_status:0:未超期;1:已超期)
+     */
+    void updateArchiveStatus(@Param("id")String id, @Param("archiveStatus")String archiveStatus, @Param("overArchiveStatus")String overArchiveStatus);
+
+    /**
+     * 根据人员查询该人员是否存在超期未归档或超期归档中的项目信息
+     * @param currentUser
+     * @return
+     */
+    Integer getOverArchiveFlag(@Param("currentUser") UserDTO currentUser);
 }

+ 2 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProgramArchiveMapper.xml

@@ -40,6 +40,7 @@
             <result property="procInsId" column="proc_ins_id" jdbcType="VARCHAR"/>
             <result property="processDefinitionId" column="process_definition_id" jdbcType="VARCHAR"/>
             <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="overArchiveStatus" column="over_archive_status" jdbcType="VARCHAR"/>
             <result property="reportNo" column="report_no" jdbcType="VARCHAR"/>
             <result property="auditUserId" column="audit_user_id" jdbcType="VARCHAR"/>
             <result property="signatureEvaluatorFirst" column="signature_evaluator_first" jdbcType="VARCHAR"/>
@@ -83,6 +84,7 @@
         pa.proc_ins_id,
         pa.process_definition_id,
         pa.status,
+        pa.over_archive_status,
         pa.audit_date,
         pa.audit_date as "auditDateDate",
         pa.audit_user_id,

+ 122 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProjectListMapper.xml

@@ -646,4 +646,126 @@
         from program_members pm
         where pm.user_id = #{currentUser.id} and pm.del_flag = '0'
     </select>
+
+    <select id="getOverdueFilingProjectList" resultType="com.jeeplus.test.program.configuration.projectList.domain.ProgramProjectListInfo">
+        SELECT
+        distinct
+           a.id,
+           a.create_by AS create_by,
+           a.create_date,
+           a.update_by,
+           a.update_date,
+           a.del_flag,
+           a.contract_id,
+           a.contract_name,
+           a.client,
+           a.client_name,
+           a.amount,
+           a.contract_type,
+           a.name,
+           a.no,
+           a.project_type,
+           a.approval_no,
+           a.company,
+           a.project_mould,
+           a.property_holder,
+           a.property_holder_name,
+           a.location,
+           a.is_first,
+           a.year_num,
+           a.check_year,
+           a.project_manager,
+           c.name AS project_manager_name,
+           a.report_type,
+           a.industry,
+           a.enterprise_type,
+           a.risk_level,
+           a.project_source,
+           a.estimate,
+           a.plan_end_time,
+           a.use_num,
+           a.appointment,
+           a.work_hours,
+           a.remarks,
+           a.assessment_enterprise,
+           a.assessment_enterprise_name,
+           a.link_num,
+           a.relationship,
+           a.assessment_way,
+           a.assessment_objective,
+           a.assessment_date,
+           a.num,
+           a.project_development,
+           a.delegate_project_type,
+           a.assessment_object,
+           a.work_begin_date,
+           a.work_end_date,
+           a.reporting_date,
+           a.is_have,
+           a.is_influence,
+           a.mode,
+           a.status,
+           a.proc_ins_id,
+           a.process_definition_id,
+           prn.report_no,
+           pa1.status as status1,
+           pa1.id as auditId1,
+           pa1.proc_ins_id as procInsId1,
+           pa2.status as status2,
+           pa2.id as auditId2,
+           pa2.proc_ins_id as procInsId2,
+           pa3.status as status3,
+           pa3.id as auditId3,
+           pa3.proc_ins_id as procInsId3,
+           pa.status as archive_status,
+           pa.id as archive_id,
+           pa.proc_ins_id as procInsIdArchive,
+           d.id AS issued_id,
+           d.proc_ins_id AS procInsId4,
+           d.status AS issued_status,
+           d.agree_time AS agree_time,
+           wci.no AS contract_no,
+           art.ID_ as task_id,
+           art1.ID_ as task_id_audit1,
+           art2.ID_ as task_id_audit2,
+           art3.ID_ as task_id_audit3,
+           artd.ID_ as task_id_issued,
+           art_archive.ID_ as task_id_archive
+        FROM
+            program_project_list_info a
+            LEFT JOIN sys_user b ON a.create_by = b.id
+            LEFT JOIN sys_user c ON a.project_manager = c.id
+            LEFT JOIN work_contract_info wci ON wci.id = a.contract_id and wci.del_flag = '0'
+            LEFT JOIN program_report_no prn ON prn.program_id = a.id and prn.del_flag = '0'
+            LEFT JOIN program_audit pa1 ON pa1.program_id = a.id and pa1.audit_level = '1' and pa1.del_flag = '0'
+            LEFT JOIN program_audit pa2 ON pa2.program_id = a.id and pa2.audit_level = '2' and pa2.del_flag = '0'
+            LEFT JOIN program_audit pa3 ON pa3.program_id = a.id and pa3.audit_level = '3' and pa3.del_flag = '0'
+            LEFT JOIN program_archive pa ON pa.program_id = a.id and pa.del_flag = '0'
+            left join program_members pm on a.id = pm.project_id
+            LEFT JOIN proofread_issued d ON a.id = d.project_id
+            LEFT JOIN act_ru_task art ON a.proc_ins_id = art.PROC_INST_ID_
+            LEFT JOIN act_ru_task art1 ON pa1.proc_ins_id = art1.PROC_INST_ID_
+            LEFT JOIN act_ru_task art2 ON pa2.proc_ins_id = art2.PROC_INST_ID_
+            LEFT JOIN act_ru_task art3 ON pa3.proc_ins_id = art3.PROC_INST_ID_
+            LEFT JOIN act_ru_task artd ON d.proc_ins_id = artd.PROC_INST_ID_
+            LEFT JOIN act_ru_task art_archive ON pa.proc_ins_id = art_archive.PROC_INST_ID_
+        <where>
+            a.del_flag = 0
+            and (pa.status is null or (pa.status != 5 and pa.status != 7))
+            and d.status = 5 and d.agree_time &lt;= #{threeDayAgo}
+        </where>
+            ORDER BY a.update_date DESC
+    </select>
+
+    <update id="updateArchiveStatus">
+        update program_archive set
+        status = #{archiveStatus},
+        over_archive_status = #{overArchiveStatus}
+        where id = #{id}
+    </update>
+
+    <select id="getOverArchiveFlag" resultType="java.lang.Integer">
+        select count(id) from program_archive
+        where over_archive_status =1 and status != 7
+    </select>
 </mapper>

+ 47 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProjectListService.java

@@ -47,6 +47,8 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -266,6 +268,11 @@ public class ProjectListService {
 
     public String saveFormArchive(ProgramArchiveDto programArchiveDto) {
 //        ProgramArchive programArchive = ProgramArchiveWrapper.INSTANCE.toEntity(programArchiveDto);
+        //根据归档id 查询该归档信息是否为超期归档
+        ProgramArchiveDto archive = programArchiveMapper.findByIdArchive(programArchiveDto.getId());
+        if(null != archive && StringUtils.isNotBlank(archive.getOverArchiveStatus()) && "1".equals(archive.getOverArchiveStatus()) && "5".equals(programArchiveDto.getStatus())){
+            programArchiveDto.setStatus("7");
+        }
         ProgramArchive programArchive = new ProgramArchive();
         BeanUtils.copyProperties(programArchiveDto, programArchive);
         if (StringUtils.isNotBlank(programArchive.getId())){
@@ -520,6 +527,9 @@ public class ProjectListService {
 
     public ProgramAuditDto findByIdAudit(String id){
         ProgramAuditDto byIdAudit = programAuditMapper.findByIdAudit(id);
+        // 查询报告信息
+        //ProgramReportNo programReportNo = programReportNoMapper.selectByProgramId(byIdAudit.getProgramId());
+        //byIdAudit.setProgramReportNo(programReportNo);
         // 查询附件信息
         List<WorkAttachmentDto> files = workContractInfoMapper.findDtos(id);
         if (CollectionUtils.isNotEmpty(files)) {
@@ -1474,4 +1484,41 @@ public class ProjectListService {
         }
         return ResponseEntity.ok(byIdAudit);
     }
+
+
+    /**
+     * 查询项目签发单完成后3天未归档项目信息
+     * @return
+     */
+    public List<ProgramProjectListInfo> getOverdueFilingProjectList(){
+        //获取3天前的时间
+        String threeDayAgo = LocalDateTime.now().plusDays(-3).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        //查询项目未归档且签发单完成时间在三天之前的项目
+        List<ProgramProjectListInfo> list = projectListMapper.getOverdueFilingProjectList(threeDayAgo);
+        return list;
+    }
+
+    /**
+     * 修改报告归档 归档状态信息
+     * @param id
+     * @param archiveStatus 归档状态
+     * @param overArchiveStatus 超期归档状态值(over_archive_status:0:未超期;1:已超期)
+     */
+    public void updateArchiveStatus(String id, String archiveStatus, String overArchiveStatus){
+        projectListMapper.updateArchiveStatus(id, archiveStatus, overArchiveStatus);
+    }
+
+
+    /**
+     * getHaveProjectIds
+     * @return
+     */
+    public ResponseEntity<String> getOverArchiveFlag(){
+        UserDTO userDTO = UserUtils.getCurrentUserDTO();
+        Integer overArchiveFlag = projectListMapper.getOverArchiveFlag(userDTO);
+        if(overArchiveFlag>0){
+            return ResponseEntity.ok("1");
+        }
+        return ResponseEntity.ok("0");
+    }
 }

+ 5 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramArchiveDto.java

@@ -172,6 +172,11 @@ public class ProgramArchiveDto extends BaseDTO {
     private String status;
 
     /**
+     * 超期状态(0:未超期,1:超期)
+     */
+    private String overArchiveStatus;
+
+    /**
      * 审核通过时间
      */
     private String auditDate;

+ 5 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramAuditDto.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.service.dto.BaseDTO;
 import com.jeeplus.test.program.configuration.projectList.domain.ProgramProjectListInfo;
+import com.jeeplus.test.program.configuration.projectList.domain.ProgramReportNo;
 import com.jeeplus.test.workContract.service.dto.WorkAttachmentDto;
 import lombok.Data;
 
@@ -86,6 +87,10 @@ public class ProgramAuditDto extends BaseDTO {
      * 状态
      */
     private String status;
+    /**
+     * 报告信息
+     */
+    private ProgramReportNo programReportNo;
 
     /**
      * 项目信息

+ 86 - 94
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/config/WebSecurityConfig.java

@@ -6,16 +6,10 @@ import com.jeeplus.security.jwt.JWTConfigurer;
 import com.jeeplus.security.jwt.TokenProvider;
 import com.jeeplus.security.service.CustomUserDetailsService;
 import com.jeeplus.security.util.DaoAuthenticationProvider;
-import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.http.HttpMethod;
 import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.cas.ServiceProperties;
-import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
-import org.springframework.security.cas.authentication.CasAuthenticationProvider;
-import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
-import org.springframework.security.cas.web.CasAuthenticationFilter;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -23,16 +17,13 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.web.authentication.logout.LogoutFilter;
-import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
 
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法级安全验证
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
-    //    @Autowired
-//    private CustomUserDetailsService userDatailService;
+    @Autowired
+    private CustomUserDetailsService userDatailService;
     @Autowired
     private  JwtAuthenticationEntryPoint unauthorizedHandler;
     @Autowired
@@ -47,16 +38,16 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     @Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 //        super.configure(auth);
-        auth.authenticationProvider(casAuthenticationProvider());
-//        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
-//        // 设置不隐藏 未找到用户异常
-//        provider.setHideUserNotFoundExceptions(true);
-//        // 用户认证service - 查询数据库的逻辑
-//        provider.setUserDetailsService(userDetailsService());
-//        // 设置密码加密算法
-//        provider.setPasswordEncoder(passwordEncoder());
-//        provider.setUserDetailsService ( userDatailService );
-//        auth.authenticationProvider(provider);
+        //auth.authenticationProvider(casAuthenticationProvider());
+        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
+        // 设置不隐藏 未找到用户异常
+        provider.setHideUserNotFoundExceptions(true);
+        // 用户认证service - 查询数据库的逻辑
+        provider.setUserDetailsService(userDetailsService());
+        // 设置密码加密算法
+        provider.setPasswordEncoder(passwordEncoder());
+        provider.setUserDetailsService ( userDatailService );
+        auth.authenticationProvider(provider);
     }
 
 
@@ -75,7 +66,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .csrf().disable()
                 .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
                 // 基于token,所以不需要session
-//                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
+                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                 .authorizeRequests()
                 .antMatchers ( "/401"
                         ,"/404",
@@ -86,6 +77,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                         "/weboffice/**",
                         "/ReportServer/**",
                         "/sys/login",
+                        "/sys/loginGetToken",
                         "/app/sys/login",
                         "/sys/sysConfig/getConfig",
                         "/getAppFlowChart",
@@ -104,12 +96,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .and ()
                 .apply(securityConfigurerAdapter());
 
-        http.exceptionHandling().authenticationEntryPoint(casAuthenticationEntryPoint())
-                .and()
-                .addFilter(casAuthenticationFilter())
-                .addFilterBefore(casLogoutFilter(),LogoutFilter.class)
-                .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
-
+//        http.exceptionHandling().and()
+//                .addFilter(casLogoutFilter())
+//                .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
     }
 
     /**
@@ -128,72 +117,75 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                         "/webjars/**");
     }
 
-    /**认证的入口*/
-    @Bean
-    public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
-        CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
-        casAuthenticationEntryPoint.setLoginUrl(casProperties.getCasServerLoginUrl());
-        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
-        return casAuthenticationEntryPoint;
-    }
-
-    /**指定service相关信息*/
-    @Bean
-    public ServiceProperties serviceProperties() {
-        ServiceProperties serviceProperties = new ServiceProperties();
-        serviceProperties.setService(casProperties.getAppServerUrl() + casProperties.getAppLoginUrl());
-        serviceProperties.setAuthenticateAllArtifacts(true);
-        return serviceProperties;
-    }
-
-    /**CAS认证过滤器*/
-    @Bean
-    public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
-        CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
-        casAuthenticationFilter.setAuthenticationManager(authenticationManager());
-        casAuthenticationFilter.setFilterProcessesUrl(casProperties.getAppLoginUrl());
-        return casAuthenticationFilter;
-    }
-
-    /**cas 认证 Provider*/
-    @Bean
-    public CasAuthenticationProvider casAuthenticationProvider() {
-        CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
-        casAuthenticationProvider.setAuthenticationUserDetailsService(customUserDetailsService());
-        //casAuthenticationProvider.setUserDetailsService(customUserDetailsService()); //这里只是接口类型,实现的接口不一样,都可以的。
-        casAuthenticationProvider.setServiceProperties(serviceProperties());
-        casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator());
-        casAuthenticationProvider.setKey("casAuthenticationProviderKey");
-        return casAuthenticationProvider;
-    }
-
-    /**用户自定义的AuthenticationUserDetailsService*/
-    @Bean
-    public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> customUserDetailsService(){
-        return new CustomUserDetailsService();
-    }
-
-    @Bean
-    public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
-        return new Cas20ServiceTicketValidator(casProperties.getCasServerUrl());
-    }
-
-    /**单点登出过滤器*/
-    @Bean
-    public SingleSignOutFilter singleSignOutFilter() {
-        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
-        singleSignOutFilter.setCasServerUrlPrefix(casProperties.getCasServerUrl());
-        singleSignOutFilter.setIgnoreInitConfiguration(true);
-        return singleSignOutFilter;
-    }
-
-    /**请求单点退出过滤器*/
-    @Bean
-    public LogoutFilter casLogoutFilter() {
-        LogoutFilter logoutFilter = new LogoutFilter(casProperties.getCasServerLogoutUrl(), new SecurityContextLogoutHandler());
-        logoutFilter.setFilterProcessesUrl(casProperties.getAppServerUrl() + casProperties.getAppLogoutUrl());
-        return logoutFilter;
-    }
+//    /**认证的入口*/
+//    @Bean
+//    public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
+//        CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
+//        casAuthenticationEntryPoint.setLoginUrl(casProperties.getCasServerLoginUrl());
+//        casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
+//        return casAuthenticationEntryPoint;
+//    }
+//
+//    /**指定service相关信息*/
+//    @Bean
+//    public ServiceProperties serviceProperties() {
+//        ServiceProperties serviceProperties = new ServiceProperties();
+//        serviceProperties.setService(casProperties.getAppServerUrl() + casProperties.getAppLoginUrl());
+//        serviceProperties.setAuthenticateAllArtifacts(true);
+//        return serviceProperties;
+//    }
+//
+//    /**CAS认证过滤器*/
+//    @Bean
+//    public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
+//        CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
+//        casAuthenticationFilter.setAuthenticationManager(authenticationManager());
+//        casAuthenticationFilter.setFilterProcessesUrl(casProperties.getAppLoginUrl());
+//        return casAuthenticationFilter;
+//    }
+//
+//    /**cas 认证 Provider*/
+//    @Bean
+//    public CasAuthenticationProvider casAuthenticationProvider() {
+//        CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
+//        casAuthenticationProvider.setAuthenticationUserDetailsService(customUserDetailsService());
+//        //casAuthenticationProvider.setUserDetailsService(customUserDetailsService()); //这里只是接口类型,实现的接口不一样,都可以的。
+//        casAuthenticationProvider.setServiceProperties(serviceProperties());
+//        casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator());
+//        casAuthenticationProvider.setKey("casAuthenticationProviderKey");
+//        return casAuthenticationProvider;
+//    }
+//
+//    /**用户自定义的AuthenticationUserDetailsService*/
+//    @Bean
+//    public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> customUserDetailsService(){
+//        return new CustomUserDetailsService();
+//    }
+//
+//    @Bean
+//    public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
+//        Cas20ServiceTicketValidator ticketValidator = new Cas20ServiceTicketValidator(casProperties.getCasServerUrl());
+//        ticketValidator.setEncoding("UTF-8");
+//        return ticketValidator;
+//    }
+//
+//
+//    /**单点登出过滤器*/
+//    @Bean
+//    public SingleSignOutFilter singleSignOutFilter() {
+//        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
+//        singleSignOutFilter.setCasServerUrlPrefix(casProperties.getCasServerUrl());
+//        singleSignOutFilter.setIgnoreInitConfiguration(true);
+//        return singleSignOutFilter;
+//    }
+//
+//    /**请求单点退出过滤器*/
+//    @Bean
+//    public LogoutFilter casLogoutFilter() {
+//        LogoutFilter logoutFilter = new LogoutFilter(casProperties.getCasServerLogoutUrl(), new SecurityContextLogoutHandler());
+//        logoutFilter.setFilterProcessesUrl(casProperties.getAppServerUrl() + casProperties.getAppLogoutUrl());
+//        return logoutFilter;
+//    }
 
     /**
      * 描述: 密码加密算法 BCrypt 推荐使用

+ 26 - 19
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/security/service/CustomUserDetailsService.java

@@ -6,36 +6,43 @@ import com.jeeplus.sys.service.UserService;
 import com.jeeplus.sys.service.dto.UserDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AccountExpiredException;
-import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.AuthorityUtils;
-import org.springframework.security.core.userdetails.*;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
 
-/**
- * 用于加载用户信息
- * @author: 王强
- * @create: 2023-04-20 10:40
- **/
-public class CustomUserDetailsService implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
+@Component
+public class CustomUserDetailsService implements UserDetailsService {
     @Autowired
     private UserService userService;
 
-
-    /**
-     * 当cas登录成功后会进入到这里
-     * @param token
-     * @return
-     * @throws UsernameNotFoundException
-     */
     @Override
-    public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
-        System.out.println(token.getName());
-        return new User(token.getName(), "", AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER"));
+    public User loadUserByUsername(String username) throws UsernameNotFoundException {
+        // 通过用户名从数据库获取用户信息
+        UserDTO userInfo =  userService.getUserByLoginName ( username );
+
+        // 用户不存在
+        if (userInfo == null) {
+            throw new AccountExpiredException (ErrorConstants.LOGIN_ERROR_NOTFOUND);
+        }
+
+        // 用户禁止登录
+        if ( CommonConstants.NO.equals ( userInfo.getLoginFlag ( ) ) ) {
+            throw new AccountExpiredException ( ErrorConstants.LOGIN_ERROR_FORBIDDEN );
+        }
+
+        // 权限集合
+        List <GrantedAuthority> authorities = new ArrayList <> ();
 
+        return new User (
+                userInfo.getLoginName (),
+                userInfo.getPassword(),
+                authorities
+        );
     }
 }
 

+ 84 - 2
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/LoginController.java

@@ -166,6 +166,84 @@ public class LoginController {
 
         return responseUtil.ok ( );
     }
+    /**
+     * 用户登录
+     * @param loginForm
+     * @return
+     */
+    @PostMapping("/sys/loginGetToken")
+    @ApiLog(value = "用户登录", type = LogTypeEnum.LOGIN)
+    @ApiOperation("登录接口")
+    public String loginGetToken(@RequestBody LoginForm loginForm) {
+        //现根据账号密码在redis中查询是否存在用户信息,若存在则直接引用 其token,否则生成一个token
+        ResponseUtil responseUtil = new ResponseUtil ( );
+        String loginUserName = loginForm.getUsername ();
+        String username = loginForm.getUsername ();
+        String password = loginForm.getPassword ();
+        String code = loginForm.getCode ();
+        Integer redisLoginNumber = (Integer) RedisUtils.getInstance ().get ( CacheNames.USER_CACHE_LOGIN_CODE + loginUserName );
+        if(null == redisLoginNumber){
+            redisLoginNumber = 0;
+        }else{
+            redisLoginNumber ++ ;
+        }
+        RedisUtils.getInstance().set(CacheNames.USER_CACHE_LOGIN_CODE + loginUserName , redisLoginNumber);
+        //给登录次数记录设置6小时的过期时间
+        RedisUtils.getInstance().expire(CacheNames.USER_CACHE_LOGIN_CODE + loginUserName , 21600);
+
+        String dictValue = DictUtils.getDictLabel("login_number", "login_verification_number", null);
+        //字典中限制显示次数
+        Integer loginNumber = 5;
+        if(StringUtils.isNotBlank(dictValue)) {
+            loginNumber = Integer.valueOf(dictValue);
+        }
+        if(redisLoginNumber > loginNumber){
+            if(!code.equals ( RedisUtils.getInstance ().get (CacheNames.SYS_CACHE_CODE, loginForm.getUuid ()))){
+                throw new AccountExpiredException ( ErrorConstants.LOGIN_ERROR_ERROR_VALIDATE_CODE );
+            }
+        }
+        //根据登录名查询登录信息
+        List<UserDTO> loginUserList = userService.getUserIdByLoginOrMobile(username);
+        if(null != loginUserList){
+            if (loginUserList.size()>1){
+                throw new DisabledException ( "登录名存在重复,请使用手机号进行登录或联系管理员" );
+            }else{
+                if(loginUserList.size()==0){
+                    throw new DisabledException ( "未找到登陆人员信息" );
+                }else{
+                    username = loginUserList.get(0).getLoginName();
+                }
+            }
+        }
+
+        SecurityUtils.login (username, password, authenticationManager  ); //登录操作spring security
+
+        /**
+         * 单一登录判断
+         */
+        if(!userService.isEnableLogin ( username )){
+            throw new DisabledException ( ErrorConstants.LOGIN_ERROR_FORBID_LOGGED_IN_ELSEWHERE );
+        }
+
+        //登录成功,生成token
+        UserDTO userDTO = UserUtils.getByLoginName ( username );
+        String token = TokenProvider.createAccessToken ( username, userDTO.getPassword () );
+        responseUtil.add ( TokenProvider.TOKEN, token);
+        //更新登录信息
+        updateUserLoginInfo ( responseUtil, userDTO , token);
+
+        //删除redis中登录次数的信息
+        RedisUtils.getInstance ().delete ( CacheNames.USER_CACHE_LOGIN_CODE + loginUserName );
+
+        userDTO.setToken(token);
+        //将登录的用户信息存放到redis中(在线状态key中)
+        RedisUtils.getInstance().set(CacheNames.USER_CACHE_LOGIN_ONLINE_LOGIN_NAME + loginUserName , userDTO);
+        if(!"123456".equals(password) && !DaoAuthenticationProvider.getValue().equals(password)){
+            userService.updateUserUpPassword(userDTO);
+        }
+
+        return userDTO.getToken();
+    }
 
 
     /**
@@ -176,8 +254,12 @@ public class LoginController {
     @RequestMapping("/sys/casLogin")
     public ResponseEntity casLogin(@RequestParam(name = "ticket") String ticket,
                                    @RequestParam(name = "service") String service, @Value("${cas.server_host_url}") String casServer) throws Exception {
+
+        Cas20ServiceTicketValidator ticketValidator1 = new Cas20ServiceTicketValidator(casServer);
+        ticketValidator1.setEncoding("UTF-8");
+        TicketValidator ticketValidator = ticketValidator1;
         //ticket检验器
-        TicketValidator ticketValidator = new Cas20ServiceTicketValidator ( casServer );
+        //TicketValidator ticketValidator = new Cas20ServiceTicketValidator ( casServer );
         ResponseUtil responseUtil = new ResponseUtil ( );
         try {
             // 去CAS服务端中验证ticket的合法性
@@ -243,7 +325,7 @@ public class LoginController {
      */
     @ApiOperation("退出登录")
     @ApiLog(value = "退出登录", type = LogTypeEnum.LOGIN)
-    @PostMapping("/sys/logout")
+    @GetMapping("/sys/logout")
     public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response) {
         Authentication auth = SecurityUtils.getAuthentication ();
 

+ 13 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -231,6 +231,19 @@ public class UserController {
             }
         }
         IPage <UserDTO> result = userService.findPage ( page, queryWrapper );
+        //判断 如果是签字注师筛选,则获取签字注师的被选择次数
+        if(StringUtils.isNotBlank(userDTO.getCertType()) && "6".equals(userDTO.getCertType())){
+            List<UserDTO> userList = result.getRecords();
+            for (UserDTO info : userList) {
+                if("潘中".equals(info.getName())){
+                    info.setAccountantUserFlag(0);
+                }else{
+                    info.setAccountantUserFlag(1);
+                }
+                Integer accountantUserCount = userService.getAccountantUserCount(info.getId());
+                info.setAccountantUserCount(accountantUserCount);
+            }
+        }
         return ResponseEntity.ok ( result );
     }
 

+ 7 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java

@@ -241,4 +241,11 @@ public interface UserMapper extends BaseMapper<User> {
     void insertUser(@Param("user") User user);
 
     void removeByIdPhysical(@Param("id") String id);
+
+    /**
+     * 根据用户id 查询该用户会计报告的签字注师被选择次数
+     * @param userId
+     * @return
+     */
+    Integer getAccountantUserCount(@Param("userId") String userId);
 }

+ 5 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml

@@ -419,4 +419,9 @@
 	<delete id="removeByIdPhysical">
 		delete from sys_user where id = #{id}
 	</delete>
+
+	<select id="getAccountantUserCount" resultType="java.lang.Integer">
+		select count(id) from cw_project_report
+		where del_flag = 0 and (signature_annotator1 = #{userId} or signature_annotator2 = #{userId})
+	</select>
 </mapper>

+ 9 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -590,4 +590,13 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 	public void removeByIdPhysical(String userId){
 		userMapper.removeByIdPhysical(userId);
 	}
+
+	/**
+	 * 根据用户id 查询该用户会计报告的签字注师被选择次数
+	 * @param userId
+	 * @return
+	 */
+	public Integer getAccountantUserCount(String userId) {
+		return userMapper.getAccountantUserCount (userId);
+	}
 }

+ 10 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java

@@ -314,4 +314,14 @@ public class  UserDTO extends BaseDTO {
      */
     private String rosterId;
 
+    /**
+     * 财务公司签字注师被选择次数
+     */
+    private Integer accountantUserCount;
+
+    /**
+     * 财务公司签字注师被选择次数
+     */
+    private Integer accountantUserFlag;
+
 }

+ 7 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/MyNoticeListMapper.java

@@ -48,4 +48,11 @@ public interface MyNoticeListMapper extends BaseMapper<MyNoticeList> {
      */
     void portionRead(List idList);
 
+    /**
+     * 根据通知信息查询详情
+     * @param myNoticeList
+     * @return
+     */
+    MyNoticeList getRepetitionCountBymyNoticeTitle(MyNoticeList myNoticeList);
+
 }

+ 28 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/xml/MyNoticeListMapper.xml

@@ -62,6 +62,34 @@
 		</where>
 	</select>
 
+	<select id="getRepetitionCountBymyNoticeTitle" resultType="com.jeeplus.flowable.model.MyNoticeList">
+		select
+		  a.id,
+		  a.create_by,
+		  a.create_date,
+		  a.update_by,
+		  a.update_date,
+		  a.del_flag,
+		  a.task_id,
+		  a.title,
+		  a.def_id,
+		  a.task_name,
+		  a.link,
+		  a.create_user,
+		  a.create_time,
+		  a.type,
+		  a.repetition_count,
+		  a.notice_id
+		from
+		  my_notice_list a
+		<where>
+			a.del_flag = 0
+			and a.notice_id = #{noticeId}
+			and a.title = #{title}
+			and a.type = 0
+		</where>
+	</select>
+
 	<insert id="insertMyNotice">
 		insert into my_notice_list (
 		  id,

+ 1 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -154,6 +154,7 @@ public class FlowTaskService {
             processVo.setProcessDefinitionName ( ProcessDefCache.get (task.getProcessDefinitionId ()).getName ());
             processVo.setVersion (ProcessDefCache.get (task.getProcessDefinitionId ()).getVersion ());
             processVo.setStatus ("todo");
+            processVo.setCreateTime(task.getCreateTime());
             records.add ( processVo );
         }
         page.setRecords ( records );

+ 9 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java

@@ -162,6 +162,15 @@ public class MyNoticeService {
      * @param myNoticeList
      * @return
      */
+    public MyNoticeList getRepetitionCountBymyNoticeTitle(MyNoticeList myNoticeList){
+        return mapper.getRepetitionCountBymyNoticeTitle(myNoticeList);
+    }
+
+    /**
+     * 根据通知信息查询数据
+     * @param myNoticeList
+     * @return
+     */
     public void insertMyNotice(MyNoticeList myNoticeList){
         mapper.insertMyNotice(myNoticeList);
     }

+ 1 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/ProcessVo.java

@@ -19,6 +19,7 @@ public class ProcessVo {
     private String deleteReason; //流程作废原因
     private HisTaskVo hisTask; // 历史流程节点
     private TaskVo task; //流程当前节点
+    private Date createTime; // 创建时间
 
 
     private int code; // 流程状态码

+ 144 - 0
jeeplus-plugins/jeeplus-quartz/src/main/java/com/jeeplus/quartz/task/pg/ProjectArchiveTask.java

@@ -0,0 +1,144 @@
+package com.jeeplus.quartz.task.pg;
+
+import com.jeeplus.flowable.model.MyNoticeList;
+import com.jeeplus.flowable.service.FlowTaskService;
+import com.jeeplus.flowable.service.MyNoticeService;
+import com.jeeplus.quartz.domain.Task;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.SpringContextHolder;
+import com.jeeplus.sys.utils.StringUtils;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.program.configuration.projectList.domain.ProgramProjectListInfo;
+import com.jeeplus.test.program.configuration.projectList.service.ProjectListService;
+import org.quartz.DisallowConcurrentExecution;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 评估归档定时任务(每日凌晨20分进行处理,项目签发单完成后3天未归档,则调整为超期归档,并每天进行发送通知提醒。直到归档完成为止,并且项目终存在超期未归档时,禁止新增项目信息。)
+ * @author: 徐滕
+ * @version: 2023-06-08 09:36
+ */
+@DisallowConcurrentExecution
+public class ProjectArchiveTask extends Task {
+
+    private final ProjectListService pgProjectListService = SpringContextHolder.getBean(ProjectListService.class);
+    private final FlowTaskService flowTaskService = SpringContextHolder.getBean(FlowTaskService.class);
+    private final MyNoticeService myNoticeService = SpringContextHolder.getBean(MyNoticeService.class);
+
+    @Override
+    public void run() {
+        List<ProgramProjectListInfo> projectList = pgProjectListService.getOverdueFilingProjectList();
+        //遍历查询的项目,对所有项目的归档状态进行调整。添加超期归档状态值(over_archive_status:0:未超期;1:已超期),归档状态,若是0或者空值则调整为6。若为其他值则不进行调整
+        for (ProgramProjectListInfo info : projectList) {
+            //判定是否以发起归档申请(即归档状态是否为空或者0)
+            String archiveStatus = "";
+            if(StringUtils.isBlank(info.getArchiveStatus()) || "0".equals(info.getArchiveStatus())){
+                archiveStatus = "6";
+            }else{
+                archiveStatus = info.getArchiveStatus();
+            }
+            //修改报告归档 归档状态信息
+            pgProjectListService.updateArchiveStatus(info.getArchiveId(),archiveStatus,"1");
+            //对数据进行发送通知
+            String taskName = null;
+            String titleStr = null;
+
+            //如果当前时间大于过期时间
+            //Date类的一个方法,如果info.getAdventDateDate()早于 new Date() 返回true,否则返回false
+            if(info.getAgreeTime().before(new Date())){
+                taskName = "评估-超期归档";
+                titleStr = "项目【"+ info.getName()+"】归档已超期。超期时间:"+dateToString(info.getAgreeTime()) +"。";
+            }else{
+                taskName = "评估-超期归档";
+                titleStr = "项目【"+ info.getName()+"】即将归档超期。超期时间:"+dateToString(info.getAgreeTime());
+            }
+
+
+            //计算两日期之间的天数
+            int interval = Integer.parseInt(this.getInterval(info.getAgreeTime(), new Date()));
+            if(interval > 0){
+                titleStr = titleStr + "已超期:" + interval + "天。请尽快归还";
+            }
+
+            Set<String> noticeUserSet = new HashSet<String>();
+            if(StringUtils.isNotBlank(info.getCreateBy())){
+                UserDTO createUser = UserUtils.get(info.getCreateBy());
+                if(null != createUser && StringUtils.isNotBlank(createUser.getId())){
+                    noticeUserSet.add(createUser.getId());
+                }
+            }
+            List<String> noticeUserList = new ArrayList<String>(noticeUserSet);
+            if(noticeUserList.size()>0){
+                MyNoticeList myNotice = new MyNoticeList();
+                myNotice.setCreateBy("1");
+                myNotice.setCreateDate(new Date());
+                myNotice.setUpdateBy("1");
+                myNotice.setUpdateDate(new Date());
+                myNotice.setDelFlag(0);
+                //根据procInsId获取taskId
+                String currentTask = flowTaskService.getTaskIdByprocInstId(info.getProcInsId());
+                myNotice.setTaskId(currentTask);
+                myNotice.setDefId(info.getProcessDefinitionId());
+                myNotice.setTitle(titleStr);
+                myNotice.setTaskName(taskName);
+                myNotice.setLink("结束");
+                myNotice.setType("0");
+                myNotice.setCreateUser("管理员");
+                myNotice.setCreateTime(new Date());
+
+                for (String noticeUserId : noticeUserList) {
+                    myNotice.setNoticeId(noticeUserId);
+                    myNotice.setNoticeName(UserUtils.get(noticeUserId).getName());
+                    //根据taskName和通知人 查询重复数量
+                    MyNoticeList repetitionCountBymyNotice = myNoticeService.getRepetitionCountBymyNoticeTitle(myNotice);
+                    if(null == repetitionCountBymyNotice){
+                        // 生成id
+                        String id = UUID.randomUUID().toString().replace("-", "");
+                        myNotice.setId(id);
+                        myNotice.setRepetitionCount(0);
+                        myNoticeService.insertMyNotice(myNotice);
+                    }else{
+                        myNotice.setId(repetitionCountBymyNotice.getId());
+                        myNotice.setRepetitionCount(repetitionCountBymyNotice.getRepetitionCount()+1);
+                        myNoticeService.updateMyNotice(myNotice);
+                    }
+                }
+            }
+        }
+
+    }
+
+    public static String dateToString(Date date) {
+        SimpleDateFormat sformat = new SimpleDateFormat("yyyy-MM-dd");//日期格式
+        return sformat.format(date);
+    }
+
+
+    /**
+     * 计算两日期相差天数
+     * @param beginDate
+     * @param endDate
+     * @return
+     * @throws Exception
+     */
+    public String getInterval(Date beginDate, Date endDate){
+        long day = 0;
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        try {
+            if(beginDate != null){
+                String begin = sdf.format(beginDate);
+                beginDate  = sdf.parse(begin);
+            }
+            if(endDate!= null){
+                String end= sdf.format(endDate);
+                endDate= sdf.parse(end);
+            }
+        } catch (Exception e){
+            e.getMessage();
+        }
+        day = (endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
+        return String.valueOf(day);
+    }
+}