intra-mart Accel Kaiden! プログラミングガイド 第21版 2024-04-01

4.2.2.2.5. 実装

集計処理を作成します。

コラム

集計クラス名を「集計定義テーブル.集計処理+”Calc”」とすることで、集計基盤に集計処理クラスとして認識されます。

4.2.2.2.5.1. 日次集計クラス作成

日次集計を行う集計クラス名をDailyLateEarlyTimeCalcとします。
標準で集計される日次遅刻時間と日次早退時間を足して、日次遅刻早退時間の値として保持します。
package jp.co.slcs.kaiden.v2.tutorial2.foundation.sum.util.calc.daily;

import static jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.SummaryUtil.nullToZero;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.conf.KlsKey.D;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.process.model.dto.SumDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.process.model.dto.SumDto.DailySumDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.SumCalcIF;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.model.dto.GenericSumCalcDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.model.dto.SumCalcDefDto;
import jp.co.slcs.kaiden.v2.tutorial2.foundation.sum.util.calc.daily.DailyLateEarlyTimeCalc.DailyLateEarlyTimeCalcDto;

/**
 * 遅刻早退合計時間算出クラス.
 */
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DailyLateEarlyTimeCalc implements SumCalcIF<DailySumDto, DailyLateEarlyTimeCalcDto> {
    
    /* **************************************************************************************
     * 集計するのに必要な値をDTOクラスで宣言します。
     * ************************************************************************************** */
    public static class DailyLateEarlyTimeCalcDto extends GenericSumCalcDto {
        
        /** 遅刻時間(分). */
        public BigDecimal lateMin;
        /** 早退時間(分). */
        public BigDecimal earlyMin;
    }
    
    /* **************************************************************************************
     * 集計処理基盤が、集計定義を元に対象の集計クラスのcalcForSumメソッドを呼び出します。
     * calcForSumメソッドでは、引数から集計に必要な値を取り出してDtoにセットし、
     * 実処理を行うcalcメソッドを呼び出します。
     * 結果を集計基盤に返却します。
     * ************************************************************************************** */
    @Override
    public Map<String, BigDecimal> calcForSum(SumDto sumDto, Map<String, BigDecimal> dailySumData, SumCalcDefDto def,
            DailySumDto dailySumDto) {
        
        DailyLateEarlyTimeCalcDto calcDto = new DailyLateEarlyTimeCalcDto();
        // 遅刻時間を算出済み日次集計データより取得
        calcDto.lateMin = nullToZero(dailySumData.get(D.M_1001_M));
        // 早退時間を算出済み日次集計データより取得
        calcDto.earlyMin = nullToZero(dailySumData.get(D.M_1002_M));
        
        return calc(calcDto);
    }
    
    /* **************************************************************************************
     * 集計処理をcalcメソッドに実装します。
     * 集計結果を集計キーに紐づけてセットし、返却します。
     * ************************************************************************************** */
    @Override
    public Map<String, BigDecimal> calc(DailyLateEarlyTimeCalcDto calcDto, String... sumKeys) {
        
        Map<String, BigDecimal> resultMap = new HashMap<String, BigDecimal>();
        
        // 算出結果をセット
        resultMap.put("DA_late_early_time_M", calcDto.lateMin.add(calcDto.earlyMin));
        
        return resultMap;
    }
    
}

4.2.2.2.5.2. 締め期間集計クラス作成

締め期間集計を行う集計クラス名をPeriodLateEarlyTimeCalcとします。
標準で集計される締め期間遅刻時間と締め期間早退時間を足して、締め期間遅刻早退時間の値として保持します。
しきい値となる「30分」は、集計定義のパラメータとして登録し、当集計クラスはそこから受け取ることとします。

コラム

集計定義パラメータについては後述します。
package jp.co.slcs.kaiden.v2.tutorial2.foundation.sum.util.calc.multiperiod.period;

import static jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.SummaryUtil.nullToZero;
import static jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.SummaryUtil.toBigDecimal;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.manager.sum.SummaryManager;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.process.model.dto.SumDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.process.model.dto.SumDto.MultiPeriodSumDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.SumCalcIF;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.model.dto.GenericSumCalcDto;
import jp.co.slcs.kaiden.v2.product_labormgr.foundation.sum.util.calc.model.dto.SumCalcDefDto;
import jp.co.slcs.kaiden.v2.tutorial2.foundation.sum.util.calc.multiperiod.period.PeriodLateEarlyTimeCalc.PeriodLateEarlyTimeCalcDto;

/**
 * 締め期間遅刻早退時間算出クラス.
 */
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PeriodLateEarlyTimeCalc implements SumCalcIF<MultiPeriodSumDto, PeriodLateEarlyTimeCalcDto> {
    
    /* **************************************************************************************
     * 集計定義パラメータを取得するためのパラメータシーケンスを宣言しています。
     * ************************************************************************************** */
    private static final long PARAM_SEQ_1 = 1;
    
    public static class PeriodLateEarlyTimeCalcDto extends GenericSumCalcDto {
        
        /** 遅刻早退時間(分). */
        public BigDecimal lateEaryMin;
        /** 下限時間. */
        public BigDecimal lowerLimitMin;
    }
    
    /** SummaryManager. */
    @Autowired
    protected SummaryManager summaryManager;
    
    @Override
    public Map<String, BigDecimal> calcForSum(SumDto sumDto, Map<String, BigDecimal> sumData, SumCalcDefDto def,
            MultiPeriodSumDto multiPeriodSumDto) {
        
        PeriodLateEarlyTimeCalcDto calcDto = new PeriodLateEarlyTimeCalcDto();
        
        /* **************************************************************************************
         * 締め期間中の日次遅刻早退時間の合計を取得します。
         * ************************************************************************************** */
        // 日次遅刻早退時間の合計を取得
        calcDto.lateEaryMin = nullToZero(summaryManager.getWrecSumDailyByPeriod(sumDto.spInfo.getUserCd(),
                sumDto.spInfo.getPeriodStartDate(), sumDto.spInfo.getPeriodEndDate(), "DA_late_early_time_M").get(
                "DA_late_early_time_M"));
        
        /* **************************************************************************************
         * 集計定義パラメータとして定義されている30分を取得します。
         * ************************************************************************************** */
        // 集計定義パラメータより、下限時間を取得
        calcDto.lowerLimitMin = toBigDecimal(def.param.getSingleParam(PARAM_SEQ_1));
        
        return calc(calcDto);
    }
    
    @Override
    public Map<String, BigDecimal> calc(PeriodLateEarlyTimeCalcDto calcDto, String... sumKeys) {
        
        Map<String, BigDecimal> resultMap = new HashMap<String, BigDecimal>();
        
        // 算出結果をセット
        if (calcDto.lateEaryMin.compareTo(calcDto.lowerLimitMin) < 0) {
            // 下限時間より少ない
            resultMap.put("PA_late_early_time_M", BigDecimal.ZERO);
        } else {
            // 下限時間以上
            resultMap.put("PA_late_early_time_M", calcDto.lateEaryMin);
        }
        
        return resultMap;
    }
}

コラム

日次集計値の単純な合計を締め期間集計値としてよい場合は、締め期間集計クラスを独自に作成する必要はありません。

4.2.2.2.5.3. applicationContext.xmlの設定

applicationContext.xmlの設定を追加します。
「src/main/resources/META-INF/spring」に設定した「applicationContext-kaiden_tutorial.xml」を次のように編集します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <!-- DIコンポーネントの対象とする要素のトップレベルパッケージ -->
    <context:component-scan base-package="jp.co.slcs.kaiden.v2.tutorial" />
    <context:component-scan base-package="jp.co.slcs.kaiden.v2.tutorial2" />

</beans>