延迟退休政策发布了,试着用前端算法写个退休年龄计算器吧!

197 阅读3分钟

果不其然,延迟退休政策还是发布了,不过其实对于程序员来说,60岁退休亦或是63岁退休没差,反正35岁就被优化了(笑),又有说疫情延误工作的3年,延迟退休补上了。 说回正题,看了下目前发布的政策计算器,是有人社局提供的h5,我看了下是接口去计算的,如果并发量过大,保不齐就崩了,我就在想,为什么不根据官方发布的政策计算规则,由前端计算呢?通读政策后,其实算法很简单,那就直接上手吧,和上篇文章一样,我写了个小程序的计算工具。

image.png

我们先看效果吧

image.png

image.png

女55

image.png

女50

image.png

我参考的计算规则是下图

image.png image.png

image.png

image.png

思路分析

  • 1.要分男、女50岁、女55岁
  • 2.最多加三岁即36个月
  • 3.男、女55每4个月算1个月,女50每2个月算1个月
  • 4.由此可得男的开始计算即为1964年12月,女55岁开始计算即为1969年12月,女50岁开始计算即为1974年12月

由上述思路,其实就可以写代码了,作为新时代程序员懒人一枚,其中很多计算也结合gpt去写,比如日期计算,月份满足条件自动加年计算,就可以完整写出来了,直接上代码看吧!

Page({
  data: {
    year: '',
    type: ['男', '女50', '女55'],
    typeindex: 0
  },
  onLoad() {
    let year = this.getCurrentYearMonth();
    this.setData({
      year
    })
  },
  getCurrentYearMonth() { // 计算当前年月
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1; // getMonth() returns months from 0 to 11
    return `${year}-${month.toString().padStart(2, '0')}`;
  },
  calculateYearsAndMonths(months) { //计算几年几月
    const years = Math.floor(months / 12);
    const remainingMonths = months % 12;
    return {
      years: years,
      months: remainingMonths
    };
  },
  chooseyear() { // 选择出生年月
    my.datePicker({
      format: 'yyyy-MM',
      startDate: '1930-01',
      endDate: '2030-12',
      currentDate: this.data.year,
      success: (res) => {
        this.setData({
          year: res.date
        })
      },
    });
  },
  bindPickerChange(e) {  // 选择性别及人员类型
    this.setData({
      typeindex: e.detail.value,
    });
  },
  query() { // 点击查询
    let {
      year,
      typeindex,
      type
    } = this.data;
    let types = type[typeindex];

    const gender = types == '男' ? 'male' : types == '女55' ? 'female_55' : 'female_50'; // 可以是 'male', 'female' (early), 或 'female' (normal)

    const delayedRetirementAge = this.calculateDelayedRetationAge(gender, year);
    console.log(`延迟退休:`, delayedRetirementAge);
    this.setData({
      delayedRetirementAge
    })

  },
  dealData(birthYear, delayMonth, year) { // 处理结果数据
    let delayYear;
    let realAge;
    if (delayMonth > 0) {
      const yearsObj = this.calculateYearsAndMonths(delayMonth);
      if (yearsObj.months > 0) {
        realAge = year + yearsObj.years + '岁' + yearsObj.months + '月'
        delayYear = birthYear + year + yearsObj.years + '年' + yearsObj.months + '月'
      } else {
        delayYear = birthYear + year + yearsObj.years + '年' + '12月'
        realAge = year + yearsObj.years + '岁'
      }
    } else {
      realAge = year + '岁'
      delayYear = birthYear + year + '年' + '12月'
    }
    return {
      delayYear,
      realAge
    }

  },
  calculateDelayedRetationAge(gender, year) { // 进行计算
    const birthYear = parseInt(year.split('-')[0]); // 出生年份
    const birthMonth = parseInt(year.split('-')[1]); // 出生月份
    let delayMonth;

    // 根据性别和原始退休年龄来计算延迟的退休年龄
    if (gender === 'male') {

      const cutoffYear = 1964;
      const cutoffMonth = 12;
      const maxDelay = 36;

      let delayMonth;
      if (birthYear > cutoffYear || (birthYear === cutoffYear && birthMonth > cutoffMonth)) {
        const totalMonths = (birthYear - cutoffYear) * 12 + (birthMonth - cutoffMonth);
        const delay = Math.ceil(totalMonths / 4);
        delayMonth = Math.min(delay, maxDelay);
      } else {
        delayMonth = 0;
      }
      console.log(this.dealData(birthYear, delayMonth, 60), 'this.dealData(birthYear, delayMonth, 60)');

      let {
        realAge,
        delayYear
      } = this.dealData(birthYear, delayMonth, 60)

      return {
        realAge,
        delayYear,
        delayMonth: delayMonth + '个月',
      }

    } else if (gender === 'female_55') {
      const cutoffYear = 1969;
      const cutoffMonth = 12;
      const maxDelay = 36;

      if (birthYear > cutoffYear || (birthYear === cutoffYear && birthMonth > cutoffMonth)) {
        const totalMonths = (birthYear - cutoffYear) * 12 + (birthMonth - cutoffMonth);
        const delay = Math.ceil(totalMonths / 4);
        delayMonth = Math.min(delay, maxDelay);
      } else {
        delayMonth = 0;
      }

      let {
        realAge,
        delayYear
      } = this.dealData(birthYear, delayMonth, 55)

      return {
        realAge,
        delayYear,
        delayMonth: delayMonth + '个月',
      }

    } else if (gender === 'female_50') {
      const cutoffYear = 1974;
      const cutoffMonth = 12;
      const maxDelay = 60;

      if (birthYear > cutoffYear || (birthYear === cutoffYear && birthMonth > cutoffMonth)) {
        const totalMonths = (birthYear - cutoffYear) * 12 + (birthMonth - cutoffMonth);
        const delay = Math.ceil(totalMonths / 2);
        delayMonth = Math.min(delay, maxDelay);
      } else {
        delayMonth = 0;
      }
      let {
        realAge,
        delayYear
      } = this.dealData(birthYear, delayMonth, 50)

      return {
        realAge,
        delayYear,
        delayMonth: delayMonth + '个月',
      }
    }

  }
});

<view class="container">
  <view class="wrap">
    <view class="left">
      出生年月
    </view>
    <view onTap="chooseyear">
      {{year||'请选择出生年月'}}
    </view>
  </view>
  <view class="wrap">
    <view class="left">
      性别及人员类型
    </view>
    <picker onChange="bindPickerChange" class="right" value="{{typeindex}}" range="{{type}}">
      <view>
        {{type[typeindex]}}
      </view>
    </picker>
  </view>
  <button size="default" onTap="query" disabled="{{!year}}"  type="primary">查询</button>
  <view a:if="{{ delayedRetirementAge }}" class="delayedRetirementAge">
    <view>
      您的改革后法定退休年龄为:{{delayedRetirementAge.realAge}}
    </view>
    <view>
      您的改革后退休时间为:{{delayedRetirementAge.delayYear}}
    </view>
    <view>
      您的延迟月数为:{{delayedRetirementAge.delayMonth}}
    </view>
  </view>
</view>
.container{
  background-color: #fff;
}

.wrap{
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 32rpx;
  border-bottom: 1rpx solid #eee;
}

.delayedRetirementAge{
  padding: 64rpx;
  text-align: center;
}