/**
 * 
 */
package nc.impl.iufo.org;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ufida.iufo.pub.tools.AppDebug;

import nc.vo.bd.accessor.IBDData;
import nc.vo.iufo.org.OrgMemberVO;
import nc.vo.ml.MultiLangUtil;
import nc.vo.org.OrgQueryUtil;
import nc.vo.org.OrgVO;
import nc.vo.org.ReportOrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.trade.sqlutil.IInSqlBatchCallBack;
import nc.vo.trade.sqlutil.InSqlBatchCaller;

import nc.itf.iufo.org.IUfoeOrgMemberQrySrv;
import nc.itf.org.IOrgMetaDataIDConst;

import nc.pub.iufo.exception.UFOSrvException;
import nc.pub.templet.converter.util.helper.ExceptionUtils;

import nc.pubitf.bd.accessor.GeneralAccessorFactory;
import nc.pubitf.rbac.IFunctionPermissionPubService;

import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.bs.framework.common.NCLocator;

import nc.impl.iufo.utils.MultiLangTextUtil;

import nc.utils.iufo.StringUtil;

/**
 * 企业报表报表组织成员查询实现类
 * 
 * @author tianchuan
 * @created at 2013-4-18,下午15:23:26
 * 
 */
public class UfoeOrgMemberQryImpl implements IUfoeOrgMemberQrySrv {

  @SuppressWarnings("unchecked")
  @Override
  public OrgMemberVO[] loadFuncPermissionOrgMembers(String[] orgPks)
      throws UFOSrvException {
    if (orgPks == null || orgPks.length <= 0) {
      return null;
    }
    // OrgVO[] orgs = OrgQueryUtil.queryOrgVOByPks(orgPks);
    Collection<OrgVO> orgs = this.queryOrgByPks(orgPks);  
    // BaseDAO dao = new BaseDAO();
    if (orgs != null && orgs.size() > 0) {
      try {
        Map<String, OrgVO> map = new HashMap<String, OrgVO>(); 
        for (OrgVO orgVO : orgs) {
          map.put(orgVO.getPk_org(), orgVO); 
        }

        String[] funcOrgPks = orgPks;
        // List<ReportOrgVO> lstOrgVO = new ArrayList<ReportOrgVO>();
        // String filterClause = UFDSSqlUtil.getInClause(funcOrgPks,
        // ReportOrgVO.PK_REPORTORG);
        // Collection<ReportOrgVO> vos = dao.retrieveByClause(ReportOrgVO.class,
        // filterClause, ReportOrgVO.CODE);
        // lstOrgVO.addAll(vos);
        Collection<ReportOrgVO> vos = this.queryReportOrgByPks(funcOrgPks);

        List<OrgMemberVO> vOrgMem = new ArrayList<OrgMemberVO>();
        for (ReportOrgVO vo : vos) {
          OrgMemberVO member = new OrgMemberVO();
          OrgVO orgvo = map.get(vo.getPk_reportorg());
          //ncm xiang   20220316   加一个非空校验
          if(orgvo == null) {
				continue;
			}
          member.setPk_org(vo.getPk_reportorg());
          member.setOrgcode(vo.getCode());
          member.setOrgname(MultiLangTextUtil.getCurLangText(vo));

          member.setPk_fatherorg(orgvo.getPk_fatherorg());
          member.setEnablestate(orgvo.getEnablestate());
          member.setIsbusinessunit(orgvo.getIsbusinessunit());
          if (orgvo.getPk_corp() != null) {
            member.setPk_corp(orgvo.getPk_corp());
          }
          else {
            member.setPk_corp(orgvo.getPk_ownorg());
          }
          vOrgMem.add(member);
        }
        return vOrgMem.toArray(new OrgMemberVO[0]);
      }
      catch (Exception e) {
        AppDebug.debug(e);
        throw new UFOSrvException(e.getMessage(), e);
      }
    }
    return null;
  }

  @SuppressWarnings("unchecked")
  @Override
  public OrgMemberVO[] loadFuncPermissionOrgMembers(String cuserid,
      String funcode, String pkGroup) {
    List<OrgMemberVO> vOrgMem = new ArrayList<OrgMemberVO>();
    try {
      String[] orgPks = new String[0];

      orgPks =
          NCLocator.getInstance().lookup(IFunctionPermissionPubService.class)
          .getUserPermissionPkOrgs(cuserid, funcode, pkGroup);

      if (orgPks == null || orgPks.length <= 0) {
        return null;
      }
      OrgVO[] orgs = OrgQueryUtil.queryOrgVOByPks(orgPks);
      BaseDAO dao = new BaseDAO();
      if (orgs != null && orgs.length > 0) {

        Map<String, OrgVO> map = new HashMap<String, OrgVO>();
        for (OrgVO orgVO : orgs) {
          map.put(orgVO.getPk_org(), orgVO);
        }

        String[] funcOrgPks = orgPks;
        List<ReportOrgVO> lstOrgVO = new ArrayList<ReportOrgVO>();
        String filterClause =
            StringUtil.getInClause(funcOrgPks, ReportOrgVO.PK_REPORTORG);
        Collection<ReportOrgVO> vos = null;
        try {
          vos =
              dao.retrieveByClause(ReportOrgVO.class, filterClause,
                  ReportOrgVO.CODE);
          for (ReportOrgVO reportOrgVO : vos) {
            if (reportOrgVO != null
                && reportOrgVO.getCode().equals("NSSBTopOrgMonth")) {
              vos.remove(reportOrgVO);
              break;
            }
          }
        }
        catch (DAOException e) {
          ExceptionUtils.wrapException(e);
        }
        lstOrgVO.addAll(vos);

        /**
         * 纳税申报：报表情况查询节点，报表主组织需要过滤
         */
        //        List<ReportOrgVO> lstOrgsTax = new ArrayList<ReportOrgVO>();
        //        if (IUFONssbWord.NSSB_BSQKCQ_NODE.equals(funcode)) {
        //          // 查询纳税主体
        //          StringBuilder taxfilterClause =
        //              new StringBuilder(StringUtil.getInClause(funcOrgPks,
        //                  TaxentityVO.PK_ORG));
        //          taxfilterClause.append(" and dr=0 and enablestate = 2 ");
        //          Collection<TaxentityVO> taxlstOrgs =
        //              dao.retrieveByClause(TaxentityVO.class,
        //                  taxfilterClause.toString(), TaxentityVO.CODE, new String[] {
        //                    TaxentityVO.PK_ORG
        //                  });
        //          // 必须有纳税主体才可以
        //          if (taxlstOrgs == null || taxlstOrgs.size() == 0) {
        //            return null;
        //          }
        //          Set<String> setOrgsTax = new HashSet<String>();
        //          for (TaxentityVO vo : taxlstOrgs) {
        //            setOrgsTax.add(vo.getPk_org());
        //          }
        //
        //          // 用纳税主体过滤lstOrgs
        //          for (ReportOrgVO vo : lstOrgVO) {
        //            if (setOrgsTax.contains(vo.getPk_reportorg())) {
        //              lstOrgsTax.add(vo);
        //            }
        //          }
        //        }
        //        else {
        //          lstOrgsTax = lstOrgVO;
        //        }

        for (ReportOrgVO vo : lstOrgVO) {
          OrgMemberVO member = new OrgMemberVO();
          OrgVO orgvo = map.get(vo.getPk_reportorg());
          member.setPk_org(vo.getPk_reportorg());
          member.setOrgcode(vo.getCode());
          // edit by congdy 2015.10.15 当前语种名称为空时取主语种内容
          String orgName = MultiLangTextUtil.getCurLangText(vo);
          member.setOrgname(orgName == null ? vo.getName() : orgName);

          member.setPk_fatherorg(orgvo.getPk_fatherorg());
          member.setEnablestate(orgvo.getEnablestate());
          member.setIsbusinessunit(orgvo.getIsbusinessunit());
          member.setPk_corp(orgvo.getPk_corp());
          vOrgMem.add(member);
        }
      }
      return vOrgMem.toArray(new OrgMemberVO[0]);
    }
    catch (BusinessException e) {
      ExceptionUtils.wrapException(e);
    }

    return null;
  }

  @SuppressWarnings({
    "unchecked"
  })
  private Collection<OrgVO> queryOrgByPks(String[] orgPks)
      throws UFOSrvException {
    InSqlBatchCaller call = new InSqlBatchCaller(orgPks);
    Collection<OrgVO> c = new ArrayList<OrgVO>();
    try {
      c = (Collection<OrgVO>) call.execute(new IInSqlBatchCallBack() {

        private Collection<OrgVO> results = new ArrayList<OrgVO>();

        @Override
        public Object doWithInSql(String inSql) throws BusinessException,
        SQLException {
          String condition = "" + OrgVO.PK_ORG + " in " + inSql;
          Collection<OrgVO> each_result =
              new BaseDAO().retrieveByClause(OrgVO.class, condition,
                  new String[] {
                OrgVO.PK_ORG, OrgVO.PK_FATHERORG, OrgVO.ENABLESTATE,
                OrgVO.ISBUSINESSUNIT, OrgVO.PK_CORP, OrgVO.PK_OWNORG
              });
          this.results.addAll(each_result);
          return this.results;
        }
      });
    }
    catch (Exception e) {
      throw new UFOSrvException(e.getMessage(), e);
    }
    return c;
  }

  @SuppressWarnings({
    "unchecked"
  })
  private Collection<ReportOrgVO> queryReportOrgByPks(String[] funcOrgPks)
      throws UFOSrvException {
    InSqlBatchCaller call = new InSqlBatchCaller(funcOrgPks);
    Collection<ReportOrgVO> c = new ArrayList<ReportOrgVO>();
    try {
      String seqSuffix = MultiLangUtil.getCurrentLangSeqSuffix();
      final String orgNameField = ReportOrgVO.NAME + seqSuffix;
      c = (Collection<ReportOrgVO>) call.execute(new IInSqlBatchCallBack() {

        private Collection<ReportOrgVO> results = new ArrayList<ReportOrgVO>();

        @Override
        public Object doWithInSql(String inSql) throws BusinessException,
        SQLException {
          String condition = "" + ReportOrgVO.PK_REPORTORG + " in " + inSql;
          // edit by congdy 2015.10.15
          // 同时取出主语种name，防止当前语种名称为录入导致名称显示为空，当前语种名称为空时取主语种内容
          Collection<ReportOrgVO> each_result =
              new BaseDAO().retrieveByClause(ReportOrgVO.class, condition,
                  ReportOrgVO.CODE, new String[] {
                ReportOrgVO.PK_REPORTORG, ReportOrgVO.CODE, orgNameField,
                ReportOrgVO.NAME
              });
          this.results.addAll(each_result);
          return this.results;
        }
      });
    }
    catch (Exception e) {
      throw new UFOSrvException(e.getMessage(), e);
    }
    return c;
  }

  // @Override
  // public OrgMemberVO[] loadFuncPermissionOrgMembersByOrgPKs(String cuserid,
  // String funcode, String pkGroup,String[] orgPks) throws UFOSrvException {
  // try {
  // // String[] orgPks =
  // NCLocator.getInstance().lookup(IFunctionPermissionPubService.class).getUserPermissionPkOrgs(cuserid,
  // funcode, pkGroup);
  //
  // if(orgPks==null || orgPks.length<=0){
  // return null;
  // }
  //
  // InSqlBatchCaller call = new InSqlBatchCaller(orgPks);
  // Collection<OrgVO> c = new ArrayList<OrgVO>();
  //
  // // [qugx 2015.9.17]按列取得VO所需
  // try {
  // c = (Collection<OrgVO>) call.execute(new IInSqlBatchCallBack() {
  //
  // private Collection<OrgVO> results = new ArrayList<OrgVO>();
  //
  // public Object doWithInSql(String inSql)
  // throws BusinessException, SQLException {
  // String condition = "" + OrgVO.PK_ORG + " in " + inSql;
  // Collection<OrgVO> each_result = (Collection<OrgVO>) new BaseDAO()
  // .retrieveByClause(OrgVO.class, condition, new
  // String[]{OrgVO.PK_ORG,OrgVO.PK_FATHERORG,OrgVO.ENABLESTATE,OrgVO.ISBUSINESSUNIT,OrgVO.PK_CORP});
  //
  // results.addAll(each_result);
  // return results;
  // }
  // });
  // } catch (SQLException e) {
  // throw new BusinessException(e);
  // }
  // OrgVO[] orgs = c.toArray(new OrgVO[0]);
  // // OrgVO[] orgs = OrgQueryUtil.queryOrgVOByPks(orgPks);
  // BaseDAO dao = new BaseDAO();
  // if (orgs != null && orgs.length > 0) {
  //
  // Map<String, OrgVO> map = new HashMap<String, OrgVO>();
  // for (OrgVO orgVO : orgs) {
  // map.put(orgVO.getPk_org(), orgVO);
  // }
  //
  // String[] funcOrgPks = orgPks;
  // List<ReportOrgVO> lstOrgVO = new ArrayList<ReportOrgVO>();
  // // String filterClause = UFDSSqlUtil.getInClause(funcOrgPks,
  // ReportOrgVO.PK_REPORTORG);
  // String filterClause = UFDSSqlUtil.buildInSql(ReportOrgVO.PK_REPORTORG,
  // funcOrgPks);
  // // [qugx 2015.9.17]按列取得VO所需
  // Collection<ReportOrgVO> vos = dao.retrieveByClause(ReportOrgVO.class,
  // filterClause, ReportOrgVO.CODE, new
  // String[]{ReportOrgVO.PK_REPORTORG,ReportOrgVO.CODE,ReportOrgVO.NAME});
  // lstOrgVO.addAll(vos);
  //
  // List<OrgMemberVO> vOrgMem = new ArrayList<OrgMemberVO>();
  // for (ReportOrgVO vo : lstOrgVO) {
  // OrgMemberVO member = new OrgMemberVO();
  // OrgVO orgvo = map.get(vo.getPk_reportorg());
  // member.setPk_org(vo.getPk_reportorg());
  // member.setOrgcode(vo.getCode());
  // member.setOrgname(MultiLangTextUtil.getCurLangText(vo));
  //
  // member.setPk_fatherorg(orgvo.getPk_fatherorg());
  // member.setEnablestate(orgvo.getEnablestate());
  // member.setIsbusinessunit(orgvo.getIsbusinessunit());
  // member.setPk_corp(orgvo.getPk_corp());
  // vOrgMem.add(member);
  // }
  // return vOrgMem.toArray(new OrgMemberVO[0]);
  // }
  // }catch (Exception e) {
  // AppDebug.debug(e);
  // }
  // return null;
  // }

  // @SuppressWarnings({ "deprecation", "unchecked" })
  // @Override
  // public OrgMemberVO[] loadFuncPermissionOrgMembers(FuncSubInfo subInfo)
  // throws UFOSrvException {
  // OrgVO[] orgs = subInfo.getFuncPermissionOrgVOs();
  // BaseDAO dao = new BaseDAO();
  // if (orgs != null && orgs.length > 0) {
  // try {
  // Map<String, OrgVO> map = new HashMap<String, OrgVO>();
  // for (OrgVO orgVO : orgs) {
  // map.put(orgVO.getPk_org(), orgVO);
  // }
  //
  // String[] funcOrgPks = subInfo.getFuncPermissionPkorgs();
  // List<ReportOrgVO> lstOrgVO = new ArrayList<ReportOrgVO>();
  // String filterClause = UFDSSqlUtil.getInClause(funcOrgPks,
  // ReportOrgVO.PK_REPORTORG);
  // Collection<ReportOrgVO> vos = dao.retrieveByClause(ReportOrgVO.class,
  // filterClause, ReportOrgVO.CODE);
  // lstOrgVO.addAll(vos);
  //
  // List<OrgMemberVO> vOrgMem = new ArrayList<OrgMemberVO>();
  // for (ReportOrgVO vo : lstOrgVO) {
  // OrgMemberVO member = new OrgMemberVO();
  // OrgVO orgvo = map.get(vo.getPk_reportorg());
  // member.setPk_org(vo.getPk_reportorg());
  // member.setOrgcode(vo.getCode());
  // member.setOrgname(MultiLangTextUtil.getCurLangText(vo));
  //
  // member.setPk_fatherorg(orgvo.getPk_fatherorg());
  // member.setEnablestate(orgvo.getEnablestate());
  // member.setIsbusinessunit(orgvo.getIsbusinessunit());
  // //member.setPk_corp(orgvo.getPk_corp());
  // vOrgMem.add(member);
  // }
  // return vOrgMem.toArray(new OrgMemberVO[0]);
  // } catch (DAOException e) {
  // AppDebug.debug(e);
  // }
  // }
  // return null;
  // }

  // @SuppressWarnings("unchecked")
  // @Override
  // public OrgMemberVO[] loadRefOrgMembers(FuncSubInfo subInfo)
  // throws UFOSrvException {
  // String[] funcOrgPks = subInfo.getFuncPermissionPkorgs();
  // if(funcOrgPks!=null&&funcOrgPks.length>0){
  // try {
  // BaseDAO dao = new BaseDAO();
  // // OrgVO[] orgs = OrgQueryUtil.queryOrgVOByPks(funcOrgPks);
  // String qryOrgInfoSql=getQryOrgInfoSql(funcOrgPks);
  // OrgInfo[] orgInfos=(OrgInfo[])dao.executeQuery(qryOrgInfoSql, new
  // OrgInfoProcessor());
  // if (orgInfos != null && orgInfos.length > 0) {
  // Map<String, OrgInfo> map = new HashMap<String, OrgInfo>();
  // for (OrgInfo orgInfo : orgInfos) {
  // map.put(orgInfo.getPk_org(), orgInfo);
  // }
  // List<ReportOrgVO> lstOrgVO = new ArrayList<ReportOrgVO>();
  // String filterClause = UFDSSqlUtil.getInClause(funcOrgPks,
  // ReportOrgVO.PK_REPORTORG);
  // Collection<ReportOrgVO> vos = dao.retrieveByClause(ReportOrgVO.class,
  // filterClause, ReportOrgVO.CODE);
  // lstOrgVO.addAll(vos);
  // //ArrayList改为LinkedList
  // List<OrgMemberVO> vOrgMem = new LinkedList<OrgMemberVO>();
  // for (ReportOrgVO vo : lstOrgVO) {
  // OrgMemberVO member = new OrgMemberVO();
  // OrgInfo orgInfo = map.get(vo.getPk_reportorg());
  // member.setPk_org(vo.getPk_reportorg());
  // member.setOrgcode(vo.getCode());
  // member.setOrgname(MultiLangTextUtil.getCurLangText(vo));
  //
  // member.setPk_fatherorg(orgInfo.getPk_fatherorg());
  // member.setEnablestate(orgInfo.getEnablestate());
  // member.setIsbusinessunit(orgInfo.getIsbusinessunit());
  // member.setPk_corp(orgInfo.getPk_corp());
  // vOrgMem.add(member);
  // }
  // return vOrgMem.toArray(new OrgMemberVO[0]);
  // }
  // } catch (DAOException e) {
  // AppDebug.debug(e);
  // }
  //
  // }
  // return null;
  // }

  /*
   * 取组织信息的SQL语句
   */
  // private String getQryOrgInfoSql(String[] pks){
  // StringBuffer sb=new StringBuffer();
  // sb.append("select pk_org,pk_fatherorg,enablestate,isbusinessunit,pk_corp from org_orgs");
  // sb.append(" where ");
  // String inClause = UFDSSqlUtil.getInClause(pks, OrgVO.PK_ORG);
  // sb.append(inClause);
  // return sb.toString();
  // }

  /*
   * 返回组织信息
   */
  // private class OrgInfoProcessor extends BaseProcessor{
  //
  // private static final long serialVersionUID = -2969396492454587203L;
  //
  // @Override
  // public Object processResultSet(ResultSet rs) throws SQLException {
  // List<OrgInfo> orgInfoList=new LinkedList<OrgInfo>();
  // OrgInfo orgInfo=null;
  // while(rs.next()){
  // orgInfo=new OrgInfo();
  // orgInfo.setPk_org(rs.getString(1)); //PK
  // orgInfo.setPk_fatherorg(rs.getString(2)); //pk_fatherorg
  // orgInfo.setEnablestate(Integer.valueOf(rs.getInt(3)));//enablestate
  // orgInfo.setIsbusinessunit(UFBoolean.valueOf(rs.getString(4)));
  // //isbusinessunit
  // orgInfo.setPk_corp(rs.getString(5));
  // orgInfoList.add(orgInfo);
  // }
  // return orgInfoList.toArray(new OrgInfo[orgInfoList.size()]);
  // }
  //
  // }

  /*
   * 组织信息，为了减少数据量，只存放和报表主组织相关的信息
   */
  // private class OrgInfo{
  // private String pk_org=null;
  // private String pk_fatherorg=null;
  // private Integer enablestate = 1;
  // private UFBoolean isbusinessunit;
  // private String pk_corp;
  //
  // public String getPk_org() {
  // return pk_org;
  // }
  // public void setPk_org(String pk_org) {
  // this.pk_org = pk_org;
  // }
  // public String getPk_fatherorg() {
  // return pk_fatherorg;
  // }
  // public void setPk_fatherorg(String pk_fatherorg) {
  // this.pk_fatherorg = pk_fatherorg;
  // }
  // public Integer getEnablestate() {
  // return enablestate;
  // }
  // public void setEnablestate(Integer enablestate) {
  // this.enablestate = enablestate;
  // }
  // public UFBoolean getIsbusinessunit() {
  // return isbusinessunit;
  // }
  // public void setIsbusinessunit(UFBoolean isbusinessunit) {
  // this.isbusinessunit = isbusinessunit;
  // }
  // public String getPk_corp() {
  // return pk_corp;
  // }
  // public void setPk_corp(String pk_corp) {
  // this.pk_corp = pk_corp;
  // }
  //
  // }

  @Override
  public IBDData[] getDeptOrgInfo(String[] orgIDs) {
    IBDData[] datas =
        GeneralAccessorFactory.getAccessor(IOrgMetaDataIDConst.DEPT)
        .getDocbyPks(orgIDs);
    return datas;
  }

  @Override
  public IBDData[] getOrgInfo(String[] orgIDs) {
    IBDData[] datas =
        GeneralAccessorFactory.getAccessor(IOrgMetaDataIDConst.ORG)
        .getDocbyPks(orgIDs);
    return datas;
  }
}
