日本华人论坛 程序编写3



日本 - package jp.co.ji.jbaas.util.seikyuhenrei;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;

import jp.co.ji.jbaas.common.CodeConst;
import jp.co.ji.jbaas.common.MapKeyConst;
import jp.co.ji.jbaas.common.SeikyuhenreiConst;
import jp.co.ji.jbaas.common.StringConst;
import jp.co.ji.jbaas.common.Validator;
import jp.co.ji.jbaas.common.bean.SeikyuHenreiBean;
import jp.co.ji.jbaas.common.bean.SystemErrorInfo;
import jp.co.ji.jbaas.context.RequestContext;
import jp.co.ji.jbaas.dao.DAOFactory;
import jp.co.ji.jbaas.exception.LogicException;
import jp.co.ji.jbaas.mail.MailConst;
import jp.co.ji.jbaas.util.common.DateUtil;
import jp.co.ji.jbaas.util.common.ListUtil;
import jp.co.ji.jbaas.util.common.MojiHenkanUtil;
import jp.co.ji.jbaas.util.common.MsgUtil;
import jp.co.ji.jbaas.util.common.StringUtil;
import jp.co.ji.jbaas.util.mail.SystemMailUtil;
import jp.co.ji.jbaas.util.mst.fusss.common.CodeMstUtil;
import jp.co.ji.jbaas.util.mst.fusss.common.GaibuSystemMaintenanceMstUtil;
import jp.co.ji.jbaas.util.seikyuhenrei.bean.SeikyuhenreiInputBean;
import jp.co.ji.jbaas.util.seikyuhenrei.bean.meisai.SeikyuHenreiMeisai;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreichukantableUtil;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreicustomUtil;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreikanriUtil;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreikanririrekiUtil;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreimeisaiUtil;
import jp.co.ji.jbaas.util.tran.fusss.common.SeikyuhenreishohinkanriUtil;
import jp.co.ji.model.fusss.common.MCdmst;
import jp.co.ji.model.fusss.common.MGaibusystemmaintenancemst;
import jp.co.ji.model.fusss.common.TSeikyuhenreichukantable;
import jp.co.ji.model.fusss.common.TSeikyuhenreikanri;
import jp.co.ji.model.fusss.common.TSeikyuhenreikanriExample;
import jp.co.ji.model.fusss.common.TSeikyuhenreikanririreki;
import jp.co.ji.model.fusss.common.TSeikyuhenreimeisai;
import jp.co.ji.model.fusss.common.TSeikyuhenreishohinkanri;

/**
* 請求返戻Util
*
* @author  NSD
*
*/
public final class SeikyuhenreiUtil {

    /** ログの定義 */
    public static final Logger LOGGER = Logger.getLogger(SeikyuhenreiUtil.class);

    /**
     * コンストラクタ(インスタンス化禁止)
     */
    private SeikyuhenreiUtil() {

    }

    /**
     * 請求返戻共通チェック
     *
     * @param inputBean 入力情報
     * @param requestIdList 要求IDリスト
     * @throws Exception
     *
     */
    public static void doCommonCheck(SeikyuhenreiInputBean inputBean, List<String> requestIdList) throws Exception {

        // 要求ID
        doEmptyCheck(inputBean.getRequestID(), SeikyuhenreiConst.REQUESTID);

        // 要求ID重複チェック
        doRequestIdRepeatCheck(inputBean, requestIdList);

        // 請求返戻区分
        doEmptyExistsCheck(inputBean.getSeikyuHenreiKBN(), SeikyuhenreiConst.SEIKYUHENREIKBNLIST,
                SeikyuhenreiConst.SEIKYUHENREIKBN);

        // 処理種別
        doEmptyExistsCheck(inputBean.getShoriShubetsu(), SeikyuhenreiConst.SHORISHUBETSULIST,
                SeikyuhenreiConst.SHORISHUBETSU);
    }

    /**
     * 要求ID重複チェック
     *
     * @param inputBean 入力情報
     * @param requestIdList 要求IDリスト
     * @throws Exception
     *
     */
    public static void doRequestIdRepeatCheck(SeikyuhenreiInputBean inputBean, List<String> requestIdList)
            throws Exception {
        // 要求ID
        String requestID = inputBean.getRequestID();

        // 要求ID重複チェック
        doRepeatCheck(requestID, requestIdList, SeikyuhenreiConst.REQUESTID + StringConst.COLON + requestID);
    }

    /**
     * 請求返戻管理番号重複チェック
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanriNoList 請求返戻管理番号リスト
     * @throws Exception
     *
     */
    public static void doSeikyuhenreiKanriNoRepeatCheck(SeikyuhenreiInputBean inputBean, List<String> seikyuhenreikanriNoList) throws Exception {

        // 請求返戻管理番号
        String seikyuHenreiKanriNO = inputBean.getSeikyuHenreiKanriNO();

        // 請求返戻管理番号重複チェック
        doRepeatCheck(seikyuHenreiKanriNO, seikyuhenreikanriNoList, SeikyuhenreiConst.SEIKYUHENREIKANRINO + StringConst.COLON + seikyuHenreiKanriNO);
    }

    /**
     * 請求返戻管理番号重複チェック
     *
     * @param taisho チェック対象
     * @param taishoList チェック対象リスト
     * @param msg エラーメッセージ
     * @throws Exception
     *
     */
    private static void doRepeatCheck(String taisho, List<String> taishoList, String msg) throws Exception {
        if (taishoList.contains(taisho)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00035, msg));
        } else {
            taishoList.add(taisho);
        }
    }

    /**
     * 請求登録の共通チェック
     *
     * @param inputBean 入力情報
     * @throws Exception
     *
     */
    public static void doSeikyuTorokuCommonCheck(SeikyuhenreiInputBean inputBean) throws Exception {

        // 決済方法チェック
        doEmptyExistsCheck(inputBean.getKessaihoho(), SeikyuhenreiConst.SHUNOHOHO_SEIKYULIST, SeikyuhenreiConst.KESSAIHOHO);

        // キャリア以外の場合チェックする
        if (!SeikyuhenreiConst.SHUNOHOHO_CARRIERLIST.contains(inputBean.getKessaihoho())) {
            // ラインコード
            doEmptyExistsCheck(inputBean.getLineCD(), SeikyuhenreiConst.LINECDLIST, SeikyuhenreiConst.LINECD);

            // マイページユーザーID
            doEmptyDigitsFormatCheck(inputBean.getMyPageUserID(), SeikyuhenreiConst.DIGITS_8,
                    SeikyuhenreiConst.HALFNUMONLY, SeikyuhenreiConst.MYPAGEUSERID);

            // 決済金額
            doEmptyFormatCheck(inputBean.getKessaiKingaku(), SeikyuhenreiConst.HALFNUMONLY,
                    SeikyuhenreiConst.KESSAIKINGAKU);

            // 即時予定区分
            String sokujiYoteiKBN = inputBean.getSokujiYoteiKBN();
            // 即時予定区分許可リスト
            List<String> sokujiYoteiKBNList = SeikyuhenreiConst.SOKUJIYOTEIKBNLIST;
            // 次期配信の場合
            if (SeikyuhenreiConst.SHUNOHOHO_JIKIHAISHINLIST.contains(inputBean.getKessaihoho())) {
                // 即時のみ許可
                sokujiYoteiKBNList = Arrays.asList(CodeConst.SokujiYoteiKbn.SOKUJI);
            }
            doEmptyExistsCheck(sokujiYoteiKBN, sokujiYoteiKBNList, SeikyuhenreiConst.SOKUJIYOTEIKBN);

            // 即時予定区分が予定、かつ次期配信、その他以外の場合
            if (CodeConst.SokujiYoteiKbn.YOTEI.equals(sokujiYoteiKBN) &&
                    !SeikyuhenreiConst.AGENT_RYOSHULIST.contains(inputBean.getKessaihoho()) &&
                    !SeikyuhenreiConst.SHUNOHOHO_SONOTALIST.contains(inputBean.getKessaihoho())) {
                // 請求返戻予定日
                doEmptyFormatCheck(inputBean.getSeikyuHenreiYoteiDate(), DateUtil.YYYYMMDD,
                        SeikyuhenreiConst.SEIKYUHENREIYOTEIDATE);
            }

            // 請求返戻明細リスト
            doSeikyuHenreiMeisaiListCheck(inputBean.getSeikyuHenreiMeisaiList());

            // 関連チェック
            doKessaiKingakuRelatedCheck(inputBean);

            // 他機能処理中チェック
            doSeikyuhenreiShorichuCheck(inputBean.getSeikyuHenreiKanriNO(), inputBean.getShoriShubetsu(),
                    inputBean.getLineCD(), inputBean.getSeikyuHenreiMeisaiList());
        }
    }

    /**
     * 請求取消共通チェック
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanriNoList 請求返戻管理番号リスト
     * @throws Exception
     *
     */
    public static void doTorikeshiCommonCheck(SeikyuhenreiInputBean inputBean, List<String> seikyuhenreikanriNoList) throws Exception {

        // 請求返戻管理番号重複チェック
        SeikyuhenreiUtil.doSeikyuhenreiKanriNoRepeatCheck(inputBean, seikyuhenreikanriNoList);

        // 他機能処理中チェック
        doSeikyuhenreiShorichuCheck(inputBean.getSeikyuHenreiKanriNO(), inputBean.getShoriShubetsu(),
                inputBean.getLineCD(), inputBean.getSeikyuHenreiMeisaiList());
    }

    /**
     * 返戻登録の共通チェック
     *
     * @param inputBean 入力情報
     * @throws Exception
     *
     */
    public static void doHenreiTorokuCommonCheck(SeikyuhenreiInputBean inputBean) throws Exception {

        // ラインコード
        doEmptyExistsCheck(inputBean.getLineCD(), SeikyuhenreiConst.LINECDLIST, SeikyuhenreiConst.LINECD);

        // 決済金額
        doEmptyFormatCheck(inputBean.getKessaiKingaku(), SeikyuhenreiConst.HALFNUMONLY,
                SeikyuhenreiConst.KESSAIKINGAKU);

        // 決済方法チェック
        doEmptyExistsCheck(inputBean.getKessaihoho(), SeikyuhenreiConst.SHUNOHOHO_HENREILIST,
                SeikyuhenreiConst.KESSAIHOHO);

        // マイページユーザーID
        doEmptyDigitsFormatCheck(inputBean.getMyPageUserID(), SeikyuhenreiConst.DIGITS_8,
                SeikyuhenreiConst.HALFNUMONLY, SeikyuhenreiConst.MYPAGEUSERID);

        // 請求返戻明細リスト
        doSeikyuHenreiMeisaiListCheck(inputBean.getSeikyuHenreiMeisaiList());

        // 関連チェック
        doKessaiKingakuRelatedCheck(inputBean);

        // 他機能処理中チェック
        doSeikyuhenreiShorichuCheck(inputBean.getSeikyuHenreiKanriNO(), inputBean.getShoriShubetsu(),
                inputBean.getLineCD(), inputBean.getSeikyuHenreiMeisaiList());

    }

    /**
     * 請求登録、返戻登録共通:請求返戻明細チェック
     *
     * @param seikyuHenreiMeisaiList 請求返戻明細リスト
     * @throws Exception
     *
     */
    public static void doSeikyuHenreiMeisaiListCheck(List<SeikyuHenreiMeisai> seikyuHenreiMeisaiList) throws Exception {
        // 必須チェック
        if (ListUtil.isEmpty(seikyuHenreiMeisaiList)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00001, SeikyuhenreiConst.SEIKYUHENREIMEISAILIST));
        }

        // エラーメッセージ
        String errMsg = SeikyuhenreiConst.SEIKYUHENREIMEISAILIST + StringConst.DOT;

        for (SeikyuHenreiMeisai meisai : seikyuHenreiMeisaiList) {

            // 枝番
            doEmptyDigitsFormatCheck(meisai.getEdaban(), SeikyuhenreiConst.DIGITS_5,
                    SeikyuhenreiConst.HALFNUMONLY, errMsg + SeikyuhenreiConst.EDABAN);

            // 請求種別
            doEmptyExistsCheck(meisai.getSeikyuShubetsu(), SeikyuhenreiConst.SEIKYUSHUBETSULIST, errMsg + SeikyuhenreiConst.SEIKYUSHUBETSU);

            // 請求返戻区分
            String seikyuHenreiKBN = meisai.getSeikyuHenreiKBN();
            doEmptyExistsCheck(seikyuHenreiKBN, SeikyuhenreiConst.SEIKYUHENREIKBNLIST,
                    errMsg + SeikyuhenreiConst.SEIKYUHENREIKBN);

            // 契約証番号
            doEmptyDigitsFormatCheck(meisai.getKeiyakuShouNO(), SeikyuhenreiConst.DIGITS_10,
                    SeikyuhenreiConst.HALFALPHANUMONLY, errMsg + SeikyuhenreiConst.KEIYAKUSHONO);

            // 操作番号
            doEmptyDigitsFormatCheck(meisai.getSosaNO(), SeikyuhenreiConst.DIGITS_3, SeikyuhenreiConst.HALFNUMONLY,
                    errMsg + SeikyuhenreiConst.SOSANO);

            // 請求返戻区分(明細)が請求の場合
            if (CodeConst.SeikyuHenreiKbn.SEIKYU.equals(seikyuHenreiKBN)) {
                // 払込方法
                String haraikomihouhou = meisai.getHaraikomihoho();
                doEmptyExistsCheck(haraikomihouhou, SeikyuhenreiConst.HARAIKOMIHOHOLIST,
                        errMsg + SeikyuhenreiConst.HARAIKOMIHOHO);

                // 回払いの場合
                if (SeikyuhenreiConst.HARAIKOMIHOHO_BUNKATSU_LIST.contains(haraikomihouhou)) {

                    // 払込回数
                    doEmptyFormatCheck(meisai.getHaraikomiKaisu(), SeikyuhenreiConst.HALFNUMONLY,
                            errMsg + SeikyuhenreiConst.HARAIKOMIKAISU);

                    // 請求回目
                    doEmptyFormatCheck(meisai.getSeikyuKaime(), SeikyuhenreiConst.HALFNUMONLY,
                            errMsg + SeikyuhenreiConst.SEIKYUKAIME);
                }
            }

            // 決済金額
            String kessaiKingakuMeisai = meisai.getKessaiKingaku();
            doEmptyFormatCheck(kessaiKingakuMeisai, SeikyuhenreiConst.HALFNUMONLY,
                    errMsg + SeikyuhenreiConst.KESSAIKINGAKU);
        }
    }

    /**
     * 決済金額の範囲チェック
     * 最小値と最大値可能
     *
     * @param kessaiKingaku 決済金額
     * @param min 最小値
     * @param max 最大値
     * @throws Exception
     *
     */
    public static void doKessaiKingakuRangeCheck(long kessaiKingaku, int min, long max) throws Exception {
        // 決済金額範囲チェック
        if (kessaiKingaku < min || kessaiKingaku > max) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00005, SeikyuhenreiConst.KESSAIKINGAKU,
                    SeikyuhenreiConst.KYOYOKINGAKU));
        }
    }

    /**
     * 決済金額の範囲チェック
     * 最小値不可、最大値可能
     *
     * @param kessaiKingaku 決済金額
     * @param min 最小値
     * @param max 最大値
     * @throws Exception
     *
     */
    public static void doKessaiKingakuRangeCheckByNotAllowMin(long kessaiKingaku, int min, long max) throws Exception {
        // 決済金額範囲チェック
        // 最小値不可、最大値可能
        if (kessaiKingaku <= min || kessaiKingaku > max) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00005, SeikyuhenreiConst.KESSAIKINGAKU,
                    SeikyuhenreiConst.KYOYOKINGAKU));
        }
    }

    /**
     * メンテナンス時間管理チェック
     *
     * @param systemCdList 対象システムコード
     * @throws Exception
     *
     */
    public static void doMaintenanceChuCheck(List<String> systemCdList) throws Exception {
        // メンテナンス中チェック
        List<MGaibusystemmaintenancemst> maintenanceList = GaibuSystemMaintenanceMstUtil.select(systemCdList,
                DateUtil.now());
        if (!ListUtil.isEmpty(maintenanceList)) {
            List<MCdmst> mcdList = CodeMstUtil.getCdmstByShuShubetsuCD(CodeConst.SystemCD.SHUSHUBETSUCD);
            List<String> hyoujiList = mcdList.stream()
                    .filter(m -> systemCdList.contains(m.getShubetsuCD())) // システムコード
                    .map(MCdmst::getHyojiMongon) // 表示文言
                    .collect(Collectors.toList());
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00008, String.join(StringConst.COMMA, hyoujiList)));
        }
    }

    /**
     * 必須チェック
     *
     * @param item 項目
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doEmptyCheck(String item, String itemName) throws Exception {
        if (StringUtil.isEmpty(item)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00001, itemName));
        }
    }

    /**
     * マスタ存在チェック
     *
     * @param rangeList 範囲リスト
     * @param item 項目
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doExistsCheck(List<String> rangeList, String item, String itemName) throws Exception {
        if (!rangeList.contains(item)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00002, itemName));
        }
    }

    /**
     * 桁数チェック(最大桁数)
     *
     * @param item 項目
     * @param digits 桁数
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doDigitsCheck(String item, Integer digits, String itemName) throws Exception {
        if (StringUtil.isNotEmpty(item)) {
            if (item.getBytes(SeikyuhenreiConst.SHIFT_JIS).length > digits) {
                throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00004, itemName, digits.toString()));
            }
        }
    }

    /**
     * 桁数チェック(最大桁数)
     *
     * @param item 項目
     * @param digits 桁数
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doDigitsLenCheck(String item, Integer digits, String itemName) throws Exception {
        if (StringUtil.isNotEmpty(item)) {
            if (item.length() > digits) {
                throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00004, itemName, digits.toString()));
            }
        }
    }

    /**
     * 桁数チェック(固定桁数)
     *
     * @param item 項目
     * @param digits 桁数
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doFixedDigitsCheck(String item, Integer digits, String itemName) throws Exception {
        if (StringUtil.isNotEmpty(item)) {
            if (item.getBytes(SeikyuhenreiConst.SHIFT_JIS).length != digits) {
                throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00049, itemName, digits.toString()));
            }
        }
    }

    /**
     * 文字種チェック
     *
     * @param item 項目
     * @param format 文字種種類
     * @param itemName 項目名称
     * @throws Exception
     *
     */
    public static void doFormatCheck(String item, String format, String itemName) throws Exception {
        if (StringUtil.isEmpty(item)) {
            return;
        }
        String errMsg = MsgUtil.getMsg(MsgUtil.MSG_A_00002, itemName);
        // 半角
        if (SeikyuhenreiConst.HANKAKUONLY.equals(format)) {
            if (!SeikyuhenreiValidator.isHankakuOnly(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 半角数字
        else if (SeikyuhenreiConst.HALFNUMONLY.equals(format)) {
            if (!Validator.isValidNumOnly(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 半角数字またハイフン
        else if (SeikyuhenreiConst.HALFORHYPHEN.equals(format)) {
            if (!SeikyuhenreiValidator.isHalfNumHyphenOnly(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 半角英数字
        else if (SeikyuhenreiConst.HALFALPHANUMONLY.equals(format)) {
            if (!Validator.isValidHalfAlphaNum(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 半角英数字記号
        else if (SeikyuhenreiConst.HALFALPHANUMSYMBOLONLY.equals(format)) {
            if (!SeikyuhenreiValidator.isHalfAlpaNumSymbolsOnly(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 全角
        else if (SeikyuhenreiConst.ZENKAKUONLY.equals(format)) {
            if (!SeikyuhenreiValidator.isZenkakuOnly(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 許容されない記号('\;)
        else if (SeikyuhenreiConst.WELLNETREJECT.equals(format)) {
            if (SeikyuhenreiValidator.hasWellnetRejectByteSymbols(item)) {
                throw new LogicException(errMsg);
            }
        }
        // yyyyMMddHHmmまたyyyyMMdd
        else if (DateUtil.YYYYMMDDHHMM_2.equals(format) || DateUtil.YYYYMMDD.equals(format)) {
            if (!DateUtil.validDate(item, format)) {
                errMsg = MsgUtil.getMsg(MsgUtil.MSG_A_00006, itemName);
                throw new LogicException(errMsg);
            }
        }
        // hh:mm-hh:mm
        else if (SeikyuhenreiConst.HHMMHHMM.equals(format)) {
            if (!SeikyuhenreiValidator.isHHMMHHMM(item)) {
                errMsg = MsgUtil.getMsg(MsgUtil.MSG_A_00006, itemName);
                throw new LogicException(errMsg);
            }
        }
        // 自由領域用チェック
        else if (SeikyuhenreiConst.MERCHANTFREE.equals(format)) {
            if (!SeikyuhenreiValidator.isPermission(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 自由領域1docomo用チェック
        else if (SeikyuhenreiConst.DOCOMO_MERCHANTFREE1.equals(format)) {
            if (!SeikyuhenreiValidator.isValidator(item)) {
                throw new LogicException(errMsg);
            }
        }
        // 送金_口座名義人チェック
        else {
            if (!SeikyuhenreiValidator.validatorSokinkozameigi(item)) {
                throw new LogicException(errMsg);
            }
        }
    }

    /**
     * 必須とマスタ存在チェック
     *
     * @param item 対象項目
     * @param rangeList 範囲リスト
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doEmptyExistsCheck(String item, List<String> rangeList, String itemName) throws Exception {
        doEmptyCheck(item, itemName);
        doExistsCheck(rangeList, item, itemName);
    }

    /**
     * 必須と桁数チェック
     *
     * @param item 対象項目
     * @param digits 桁数
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doEmptyDigitsCheck(String item, int digits, String itemName) throws Exception {
        doEmptyCheck(item, itemName);
        doDigitsCheck(item, digits, itemName);
    }

    /**
     * 必須と文字種チェック
     *
     * @param item 対象項目
     * @param format 文字種タイプ
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doEmptyFormatCheck(String item, String format, String itemName) throws Exception {
        doEmptyCheck(item, itemName);
        doFormatCheck(item, format, itemName);
    }

    /**
     * 桁数チェックと文字種チェック
     *
     * @param item 対象項目
     * @param digits 桁数
     * @param format 文字種タイプ
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doDigitsFormatCheck(String item, int digits, String format, String itemName)
            throws Exception {
        doDigitsCheck(item, digits, itemName);
        doFormatCheck(item, format, itemName);
    }

    /**
     * 必須と桁数チェックと文字種チェック
     *
     * @param item 対象項目
     * @param digits 桁数
     * @param format 文字種タイプ
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doEmptyDigitsFormatCheck(String item, int digits, String format, String itemName)
            throws Exception {
        doEmptyDigitsCheck(item, digits, itemName);
        doFormatCheck(item, format, itemName);
    }

    /**
     * 必須と桁数チェック(固定桁数)と文字種チェック
     *
     * @param item 対象項目
     * @param digits 桁数
     * @param format 文字種タイプ
     * @param itemName 対象項目名称
     * @throws Exception
     *
     */
    public static void doEmptyFixedDigitsFormatCheck(String item, int digits, String format, String itemName)
            throws Exception {
        doEmptyCheck(item, itemName);
        doFixedDigitsCheck(item, digits, itemName);
        doFormatCheck(item, format, itemName);
    }

    /**
     * 他機能処理中チェック
     *
     * @param seikyuHenreiKanriNO 請求返戻管理番号
     * @param shoriShubetsu 処理種別
     * @param lineCD ラインコード
     * @param seikyuHenreiMeisaiList 請求返戻明細リスト
     * @throws Exception
     *
     */
    public static void doSeikyuhenreiShorichuCheck(String seikyuHenreiKanriNO, String shoriShubetsu, String lineCD,
            List<SeikyuHenreiMeisai> seikyuHenreiMeisaiList) throws Exception {

        // 検索結果
        List<SeikyuHenreiBean> rsList;
        // 検索条件
        Map<String, Object> param = new HashMap<String, Object>();
        param.put(MapKeyConst.SHORICHUSTATUS, CodeConst.ShorichuStatus.HI_SHORICHU);
        // 請求登録また返戻登録の場合
        if (CodeConst.SeikyuHenreiShoriShubetsu.TOROKU.equals(shoriShubetsu)) {
            param.put(MapKeyConst.LINECD, lineCD);
            param.put(MapKeyConst.SEIKYUHENREIMEISAILIST, seikyuHenreiMeisaiList);
            rsList = SeikyuhenreicustomUtil.selectTorokuShorichuData(param);
        }
        // 請求取消また返戻取消の場合
        else {
            param.put(MapKeyConst.SEIKYUHENREIKANRINO, seikyuHenreiKanriNO);
            rsList = SeikyuhenreicustomUtil.selectTorikeshiShorichuData(param);
        }

        // 検索結果判定
        if (!ListUtil.isEmpty(rsList)) {

            // 請求返戻管理番号リスト
            List<String> seikyuhenreiKanriNoList = rsList.stream().map(s -> String.valueOf(s.getSeikyuHenreiKanriNO())).distinct()
                    .collect(Collectors.toList());
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00096, String.join(",", seikyuhenreiKanriNoList)));
        }
    }

    /**
     * 請求登録、返戻登録共通:決済金額関連チェック
     *
     * @param inputBean 入力情報
     * @throws Exception
     *
     */
    public static void doKessaiKingakuRelatedCheck(SeikyuhenreiInputBean inputBean) throws Exception {
        long total = 0L;
        for (SeikyuHenreiMeisai meisai : inputBean.getSeikyuHenreiMeisaiList()) {
            // 決済金額
            long kessaiKingakuMesai = Long.parseLong(meisai.getKessaiKingaku());
            if (CodeConst.SeikyuHenreiKbn.SEIKYU.equals(meisai.getSeikyuHenreiKBN())) {
                total += kessaiKingakuMesai;
            } else {
                total -= kessaiKingakuMesai;
            }
        }

        long kessaikingaku = Long.parseLong(inputBean.getKessaiKingaku());
        // 請求返戻区分が「返戻」の場合、合計金額が0以下のため負数へ変更
        if (CodeConst.SeikyuHenreiKbn.HENREI.equals(inputBean.getSeikyuHenreiKBN())) {
            kessaikingaku = -kessaikingaku;
        }

        // 決済金額と明細合計金額比較
        if (total != kessaikingaku) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00007, SeikyuhenreiConst.KESSAIKINGAKU,
                    SeikyuhenreiConst.MEISAIKINGAKU_GOKEI));
        }
    }

    /**
     * 取消可能チェック
     *
     * @param rangeList 取消可能範囲リスト
     * @param seikyuHenreiStatus 請求返戻ステータス
     * @param shorishubetsu 処理種別
     * @param seikyuhenreikanriNO 請求返戻管理番号
     * @throws Exception
     *
     */
    public static void doTorikeshikanoCheck(List<String> rangeList, String seikyuHenreiStatus, String shorishubetsu,
            String seikyuhenreikanriNO) throws Exception {
        if (!rangeList.contains(seikyuHenreiStatus)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00045, shorishubetsu, seikyuhenreikanriNO));
        }
    }

    /**
     * 請求登録時の共通処理(決済前処理)
     * 請求返戻管理登録、請求返戻明細登録、請求返戻商品登録、請求返戻管理履歴登録
     *
     * @param inputBean 入力情報
     * @param gyoumuDate 業務日付
     * @param shunoDaikoKaishaCD 収納代行会社コード
     * @param saiSeikyuSaiHenreiTaishoFLG 再請求再返戻対象フラグ
     * @param shiharaiKigen 支払期限
     * @return 登録された請求返戻管理情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreikanri doSeikyuhenreiCommon(SeikyuhenreiInputBean inputBean, Date gyoumuDate,
            String shunoDaikoKaishaCD, String saiSeikyuSaiHenreiTaishoFLG, Date shiharaiKigen) throws Exception {

        // 請求返戻管理情報登録
        TSeikyuhenreikanri seikyuhenreikanri = insertSeikyuhenreikanri(inputBean, gyoumuDate, shunoDaikoKaishaCD,
                saiSeikyuSaiHenreiTaishoFLG, shiharaiKigen);

        // 請求返戻明細と請求返戻商品管理登録
        insertMeisaiAndShohinkanri(inputBean, seikyuhenreikanri.getSeikyuHenreiKanriNO());

        // 請求返戻管理履歴登録
        insertSeikyuhenreikanririreki(seikyuhenreikanri, gyoumuDate);

        return seikyuhenreikanri;

    }

    /**
     * 返戻登録時の共通処理(決済前処理)
     * 請求返戻管理登録、請求返戻明細登録、請求返戻商品登録、請求返戻管理履歴登録
     *
     * @param inputBean 入力情報
     * @param gyoumuDate 業務日付
     * @param shunoDaikoKaishaCD 収納代行会社コード
     * @param systemDate システム日付
     * @return 登録された請求返戻管理情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreikanri doHenreiTorokuCommon(SeikyuhenreiInputBean inputBean, Date gyoumuDate,
            String shunoDaikoKaishaCD, Date systemDate) throws Exception {

        // 請求返戻管理情報登録
        TSeikyuhenreikanri seikyuhenreikanri = insertHenreiTorokuSeikyuhenreikanri(inputBean, shunoDaikoKaishaCD,
                systemDate);

        // 請求返戻明細と請求返戻商品管理登録
        insertMeisaiAndShohinkanri(inputBean, seikyuhenreikanri.getSeikyuHenreiKanriNO());

        // 請求返戻管理履歴登録
        insertSeikyuhenreikanririreki(seikyuhenreikanri, gyoumuDate);

        // 請求返戻管理情報更新
        seikyuhenreikanri = updateSeikyuhenreiStatus(seikyuhenreikanri, CodeConst.ShorichuStatus.WEB_SHORICHU);

        // コミット
        DAOFactory.commit();

        return seikyuhenreikanri;

    }

    /**
     * 請求返戻管理テーブル処理中更新
     *
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param shorichuStatus 処理中ステータス
     * @return 登録された請求返戻管理情報
     * @throws Exception
     */
    public static TSeikyuhenreikanri updateSeikyuhenreiStatus(TSeikyuhenreikanri seikyuhenreikanri, String shorichuStatus) throws Exception {

        // 処理中ステータス
        seikyuhenreikanri.setShorichuStatus(shorichuStatus);

        // 更新実行
        seikyuhenreikanri = SeikyuhenreikanriUtil.update(seikyuhenreikanri);
        return seikyuhenreikanri;
    }

    /**
     * 決済金額0円処理
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param gyoumuDate 業務日付
     * @param seikyuHenreiIraiDate 請求返戻依頼日
     * @param seikyuhenreikaisu 請求返戻回数
     * @return 結果マップ
     * @throws Exception
     *
     */
    public static Map<String, Object> doSeikyuTorokuZeroYen(SeikyuhenreiInputBean inputBean,
            TSeikyuhenreikanri seikyuhenreikanri, Date gyoumuDate, Date seikyuHenreiIraiDate, Integer seikyuhenreikaisu)
            throws Exception {

        // 請求返戻管理更新
        updateSeikyuhenreikanri(seikyuhenreikanri, inputBean.getKessaihoho(), gyoumuDate, seikyuHenreiIraiDate,
                seikyuhenreikaisu);

        // 請求返戻管理履歴登録
        insertSeikyuhenreikanririreki(seikyuhenreikanri, gyoumuDate);

        // コミット
        DAOFactory.commit();

        // 応答情報を作成
        return createResultMap(inputBean, SeikyuhenreiConst.RESULTCD_OK, seikyuhenreikanri.getSeikyuHenreiKanriNO(),
                seikyuhenreikanri.getSeikyuHenreiStatus());
    }

    /**
     * 請求登録時、請求返戻管理履歴登録処理
     *
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param gyoumuDate 業務日付
     * @return 請求返戻管理履歴情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreikanririreki insertSeikyuhenreikanririreki(TSeikyuhenreikanri seikyuhenreikanri,
            Date gyoumuDate) throws Exception {

        // 該当請求返戻管理番号により最大請求返戻管理履歴通番を検索
        int maxSeikyuHenreiKanriRirekiTsuban = SeikyuhenreicustomUtil
                .selectMaxRirekiTsuban(seikyuhenreikanri.getSeikyuHenreiKanriNO());

        // 請求返戻管理履歴
        TSeikyuhenreikanririreki insertkanriRirekiBean = new TSeikyuhenreikanririreki();
        insertkanriRirekiBean.setSeikyuHenreiKanriNO(seikyuhenreikanri.getSeikyuHenreiKanriNO());
        insertkanriRirekiBean.setSeikyuHenreiKanriRirekiTsuban(maxSeikyuHenreiKanriRirekiTsuban + 1);
        insertkanriRirekiBean.setSeikyuHenreiStatus(seikyuhenreikanri.getSeikyuHenreiStatus());
        insertkanriRirekiBean.setSaiSeikyuHenreiYoteiDate(seikyuhenreikanri.getSaiSeikyuHenreiYoteiDate());
        insertkanriRirekiBean.setSeikyuHenreiKanriRirekiHenkoDate(gyoumuDate);

        // 登録処理とリターン
        return SeikyuhenreikanririrekiUtil.insert(insertkanriRirekiBean);
    }

    /**
     * 返戻管理履歴取得処理
     *
     * @param parameter (契約証番号)
     * @return 請求返戻管理履歴情報
     * @throws Exception
     *
     */
    public static List<Map<String, Object>> getSeikyuhenreikanririreki(Map<String, Object> parameter) throws Exception {
        return SeikyuhenreikanririrekiUtil.get(parameter);
    }

    /**
     * 請求登録時、請求返戻中間登録処理
     *
     * @param tranPkey トランテーブルキー
     * @param seikyuhenreikanriNO 請求返戻管理番号
     * @return 請求返戻管理履歴情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreichukantable insertSeikyuhenreichukantable(Long tranPkey, Long seikyuhenreikanriNO)
            throws Exception {

        // 請求返戻中間情報
        TSeikyuhenreichukantable seikyuhenreichukantable = new TSeikyuhenreichukantable();
        seikyuhenreichukantable.setSeikyuHenreiKanriNO(seikyuhenreikanriNO);
        seikyuhenreichukantable.setKessaiBetsuKanriNO(tranPkey);

        // 登録とリターン
        return SeikyuhenreichukantableUtil.insert(seikyuhenreichukantable);
    }

    /**
     * 結果マップ作成(共通部分)
     *
     * @param inputBean 入力情報
     * @param resultCD 結果コード
     * @param seikyuhenreikanriNO 請求返戻管理番号
     * @param seikyuhenreiStatus 請求返戻ステータス
     * @return 結果マップ
     * @throws Exception
     *
     */
    public static Map<String, Object> createResultMap(SeikyuhenreiInputBean inputBean, String resultCD,
            Long seikyuhenreikanriNO, String seikyuhenreiStatus) throws Exception {
        // 結果マップ
        Map<String, Object> rsMap = new HashMap<String, Object>();
        rsMap.put(MapKeyConst.RESPONSEID, inputBean.getRequestID());
        rsMap.put(MapKeyConst.RESULTCD, resultCD);
        rsMap.put(MapKeyConst.SEIKYUHENREIKANRINO, String.valueOf(seikyuhenreikanriNO));
        rsMap.put(MapKeyConst.SEIKYUHENREISTATUS, seikyuhenreiStatus);

        // 結果がNGの場合、システムメール送信し、後続処理しない
        if (SeikyuhenreiConst.RESULTCD_NG.equals(resultCD)) {
            // 結果が失敗の場合
            doFailedHandle(inputBean, seikyuhenreikanriNO, rsMap, null);
        }
        return rsMap;
    }

    /**
     * 外部システム連携時例外発生処理
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param systemDate システム日付
     * @param e 発生した例外
     * @throws Exception
     *
     */
    public static void doSeikyuHenreiException(SeikyuhenreiInputBean inputBean, TSeikyuhenreikanri seikyuhenreikanri,
            Date systemDate, Exception e) throws Exception {
        // 請求返戻管理更新
        seikyuhenreikanri.setShorichuStatus(CodeConst.ShorichuStatus.HI_SHORICHU);
        seikyuhenreikanri.setErrHasseibiJi(systemDate);
        SeikyuhenreikanriUtil.update(seikyuhenreikanri);

        // コミット
        DAOFactory.commit();

        // 例外処理:システムメール送信
        doFailedHandle(inputBean, seikyuhenreikanri.getSeikyuHenreiKanriNO(), null, e);
    }

    /**
     * 失敗処理
     *
     * @param bean 入力情報
     * @param seikyuhenreikanriNO 請求返戻管理番号
     * @param output 結果情報
     * @param e 発生した例外
     * @throws Exception
     */
    private static void doFailedHandle(SeikyuhenreiInputBean bean, Long seikyuhenreikanriNO,
            Map<String, Object> output, Exception e) throws Exception {

        // システム送信のフリー項目
        String freeItem = getFreeItem(bean, seikyuhenreikanriNO, output, e);

        // システムメール設定
        SystemErrorInfo errInfo = getSystemErrorInfo(freeItem, e);

        // システムメール送信
        SystemMailUtil.sendSystemMail(new ArrayList<SystemErrorInfo>(Arrays.asList(errInfo)));
    }

    /**
     * システムメールフリー項目
     *
     * @param bean 入力情報
     * @param seikyuhenreikanriNO 請求返戻管理番号
     * @param output 結果情報
     * @param e 発生した例外
     * @return フリー項目
     *
     */
    private static String getFreeItem(SeikyuhenreiInputBean bean, Long seikyuhenreikanriNO, Map<String, Object> output,
            Exception e) {

        // システムフリー項目
        StringBuilder sb = new StringBuilder();
        sb.append("要求ID:");
        sb.append(bean.getRequestID());
        // 処理失敗の場合
        if (null != output) {
            sb.append(";結果コード:");
            sb.append(output.get(MapKeyConst.RESULTCD));
            sb.append(";請求返戻管理番号:");
            sb.append(output.get(MapKeyConst.SEIKYUHENREIKANRINO));
            sb.append(";請求返戻ステータス:");
            sb.append(output.get(MapKeyConst.SEIKYUHENREISTATUS));
        } else {
            // 処理例外の場合
            sb.append(";請求返戻管理番号:");
            sb.append(seikyuhenreikanriNO);
            sb.append(";マイページユーザーID:");
            sb.append(bean.getMyPageUserID());
            sb.append(";ラインコード:");
            sb.append(bean.getLineCD());
            sb.append(";請求返戻区分:");
            sb.append(bean.getSeikyuHenreiKBN());
            sb.append(";処理種別:");
            sb.append(bean.getShoriShubetsu());
            sb.append(";決済方法:");
            sb.append(bean.getKessaihoho());
        }
        return sb.toString();
    }

    /**
     * システムメール情報設定
     *
     * @param freeItem フリー項目
     * @param e 例外
     * @return システムメール情報
     * @throws Exception
     *
     */
    public static SystemErrorInfo getSystemErrorInfo(String freeItem, Exception e) throws Exception {

        SystemErrorInfo infoBean = new SystemErrorInfo();
        infoBean.setOccurTime(DateUtil.dateToString(DateUtil.now(), DateUtil.YYYYMMDDHHMMSS));
        infoBean.setOccurServer(InetAddress.getLocalHost().getHostName());
        infoBean.setOccurClass("");
        infoBean.setId("");
        infoBean.setErrorKubun(MailConst.RETURN_CODE_ABNORMAL_END);
        if (null != e) {
            infoBean.setMessage("外部システム連携が例外発生しました。");
            infoBean.setExceptionInfo(ArrayUtils.toString(e.getStackTrace()));
        } else {
            infoBean.setMessage("外部システム連携が失敗しました。");
            infoBean.setExceptionInfo("");
        }
        infoBean.setFreeItem(freeItem);
        return infoBean;
    }

    /**
     * 請求登録_請求返戻管理情報取得
     *
     * @param seikyuHenreiKanriNO 請求返戻管理番号
     * @return 既存請求返戻管理情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreikanri getSeikyuhenreikanriInfo(String seikyuHenreiKanriNO) throws Exception {
        // 請求返戻番号が空の場合
        SeikyuhenreiUtil.doEmptyCheck(seikyuHenreiKanriNO, SeikyuhenreiConst.SEIKYUHENREIKANRINO);

        // 検索
        TSeikyuhenreikanri seikyuhenreikanri = SeikyuhenreicustomUtil.selectSeikyuhenreiByKanriNO(seikyuHenreiKanriNO);

        // ない場合
        if (null == seikyuhenreikanri) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00003,
                    SeikyuhenreiConst.SEIKYUHENREIKANRINO + StringConst.COLON + seikyuHenreiKanriNO));
        }
        return seikyuhenreikanri;
    }

    /**
     * 次期配信後払入金時、請求返戻管理情報取得
     *
     * @param inputBean 入力パラメータ
     * @return 請求返戻管理情報
     * @throws Exception
     */
    public static TSeikyuhenreikanri getJikihaishinAtobaraiSeikyuhenreikanriInfo(SeikyuhenreiInputBean inputBean) throws Exception {

        // 検索条件
        TSeikyuhenreikanriExample selectParam = new TSeikyuhenreikanriExample();
        TSeikyuhenreikanriExample.Criteria criteria = selectParam.createCriteria();
        // 請求返戻管理番号
        criteria.andSeikyuHenreiKanriNOEqualTo(Long.parseLong(inputBean.getSeikyuHenreiKanriNO()));
        // 収納代行会社コード:代理店
        criteria.andShunoDaikoKaishaCDEqualTo(CodeConst.ShunoDaikoKaishaCd.AGENT);
        // 収納方法_予定:現金振込また現金振込以外また前払式支払手段また残金支払い
        criteria.andShunoHohoYoteiIn(SeikyuhenreiConst.SHUNOHOHO_JIKIHAISHINLIST);
        // 収納方法_実績
        criteria.andShunoHohoJissekiIsNull();
        // エラー発生日時
        criteria.andErrHasseibiJiIsNull();
        // 処理中ステータス:非処理中
        criteria.andShorichuStatusEqualTo(CodeConst.ShorichuStatus.HI_SHORICHU);
        // 請求の場合
        if (CodeConst.SeikyuHenreiKbn.SEIKYU.equals(inputBean.getSeikyuHenreiKBN())) {
            // 請求返戻ステータス:「請求待ち」
            criteria.andSeikyuHenreiStatusEqualTo(CodeConst.SeikyuHenreiStatus.SEIKYU_MACHI);
        }
        // 返戻の場合
        else {
            // 請求返戻ステータス:「返戻待ち」
            criteria.andSeikyuHenreiStatusEqualTo(CodeConst.SeikyuHenreiStatus.HENREI_MACHI);
        }

        // 検索結果
        List<TSeikyuhenreikanri> seikyuhenreikanriList = SeikyuhenreikanriUtil.select(selectParam);
        if (ListUtil.isEmpty(seikyuhenreikanriList)) {
            throw new LogicException(MsgUtil.getMsg(MsgUtil.MSG_A_00003,
                    SeikyuhenreiConst.SEIKYUHENREIKANRINO + StringConst.COLON + inputBean.getSeikyuHenreiKanriNO()));
        }

        // 請求返戻管理情報を格納
        return seikyuhenreikanriList.get(0);
    }

    /**
     * 請求取消メイン処理(コンビニ・ペイジーかつ入金待ち以外の場合)
     * 返戻取消メイン処理(すべてのパターン)
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param systemDate システム日付
     * @return 結果マップ
     * @throws Exception
     */
    public static Map<String, Object> doTorikeshiMain(SeikyuhenreiInputBean inputBean,
            TSeikyuhenreikanri seikyuhenreikanri, Date systemDate) throws Exception {

        // 取消日時:システム日時
        seikyuhenreikanri.setTorikeshiDate(systemDate);
        // 請求返戻ステータス:「取消済み」
        seikyuhenreikanri.setSeikyuHenreiStatus(CodeConst.SeikyuHenreiStatus.TORIKESHI_ZUMI);

        // 更新処理
        SeikyuhenreikanriUtil.update(seikyuhenreikanri);

        return createResultMap(inputBean, SeikyuhenreiConst.RESULTCD_OK, seikyuhenreikanri.getSeikyuHenreiKanriNO(),
                seikyuhenreikanri.getSeikyuHenreiStatus());
    }

    /**
     * 請求登録時、請求返戻管理更新処理(0円の場合)
     *
     * @param seikyuhenreikanri 請求返戻管理情報
     * @param shunohoho 収納方法
     * @param gyoumuDate 業務日付
     * @param seikyuHenreiIraiDate 請求返戻依頼日
     * @param seikyuhenreikaisu 請求返戻回数
     * @return 請求返戻管理情報
     * @throws Exception
     *
     */
    private static TSeikyuhenreikanri updateSeikyuhenreikanri(TSeikyuhenreikanri seikyuhenreikanri, String shunohoho,
            Date gyoumuDate, Date seikyuHenreiIraiDate, Integer seikyuhenreikaisu) throws Exception {

        // 請求返戻ステータス:入金済み
        seikyuhenreikanri.setSeikyuHenreiStatus(CodeConst.SeikyuHenreiStatus.NYUKIN_ZUMI);
        // 収納方法_実績
        seikyuhenreikanri.setShunoHohoJisseki(shunohoho);
        // 仮想口座の場合、請求返戻回数を更新しない
        if (null != seikyuhenreikaisu) {
            // 請求返戻回数
            seikyuhenreikanri.setSeikyuHenreiKaisu(seikyuhenreikaisu);
        }
        // 決済金額:"0"
        seikyuhenreikanri.setKessaiKingaku(SeikyuhenreiConst.KESSAIKINGAKU_ZERO);
        // 請求返戻依頼日
        seikyuhenreikanri.setSeikyuHenreiIraiDate(seikyuHenreiIraiDate);
        // 入金処理日
        seikyuhenreikanri.setNyukinShoriDate(gyoumuDate);

        // 更新とリターン
        return SeikyuhenreikanriUtil.update(seikyuhenreikanri);
    }

    /**
     * 請求登録時、請求返戻管理登録Bean作成
     *
     * @param inputBean 入力情報
     * @param gyoumuDate 業務日付
     * @param shunoDaikoKaishaCD 収納代行会社コード
     * @param saiSeikyuSaiHenreiTaishoFLG 再請求再返戻対象フラグ
     * @param shiharaiKigen 支払期限
     * @return 請求返戻管理登録Bean
     * @throws Exception
     */
    public static TSeikyuhenreikanri insertSeikyuhenreikanri(SeikyuhenreiInputBean inputBean, Date gyoumuDate,
            String shunoDaikoKaishaCD, String saiSeikyuSaiHenreiTaishoFLG, Date shiharaiKigen) throws Exception {
        TSeikyuhenreikanri seikyuhenreikanri = new TSeikyuhenreikanri();
        // システムコード
        seikyuhenreikanri.setSystemCD(RequestContext.getSystemCD());
        // 処理中ステータス:非処理中
        seikyuhenreikanri.setShorichuStatus(CodeConst.ShorichuStatus.HI_SHORICHU);
        // 請求返戻ステータス:請求待ち
        seikyuhenreikanri.setSeikyuHenreiStatus(CodeConst.SeikyuHenreiStatus.SEIKYU_MACHI);
        // 請求返戻区分
        seikyuhenreikanri.setSeikyuHenreiKBN(inputBean.getSeikyuHenreiKBN());
        // 即時予定区分
        seikyuhenreikanri.setSokujiYoteiKBN(inputBean.getSokujiYoteiKBN());
        // 請求返戻金額
        seikyuhenreikanri.setSeikyuHenreiKingaku(Long.parseLong(inputBean.getKessaiKingaku()));
        // 請求返戻回数:"0"
        seikyuhenreikanri.setSeikyuHenreiKaisu(SeikyuhenreiConst.SEIKYUHENREIKAISU_ZERO);
        // 収納方法_予定
        seikyuhenreikanri.setShunoHohoYotei(inputBean.getKessaihoho());
        // 請求返戻予定日
        if (CodeConst.SokujiYoteiKbn.SOKUJI.equals(inputBean.getSokujiYoteiKBN())) {
            // 即時の場合、業務日付
            seikyuhenreikanri.setSeikyuHenreiYoteiDate(gyoumuDate);
        } else {
            // 予定の場合
            seikyuhenreikanri.setSeikyuHenreiYoteiDate(DateUtil.stringToDate(inputBean.getSeikyuHenreiYoteiDate(),
                    DateUtil.YYYYMMDD));
        }
        // 支払・送金依頼期限
        seikyuhenreikanri.setShiharaiSokinIraiKigen(shiharaiKigen);
        // 再請求再返戻対象フラグ
        if (StringUtil.isNotEmpty(saiSeikyuSaiHenreiTaishoFLG)) {
            seikyuhenreikanri.setSaiSeikyuSaiHenreiTaishoFLG(Byte.valueOf(saiSeikyuSaiHenreiTaishoFLG));
        }
        // 収納代行会社依頼ステータス:未処理
        seikyuhenreikanri.setShunoDaikoKaishaIraiStatus(CodeConst.ShunoDaikoKaishaIraiStatus.MI_SHORI);
        // 領収元区分
        if (SeikyuhenreiConst.AGENT_RYOSHULIST.contains(inputBean.getKessaihoho())) {
            // 代理店領収
            seikyuhenreikanri.setRyoshuMotoKBN(CodeConst.RyoshuMotoKbn.AGENT_RYOSHU);
        } else {
            // JI領収
            seikyuhenreikanri.setRyoshuMotoKBN(CodeConst.RyoshuMotoKbn.JI_RYOSHU);
        }
        // 収納代行会社コード
        seikyuhenreikanri.setShunoDaikoKaishaCD(shunoDaikoKaishaCD);
        // マイページユーザーID
        seikyuhenreikanri.setMyPageUserID(Long.parseLong(inputBean.getMyPageUserID()));

        // 次期配信かつHOST計上不要フラグが'true'の場合
        if (SeikyuhenreiConst.SHUNOHOHO_JIKIHAISHINLIST.contains(inputBean.getKessaihoho())
                && StringConst.TRUE.equalsIgnoreCase(inputBean.getHostKeijofuyoFlg())) {
            // 精算データホスト連携ステータス:連携不要
            seikyuhenreikanri.setSeisanDataHostRenkeiStatus(CodeConst.SeisanDataHostRenkeiStatus.RENKEI_FUYO);
            // 伝票データホスト連携ステータス:連携不要
            seikyuhenreikanri.setDempyoDataHostRenkeiStatus(CodeConst.DempyoDataHostRenkeiStatus.RENKEI_FUYO);
        }
        // 上記以外の場合
        else {
            // 精算データホスト連携ステータス:未処理
            seikyuhenreikanri.setSeisanDataHostRenkeiStatus(CodeConst.SeisanDataHostRenkeiStatus.MI_SHORI);
            // 伝票データホスト連携ステータス:未処理
            seikyuhenreikanri.setDempyoDataHostRenkeiStatus(CodeConst.DempyoDataHostRenkeiStatus.MI_SHORI);
        }

        return SeikyuhenreikanriUtil.insert(seikyuhenreikanri);
    }

    /**
     * 返戻登録時、請求返戻管理登録Bean作成
     *
     * @param inputBean 入力情報
     * @param shunoDaikoKaishaCD 収納代行会社コード
     * @param systemDate システム日付
     * @return 請求返戻管理登録Bean
     * @throws Exception
     */
    public static TSeikyuhenreikanri insertHenreiTorokuSeikyuhenreikanri(SeikyuhenreiInputBean inputBean, String shunoDaikoKaishaCD, Date systemDate)
            throws Exception {

        TSeikyuhenreikanri seikyuhenreikanri = new TSeikyuhenreikanri();
        // システムコード
        seikyuhenreikanri.setSystemCD(RequestContext.getSystemCD());
        // 処理中ステータス:非処理中
        seikyuhenreikanri.setShorichuStatus(CodeConst.ShorichuStatus.HI_SHORICHU);
        // 請求返戻ステータス:返戻待ち
        seikyuhenreikanri.setSeikyuHenreiStatus(CodeConst.SeikyuHenreiStatus.HENREI_MACHI);
        // 請求返戻区分
        seikyuhenreikanri.setSeikyuHenreiKBN(CodeConst.SeikyuHenreiKbn.HENREI);
        // 即時予定区分
        seikyuhenreikanri.setSokujiYoteiKBN(CodeConst.SokujiYoteiKbn.SOKUJI);
        // 請求返戻金額
        seikyuhenreikanri.setSeikyuHenreiKingaku(Long.parseLong(inputBean.getKessaiKingaku()));
        // 請求返戻回数:"0"
        seikyuhenreikanri.setSeikyuHenreiKaisu(SeikyuhenreiConst.SEIKYUHENREIKAISU_ZERO);
        // 収納方法_予定
        seikyuhenreikanri.setShunoHohoYotei(inputBean.getKessaihoho());
        // 請求返戻予定日
        seikyuhenreikanri.setSeikyuHenreiYoteiDate(systemDate);
        // コンビニ・口座振込返戻の場合
        if (SeikyuhenreiConst.SHUNOHOHO_SOKINLIST.contains(inputBean.getKessaihoho())) {
            // 支払・送金依頼期限
            seikyuhenreikanri.setShiharaiSokinIraiKigen(
                    DateUtil.stringToDate(inputBean.getSokinIraiKigen(), DateUtil.YYYYMMDDHHMM_2));
        }
        // 収納代行会社依頼ステータス:未処理
        seikyuhenreikanri.setShunoDaikoKaishaIraiStatus(CodeConst.ShunoDaikoKaishaIraiStatus.MI_SHORI);
        // 収納代行会社コード
        seikyuhenreikanri.setShunoDaikoKaishaCD(shunoDaikoKaishaCD);
        // マイページユーザーID
        seikyuhenreikanri.setMyPageUserID(Long.parseLong(inputBean.getMyPageUserID()));

        // 次期配信かつHOST計上不要フラグが'true'の場合
        if (SeikyuhenreiConst.SHUNOHOHO_JIKIHAISHINLIST.contains(inputBean.getKessaihoho())
                && StringConst.TRUE.equalsIgnoreCase(inputBean.getHostKeijofuyoFlg())) {
            // 精算データホスト連携ステータス:連携不要
            seikyuhenreikanri.setSeisanDataHostRenkeiStatus(CodeConst.SeisanDataHostRenkeiStatus.RENKEI_FUYO);
            // 伝票データホスト連携ステータス:連携不要
            seikyuhenreikanri.setDempyoDataHostRenkeiStatus(CodeConst.DempyoDataHostRenkeiStatus.RENKEI_FUYO);
        }
        // 上記以外の場合
        else {
            // 精算データホスト連携ステータス:未処理
            seikyuhenreikanri.setSeisanDataHostRenkeiStatus(CodeConst.SeisanDataHostRenkeiStatus.MI_SHORI);
            // 伝票データホスト連携ステータス:未処理
            seikyuhenreikanri.setDempyoDataHostRenkeiStatus(CodeConst.DempyoDataHostRenkeiStatus.MI_SHORI);
        }
        return SeikyuhenreikanriUtil.insert(seikyuhenreikanri);
    }

    /**
     * 請求登録時、請求返戻明細と請求返戻商品管理登録
     *
     * @param inputBean 入力情報
     * @param seikyuhenreikanriNO 登録された請求返戻管理番号
     * @throws Exception
     *
     */
    public static void insertMeisaiAndShohinkanri(SeikyuhenreiInputBean inputBean, long seikyuhenreikanriNO)
            throws Exception {

        // 請求返戻明細登録リスト
        List<TSeikyuhenreimeisai> meisaiList = new ArrayList<TSeikyuhenreimeisai>();
        // 請求返戻商品登録リスト
        List<TSeikyuhenreishohinkanri> shohinkanriList = new ArrayList<TSeikyuhenreishohinkanri>();

        // 入力の明細リスト
        for (SeikyuHenreiMeisai meisai : inputBean.getSeikyuHenreiMeisaiList()) {
            // 請求返戻明細
            TSeikyuhenreimeisai insertMeisaiBean = createSeikyuhenreimeisaiBean(seikyuhenreikanriNO, meisai);
            meisaiList.add(insertMeisaiBean);

            // 請求返戻商品
            TSeikyuhenreishohinkanri shohinkanri = createSeikyuhenreishohinkanriBean(seikyuhenreikanriNO,
                    inputBean.getLineCD(), meisai);
            shohinkanriList.add(shohinkanri);
        }
        SeikyuhenreimeisaiUtil.insert(meisaiList);
        SeikyuhenreishohinkanriUtil.insert(shohinkanriList);
    }

    /**
     * 請求登録時、請求返戻明細登録Bean作成
     *
     * @param seikyuHenreiKanriNO 請求返戻管理番号
     * @param seikyuHenreiMeisai 入力明細情報
     * @return 請求返戻管理情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreimeisai createSeikyuhenreimeisaiBean(long seikyuHenreiKanriNO,
            SeikyuHenreiMeisai seikyuHenreiMeisai) throws Exception {
        // 請求返戻明細
        TSeikyuhenreimeisai insertMeisaiBean = new TSeikyuhenreimeisai();
        insertMeisaiBean.setSeikyuHenreiKanriNO(seikyuHenreiKanriNO);
        insertMeisaiBean.setEdaban(seikyuHenreiMeisai.getEdaban());
        insertMeisaiBean.setSeikyuShubetsu(seikyuHenreiMeisai.getSeikyuShubetsu());
        insertMeisaiBean.setSeikyuHenreiKBN(seikyuHenreiMeisai.getSeikyuHenreiKBN());
        insertMeisaiBean.setKessaiKingaku(Long.parseLong(seikyuHenreiMeisai.getKessaiKingaku()));
        insertMeisaiBean.setHaraikomihoho(seikyuHenreiMeisai.getHaraikomihoho());
        if (StringUtil.isNotEmpty(seikyuHenreiMeisai.getSeikyuKaime())) {
            insertMeisaiBean.setSeikyuKaime(Short.parseShort(seikyuHenreiMeisai.getSeikyuKaime()));
        }
        if (StringUtil.isNotEmpty(seikyuHenreiMeisai.getHaraikomiKaisu())) {
            insertMeisaiBean.setHaraikomiKaisu(Short.parseShort(seikyuHenreiMeisai.getHaraikomiKaisu()));
        }
        return insertMeisaiBean;
    }

    /**
     * 請求登録時、請求返戻商品管理登録Bean作成
     *
     * @param seikyuHenreiKanriNO 請求返戻管理番号
     * @param lineCD ラインコード
     * @param seikyuHenreiMeisai 請求返戻明細情報
     * @return 請求返戻管理情報
     * @throws Exception
     *
     */
    public static TSeikyuhenreishohinkanri createSeikyuhenreishohinkanriBean(long seikyuHenreiKanriNO, String lineCD,
            SeikyuHenreiMeisai seikyuHenreiMeisai) throws Exception {
        // 請求返戻商品管理
        TSeikyuhenreishohinkanri insertShohinkanriBean = new TSeikyuhenreishohinkanri();
        insertShohinkanriBean.setLineCD(lineCD);
        insertShohinkanriBean.setKeiyakuShoNO(seikyuHenreiMeisai.getKeiyakuShouNO());
        insertShohinkanriBean.setSosaNO(Long.parseLong(seikyuHenreiMeisai.getSosaNO()));
        insertShohinkanriBean.setSeikyuHenreiKanriNO(seikyuHenreiKanriNO);
        insertShohinkanriBean.setEdaban(seikyuHenreiMeisai.getEdaban());
        return insertShohinkanriBean;
    }

    /**
     * 文字変換
     *
     * @param item 値
     * @param itemName 項目名称
     * @return 転換された値
     * @throws Exception
     *
     */
    public static String convert(String itemName, String item) throws Exception {
        LOGGER.debug(itemName + SeikyuhenreiConst.CONVERTBEFORE + item);
        String itemAfter = MojiHenkanUtil.converMojiretsuByHenkanmst(item);
        LOGGER.debug(itemName + SeikyuhenreiConst.CONVERTAFTER + itemAfter);
        return itemAfter;
    }

}


日本 Japan
 ·日本中文新闻 日本26年新成人预估仅109万 与去年并列历史第二低
·日本中文新闻 日本皇居新年参贺突发裸奔事件 男子涉公然猥亵被捕
·日本中文新闻 印度宣布超越日本成为全球第四大经济体
·日本留学生活 在熟悉的城市,遇見不一樣的感受
·日本留学生活 求购一些水电燃气话费等公共料金请求书
·日本华人网络交流 制造信息垃圾的产业,这种现象在日本尤其普遍。
·日本华人网络交流 美军入侵 委内瑞拉领空 并非零伤亡
·日本华人网络交流 年末采购食品,恰时间就能全半价。
 ·中文新闻 马丁·克鲁内斯 (Martin Clunes) 在新剧中变身休·爱德华兹 (Huw Edw
·中文新闻 当朋友们讲述他们对他们的阴谋感到震惊以及他们如何向他们隐

日语考试

旅行管理

华人网出套资格考试用书,课本4本,习题6本,CD课时9张,16小时左右。7千出。位置东京,上板桥车站附近,东武东上线上,池袋,山手线上交易。微信qzq20198 评论 1111111 ...

日语考试

募集一起备考FP考试

华人网情况介绍‘ 本人打算明年1月先考3级 之后考2级想找小伙伴一起学习。 我滴情况是,社会人30代前半,人品端正热爱学习和户外运动 想持续保持学习和进步。 坐标最好是东京靠埼玉, ...

日语考试

行政书士资格考试

华人网今年十一月份打算考行政书士资格,有没有一起考试的小伙伴,可以加我微信,大家一起分享学习经验。同时更加欢迎考过的前辈给予指导!万分感谢! ...

日语考试

1v1辅导研究计划书(情报,通信专业)

华人网教育背景:985计算机+早大情报 辅导经历:曾在东京知名的理工孰任教,教授课程包括《高等数学》,《线性代数》,《形式语言》,《数理统计》,曾1v1辅导过多名学生的研究计划书。 ...

日语考试

找个小伙伴一起学习java

华人网准备明年入职,有资料可以共享给你,我是基本0开始的所以想互相监督,约定线上固定时间,守时素质高的,日语太差的别了,一起学习 评论 留下你的V我加你。举个例子,约定好每周 ...

日语考试

求书 ソーシャルワーク基盤と専門職

华人网求书 ソーシャルワーク基盤と専門職 评论 这本书应该是日本学校的教材,而且好像是较新版本,LZ是不是觉得这里比去书店找能更快找到? 评论 学校要用的书想便宜点买个二手的 ...