日本华人论坛 程序编写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
 ·日本留学生活 求个大阪合租
·日本留学生活 自家房招租求
·日本留学生活 东京地区出9成新lv钱包
·日本育儿教育 孩子从国内过来如何学习日语
·日本育儿教育 明年四月横滨招月嫂
·日本育儿教育 请问咋让娃突破识字关?感谢分享中文共读和学习经验的妈妈
 ·中文新闻 东区明星迈克尔·格列柯,53 岁,将在第一次出生两年后第二次
·中文新闻 《爱情岛》明星卡米拉·瑟洛和杰米·朱维特在透露即将迎来第三

日语考试

旅行管理

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

日语考试

募集一起备考FP考试

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

日语考试

行政书士资格考试

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

日语考试

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

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

日语考试

找个小伙伴一起学习java

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

日语考试

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

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