java通过解密身份证计算年龄(精确到日)

一、需求:对于系统中满55岁女性在职的党员和满60岁男性在职党员通过xxl-job进行定时提醒该人本级和上级管理员进行转出。

二、控制层 

package com.cnpc.dj.party.controller;


import com.cnpc.dj.common.JsonResult;
import com.cnpc.dj.common.exception.BusiException;
import com.cnpc.dj.party.service.PartyRetiredMemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin
@RequestMapping("member")
@Slf4j
public class PartyRetiredMemController extends BaseControllerAdapter{

    @Autowired
    private PartyRetiredMemService partyRetiredMemService;


    /**
     * 定时任务离退休党员
     * 【每天8点定时提醒前一天到55岁的女性和到60岁的男性】
     * @return 发送邮件提醒
     * @throws BusiException
     */
    @PostMapping("getRemindTransOutMem")
    public JsonResult<?> getRemindTransOutMem() throws Exception {
        log.info("getFiftyFiveFemale接口开始定时查询信息");
        String remindTransOutMem = partyRetiredMemService.getRemindTransOutMem();
        return JsonResult.success(remindTransOutMem);
    }
}

三、逻辑层代码

package com.cnpc.dj.party.service;

import com.alibaba.druid.util.StringUtils;
import com.cnpc.dj.party.entity.*;
import com.cnpc.dj.party.repository.RetiredMemMapper;
import com.cnpc.dj.party.utils.FeedMailSender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.Period;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * @author 解忧杂货铺
 */
@Service
@Slf4j
public class PartyRetiredMemService {

    @Autowired
    private RetiredMemMapper retiredMemMapper;

    @Value("${isMailOpen}")
    private String open;

    @Value("${username}")
    private String mailSendMail;

    @Value("${host}")
    private String mailServiceHost;

    @Value("${password}")
    private String mailServicePwd;

    @Value("${addr}")
    private String mailServiceAddr;

    // 党组白名单党员
    @Value("${excludePerson}")
    private String excludePerson;

    /**
     * 55岁女性党员60岁男性党员
     * 满55岁60岁第二天早8点提醒党支部管理员和上级管理员
     * @return
     */
    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
    public String getRemindTransOutMem() throws Exception {
        //查询已满55岁女/60岁男党员的上级管理员,发送邮件提醒进行党员转出
        // 截取党组白名单成员
        List<String> sapList = Arrays.asList(excludePerson.split(","));
        List<RetiredMember> retiredMemList = retiredMemMapper.getRemindTransOutMem(sapList);
        if (retiredMemList != null && retiredMemList.size()>0) {
            for (RetiredMember member : retiredMemList) {
                String gender = member.getGender();
                String idCard = member.getIdentityCard();
                String realName = member.getRealName();//已达退休年龄待转出的党员
                String orgName = member.getOrg().getOrgName();//已达退休年龄待转出的党员所在组织
                // 截取生日部分
                int birthYear = Integer.parseInt(idCard.substring(6, 10)); // 截取出生年份
                int birthMonth = Integer.parseInt(idCard.substring(10, 12)); // 截取出生月份
                int birthDay = Integer.parseInt(idCard.substring(12, 14)); // 截取出生日期
                Period age = null; // 计算年龄
                try {
                LocalDate birthDate = LocalDate.of(birthYear, birthMonth, birthDay); // 创建出生日期对象
                LocalDate currentDate = LocalDate.now(); // 获取当前日期
                age = Period.between(birthDate, currentDate);

                } catch (Exception e) {
                    e.printStackTrace();
                    continue;
                }
//                System.out.println("该人的年龄为:" + age.getYears() + "岁 " + age.getMonths() + "个月 " + age.getDays() + "天");
                //判断年龄是否为整55岁+1天女
                if (gender.equals("xb_002") && age.getYears() >= 55  && age.getDays() == 1) {
                    //获取党员的组织code查询本支级和上级管理员邮箱发邮件
                    String orgCode = member.getOrg().getOrgCode();
                    String parentOrgCode = member.getOrg().getParentOrgCode();
                    List<String> list = new ArrayList<>();
                    list.add(orgCode);
                    list.add(parentOrgCode);
                    RetiredMember retiredMember = new RetiredMember();
                    retiredMember.setOrgCodeList(list);
                    List<ReceiverEmailInfo> receiverEmail = retiredMemMapper.getReceiverEmail(retiredMember);
                    if (receiverEmail != null && receiverEmail.size() >0 ) {
                        log.info(""+orgName+"下55岁女党员"+realName+"转出提醒  开始发送邮件  start in");
                        for (ReceiverEmailInfo receiverEmailInfo : receiverEmail) {
                            if (Boolean.valueOf(open)) {
                                String email = receiverEmailInfo.getEmail();
                                String sendStatus = "0";
                                if (!StringUtils.isEmpty(email) && !"".equals(email)) {
                                    Boolean aBoolean = sendMail(email,orgName,realName);
                                    if (aBoolean) {
                                        sendStatus = "1";
                                    } else {//发送失败再次发送
                                        //发送邮件
                                        Boolean bBoolean = sendMail(email,orgName,realName);
                                        if (bBoolean) {
                                            sendStatus = "1";
                                        }
                                    }
                                }
                            }
                        }
                    }
                    log.info(""+orgName+"下55岁女党员"+realName+"转出提醒  邮件发送完毕  end out");
                    //判断年龄是否为整60岁+1天男
                }else if (gender.equals("xb_001") && age.getYears() >= 60  && age.getDays() == 1) {
                    //获取党员的组织code查询本支级和上级管理员邮箱发邮件
                    String orgCode = member.getOrg().getOrgCode();
                    String parentOrgCode = member.getOrg().getParentOrgCode();
                    List<String> list = new ArrayList<>();
                    list.add(orgCode);
                    list.add(parentOrgCode);
                    RetiredMember retiredMember = new RetiredMember();
                    retiredMember.setOrgCodeList(list);
                    List<ReceiverEmailInfo> receiverEmail = retiredMemMapper.getReceiverEmail(retiredMember);
                    if (receiverEmail != null && receiverEmail.size() >0 ) {
                        log.info(""+orgName+"下60岁男党员"+realName+"转出提醒  开始发送邮件  start in");
                        for (ReceiverEmailInfo receiverEmailInfo : receiverEmail) {
                            if (Boolean.valueOf(open)) {
                                String email = receiverEmailInfo.getEmail();
                                String sendStatus = "0";
                                if (!StringUtils.isEmpty(email) && !"".equals(email)) {
                                    Boolean aBoolean = sendMail(email,orgName,realName);
                                    if (aBoolean) {
                                        sendStatus = "1";
                                    } else {//发送失败再次发送
                                        //发送邮件
                                        Boolean bBoolean = sendMail(email,orgName,realName);
                                        if (bBoolean) {
                                            sendStatus = "1";
                                        }
                                    }
                                }
                            }
                        }
                    }
                    log.info(""+orgName+"下60岁男党员"+realName+"转出提醒  邮件发送完毕  end out");
                }
            }
        }
        return "ok";
    }


    @Async
    public Boolean sendMail(String email,String orgName,String realName){
        //发送邮件
        MailSendInfo mailInfo = new MailSendInfo();
        mailInfo.setMailServerHost(mailServiceHost);
        mailInfo.setValidate(true);
        mailInfo.setUserName(mailSendMail);
        mailInfo.setPassword(mailServicePwd);// 您的邮箱密码
        mailInfo.setFromAddress(mailServiceAddr);
        mailInfo.setToAddress(email);

        mailInfo.setSubject("【海油党建】党组织关系转接提醒");
        String content1 = "您好: <br> ";
        String content2 = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+orgName + realName + "同志已达到国家法定退休年龄,请结合实际情况核实该名同志是否需要转出党组织关系,谢谢。<br><br>";
        String content3 = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此邮件为党建信息化平台自动发送,无需回复。如有问题请联系平台运维热线010-84527171。";
        mailInfo.setContent(content1 + content2 + content3);

        return FeedMailSender.sendHtmlMail(mailInfo);// 发送html格式

    }
}

四、mapper层

package com.cnpc.dj.party.repository;

import com.cnpc.dj.party.entity.ReceiverEmailInfo;
import com.cnpc.dj.party.entity.RetiredMember;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface RetiredMemMapper {

	//获取在职正常党籍党员的身份证
	List<RetiredMember> getRemindTransOutMem(@Param("sapList") List<String> sapList);

	// 获取党员所在组织本级和上级管理员
	List<ReceiverEmailInfo> getReceiverEmail(RetiredMember retiredMember);

}

五、xml层

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cnpc.dj.party.repository.RetiredMemMapper">
  <resultMap id="BaseResultMap" type="com.cnpc.dj.party.entity.RetiredMember">
    <id column="ID" jdbcType="DECIMAL" property="id" />
    <result column="HEAD_IMG" jdbcType="VARCHAR" property="headImg" />
    <result column="REAL_NAME" jdbcType="VARCHAR" property="realName" />
    <result column="IDENTITY_CARD" jdbcType="VARCHAR" property="identityCard" typeHandler="com.cnpc.dj.party.utils.AESTypeHandler"/>
    <result column="SAP_NO" jdbcType="VARCHAR" property="sapNo" />
    <result column="GENDER" jdbcType="VARCHAR" property="gender" />
    <result column="NATION" jdbcType="VARCHAR" property="nation" />
    <result column="EDU_LEVEL" jdbcType="VARCHAR" property="eduLevel" />
    <result column="DEGREE" jdbcType="VARCHAR" property="degree" />
    <result column="NATIVE_PLACE" jdbcType="VARCHAR" property="nativePlace" />
    <result column="MOBILE_PHONE" jdbcType="VARCHAR" property="mobilePhone" />
    <result column="TELEPHONE" jdbcType="VARCHAR" property="telephone" />
    <result column="EMAIL" jdbcType="VARCHAR" property="email" />
    <result column="COMPANY" jdbcType="VARCHAR" property="company" />
    <result column="BIRTH_DATE" jdbcType="VARCHAR" property="birthDate" />
    <result column="ADDRESS" jdbcType="VARCHAR" property="address" />
    <result column="BIRTH_ADDRESS" jdbcType="VARCHAR" property="birthAddress" />
    <result column="HOME_ADDRESS" jdbcType="VARCHAR" property="homeAddress" />
    <result column="NEW_SOCIAL_PERSONNEL" jdbcType="VARCHAR" property="newSocialPersonnel" />
    <result column="DUTY" jdbcType="VARCHAR" property="duty" />
    <result column="BEGIN_WORK_DATE" jdbcType="VARCHAR" property="beginWorkDate" />
    <result column="JOB" jdbcType="VARCHAR" property="job" />
    <result column="JOB_START_DATE" jdbcType="VARCHAR" property="jobStartDate" />
    <result column="PRO_TECHNICAL_DUTY" jdbcType="VARCHAR" property="proTechnicalDuty" />
    <result column="ORG_ID" jdbcType="DECIMAL" property="orgId" />
    <result column="IS_DELETE" jdbcType="VARCHAR" property="isDelete" />
    <result column="CREATE_USERID" jdbcType="DECIMAL" property="createUserid" />
    <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime" />
    <result column="UPDATE_USERID" jdbcType="DECIMAL" property="updateUserid" />
    <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime" />
    <result column="USER_ID" jdbcType="DECIMAL" property="userId" />
    <result column="TRANSFER_STATUS" jdbcType="DECIMAL" property="transferStatus" />
    <result column="IS_HR" jdbcType="DECIMAL" property="isHr" />
  </resultMap>

  <resultMap id="MemberAndMemberShip" type="com.cnpc.dj.party.entity.RetiredMember" extends="BaseResultMap">
    <association property="memberShip" javaType="com.cnpc.dj.party.entity.MemberShip">
      <id column="memberShipId" jdbcType="DECIMAL" property="id"/>
      <result column="STATUS" jdbcType="VARCHAR" property="status"/>
      <result column="APPLY_PARTY_DATE" jdbcType="VARCHAR" property="applyPartyDate"/>
      <result column="ACTIVIST_BEGIN_DATE" jdbcType="VARCHAR" property="activistBeginDate"/>
      <result column="DEVELOPER_BEGIN_DATE" jdbcType="VARCHAR" property="developerBeginDate"/>
      <result column="JOIN_PARTY_DATE" jdbcType="VARCHAR" property="joinPartyDate"/>
      <result column="BECOME_DATE" jdbcType="VARCHAR" property="becomeDate"/>
      <result column="MEMBER_TYPE" jdbcType="DECIMAL" property="memberType"/>
      <result column="REMOVE_TYPE" jdbcType="DECIMAL" property="removeType"/>
      <result column="PREPARE_START_DATE" jdbcType="VARCHAR" property="prepareStartDate" />
      <result column="PREPARE_END_DATE" jdbcType="VARCHAR" property="prepareEndDate" />
      <result column="LEAVE_BRANCH_TIME" jdbcType="VARCHAR" property="leaveBranchTime" />
      <result column="LEAVE_AGE" jdbcType="DECIMAL" property="leaveAge" />
      <result column="CONNECT_ADDRESS" jdbcType="VARCHAR" property="connectAddress" />
    </association>
  </resultMap>

  <resultMap id="MemberAndMemberShipAndOrg" type="com.cnpc.dj.party.entity.RetiredMember" extends="MemberAndMemberShip">
    <association property="org" javaType="com.cnpc.dj.party.entity.Org">
      <id column="ORG_ID" property="id" jdbcType="DECIMAL"/>
      <result column="PARENT_ID" property="parentId" jdbcType="DECIMAL"/>
      <result column="ORG_CODE" property="orgCode" jdbcType="VARCHAR"/>
      <result column="PARENT_ORG_CODE" property="parentOrgCode" jdbcType="VARCHAR"/>
      <result column="ORG_NAME" property="orgName" jdbcType="VARCHAR"/>
      <result column="ORG_TYPE" property="orgType" jdbcType="VARCHAR"/>
      <result column="ORG_DEPENDENCY" property="orgDependency" jdbcType="VARCHAR"/>
      <result column="UNIT_SITUATION" property="unitSituation" jdbcType="VARCHAR"/>
      <result column="ORG_SECRETARY" property="orgSecretary" jdbcType="VARCHAR"/>
      <result column="ORG_CONTACTOR" property="orgContactor" jdbcType="VARCHAR"/>
      <result column="PHONE" property="phone" jdbcType="VARCHAR"/>
      <result column="ADDRESS" property="address" jdbcType="VARCHAR"/>
      <result column="VALID_FLAG" property="validFlag" jdbcType="VARCHAR"/>
      <result column="IS_RETIRED_ORG" property="isRetiredOrg" jdbcType="VARCHAR"/>
      <result column="IS_DEL_ORG" property="isDelOrg" jdbcType="VARCHAR"/>
      <result column="PARENT_ORG_CODE" property="parentOrgCode" jdbcType="VARCHAR"/>
      <result column="INDEX" property="index" jdbcType="VARCHAR"/>
      <result column="IS_ACCREDIT_IN" property="isAccreditIn" jdbcType="VARCHAR"/>
      <result column="ORG_SHORT_NAME" property="orgShortName" jdbcType="VARCHAR"/>
      <result column="REAL_TYPE" property="orgRealType" jdbcType="VARCHAR"/>
      <result column="IS_ACCREDIT_OUT" property="isAccreditOut" jdbcType="VARCHAR"/>
      <result column="SUB_ORG_COUNT" property="subOrgCount" jdbcType="DECIMAL"/>
    </association>
  </resultMap>
  <sql id="Base_Column_List">
    M.ID,M.SAP_NO,M.REAL_NAME,M.IDENTITY_CARD,M.GENDER,M.BIRTH_DATE,M.ORG_ID,M.TRANSFER_STATUS,M.IS_DELETE,
    MS.ID,MS.STATUS,MS.MEMBER_TYPE,O.ID,O.PARENT_ID,O.ORG_CODE,O.PARENT_ORG_CODE,O.ORG_NAME,O.ORG_SHORT_NAME,O.ORG_TYPE,O.IS_RETIRED_ORG,O.IS_JN,O.IN_OUT_COUNTRY,O.IS_DEL_ORG,O.IS_DELETE
  </sql>
  <!-- 查询女性在职党籍正常的党员问题 -->
  <select id="getRemindTransOutMem" resultMap="MemberAndMemberShipAndOrg" parameterType="java.util.List">
    SELECT
    <include refid="Base_Column_List"/>
    FROM ZHONGHY_BASIC_INFO.DJ_MEMBER M
    LEFT JOIN ZHONGHY_BASIC_INFO.DJ_MEMBERSHIP MS ON M.ID = MS.MEMBER_ID
    LEFT JOIN ZHONGHY_BASIC_INFO.DJ_ORG O on O.ID = M.ORG_ID
    WHERE 1=1
    AND MEMBER_TYPE = '0'
    AND M.TRANSFER_STATUS = '0'
    AND MS.STATUS = 'djzt_001'
    AND M.IS_DELETE = '0'
    AND O.IS_DELETE = '0'
    AND O.IS_DEL_ORG = '0'
    AND !REGEXP_LIKE(O.ORG_CODE, '^(000.001|000.002)')
    AND !REGEXP_LIKE(O.ORG_NAME,'退休')
    <if test="sapList != null">
      AND M.SAP_NO NOT IN
      <foreach item="item" index="index" collection="sapList" open="(" separator="," close=")">
        #{item}
      </foreach>
    </if>
  </select>

  <select id="getReceiverEmail" resultType="com.cnpc.dj.party.entity.ReceiverEmailInfo">
    SELECT ID,ORG_ID,ORG_CODE,SAP,USER_NAME,EMAIL
    FROM ZHONGHY_BASIC_INFO.DJ_UM_USERINFO
    WHERE ID IN (
    SELECT USER_ID
    FROM ZHONGHY_BASIC_INFO.DJ_UM_USER_ROLE
    WHERE 1 = 1
    <if test="orgCodeList != null">
      AND ORG_CODE IN
      <foreach item="item" index="index" collection="orgCodeList" open="(" separator="," close=")">
        #{item}
      </foreach>
    </if>
    AND ROLE_CODE IN ('dzbgly', 'dzzgly', 'dwgly'))
  </select>
</mapper>

六、xxl-job定时器

 /**
     * @Description://每天8:00调用一次查询满55岁女和60岁男的党员
     * @date: 2024年05月24日下午15:15:48
     */
    @XxlJob("getRemindTransOutMem") //必须要写的,注解参数需要和在xxl-job-admin里创建的jobhandler得名称是一致的
    public ReturnT<String> getRemindTransOutMem(String param) {

        try {
            log.info("getRemindTransOutMem start:" + LocalDateTime.now());
            // Create URL object with the desired endpoint
//            URL url = new URL("http://127.0.0.1:8080/org/insertOrgUnitDetail");
            URL url = new URL("http://fundamental:8080/member/getRemindTransOutMem");
//            URL url = new URL("http://127.0.0.1:9002/autoStatsRPT/generateReport");
            HttpUtil.httpPost(url);

        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
        log.info("getRemindTransOutMem end:" + LocalDateTime.now());
            return ReturnT.SUCCESS;
        }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@百思不得奇解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值