package com.dbs.mplus.controller.mobile;

import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Base64;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.dbs.mplus.MPlusConstants;
import com.dbs.mplus.exception.mobile.ApiCallException;
import com.dbs.mplus.exception.mobile.MobileControllerException;
import com.dbs.mplus.framework.FrameworkConstants;
import com.dbs.mplus.framework.exception.MPlusServiceException;
import com.dbs.mplus.framework.exception.service.LoginException;
import com.dbs.mplus.framework.service.menu.ServiceMenu;
import com.dbs.mplus.framework.service.mobile.user.MpLoginInfoService;
import com.dbs.mplus.framework.template.AbstractController;
import com.dbs.mplus.framework.util.ResponseUtil;
import com.dbs.mplus.service.MPlusConfigureService;
import com.dbs.mplus.service.MultiPartFileUtil;
import com.dbs.mplus.service.api.MPlusApi;
import com.dbs.mplus.service.api.MPlusApiCallService;
import com.dbs.mplus.service.mobile.user.repository.dao.MPlusUser;

/**
 * 진료
 *
 * @author seokhwan.chon
 *
 */
@Controller
@RequestMapping("/mobile/safety")
@ServiceMenu(menuId = "safety", description = "환자안전관리")
public class SafetyController extends AbstractController {

  private final Logger logger = LoggerFactory.getLogger(this.getClass());

  @Autowired
  private MPlusApiCallService apiCallService;

  @Autowired
  private MPlusConfigureService configureService;

  @Autowired
  private MpLoginInfoService mpLoginInfoService;

  /**
   * 환자안전관리 투약리스트조회
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getInjectionList.json", method = RequestMethod.POST)
  public Map<String, Object> getInjectionList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETINJECTIONLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 투약 ATC 바코드 호출
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getAtcPrescriptionList.json", method = RequestMethod.POST)
  public Map<String, Object> getAtcPrescriptionList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETATCPRESCRIPTIONLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 투약실시
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputInjection.json", method = RequestMethod.POST)
  public Map<String, Object> inputInjection(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTINJECTION, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 IVF리스트조회
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getInfusionList.json", method = RequestMethod.POST)
  public Map<String, Object> getInfusionList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETINFUSIONLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * IVF실시
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputStartInfusion.json", method = RequestMethod.POST)
  public Map<String, Object> inputStartInfusion(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTSTARTINFUSION, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * IVF종료
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputEndInfusion.json", method = RequestMethod.POST)
  public Map<String, Object> inputEndInfusion(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTENDINFUSION, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 채혈 조회
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getSpecimenList.json", method = RequestMethod.POST)
  public Map<String, Object> getSpecimenList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETSPECIMENLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 채혈실시
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/actSpecimen.json", method = RequestMethod.POST)
  public Map<String, Object> actSpecimen(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_ACTSPECIMEN, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 혈액 신청 리스트
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getBloodRequestList.json", method = RequestMethod.POST)
  public Map<String, Object> getBloodRequestList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETBLOODREQUESTLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 혈액신쳥
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputBloodRequest.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodRequest(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODREQUEST, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 혈액 확인 리스트
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getBloodReceiveList.json", method = RequestMethod.POST)
  public Map<String, Object> getBloodReceiveList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETBLOODRECEIVELIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 혈액확인
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputBloodReceive.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodReceive(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODRECEIVE, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 2020.02.10 Fatima 환자안전관리 수혈 확인 리스트
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getBloodCheckList.json", method = RequestMethod.POST)
  public Map<String, Object> getBloodCheckList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETBLOODCHECKLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 2020.02.10 Fatima 환자안전관리 수혈 상세정보 리스트
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getBloodDetailInfo.json", method = RequestMethod.POST)
  public Map<String, Object> getBloodDetailInfo(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETBLOODDETAILINFO, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 수혈확인
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputBloodCheck.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodCheck(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODCHECK, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 혈액 취소 리스트
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getBloodCancelList.json", method = RequestMethod.POST)
  public Map<String, Object> getBloodCancelList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETBLOODCANCELLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 혈액취소
   *
   * @param request
   * @param response
   * @param reqMap
   *
   */
  @RequestMapping(value = "/inputBloodCancel.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodCancel(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      List<Map<String, Object>> vitalList = (List<Map<String, Object>>) reqMap.get("param");
      List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

      for (int i = 0; i < vitalList.size(); i++) {
        Map<String, Object> result = this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODCANCEL, vitalList.get(i));
        // System.out.println("TEST2" + result);
        Object resultObj = result.get("result");
        if (resultObj != null) {
          if (((List<Map<String, Object>>) resultObj).size() > 0) {
            resultList.add(((List<Map<String, Object>>) resultObj).get(0));
          }
        }
        if ((i + 1) != resultList.size()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("ReturnVal", "FAIL");
          resultList.add(resultMap);
        }
      }

      return ResponseUtil.wrapExtraMessageResultMap(null, resultList);

    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 투약 리스트 조회
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getPrescriptionList.json", method = RequestMethod.POST)
  public Map<String, Object> getPrescriptionList(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETPRESCRIPTIONLIST, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /***
   * 
   * @param request
   * @param response
   * @param reqMap
   * @return
   * @throws MobileControllerException
   */
  @RequestMapping(value = "/getNfcDoctorId.json", method = RequestMethod.POST)
  public Map<String, Object> getNfcDoctorId(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.SAFETY_GETNFCDOCTORID, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /***
   * 
   * @param request
   * @param response
   * @param reqMap
   * @return
   * @throws MobileControllerException
   */
  @RequestMapping(value = "/doNfcLogin.json", method = RequestMethod.POST)
  @ResponseBody
  public Object doNfcLogin(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      // List<Map<String, Object>> result = (List<Map<String, Object>>)
      // this.apiCallService.call(MPlusApi.SAFETY_DONFCLOGIN, reqMap);
      // Map<String, Object> result =
      // this.apiCallService.call(MPlusApi.SAFETY_DONFCLOGIN, reqMap);

      List<Map<String, Object>> result = (List<Map<String, Object>>) this.apiCallService
          .execute(MPlusApi.SAFETY_DONFCLOGIN, reqMap);

      logger.error("result -- > " + result);

      // 로그인 실패 판별 (병원이 주는 결과값에 따라 달라질 수 있음)
      if (result.size() == 0) {
        throw new LoginException("mplus.auth.not.department", "소속된 진료과가 없습니다. 접속권한을 확인하세요", null);
      }

      if (result.size() == 1) {
        if (result.get(0).get("userId") == null) {
          throw new LoginException("mplus.auth.checkaccount", "아이디 또는 비밀번호를 다시 확인하세요", null);
        }
      }

      if (!result.get(0).get("returnCd").toString().equals("0000")) {
        // mplus.auth.checkaccount : client에는 response.msg로 '아이디 또는 비밀번호를 다시 확인하세요'가
        // 들어가게 됨
        // throw new LoginException("mplus.auth.checkaccount",
        // legacyResultList.get(0).get("returnMsg").toString(), null);
        MPlusUser mpUser = new MPlusUser();
        mpUser.setUserId(result.get(0).get("userId").toString());
        mpUser.setHospitalCd(result.get(0).get("hospitalCd").toString());
        // mpUser.setReturnCd(result.get(0).get("returnCd").toString());
        mpUser.setReturnMsg(result.get(0).get("returnMsg").toString());
        mpUser.setReturnMsg("");
        mpUser.setFailCnt(result.get(0).get("failCnt").toString());
        return mpUser;
      }

      Map<String, Object> userMap = result.get(0);
      List<Map<String, Object>> departmentList = new ArrayList<Map<String, Object>>();
      for (int i = 0; i < result.size(); i++) {
        Map<String, Object> department = new HashMap<String, Object>();
        department.put("userId", result.get(i).get("userId"));
        department.put("userNm", result.get(i).get("userNm"));
        department.put("deptCd", result.get(i).get("deptCd"));
        department.put("deptNm", result.get(i).get("deptNm"));
        department.put("jobKindCd", result.get(i).get("jobKindCd"));
        department.put("jobKindNm", result.get(i).get("jobKindNm"));
        department.put("userAuth", result.get(i).get("userAuth"));
        department.put("deptabbr", result.get(i).get("deptabbr"));
        department.put("dutplceinstnm", result.get(i).get("dutplceinstnm"));
        department.put("dutplcenm", result.get(i).get("dutplcenm"));
        department.put("jobposnm", result.get(i).get("jobposnm"));
        department.put("posdeptnm", result.get(i).get("posdeptnm"));
        department.put("posinstnm", result.get(i).get("posinstnm"));
        department.put("prfshipflagnm", result.get(i).get("prfshipflagnm"));
        department.put("systeminstnm", result.get(i).get("systeminstnm"));
        department.put("systemnm", result.get(i).get("systemnm"));
        department.put("unitnm", result.get(i).get("unitnm"));
        department.put("jobrespnm", result.get(i).get("jobrespnm"));
        // if( "W".equals(legacyResultList.get(i).get("jobKindCd"))) {
        // department.put("departmentTyp", "W");
        // } else {
        // department.put("departmentTyp", "D");
        // }
        departmentList.add(department);
      }

      userMap.put("departmentList", departmentList);
      MPlusUser mpUser = new MPlusUser();
      mpUser.setUserId(result.get(0).get("userId").toString());
      mpUser.setUserNm((String) userMap.get("userNm"));
      mpUser.setHospitalCd(reqMap.get("hospitalCd").toString());

      mpUser.setUserNm((String) userMap.get("userNm"));
      mpUser.setDepartmentList((List<Map<String, Object>>) userMap.get("departmentList"));

      // 세브란스 - 간호사의 소속이 병동이지 구분하기위해 쓰인 W는 N(간호사)으로 변경
      String jobKindCd = (String) userMap.get("jobKindCd");
      if ("W".equals(jobKindCd)) {
        jobKindCd = "N";
      }
      mpUser.setJobKindCd(jobKindCd);
      mpUser.setJobKindNm((String) userMap.get("jobKindNm"));

      // 세션에 사용자 정보 심기
      // 20190311 shinsunwoo (주의) mcare-plus-framework의 로그인 세션 생성시 마지막setAttribute에
      // SESSION.USER_DEVICE_ID를 체크하므로
      // 세션 수정 시, 마지막setAttribute는 SESSION SESSION.USER_DEVICE_ID를 유지해 주세요.
      final HttpSession session = request.getSession();
      // 사용자 ID
      session.setAttribute(FrameworkConstants.SESSION.USER_ID.getKey(), mpUser.getUserId());
      // 사용자 이름
      session.setAttribute(FrameworkConstants.SESSION.USER_NAME.getKey(), mpUser.getUserNm());
      // Hospital Code
      session.setAttribute(FrameworkConstants.SESSION.USER_HOSPITAL.getKey(), mpUser.getHospitalCd());
      // Job kind code
      session.setAttribute(MPlusConstants.SESSION.JOB_KIND_CD.getKey(), mpUser.getJobKindCd());
      // Job kind name
      session.setAttribute(MPlusConstants.SESSION.JOB_KIND_NM.getKey(), mpUser.getJobKindNm());
      // Device ID : 20190116 shinsunwoo 중복로그인 체크용 Device ID 적용
      session.setAttribute(FrameworkConstants.SESSION.USER_DEVICE_ID.getKey(), reqMap.get("deviceId").toString());

      // 20190118 shinsunwoo 중복로그인 체크, user id, user uuid를 DB에 insert or upate
      // 단독 db, 비부하 상태에서 등록 테스트에서 초당 188건 등록
      if (this.configureService.isSessionDuplicateCheck()) {
        mpLoginInfoService.insertUuid(mpUser.getUserId().toString(), reqMap.get("deviceId").toString()); // DB insert or
                                                                                                         // update
        // this.logger.debug("LoginInfo aaa = " + userId);
      }

      // 사용자가 자기 손으로 순순히 로그인 하는 경우에는 대부분 index page로 가야 하지만
      // 로그인하지 않은 상태에서 push를 받고, 로그인 한 다음에 어디로 가는 경우라던지 (2016.2.2.현재. 아직 고려되지 않고 있는
      // 서비스 경로임)
      // 로그인 된 상태에서 세션이 끊어졌는데 로그인이 필요한 어떤메뉴(예:번호표발급)를 누른 경우 자동로그인을 탄 다음에 해당 메뉴로 곧장 가기
      // 위해 필요함
      if (FrameworkConstants.URI_SPECIAL_PAGE.INDEX.getPage() != null) {
        // 이름은 page이지만, 사실 json요청일수도 있음
        mpUser.setNextPage(FrameworkConstants.URI_SPECIAL_PAGE.INDEX.getPage());
        // index로 보낼려면 이렇게....
        // user.setNextPage(MPlusConstants.URI_MP_INDEX);
      }

      return mpUser;
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 환정보조회 공통
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/getPocPatientInfo.json", method = RequestMethod.POST)
  public Map<String, Object> getPocPatientInfo(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_GETPOCPATIENTINFO, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 투약 실시
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/actMedication.json", method = RequestMethod.POST)
  public Map<String, Object> actMedication(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_ACTMEDICATION, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 수혈 1단계 저장
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/inputCheckupId.json", method = RequestMethod.POST)
  public Map<String, Object> inputCheckupId(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_INPUTCHECKUPID, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 환자안전관리 수혈 2~4단계 저장
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/inputBloodHealthCheck.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodHealthCheck(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

    } catch (MPlusServiceException ex) {
      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }

    // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
    // reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
    // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
    reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

    // 실행
    try {
      return this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODHEALTHCHECK, reqMap);
    } catch (ApiCallException ex) {
      if (this.logger.isDebugEnabled()) {
        this.logger.debug("예외발생", ex);
      }

      throw new MobileControllerException(ex.getCode(), ex.getMessage());
    }
  }

  /**
   * 수혈 인증저장
   *
   * @param request
   * @param response
   * @param reqMap
   */
  @RequestMapping(value = "/inputBloodSignData.json", method = RequestMethod.POST)
  public Map<String, Object> inputBloodSignData(HttpServletRequest request, HttpServletResponse response,
      @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
    // 접근권한 및 파라미터 정리
    try {
      reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

      /**
       * 1. Xml 데이터를 꺼냄
       * 2. euc-kr 로 변환
       * 3. base64 Encode
       * 4. reqMap 에 다시
       */
      String tempString = reqMap.get("bloodXmlData").toString(); 
      byte[] eucKrXmlData = tempString.getBytes("euc-kr");
      Base64.Encoder encoder = Base64.getEncoder();
      byte[] encodeXml = encoder.encode(eucKrXmlData);

      reqMap.put("bloodXmlData", new String(encodeXml));
    
      } catch (MPlusServiceException ex) {
        throw new MobileControllerException(ex.getCode(), ex.getMessage());
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      
        // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
//        reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
        // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
        reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

        // 실행
        try {
            return this.apiCallService.call(MPlusApi.MEDICAL_INPUTBLOODSIGNDATA , reqMap);
        } catch (ApiCallException ex) {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("예외발생", ex);
            }

            throw new MobileControllerException(ex.getCode(), ex.getMessage());
        }
    }
    
    /**
     * 부작용 리스트
     *
     * @param request
     * @param response
     * @param reqMap
     */
    @RequestMapping(value = "/getSideEffectList.json", method = RequestMethod.POST)
    public Map<String, Object> getSideEffectList(HttpServletRequest request, HttpServletResponse response,
                                                  @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
        // 접근권한 및 파라미터 정리
        try {
            reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

        } catch (MPlusServiceException ex) {
            throw new MobileControllerException(ex.getCode(), ex.getMessage());
        }

        // 20180612 shinsunwoo 세션에서 병원구분코드를 가져와서 추가함
//        reqMap.put("hospitalCd", reqMap.get("mpUserHospital"));
        // 20190125 shinsunwoo user IP를 서비스 호출 파라미터로 전달하여, 서비스 로그에 출력하
        reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

        // 실행
        try {
            return this.apiCallService.call(MPlusApi.MEDICAL_GETSIDEEFFECTLIST , reqMap);
        } catch (ApiCallException ex) {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("예외발생", ex);
            }

            throw new MobileControllerException(ex.getCode(), ex.getMessage());
        }
    }

    /**
     * 수혈중단 리스트
     *
     * @param request
     * @param response
     * @param reqMap
     */
    @RequestMapping(value = "/getTransStopReasonList.json", method = RequestMethod.POST)
    public Map<String, Object> getTransStopReasonList(HttpServletRequest request, HttpServletResponse response,
                                                  @RequestBody Map<String, Object> reqMap) throws MobileControllerException {
        // 접근권한 및 파라미터 정리
        try {
            reqMap = super.isAccessableMenu(this.getClass(), request, reqMap);

        } catch (MPlusServiceException ex) {
            throw new MobileControllerException(ex.getCode(), ex.getMessage());
        }
        reqMap.put("userIP", com.dbs.mplus.framework.util.HttpRequestUtil.getClientIpAddr(request));

        // 실행
        try {
            return this.apiCallService.call(MPlusApi.MEDICAL_GETTRANSSTOPREASONLIST , reqMap);
        } catch (ApiCallException ex) {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("예외발생", ex);
            }

            throw new MobileControllerException(ex.getCode(), ex.getMessage());
        }
    }

}
