com.gettec.fsnip.fsn.service.business.impl.BusinessUnitServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.gettec.fsnip.fsn.service.business.impl.BusinessUnitServiceImpl.java

Source

package com.gettec.fsnip.fsn.service.business.impl;

import com.gettec.fsnip.fsn.dao.business.BusinessUnitDAO;
import com.gettec.fsnip.fsn.exception.DaoException;
import com.gettec.fsnip.fsn.exception.JPAException;
import com.gettec.fsnip.fsn.exception.ServiceException;
import com.gettec.fsnip.fsn.model.base.District;
import com.gettec.fsnip.fsn.model.base.Office;
import com.gettec.fsnip.fsn.model.base.SysArea;
import com.gettec.fsnip.fsn.model.business.*;
import com.gettec.fsnip.fsn.model.market.Resource;
import com.gettec.fsnip.fsn.model.product.BusinessCertification;
import com.gettec.fsnip.fsn.model.product.ProductInstance;
import com.gettec.fsnip.fsn.model.sales.BusinessSalesInfo;
import com.gettec.fsnip.fsn.service.base.DistrictService;
import com.gettec.fsnip.fsn.service.base.OfficeService;
import com.gettec.fsnip.fsn.service.base.SysAreaService;
import com.gettec.fsnip.fsn.service.business.*;
import com.gettec.fsnip.fsn.service.carering.CateringService;
import com.gettec.fsnip.fsn.service.common.impl.BaseServiceImpl;
import com.gettec.fsnip.fsn.service.market.ResourceService;
import com.gettec.fsnip.fsn.service.product.BusinessCertificationService;
import com.gettec.fsnip.fsn.service.sales.BusinessSalesInfoService;
import com.gettec.fsnip.fsn.transfer.BusinessBrandTransfer;
import com.gettec.fsnip.fsn.transfer.BusinessUnitTransfer;
import com.gettec.fsnip.fsn.util.AnalysisExlUtil;
import com.gettec.fsnip.fsn.util.FilterUtils;
import com.gettec.fsnip.fsn.util.HttpUtils;
import com.gettec.fsnip.fsn.vo.business.*;
import com.gettec.fsnip.fsn.vo.business.report.BusinessUnitOfReportVO;
import com.gettec.fsnip.fsn.vo.catering.CateringVO;
import com.gettec.fsnip.fsn.vo.common.OrganizationVO;
import com.gettec.fsnip.fsn.vo.common.UserVO;
import com.gettec.fsnip.sso.client.util.SSOClientUtil;
import com.gettec.fsnip.sso.client.vo.AuthenticateInfo;
import com.lhfs.fsn.vo.BusinessUnitVO;
import com.lhfs.fsn.vo.business.BussinessUnitVOToPortal;
import com.lhfs.fsn.vo.business.LightBusUnitVO;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.*;

/**
 * BusinessUnit service implementation
 * 
 * @author Ryan Wang
 */
@Service(value = "businessUnitService")
public class BusinessUnitServiceImpl extends BaseServiceImpl<BusinessUnit, BusinessUnitDAO>
        implements BusinessUnitService {
    @Autowired
    private BusinessUnitDAO businessUnitDAO;
    @Autowired
    private BusinessBrandService businessBrandService;
    @Autowired
    private ResourceService testResourceService;
    @Autowired
    private EnterpriseRegisteService enterpriseService;
    @Autowired
    private LicenseService licenseService;
    @Autowired
    private OrgInstitutionService orgInstitutionService;
    @Autowired
    private CirculationPermitService circulationPermitService;
    @Autowired
    private FieldValueService fieldValueService;
    @Autowired
    private ProducingDepartmentService producingDepartmentService;
    @Autowired
    private TaxRegisterService taxRegisterService;
    @Autowired
    private LiquorSalesLicenseService liquorSalesLicenseService;
    @Autowired
    private BusinessCertificationService businessCertificationService;
    @Autowired
    private SysAreaService sysAreaService;
    @Autowired
    private OfficeService officeService;
    @Autowired
    private DistrictService districtService;
    @Autowired
    private BusinessMarketService businessMarketService;
    @Autowired
    private MarketToBusinessPKService MarketToBusinessPKService;
    @Autowired
    private BusinessSalesInfoService businessSalesInfoService;
    @Autowired
    private CateringService cateringService;
    @Autowired
    private ResourceService resourceService;

    @Override
    public BusinessUnitDAO getDAO() {
        return businessUnitDAO;
    }

    /**
     * ????
     * @param name
     * @return
     */
    public boolean checkUniqueName(String name) throws ServiceException {
        try {
            String condition = " WHERE e.name = ?1";
            return getDAO().count(condition, new Object[] { name }) < 1;
        } catch (JPAException jpae) {
            throw new ServiceException("BusinessUnitServiceImpl.checkUniqueName()-->" + jpae.getMessage(),
                    jpae.getException());
        }
    }

    /**
     * ??????
     * @param name
     * @return
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public String findLicenseByName(String name) throws ServiceException {
        try {
            return getDAO().findLicenseByName(name);
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl.findByName()-->" + dex.getMessage(),
                    dex.getException());
        }
    }

    @Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)
    public int getProductCount() {
        return getDAO().getProductCount();
    }

    /**
     * ?????
     * @param name
     * @throws ServiceException 
     */
    @Override
    public List<BusinessUnit> findByName_(String name) throws ServiceException {
        try {
            List<BusinessUnit> businessUnitList = getDAO().findByName_(name);
            BusinessUnitTransfer.transfer(businessUnitList);
            return businessUnitList;
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl.findByName_()-->" + dex.getMessage(),
                    dex.getException());
        }
    }

    /**
     * ?qs???qs???
     * @param firstpart qs?
     * @param formatId qs?id
     * @throws ServiceException 
     * @author HuangYog 2015/01/28 --? firstpart
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)
    public List<String> getListOfQsNo(String firstpart, Long formatId) throws ServiceException {
        try {
            return getDAO().getListOfQsNo(firstpart, formatId);
        } catch (DaoException e) {
            throw new ServiceException(e.getMessage(), e.getException());
        }
    }

    /**
     * ??????
     * @throws ServiceException
     * @author ZhangHui 2015/6/7
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public BusinessUnit saveTestee(String testee) throws ServiceException {
        try {
            if (testee == null || testee == null || "".equals(testee)) {
                return null;
            }

            BusinessUnit bus = new BusinessUnit(testee);

            //         BusinessUnit orig_testee = getDAO().findByName(testee);
            /**
             * ??????????
             * wubiao  2016.2.18 10:20
             */
            BusinessUnit orig_testee = getDAO().findByNameOrganization(testee);

            if (orig_testee == null) {
                create(bus);
            } else {
                bus.setId(orig_testee.getId());
            }
            return bus;
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl.saveTestee()-->" + e.getMessage(), e);
        }
    }

    /**
     * ????
     * @param name
     * @throws ServiceException
     */
    @Override
    public List<BusinessUnit> getListByName(String name, String type, int page, int pageSize)
            throws ServiceException {
        try {
            return getDAO().getListByName(page, pageSize, name, type);
        } catch (DaoException dex) {
            throw new ServiceException("?service-error????,", dex);
        }
    }

    /**
     * service??????
     */
    @Override
    public List<BusinessUnit> getSubsidiaryListByOrgPage(int page, int pageSize, String configure, Long org)
            throws ServiceException {
        List<BusinessUnit> subsidiary = null;
        try {
            subsidiary = getDAO().getSubsidiaryListByOrgPage(getConfigure(org, configure), page, pageSize);
            BusinessUnitTransfer.transfer(subsidiary);
        } catch (DaoException dex) {
            throw new ServiceException(dex.getMessage(), dex.getException());
        }
        return subsidiary;
    }

    /**
     * service????
     */
    @Override
    public Long getCountByOrg(Long organization, String configure) throws ServiceException {

        try {
            Long count = getDAO().getCountByOrg(getConfigure(organization, configure));
            return count;
        } catch (DaoException dex) {
            throw new ServiceException(dex.getMessage(), dex.getException());
        }
    }

    /**
     * service?
     * @author longxianzhen 2015/06/18
     */
    @SuppressWarnings("unchecked")
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void addSubsidiary(BusinessUnit businessUnit, Long org) throws ServiceException {
        try {
            BusinessUnit bus = getDAO().findByName(businessUnit.getName());
            /* ??  ??sso */
            if (bus == null || (bus != null && (bus.getOrganization() == null || bus.getOrganization() == 0))) {
                BusinessUnit parentBu = getDAO().findByOrgnizationId(org);
                BatchAddSubsidiatyVO batchAddSuVO = new BatchAddSubsidiatyVO();
                List<OrganizationVO> orgs = new ArrayList<OrganizationVO>();//?sso??         
                OrganizationVO orgVO = new OrganizationVO();
                orgVO.setOrganizationName(businessUnit.getName());
                orgVO.setOrganizationAddress(businessUnit.getAddress());
                orgVO.setParentId(org.toString());
                orgVO.setComments("");
                orgs.add(orgVO);
                batchAddSuVO.setOrganizations(orgs);
                JSONObject json = JSONObject.fromObject(batchAddSuVO);
                //sso??
                String result = SSOClientUtil.send(
                        HttpUtils.getSSOHostname() + "/service/organization/fsnOrgainzationReg", SSOClientUtil.POST,
                        json);
                JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
                List<JSONObject> successList = jsonResult.getJSONArray("success");
                if (successList.size() == 1) {
                    for (JSONObject orgJSON : successList) {
                        if (bus == null) {//sso?? ?? 
                            businessUnit.setParentOrganizationId(org);
                            businessUnit.setOrganization(Long.parseLong(orgJSON.getString("id")));
                            businessUnit.setType(parentBu.getType());
                            businessUnit.setEnterpriteDate(new Date());
                            if (parentBu.getType().contains("?")) {
                                businessUnit.setSignFlag(parentBu.isSignFlag());
                            }
                            /*???*/
                            LicenseInfo orig_license = licenseService.save(businessUnit.getLicense());
                            businessUnit.setLicense(orig_license);
                            create(businessUnit);
                        } else {//
                            bus.setParentOrganizationId(org);
                            bus.setOrganization(Long.parseLong(orgJSON.getString("id")));
                            bus.setType(parentBu.getType());
                            bus.setEnterpriteDate(new Date());
                            bus.setAddress(businessUnit.getAddress());
                            bus.setOtherAddress(businessUnit.getOtherAddress());
                            if (parentBu.getType().contains("?")) {
                                bus.setSignFlag(parentBu.isSignFlag());
                            }
                            /*???*/
                            LicenseInfo orig_license = licenseService.save(businessUnit.getLicense());
                            bus.setLicense(orig_license);
                            update(bus);
                        }
                    }
                }
            } else {//???ID
                bus.setParentOrganizationId(org);
                update(bus);
            }

        } catch (Exception e) {
            throw new ServiceException("service?", e);
        }

    }

    /**
     * service????
     */
    @Override
    public boolean verificationNameOrLic(String val, String type) throws ServiceException {
        try {
            return getDAO().verificationNameOrLic(val, type);
        } catch (DaoException dex) {
            throw new ServiceException(dex.getMessage(), dex.getException());
        }

    }

    /**
     * service? ??? ??
     * @author longxianzhen 2015/06/18
     */
    @SuppressWarnings("unchecked")
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void editSubsidiary(BusinessUnit businessUnit) throws ServiceException {
        StringBuffer sb = new StringBuffer();
        try {
            BusinessUnit originalBusinessUnit = findById(businessUnit.getId());
            BusinessUnit buByName = getDAO().findByName(businessUnit.getName());
            /* ???????? */
            if (buByName == null) {//???
                /* ??  */
                LicenseInfo orig_license = licenseService.save(businessUnit.getLicense());
                businessUnit.setLicense(orig_license);
                originalBusinessUnit.setName(businessUnit.getName());
                if (businessUnit.getAddress() != null
                        && !businessUnit.getAddress().equals(originalBusinessUnit.getAddress())) {
                    originalBusinessUnit.setAddress(businessUnit.getAddress());
                    originalBusinessUnit.setOtherAddress(businessUnit.getOtherAddress());
                }
                originalBusinessUnit.setLicense(businessUnit.getLicense());
                //?sso??
                sb.append("parentId=").append(originalBusinessUnit.getParentOrganizationId());
                sb.append("&organizationName=")
                        .append(URLEncoder.encode(businessUnit.getName().toString(), "utf-8"));
                sb.append("&organizationAddress=")
                        .append(URLEncoder.encode(businessUnit.getAddress().toString(), "utf-8"));
                sb.append("&comments=").append("");
                sb.append("&organizationId=").append(originalBusinessUnit.getOrganization());
                sb.append("&isFsnRequest=").append(true);
                /* SSO??? */
                String result = HttpUtils.send(HttpUtils.getSSOHostname() + "/service/organization", "PUT",
                        sb.toString());
                if (result != null) {
                    JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
                    if (jsonResult.getString("status").equals("true")) {
                        update(originalBusinessUnit);
                    }
                } else {
                    throw new ServiceException(
                            "SSO???? null ?",
                            new Exception());
                }

                /* ??? ? ?? ???*/
            } else if (buByName != null
                    && (buByName.getOrganization() == null || buByName.getOrganization() == 0)) {
                BusinessUnit parentBu = BusinessUnitTransfer
                        .transfer(getDAO().findByOrgnizationId(originalBusinessUnit.getParentOrganizationId()));
                BatchAddSubsidiatyVO batchAddSuVO = new BatchAddSubsidiatyVO();
                List<OrganizationVO> orgs = new ArrayList<OrganizationVO>();//?sso??         
                OrganizationVO orgVO = new OrganizationVO();
                orgVO.setOrganizationName(businessUnit.getName());
                orgVO.setOrganizationAddress(businessUnit.getAddress());
                orgVO.setParentId(originalBusinessUnit.getParentOrganizationId().toString());
                orgVO.setComments("");
                orgs.add(orgVO);
                batchAddSuVO.setOrganizations(orgs);
                JSONObject json = JSONObject.fromObject(batchAddSuVO);
                //sso??
                String result = SSOClientUtil.send(
                        HttpUtils.getSSOHostname() + "/service/organization/fsnOrgainzationReg", SSOClientUtil.POST,
                        json);
                JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
                List<JSONObject> successList = jsonResult.getJSONArray("success");
                if (successList.size() == 1) {
                    for (JSONObject orgJSON : successList) {
                        buByName.setParentOrganizationId(originalBusinessUnit.getParentOrganizationId());
                        buByName.setOrganization(Long.parseLong(orgJSON.getString("id")));
                        buByName.setType(parentBu.getType());
                        buByName.setEnterpriteDate(new Date());
                        buByName.setAddress(businessUnit.getAddress());
                        buByName.setOtherAddress(businessUnit.getOtherAddress());
                        if (parentBu.getType().contains("?")) {
                            buByName.setSignFlag(parentBu.isSignFlag());
                        }
                        /*???*/
                        LicenseInfo orig_license = licenseService.save(businessUnit.getLicense());
                        buByName.setLicense(orig_license);
                        update(buByName);
                    }
                }
                originalBusinessUnit.setParentOrganizationId(null);
                update(originalBusinessUnit);
            } else {//??? ? ?? ???
                buByName.setParentOrganizationId(originalBusinessUnit.getParentOrganizationId());
                update(buByName);
                originalBusinessUnit.setParentOrganizationId(null);
                update(originalBusinessUnit);
            }

        } catch (UnsupportedEncodingException uex) {
            throw new ServiceException("service?URL?", uex);
        } catch (Exception e) {
            throw new ServiceException("service?", e);
        }

    }

    /**
     * service???
     * @param enRegiste
     * @return void
     * @throw ServiceException
     * @author LongXianZhen
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void saveEnterpriseRegisteInfo(EnterpriseRegiste enRegiste) throws ServiceException {
        try {
            Set<Resource> licAttachments = enRegiste.getLicAttachments();
            Set<Resource> disAttachments = enRegiste.getDisAttachments();
            Set<Resource> qsAttachments = enRegiste.getQsAttachments();
            Set<Resource> liquorAttachments = enRegiste.getLiquorAttachments();
            for (Resource resource : qsAttachments) {
                resource.setId(null);
            }
            for (Resource resource : disAttachments) {
                resource.setId(null);
            }
            for (Resource resource : licAttachments) {
                resource.setId(null);
            }
            for (Resource resource : liquorAttachments) {
                resource.setId(null);
            }
            enRegiste.setId(null);
            enRegiste.setStatus("");
            String addr = enRegiste.getEnterptiteAddress();
            enRegiste.setEnterptiteAddress(addr.replaceAll("-", ""));
            enRegiste.setOtherAddress(addr);
            enRegiste.setEnterpriteDate(new Date());
            enRegiste.setLicAttachments(licAttachments);
            //          enRegiste.setOrgAttachments(orgAttachments);
            enRegiste.setDisAttachments(disAttachments);
            enRegiste.setQsAttachments(qsAttachments);
            enRegiste.setLiquorAttachments(liquorAttachments);
            enterpriseService.create(enRegiste);
            enRegiste.setLicAttachments(licAttachments);
            enRegiste.setDisAttachments(disAttachments);
            enRegiste.setQsAttachments(qsAttachments);
            enRegiste.setLiquorAttachments(liquorAttachments);
            //          enRegiste.setOrgAttachments(orgAttachments);
            if ("??.??".equals(enRegiste.getEnterpriteType())) {
                enRegiste.setEnterpriteType("??");
            }
            testResourceService.saveLicAndOrgResource(enRegiste);
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.saveEnterpriseRegisteInfo()-->" + sex.getMessage(),
                    sex.getException());
        }
    }

    /**
     * ???
     */
    @Override
    public List<EnterpriseRegiste> getEnRegisteListByPage(int page, int pageSize, String configure)
            throws ServiceException {
        List<EnterpriseRegiste> enRegiste = null;
        try {
            enRegiste = enterpriseService.getEnRegisteListByPage(page, pageSize, getConfigureEn(configure));
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.getEnRegisteListByPage()-->" + sex.getMessage(),
                    sex.getException());
        }
        return enRegiste;
    }

    /**
     * service?
     */
    @Override
    public Long getAllCount(String configure) throws ServiceException {
        Long count = 0L;
        try {
            count = enterpriseService.getAllCount(getConfigureEn(configure));
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.getAllCount()-->" + sex.getMessage(),
                    sex.getException());
        }
        return count;
    }

    /**
     * ?
     * @param id ?id
     * @return boolean
     *         true: 
     *         false: 
     * @throws ServiceException
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public EnterpriseRegiste spprove(Long id, boolean signFlag) throws ServiceException {
        try {
            EnterpriseRegiste orig_enRegiste = enterpriseService.findById(id);
            if (orig_enRegiste == null) {
                return null;
            }

            /* 1. sso?? */
            JSONObject json = getSpproveSSOData(orig_enRegiste);
            String result = SSOClientUtil.send(
                    HttpUtils.getSSOHostname() + "/service/organization/fsnOrgainzationReg", SSOClientUtil.POST,
                    json);
            JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
            if (!jsonResult.getString("status").equals("true")) {
                if (jsonResult.getString("error").equals("SYS_ERROR_CODE_USER_NAME_EXISTING")) {
                    throw new ServiceException("???", null);
                }
                throw new ServiceException("?", null);
            }
            /* 2. ? */
            orig_enRegiste.setStatus("");
            Long orgId = Long.parseLong(jsonResult.getString("userOrganizationId"));
            /* 3. ??? */
            LicenseInfo orig_liceInfo = licenseService.save(orig_enRegiste.getLicenseNo());
            /* 4. ?? */
            OrganizingInstitution orig_orgIns = orgInstitutionService.save(orig_enRegiste.getOrganizationNo());

            /* 4. ???? */
            CirculationPermitInfo orig_criculation = circulationPermitService.save(orig_enRegiste.getPassNo());

            /* 5. ??BusinessUnit? */
            BusinessUnit orig_business = getDAO().findByName(orig_enRegiste.getEnterpriteName());
            if (orig_business == null) {
                /* 5.1  */
                BusinessUnit business = getBusinessByEnregiste(orig_enRegiste, orgId);
                business.setLicense(orig_liceInfo);
                business.setOrgInstitution(orig_orgIns);
                business.setDistribution(orig_criculation);
                business.setSignFlag(signFlag);
                create(business);
                orig_business = business;
            } else {
                /* 5.2  */
                setBusinessValue(orig_business, orig_enRegiste, orgId);
                orig_business.setLicense(orig_liceInfo);
                orig_business.setOrgInstitution(orig_orgIns);
                orig_business.setSignFlag(signFlag);
                update(orig_business);
            }
            /* 6.  */
            enterpriseService.update(orig_enRegiste);
            /* 7. ???fdams? */
            /*if(orig_enRegiste.getEnterpriteType().equals("??")){
               JSONObject wdaJson = getSpproveFDAMSData(orig_business, orig_enRegiste);
               String wdaResult = HttpUtils.send(HttpUtils.getWDAHostname()+"/wda-core/service/businessBasic/addBusinessBasic", "POST", wdaJson);
               JSONObject wdaJsonResult = (JSONObject)JSONSerializer.toJSON(wdaResult);
               if(!wdaJsonResult.getJSONObject("result").getBoolean("success")){
                  throw new ServiceException("?", null);
               }
            }*/
            /*8.???*/
            if (orig_business.getType().equals("")) {
                BusinessMarket market = new BusinessMarket();
                market.setBusiness(orig_business);
                market.setPublishFlag(false);
                businessMarketService.create(market);
            }
            return orig_enRegiste;
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl.spprove()-->" + dex.getMessage(),
                    dex.getException());
        } catch (Exception e) {
            throw new ServiceException("?" + e.getMessage(), e);
        }
    }

    /**
     * BusinessUnit??EnterpriseRegiste?
     * @param orig_business
     * @param orig_enRegiste
     * @param orgId
     */
    private void setBusinessValue(BusinessUnit orig_business, EnterpriseRegiste orig_enRegiste, Long orgId) {
        orig_business.setAddress(orig_enRegiste.getEnterptiteAddress());
        orig_business.setOtherAddress(orig_enRegiste.getOtherAddress());
        orig_business.setPersonInCharge(orig_enRegiste.getLegalPerson());
        orig_business.setOrganization(orgId);
        //orig_business.setParentOrganizationId(0L);
        orig_business.setType(orig_enRegiste.getEnterpriteType());
        orig_business.setEnterpriteDate(orig_enRegiste.getEnterpriteDate());
        orig_business.setTelephone(orig_enRegiste.getTelephone());
        orig_business.setEmail(orig_enRegiste.getEmail());
    }

    /**
     * ?EnterpriseRegiste??BusinessUnit?
     * @param orig_enRegiste
     * @param orgId
     * @return
     */
    private BusinessUnit getBusinessByEnregiste(EnterpriseRegiste orig_enRegiste, Long orgId) {
        BusinessUnit business = new BusinessUnit();
        business.setName(orig_enRegiste.getEnterpriteName());
        business.setAddress(orig_enRegiste.getEnterptiteAddress());
        business.setOtherAddress(orig_enRegiste.getOtherAddress());
        business.setPersonInCharge(orig_enRegiste.getLegalPerson());
        business.setEmail(orig_enRegiste.getEmail());
        business.setOrganization(orgId);
        business.setParentOrganizationId(0L);
        business.setType(orig_enRegiste.getEnterpriteType());
        business.setEnterpriteDate(orig_enRegiste.getEnterpriteDate());
        business.setTelephone(orig_enRegiste.getTelephone());
        return business;
    }

    /**
     * ?sso??
     * @param enRegiste
     * @return
     */
    private JSONObject getSpproveSSOData(EnterpriseRegiste enRegiste) {
        EnterpriseRegisteSSO enRegisteSSO = new EnterpriseRegisteSSO();
        /* 1. List<OrganizationVO> */
        List<OrganizationVO> orgs = new ArrayList<OrganizationVO>();
        OrganizationVO org = new OrganizationVO();
        org.setOrganizationName(enRegiste.getEnterpriteName());
        org.setOrganizationAddress(enRegiste.getEnterptiteAddress());
        org.setComments("");
        if ("??".equals(enRegiste.getEnterpriteType())) {
            org.setType("??.??");
        } else {
            org.setType(enRegiste.getEnterpriteType());
        }
        orgs.add(org);
        /* 2. UserVO */
        UserVO user = new UserVO();
        user.setUserName(enRegiste.getUserName());
        user.setPassword(enRegiste.getPassword());
        user.setEmail(enRegiste.getEmail());
        user.setTelephone(enRegiste.getTelephone());
        enRegisteSSO.setOrganizations(orgs);
        enRegisteSSO.setUser(user);
        /* 3.  */
        JSONObject json = JSONObject.fromObject(enRegisteSSO);
        return json;
    }

    /**
     * Id??
     * @param info  ?
     * @param isLoadImg<br>
     *              true:??, false:?
     * @param isCompatibilityNotRegiste<br>
     *              true:?, false:?
     * @author ZhangHui 2015/4/9
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)
    public BusinessUnit findByInfo(AuthenticateInfo info, boolean isLoadImg, boolean isCompatibilityNotRegiste)
            throws ServiceException {
        try {
            /* 1. ??  */
            BusinessUnit businessUnit = BusinessUnitTransfer
                    .transfer(getDAO().findByOrgnizationId(info.getOrganization()));
            if (businessUnit.getType() != null && businessUnit.getType().equals("??")) {
                /* 2. ???  */
                List<BusinessBrand> brands = BusinessBrandTransfer
                        .transfer(businessBrandService.getDAO().getListByBusunitId(businessUnit.getId()));
                businessUnit.setBrands(brands);
                /* 3. ??  */
                List<FieldValue> fieldValues = fieldValueService.getListByBusunitId(businessUnit.getId());
                businessUnit.setFieldValues(fieldValues);
                /* 4. ??? */
                List<ProducingDepartment> subDepartments = producingDepartmentService.getDAO()
                        .getListByBusunitIdAndDepartFlag(businessUnit.getId(), false);
                businessUnit.setSubDepartments(subDepartments);
                /* 5. ?? */
                List<ProducingDepartment> proDepartments = producingDepartmentService.getDAO()
                        .getListByBusunitIdAndDepartFlag(businessUnit.getId(), true);
                businessUnit.setProDepartments(proDepartments);
            }
            if (isLoadImg) {
                EnterpriseRegiste orig_enterprise = enterpriseService.findbyEnterpriteName(businessUnit.getName());
                if (orig_enterprise != null) {
                    /* 4. ??  */
                    businessUnit.setOrgAttachments(orig_enterprise.getOrgAttachments());
                    businessUnit.setLicAttachments(orig_enterprise.getLicAttachments());
                    businessUnit.setDisAttachments(orig_enterprise.getDisAttachments());
                    businessUnit.setQsAttachments(orig_enterprise.getQsAttachments());
                    businessUnit.setLogoAttachments(orig_enterprise.getLogoAttachments());
                    businessUnit.setTaxRegAttachments(orig_enterprise.getTaxRegAttachments());
                    if (businessUnit.getTaxRegister() != null) {
                        businessUnit.getTaxRegister().setTaxAttachments(orig_enterprise.getTaxRegAttachments());
                    }
                    businessUnit.setLiquorAttachments(orig_enterprise.getLiquorAttachments());
                } else if (isCompatibilityNotRegiste) {
                    /* ?? */
                    enterpriseService.save(businessUnit, info);
                }
                /* ?? */
                BusinessSalesInfo orig_busSalesInfo = businessSalesInfoService.findByBusId(businessUnit.getId());
                if (orig_busSalesInfo != null) {
                    businessUnit.setPropagandaAttachments(setListResourceEx(orig_busSalesInfo.getPubPtotosName(),
                            orig_busSalesInfo.getPubPtotosUrl()));
                    businessUnit.setQrAttachments(setListResource(orig_busSalesInfo.getQrcodeImgName(),
                            orig_busSalesInfo.getQrcodeImgUrl()));
                }
                /* ??  */
                List<BusinessCertification> listOfCertification = businessCertificationService
                        .getListOfCertificationByBusinessId(businessUnit.getId());
                businessUnit.setListOfCertification(listOfCertification);
            }
            return businessUnit;
        } catch (DaoException dex) {
            throw new ServiceException(
                    "?service-errorId??,?",
                    dex.getException());
        }
    }

    /**
     * Id??
     * @param info  ?
     * @param isLoadImg<br>
     *              true:??, false:?
     * @param isCompatibilityNotRegiste<br>
     *              true:?, false:?
     * @author ZhangHui 2015/4/9
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)
    public BusinessUnit findByInfo2(AuthenticateInfo info, BusinessUnit businessUnit1, boolean isLoadImg,
            boolean isCompatibilityNotRegiste) throws ServiceException {
        //      try {
        /* 1. ??  */
        //         BusinessUnit businessUnit = BusinessUnitTransfer.transfer(getDAO().findByOrgnizationId(info.getOrganization()));
        BusinessUnit businessUnit = null;
        try {
            businessUnit = BusinessUnitTransfer.transfer(getDAO().findById(businessUnit1.getId()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (businessUnit == null) {
            businessUnit = businessUnit1;
        }
        if (businessUnit.getType() != null && businessUnit.getType().equals("??")) {
            /* 2. ???  */
            List<BusinessBrand> brands = null;
            try {
                brands = BusinessBrandTransfer
                        .transfer(businessBrandService.getDAO().getListByBusunitId(businessUnit.getId()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            businessUnit.setBrands(brands);
            /* 3. ??  */
            List<FieldValue> fieldValues = null;
            try {
                fieldValues = fieldValueService.getListByBusunitId(businessUnit.getId());
            } catch (Exception e) {
                e.printStackTrace();
            }
            businessUnit.setFieldValues(fieldValues);
            /* 4. ??? */
            List<ProducingDepartment> subDepartments = null;
            try {
                subDepartments = producingDepartmentService.getDAO()
                        .getListByBusunitIdAndDepartFlag(businessUnit.getId(), false);
            } catch (Exception e) {
                e.printStackTrace();
            }

            businessUnit.setSubDepartments(subDepartments);
            /* 5. ?? */
            List<ProducingDepartment> proDepartments = null;
            try {
                proDepartments = producingDepartmentService.getDAO()
                        .getListByBusunitIdAndDepartFlag(businessUnit.getId(), true);
            } catch (Exception e) {
                e.printStackTrace();
            }

            businessUnit.setProDepartments(proDepartments);
        }
        if (isLoadImg) {
            EnterpriseRegiste orig_enterprise = null;
            try {
                orig_enterprise = enterpriseService.findbyEnterpriteName(businessUnit.getName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (orig_enterprise != null) {
                /* 4. ??  */
                businessUnit.setOrgAttachments(orig_enterprise.getOrgAttachments());
                businessUnit.setLicAttachments(orig_enterprise.getLicAttachments());
                businessUnit.setDisAttachments(orig_enterprise.getDisAttachments());
                businessUnit.setQsAttachments(orig_enterprise.getQsAttachments());
                businessUnit.setLogoAttachments(orig_enterprise.getLogoAttachments());
                businessUnit.setTaxRegAttachments(orig_enterprise.getTaxRegAttachments());
                try {
                    if (businessUnit.getTaxRegister() != null) {
                        try {
                            businessUnit.getTaxRegister().setTaxAttachments(orig_enterprise.getTaxRegAttachments());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        businessUnit.setTaxRegister(null);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    businessUnit.setTaxRegister(null);
                }
                businessUnit.setLiquorAttachments(orig_enterprise.getLiquorAttachments());
            } else if (isCompatibilityNotRegiste) {
                /* ?? */
                enterpriseService.save(businessUnit, info);
            }
            /* ?? */
            BusinessSalesInfo orig_busSalesInfo = null;
            try {
                orig_busSalesInfo = businessSalesInfoService.findByBusId(businessUnit.getId());
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (orig_busSalesInfo != null) {
                businessUnit.setPropagandaAttachments(setListResourceEx(orig_busSalesInfo.getPubPtotosName(),
                        orig_busSalesInfo.getPubPtotosUrl()));
                businessUnit.setQrAttachments(
                        setListResource(orig_busSalesInfo.getQrcodeImgName(), orig_busSalesInfo.getQrcodeImgUrl()));
            }
            /* ??  */
            List<BusinessCertification> listOfCertification = null;
            try {
                listOfCertification = businessCertificationService
                        .getListOfCertificationByBusinessId(businessUnit.getId());
            } catch (Exception e) {
                e.printStackTrace();
            }

            businessUnit.setListOfCertification(listOfCertification);
        }
        return businessUnit;
        //      } catch (DaoException dex) {
        //         throw new ServiceException("?service-errorId??,?", dex.getException());
        //      }
    }

    private List<Resource> setListResource(String name, String url) {
        List<Resource> result = null;
        if (url != null && url != null) {
            result = new ArrayList<Resource>();
            Resource res = new Resource();
            res.setId(new Long(-1));
            res.setFileName(name);
            res.setName(name);
            res.setUrl(url);
            result.add(res);
        }
        return result;
    }

    private List<Resource> setListResourceEx(String name, String url) {

        List<Resource> result = null;
        if (name != null && url != null) {
            String[] names = name.split("\\|");
            String[] urls = url.split("\\|");
            result = new ArrayList<Resource>();
            for (int i = 0; i < names.length; i++) {
                Resource res = new Resource();
                res.setId(new Long(-1));
                res.setFileName(names[i]);
                res.setName(names[i]);
                res.setUrl(urls[i]);
                result.add(res);
            }
        }
        return result;
    }

    /**
     * ?FSN bus_unit?
     * @param businessUnit  ??
     * @return void
     * @throws ServiceException
     * @author TangXin
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void updateBusinessUnit(BusinessUnit businessUnit) throws ServiceException {
        try {
            BusinessUnit orig_businessUnit = findById(businessUnit.getId());
            setBusinessUnitValue(orig_businessUnit, businessUnit);
            if (businessUnit.getTaxRegister() != null) {
                orig_businessUnit
                        .setTaxRegister(taxRegisterService.findById(businessUnit.getTaxRegister().getId()));
            }
            if (businessUnit.getLicense() != null) {
                orig_businessUnit
                        .setLicense(licenseService.getDAO().findById(businessUnit.getLicense().getLicenseNo()));
            }
            if (businessUnit.getOrgInstitution() != null) {
                orig_businessUnit.setOrgInstitution(
                        orgInstitutionService.findByOrgCode(businessUnit.getOrgInstitution().getOrgCode()));
            }
            if (businessUnit.getDistribution() != null) {
                orig_businessUnit.setDistribution(circulationPermitService
                        .findByDistributionNo(businessUnit.getDistribution().getDistributionNo()));
            }

            /*?????*/
            String type = orig_businessUnit.getType();
            String addr = orig_businessUnit.getAddress();
            if (type != null && addr != null && ((type.contains("??") && addr.contains("?"))
                    || type.contains(""))) {
                orig_businessUnit.setNote(businessUnit.getNote());
                if (businessUnit.getSysArea() != null) {
                    SysArea orig_area = sysAreaService.findById(businessUnit.getSysArea().getId());
                    orig_businessUnit.setSysArea(orig_area);
                }
                if (businessUnit.getOffice() != null) {
                    Office orig_office = officeService.findById(businessUnit.getOffice().getId());
                    orig_businessUnit.setOffice(orig_office);
                }
                MarketToBusinessPKService.save(orig_businessUnit);
            }
            /*?--??*/
            if (businessUnit.getDistrict() != null && businessUnit.getDistrict().size() > 0) {
                Set<District> new_origDist = this.getNewDistrict(orig_businessUnit.getDistrict(),
                        businessUnit.getDistrict());
                orig_businessUnit.setDistrict(new_origDist);
            }
            update(orig_businessUnit);
            //???
            EnterpriseRegiste orig_enterprise = enterpriseService.findbyEnterpriteName(businessUnit.getName());
            if (orig_enterprise != null) {
                orig_enterprise.setEnterptiteAddress(businessUnit.getAddress());
                orig_enterprise.setLegalPerson(businessUnit.getPersonInCharge());
                orig_enterprise.setEmail(businessUnit.getEmail());
                orig_enterprise.setTelephone(businessUnit.getTelephone());
                enterpriseService.update(orig_enterprise);
            }
        } catch (JPAException jpae) {
            throw new ServiceException("?JpaExcetion-error?FSN?",
                    jpae.getException());
        } catch (Exception e) {
            throw new ServiceException("?service-error?FSN?", e);
        }
    }

    /**
     * ?????
     * @param orig_businessUnit
     * @param businessUnit
     * @author ZhangHui
     */
    private void setBusinessUnitValue(BusinessUnit orig_businessUnit, BusinessUnit businessUnit) {
        orig_businessUnit.setAddress(businessUnit.getAddress());
        orig_businessUnit.setOtherAddress(businessUnit.getOtherAddress());
        orig_businessUnit.setPersonInCharge(businessUnit.getPersonInCharge());
        orig_businessUnit.setContact(businessUnit.getContact());
        orig_businessUnit.setTelephone(businessUnit.getTelephone());
        orig_businessUnit.setPostalCode(businessUnit.getPostalCode());
        orig_businessUnit.setEmail(businessUnit.getEmail());
        orig_businessUnit.setFax(businessUnit.getFax());
        orig_businessUnit.setAbout(businessUnit.getAbout());
        orig_businessUnit.setWebsite(businessUnit.getWebsite());
        orig_businessUnit.setMarketOrg(businessUnit.getMarketOrg());
    }

    private Set<District> getNewDistrict(Set<District> orig_district, Set<District> now_district) throws Exception {
        try {
            List<Long> new_ids = new ArrayList<Long>();
            List<Long> orig_ids = new ArrayList<Long>();
            Set<District> new_orig_dis = new HashSet<District>();
            if (now_district != null) {
                for (District dis : now_district) {
                    if (dis.getId() != null)
                        new_ids.add(dis.getId());
                }
            }
            if (orig_district != null) {
                for (District ordis : orig_district) {
                    if (new_ids.contains(ordis.getId()))
                        new_orig_dis.add(ordis);
                }
            }
            for (District dis1 : new_orig_dis) {
                if (dis1.getId() != null)
                    orig_ids.add(dis1.getId());
            }
            for (District dist : now_district) {
                if (dist.getId() != null && !orig_ids.contains(dist.getId())) {
                    District orig_distr = districtService.findById(dist.getId());
                    new_orig_dis.add(orig_distr);
                    orig_ids.add(dist.getId());
                }
            }
            return new_orig_dis;
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * ??FSN bus_unit?
     * @param businessUnit  ??
     * @param step          
     * @return void
     * @throws ServiceException
     * @author TangXin
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void updateBusinessUnit(BusinessUnit businessUnit, String step) throws ServiceException {
        try {
            if (step == null && businessUnit != null) {
                updateBusinessUnit(businessUnit);
                return;
            }
            if (step.equals("step1") || step.equals("step3")) {
                return;
            }
            if (step.equals("step2")) {
                BusinessUnit orig_businessUnit = findById(businessUnit.getId());
                if (businessUnit.getLicense() != null) {
                    orig_businessUnit
                            .setLicense(licenseService.getDAO().findById(businessUnit.getLicense().getLicenseNo()));
                }
                if (businessUnit.getOrgInstitution() != null) {
                    orig_businessUnit.setOrgInstitution(
                            orgInstitutionService.findByOrgCode(businessUnit.getOrgInstitution().getOrgCode()));
                }
                if (businessUnit.getDistribution() != null) {
                    orig_businessUnit.setDistribution(circulationPermitService
                            .findByDistributionNo(businessUnit.getDistribution().getDistributionNo()));
                }
                if (businessUnit.getTaxRegister() != null) {
                    orig_businessUnit
                            .setTaxRegister(taxRegisterService.findById(businessUnit.getTaxRegister().getId()));
                }
                if (businessUnit.getLiquorSalesLicense() != null) {
                    orig_businessUnit.setLiquorSalesLicense(
                            liquorSalesLicenseService.findById(businessUnit.getLiquorSalesLicense().getId()));
                }
                update(orig_businessUnit);
            }
        } catch (JPAException jpae) {
            throw new ServiceException(
                    "[JPAException]BusinessUnitServiceImpl.updateBusinessUnit()-->" + jpae.getMessage(),
                    jpae.getException());
        } catch (ServiceException sex) {
            throw new ServiceException(
                    "[ServiceException]BusinessUnitServiceImpl.updateBusinessUnit()-->" + sex.getMessage(),
                    sex.getException());
        }
    }

    /**
     * ?sso???sso?
     * @param businessUnit       ???
     * @param orig_businessUnit  ?????
     * @return
     * @throws ServiceException 
     */
    public JSONObject updateBusInfoInSSO(BusinessUnit businessUnit, BusinessUnit orig_businessUnit)
            throws ServiceException {
        try {
            StringBuffer sb = new StringBuffer();
            sb.append("parentId=").append(orig_businessUnit.getParentOrganizationId());
            //sb.append("&organizationName=").append(URLEncoder.encode(businessUnit.getName().toString(), "utf-8"));  //?????
            sb.append("&organizationAddress=")
                    .append(URLEncoder.encode(businessUnit.getAddress().toString(), "utf-8"));
            sb.append("&comments=").append("");
            sb.append("&organizationId=").append(orig_businessUnit.getOrganization());
            sb.append("&isFsnRequest=").append(true);
            String result = SSOClientUtil.send(HttpUtils.getSSOHostname() + "/service/organization",
                    SSOClientUtil.PUT, sb.toString());
            JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
            return jsonResult;
        } catch (Exception e) {
            throw new ServiceException("?service-errorupdateBusInfoInSSO ",
                    e);
        }
    }

    /**
     * ??Id???nameaddrelicenseNobusinessType
     */
    @Override
    public BusinessUnit findByIdOfLigth(Long busId) throws ServiceException {
        try {
            return getDAO().getBusinessByOrganizationIdOfLigth(busId);
        } catch (DaoException dep) {
            throw new ServiceException("BusinessUnitServiceImpl.findByIdOfLigth() " + dep.getMessage(),
                    dep.getException());
        }
    }

    /**
     * ??
     */
    @SuppressWarnings("unchecked")
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public Model batchAddSubsidiary(ExlVO exlVO, Long currentUserOrganization, Model model)
            throws ServiceException {
        try {
            BusinessUnit parentBu = getDAO().findByOrgnizationId(currentUserOrganization);
            List<Resource> attachments = exlVO.getAryExlAttachments();
            for (Resource re : attachments) {
                List<BusinessUnit> bus = AnalysisExlUtil.getBuListByExlByte(re.getFile());
                BatchAddSubsidiatyVO batchAddSuVO = new BatchAddSubsidiatyVO();
                List<OrganizationVO> orgs = new ArrayList<OrganizationVO>();
                List<JSONObject> existsBusJsonList = new ArrayList<JSONObject>();
                String strJson = "";
                for (BusinessUnit bu : bus) {
                    BusinessUnit b = getDAO().findByName(bu.getName());
                    OrganizationVO org = new OrganizationVO();
                    org.setOrganizationName(bu.getName());
                    org.setOrganizationAddress(bu.getAddress());
                    org.setParentId(currentUserOrganization.toString());
                    org.setLicenseNo(bu.getLicense().getLicenseNo());
                    org.setComments("");
                    if (b == null) {
                        orgs.add(org);
                    } else {
                        strJson += "{'organizationName':'" + bu.getName() + "','organizationAddress':'"
                                + bu.getAddress() + "','licenseNo':'" + bu.getLicense().getLicenseNo()
                                + "','msg':'????'},";
                    }
                }
                if (strJson.length() > 0) {
                    strJson = strJson.substring(0, strJson.length() - 1);
                    strJson = "{'success':[],'faild':[" + strJson + "]}";
                    strJson.replaceAll("'", "\"");
                    JSONObject jsn = (JSONObject) JSONSerializer.toJSON(strJson);
                    existsBusJsonList.addAll(jsn.getJSONArray("faild"));
                }
                if (orgs.size() > 0) {
                    batchAddSuVO.setOrganizations(orgs);
                    JSONObject json = JSONObject.fromObject(batchAddSuVO);
                    String result = SSOClientUtil.send(
                            HttpUtils.getSSOHostname() + "/service/organization/fsnOrgainzationReg",
                            SSOClientUtil.POST, json);
                    JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
                    List<JSONObject> successList = jsonResult.getJSONArray("success");
                    List<JSONObject> faildList = jsonResult.getJSONArray("faild");
                    for (JSONObject org : successList) {
                        BusinessUnit bu = new BusinessUnit();
                        bu.setLicense(new LicenseInfo());
                        bu.setName(org.getString("organizationName"));
                        bu.setAddress(org.getString("organizationAddress"));
                        bu.getLicense().setLicenseNo(org.getString("licenseNo"));
                        bu.setOrganization(Long.parseLong(org.getString("id")));
                        bu.setType(parentBu.getType());
                        bu.setParentOrganizationId(currentUserOrganization);
                        create(bu);
                    }
                    faildList.addAll(existsBusJsonList);
                    model.addAttribute("successSize", successList.size());
                    model.addAttribute("faildList", faildList);
                    model.addAttribute("faildSize", faildList.size());
                } else {
                    model.addAttribute("successSize", 0);
                    model.addAttribute("faildList", existsBusJsonList);
                    model.addAttribute("faildSize", existsBusJsonList.size());
                }
            }

        } catch (Exception e) {
            throw new ServiceException("", e);

        }
        return model;
    }

    /**
     * service????
     */
    @Override
    public boolean verificationEnName(String name) throws ServiceException {
        boolean isExist = false;
        StringBuffer sb = new StringBuffer();
        try {
            sb.append("orgName=").append(URLEncoder.encode(name, "utf-8"));
            sb.append("&parentId=").append(0L);
            isExist = enterpriseService.verificationEnName(name);
            if (isExist) {
                return isExist;
            }
            String result = SSOClientUtil.send(
                    HttpUtils.getSSOHostname() + "/service/organization/checkOrgNameUnique", SSOClientUtil.GET,
                    sb.toString());
            JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
            if (jsonResult.get("status").equals("false")) {
                isExist = true;
            }
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.verificationEnName()-->" + sex.getMessage(),
                    sex.getException());
        } catch (Exception e) {
            throw new ServiceException("", e);
        }
        return isExist;
    }

    /**
     * service????
     */
    @Override
    public boolean verificationEnUserName(String userName) throws ServiceException {
        boolean isExist = false;
        StringBuffer sb = new StringBuffer();
        try {
            sb.append("name=").append(URLEncoder.encode(userName, "utf-8"));
            isExist = enterpriseService.verificationEnUserName(userName);
            if (isExist) {
                return isExist;
            }
            //String casServiceURL = SSOClientUtil.getServiceURLOfCurrentCAS();
            String result = SSOClientUtil.send(
                    HttpUtils.getSSOHostname() + "/service/portal/user/checkUserNameUnique", SSOClientUtil.GET,
                    sb.toString());
            JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
            if (jsonResult.get("status").equals("false")) {
                isExist = true;
            }
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.verificationEnUserName()-->" + sex.getMessage(),
                    sex.getException());
        } catch (Exception e) {
            throw new ServiceException("", e);
        }
        return isExist;
    }

    /**
     * ??
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void noPassReturn(String returnMes, Long id) throws ServiceException {
        StringBuffer sb = new StringBuffer();
        try {
            EnterpriseRegiste enRegiste = enterpriseService.findById(id);
            if (enRegiste != null) {
                sb.append("userName=").append(URLEncoder.encode(enRegiste.getUserName(), "utf-8"));
                sb.append("&organizationName=").append(URLEncoder.encode(enRegiste.getEnterpriteName(), "utf-8"));
                sb.append("&reason=").append(URLEncoder.encode(returnMes, "utf-8"));
                sb.append("&email=").append(URLEncoder.encode(enRegiste.getEmail(), "utf-8"));
                String result = SSOClientUtil.send(
                        HttpUtils.getSSOHostname() + "/service/organization/fsnRejectRegist", SSOClientUtil.POST,
                        sb.toString());
                JSONObject jsonResult = (JSONObject) JSONSerializer.toJSON(result);
                if (jsonResult.getString("status").equals("true")) {
                    enterpriseService.delete(enRegiste);
                }
            }
        } catch (ServiceException sex) {
            throw new ServiceException("BusinessUnitServiceImpl.noPassReturn()-->" + sex.getMessage(),
                    sex.getException());
        } catch (Exception e) {
            throw new ServiceException("", e);
        }
    }

    /**
     * ?????? 
     */
    @Override
    public List<String> getAllBusUnitName(String name, int page, int pageSize) throws ServiceException {
        try {
            return getDAO().getAllBusUnitName(name, page, pageSize);
        } catch (DaoException daoe) {
            throw new ServiceException("?service-error:????",
                    daoe.getException());
        }
    }

    /**
     * ??????
     */
    @Override
    public List<String> getAllBusUnitLicenseNoAndId() throws ServiceException {
        try {
            return getDAO().getAllLicenseNoAndId();
        } catch (DaoException daoe) {
            throw new ServiceException(
                    "?service-error:?????",
                    daoe.getException());
        }
    }

    /**
     * ?????
     */
    @Override
    public List<String> getAllAddressAndId() throws ServiceException {
        try {
            return getDAO().getAllBusUnitAddressAndId();
        } catch (DaoException daoe) {
            throw new ServiceException("?service-error????",
                    daoe.getException());
        }
    }

    private Map<String, Object> getConfigureEn(String configure) throws ServiceException {
        if (configure == null || configure.equals("null")) {
            return null;
        }
        Object[] params = null;
        String new_configure = " WHERE ";
        params = new Object[1];
        String filter[] = configure.split("@@");
        for (int i = 0; i < filter.length; i++) {
            String filters[] = filter[i].split("@");
            if (filters.length > 3) {
                try {
                    String config = splitJointConfigureEn(filters[0], filters[1], filters[2]);
                    if (config == null) {
                        continue;
                    }
                    if (i == 0) {
                        new_configure = new_configure + config;
                    } else {
                        new_configure = new_configure + " AND " + config;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("condition", new_configure);
        map.put("params", params);
        return map;
    }

    /**
    * ??
    * @param field
    * @param mark
    * @param value
    * @throws ServiceException
    */
    private String splitJointConfigureEn(String field, String mark, String value) throws ServiceException {
        try {
            value = URLDecoder.decode(value, "utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new ServiceException(
                    "?Service-Error?utf-8???", e);
        }
        if (field.equals("id")) {
            return FilterUtils.getConditionStr("id", mark, value);
        }
        if (field.equals("userName")) {
            return FilterUtils.getConditionStr("userName", mark, value);
        }
        if (field.equals("materialNo")) {
            return FilterUtils.getConditionStr("materialNo", mark, value);
        }
        if (field.equals("enterpriteName")) {
            return FilterUtils.getConditionStr("enterpriteName", mark, value);
        }
        if (field.equals("enterptiteAddress")) {
            return FilterUtils.getConditionStr("enterptiteAddress", mark, value);
        }
        if (field.equals("legalPerson")) {
            return FilterUtils.getConditionStr("legalPerson", mark, value);
        }
        if (field.equals("status")) {
            return FilterUtils.getConditionStr("status", mark, value);
        }
        if (field.equals("name")) {
            return FilterUtils.getConditionStr("name", mark, value);
        }
        if (field.equals("email")) {
            return FilterUtils.getConditionStr("email", mark, value);
        }
        if (field.equals("personInCharge")) {
            return FilterUtils.getConditionStr("personInCharge", mark, value);
        }
        if (field.equals("telephone")) {
            return FilterUtils.getConditionStr("telephone", mark, value);
        }
        if (field.equals("license")) {
            return FilterUtils.getConditionStr("license_no", mark, value);
        }
        if (field.equals("enterpriteType")) {
            return FilterUtils.getConditionStr("enterpriteType", mark, value);
        }
        if (field.equals("enterpriteDate")) {
            return FilterUtils.getConditionStr("enterpriteDate", mark, value);
        }
        return null;
    }

    /**
      * ?where
      * @param organizationId ?ID
      * @param condition ??
      * @return
      */
    private Map<String, Object> getConfigure(Long organizationId, String condition) {
        String new_configure = " WHERE e.parentOrganizationId = ?1";
        if (condition != null && !condition.equals("null")) {
            String filter[] = condition.split("@@");
            for (int i = 0; i < filter.length; i++) {
                String filters[] = filter[i].split("@");
                try {
                    String config = splitJointConfigure(filters[0], filters[1], filters[2]);
                    if (config == null) {
                        continue;
                    }
                    if (i == 0) {
                        new_configure = new_configure + " AND " + config;
                    } else {
                        new_configure = new_configure + " AND " + config;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("condition", new_configure);
        map.put("params", new Object[] { organizationId });
        return map;
    }

    /**
     * ??
     * @param field
     * @param mark
     * @param value
     * @throws ServiceException
     */
    private String splitJointConfigure(String field, String mark, String value) throws ServiceException {
        try {
            value = URLDecoder.decode(value, "utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new ServiceException(
                    "?Service-Error?utf-8???", e);
        }
        if (field.equals("id")) {
            return FilterUtils.getConditionStr("id", mark, value);
        }
        if (field.equals("name")) {
            return FilterUtils.getConditionStr("name", mark, value);
        }
        if (field.equals("address")) {
            return FilterUtils.getConditionStr("address", mark, value);
        }
        if (field.equals("license_licenseNo")) {
            return FilterUtils.getConditionStr("license.licenseNo", mark, value);
        }
        return null;
    }

    /**
     * ??pdf
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public boolean removeBusUnitPdf(Long resId, Long busId) throws ServiceException {
        try {
            Set<Resource> removes = new HashSet<Resource>();
            Resource remove = testResourceService.findById(resId);
            removes.add(remove);
            BusinessUnit orgBus = findById(busId);
            if (removes != null && orgBus != null) {
                orgBus.removeResources(removes);
                testResourceService.delete(remove);
                update(orgBus);
            }
            return true;
        } catch (Exception e) {
            throw new ServiceException("service-exception: ??pdf?", e);
        }
    }

    @Override
    public Long countBusPdfByBusId(Long busId) throws ServiceException {
        try {
            return testResourceService.countBusPdfByBusId(busId);
        } catch (ServiceException se) {
            throw new ServiceException("BusinessUnitServiceImpl.countBusPdfByBusId() " + se.getMessage(),
                    se.getException());
        }
    }

    /**
     * ??id???pdf
     */
    @Override
    public List<Resource> getBusinessPdfsByBusUnitIdWithPage(Long busId, int page, int pageSize)
            throws ServiceException {
        try {
            return testResourceService.getListBusPdfWithPage(busId, page, pageSize);
        } catch (ServiceException jpae) {
            throw new ServiceException(
                    "service-exception:??id???pdf?",
                    jpae.getException());
        }
    }

    /**
     * ??id?pdf
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public boolean wdaBackBusUnitById(Long busId, String backMsg) throws ServiceException {
        BusinessUnit orig_bus = findById(busId);
        if (orig_bus != null) {
            orig_bus.setWdaBackFlag(true);
            orig_bus.setWdaBackMsg(backMsg);
            update(orig_bus);
            return true;
        }
        return false;
    }

    /**
     * ????
     */
    @Override
    public Long countProductByBusinessCertificationId(Long busCertId) throws ServiceException {
        try {
            return businessCertificationService.countProductByBusinessCertificationId(busCertId);
        } catch (ServiceException e) {
            throw new ServiceException(
                    "BusinessUnitServiceImpl.countProductByBusinessCertificationId() " + e.getMessage(),
                    e.getException());
        }
    }

    /**
     * ?id??
     */
    @Override
    public BusinessUnit findByOrganization(Long organization) throws ServiceException {
        try {
            return getDAO().findByOrgnizationId(organization);
        } catch (DaoException daoe) {
            throw new ServiceException("BusinessUnitServiceImpl.findByOrganization() " + daoe.getMessage(),
                    daoe.getException());
        }
    }

    /**
      * ??????
      * @param orgCode
      * @return booleanture??
      */
    @Override
    public boolean validateBusUnitOrgCode(String orgCode, Long orgId) throws ServiceException {
        try {
            return getDAO().validateBusUnitOrgCode(orgCode, orgId);
        } catch (DaoException daoe) {
            throw new ServiceException("BusinessUnitServiceImpl.validateBusUnitOrgCode() " + daoe.getMessage(),
                    daoe.getException());
        }
    }

    /**
        * ? ??? ???
        */
    @Override
    public BusinessUnit findByName(String name) throws ServiceException {
        try {
            return getDAO().findByName(name);
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl.findByName()-->" + dex.getMessage(),
                    dex.getException());
        }
    }

    /**
     * ???id????
     * @author ZhangHui 2015/5/1
     * ZhangHui 2015/5/14<br>
     * ?LightBusUnitVO
     */
    @Override
    public LightBusUnitVO findBusVOByOrg(Long organization) throws ServiceException {
        try {
            return getDAO().findBusVOByOrg(organization);
        } catch (DaoException daoe) {
            throw new ServiceException("BusinessUnitServiceImpl.findByOrganization() " + daoe.getMessage(),
                    daoe.getException());
        }
    }

    /**
     * ??????????
     * @author ZhangHui 2015/5/14
     */
    @Override
    public LightBusUnitVO findVOByName(String name) throws ServiceException {
        try {
            return getDAO().findVOByName(name);
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl.findByName()-->" + dex.getMessage(),
                    dex.getException());
        }
    }

    /**
     * ????
     * @param busName
     * @param signFlag
     * @throws ServiceException
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public boolean updateSignStatus(String busName, boolean signFlag, boolean passFlag) throws ServiceException {
        try {
            /*BusinessUnit orig_bus = this.findByName(busName);
            if(orig_bus != null){
               orig_bus.setSignFlag(signFlag);
               update(orig_bus);
               return true;
            }
            return false;*/
            return getDAO().updateSignStatus(busName, signFlag, passFlag);
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl.updateBusUnitSignStatus() " + e.getMessage(), e);
        }
    }

    /**
     * ?????
     * @param busName
     * @return
     * @throws ServiceException
     */
    public boolean findSignFlagByName(String busName) throws ServiceException {
        try {
            return getDAO().findSignFlagByName(busName);
        } catch (DaoException daoe) {
            throw new ServiceException("BusinessUnitServiceImpl.findSignFlagByName() " + daoe.getMessage(), daoe);
        }
    }

    /**
     * ???
     */
    public long countMarketByOrganization(Long organization, String configure) throws ServiceException {
        try {
            return getDAO().countMarketByOrganization(getConfigureEn(configure), organization);
        } catch (DaoException daoe) {
            throw new ServiceException("BusinessUnitServiceImpl-->countMarketByOrganization()" + daoe.getMessage(),
                    daoe);
        }
    }

    /**
     * ???,???????
     * @param busUnit
     * @return
     * @throws ServiceException
     * @author TangXin
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public BusinessUnit save(BusinessUnit busUnit) throws ServiceException {
        try {
            if (busUnit == null)
                return null;
            BusinessUnit orig_bus = getDAO().findByName(busUnit.getName());
            if (orig_bus == null) {
                create(busUnit);
                orig_bus = busUnit;
            } else {
                String mainAddr = orig_bus.getAddress();
                String otherAddress = orig_bus.getOtherAddress();
                String streetAddr = null;
                if (otherAddress != null && otherAddress.split("--").length > 1) {
                    streetAddr = otherAddress.split("--")[1];
                }
                if (mainAddr == null || mainAddr.equals("") || streetAddr == null || streetAddr.equals("")) {
                    orig_bus.setAddress(busUnit.getAddress());
                    orig_bus.setOtherAddress(busUnit.getOtherAddress());
                    update(orig_bus);
                }
            }
            return orig_bus;
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl-->saveQRCodeProductBusUnit()" + e.getMessage(), e);
        }
    }

    /** 
     * ??? ? 
     * @param obj 
     * @author <br>
      * 
      * 2015/3/16
     * 
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void create(JSONObject obj) {
        try {
            String bussName = obj.getString("name");
            BusinessUnit businessUnit = new BusinessUnit();
            if (bussName.equals("") || bussName == null) {
                return;
            }
            businessUnit.setName(bussName);
            businessUnit.setAddress(obj.getString("address"));
            businessUnit.setContact(obj.getString("contact"));
            businessUnit.setEmail(obj.getString("email"));
            businessUnit.setRegion(obj.getString("region"));
            businessUnit.setSampleLocal(obj.getString("sampleLocal"));
            businessUnit.setAdministrativeLevel(obj.getString("administrativeLevel"));
            businessUnit.setPostalCode(obj.getString("postalCode"));
            businessUnit.setPersonInCharge("personInCharge");
            businessUnit.setTelephone(obj.getString("contact_phone"));
            businessUnit.setFax(obj.getString("fax"));
            String license = obj.getString("license_no");
            if (StringUtils.isNotEmpty(license)) {
                businessUnit.setLicense(null);
            } else {
                LicenseInfo lic = licenseService.findByLic(license);
                if (lic == null) {
                    businessUnit.setLicense(new LicenseInfo());
                    businessUnit.getLicense().setLicenseNo(license);
                } else {
                    businessUnit.setLicense(lic);
                }
            }
            String distribution = obj.getString("distribution_no");
            if (StringUtils.isNotEmpty(distribution)) {
                businessUnit.setDistribution(null);
            } else {
                CirculationPermitInfo cir = circulationPermitService.findByDistributionNo(distribution);
                if (cir == null) {
                    businessUnit.setDistribution(new CirculationPermitInfo());
                    businessUnit.getDistribution().setDistributionNo(distribution);
                } else {
                    businessUnit.setDistribution(cir);
                }
            }
            create(businessUnit);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * ??
     * @param bu
     * @return Map
     * @author LongXianZhen
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @Override
    public Map<String, Object> saveBusinessUnit(BusinessUnitVO bu) {
        Map<String, Object> map = new HashMap<String, Object>();
        String bussName = bu.getName().trim();
        BusinessUnit businessUnit = new BusinessUnit();
        if (bussName.equals("") || bussName == null) {
            map.put("msg", "???");
            map.put("status", "false");
            return map;
        }
        BusinessUnit bus = null;
        try {
            bus = findByName(bussName);
        } catch (ServiceException e1) {
            e1.printStackTrace();
        }
        if (bus != null) {
            map.put("business", bus);
            map.put("status", "true");
            return map;
        }
        businessUnit.setName(bussName);
        businessUnit.setAddress(bu.getAddress() == null || bu.getAddress().equals("") ? null : bu.getAddress());
        businessUnit.setContact(bu.getContact() == null || bu.getContact().equals("") ? null : bu.getContact());
        businessUnit.setEmail(bu.getEmail() == null || bu.getEmail().equals("") ? null : bu.getEmail());
        businessUnit.setRegion(bu.getRegion() == null || bu.getRegion().equals("") ? null : bu.getRegion());
        businessUnit.setSampleLocal(
                bu.getSampleLocal() == null || bu.getSampleLocal().equals("") ? null : bu.getSampleLocal());
        businessUnit.setAdministrativeLevel(
                bu.getAdministrativeLevel() == null || bu.getAdministrativeLevel().equals("") ? null
                        : bu.getAdministrativeLevel());
        businessUnit.setPostalCode(
                bu.getPostalCode() == null || bu.getPostalCode().equals("") ? null : bu.getPostalCode());
        businessUnit.setPersonInCharge(bu.getPersonInCharge() == null || bu.getPersonInCharge().equals("") ? null
                : bu.getPersonInCharge());
        businessUnit.setTelephone(
                bu.getContact_phone() == null || bu.getContact_phone().equals("") ? null : bu.getContact_phone());
        businessUnit.setFax(bu.getFax() == null || bu.getFax().equals("") ? null : bu.getFax());
        //??
        if ("".equals(bu.getLicense_no()) || bu.getLicense_no() == null) {
            businessUnit.setLicense(null);
        } else {
            LicenseInfo lic = licenseService.findByLic(bu.getLicense_no().trim());
            if (lic == null) {
                businessUnit.setLicense(new LicenseInfo());
                businessUnit.getLicense().setLicenseNo(bu.getLicense_no());
            } else {
                businessUnit.setLicense(lic);
            }

        }
        //????
        if ("".equals(bu.getDistribution_no()) || bu.getDistribution_no() == null) {
            businessUnit.setDistribution(null);
        } else {
            CirculationPermitInfo cir = null;
            try {
                cir = circulationPermitService.findByDistributionNo(bu.getDistribution_no());
            } catch (ServiceException e) {
                e.printStackTrace();
            }
            if (cir == null) {
                businessUnit.setDistribution(new CirculationPermitInfo());
                businessUnit.getDistribution().setDistributionNo(bu.getDistribution_no());
            } else {
                businessUnit.setDistribution(cir);
            }

        }
        try {
            businessUnitDAO.persistent(businessUnit);
        } catch (JPAException e) {
            e.printStackTrace();
            map.put("msg", "??");
            map.put("status", "false");
            return map;
        }
        map.put("business", businessUnit);
        map.put("status", "true");
        return map;
    }

    /**
     * ??ID???
     * @author ZhaWanNeng
     */
    @Override
    public String getMarketNameByOrganization(Long organization) throws ServiceException {
        try {
            String orig_marketName = businessUnitDAO.getMarketNameByOrganization(organization);
            if (StringUtils.isNotEmpty(orig_marketName)) {
                orig_marketName = orig_marketName + "-";
            }
            return orig_marketName;
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl-->getMarketNameByOrganization()" + e.getMessage(),
                    e);
        }
    }

    /**
     * ?
     * @return Long
     * @author ZhaWanNeng
      * 
      * 2015/4/10
     */
    @Override
    public Long unitCount() throws ServiceException {
        try {
            return getDAO().unitCount();
        } catch (DaoException dex) {
            throw new ServiceException("BusinessUnitServiceImpl-->unitCount()" + dex.getMessage(),
                    dex.getException());
        }
    }

    /**
     * ?ID??id
     * @author ZhangHui 2015/4/8
     */
    @Override
    public Long findIdByOrg(Long organization) throws ServiceException {
        try {
            return getDAO().getIdByOrganization(organization);
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl-->findIdByOrg()" + e.getMessage(), e);
        }
    }

    /**
     * ????id?
     * @throws ServiceException
     * @author ZhangHui 2015/7/1
     */
    @Override
    public Long findOrgById(Long organization) throws ServiceException {
        try {
            return getDAO().findOrgById(organization);
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl-->findOrgById()" + e.getMessage(), e);
        }
    }

    /**
     * ??????id
     * @author ZhangHui 2015/6/2
     */
    @Override
    public Long findIdByName(String name) throws ServiceException {
        try {
            return getDAO().getIdByName(name);
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl-->findIdByName()" + e.getMessage(), e);
        }
    }

    /**
     * ???
     * @author HuangYog
     * Create date 2015/04/13
     */
    @Override
    public Object getAllBusUnitName(Integer page, Integer pageSize, String keyword, String busType)
            throws ServiceException {
        try {
            return getDAO().getAllBusUnitName(page, pageSize, keyword, busType);
        } catch (DaoException daoe) {
            throw new ServiceException(
                    "?service-error:????",
                    daoe.getException());
        }
    }

    /**
     * ?????<br>
     * ???
     * @author ZhangHui 2015/4/24
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public boolean saveBYProducer(ProductInstance sample, Long organization) {
        try {
            if (sample == null) {
                return false;
            }
            BusinessUnit producer = sample.getProducer();
            if (producer == null) {
                return false;
            }
            String bus_guid = producer.getGuid();
            if (bus_guid == null || "".equals(bus_guid)) {
                return false;
            }

            /* 1. ??? */
            LicenseInfo orig_license = null;
            if (producer.getLicense() != null) {
                orig_license = licenseService.save(producer.getLicense().getLicenseNo());
                producer.setLicense(orig_license);
            }

            /* 2. ??? */
            BusinessUnit orig_busUnit = getDAO().findByGuid(bus_guid);
            if (orig_busUnit == null) {
                /* 2.1 ? */
                create(producer);
            } else {
                /**
                 * ????????????????
                 */
                /*orig_busUnit.setLicense(producer.getLicense());
                orig_busUnit.setAddress(producer.getAddress());
                update(orig_busUnit);*/

                producer = orig_busUnit;
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * ????????????<br>
     * ?business TreeNode?
     * @author ZhangHui 2015/5/18
     */
    @Override
    public List<BusinessTreeNode> getRelativesOfTreeNodes(int level, String keyword, Long organization)
            throws ServiceException {
        try {
            return buildProductTree(getDAO().getRelativesOfTreeNodes(level, keyword, organization), level);
        } catch (DaoException e) {
            throw new ServiceException("BusinessUnitServiceImpl.getRelativesOfTreeNodes()-->" + e.getMessage(),
                    e.getException());
        }
    }

    /**
     * build BrandCategoryDetail to BrandCategoryTreeNode
     * @param details
     * @param level
     * */
    @SuppressWarnings("deprecation")
    private static List<BusinessTreeNode> buildProductTree(List<BusinessTreeDetail> details, int level) {
        if (details.size() < 1) {
            return new ArrayList<BusinessTreeNode>(0);
        }

        List<BusinessTreeNode> nodes = new ArrayList<BusinessTreeNode>(details.size());
        for (BusinessTreeDetail detail : details) {
            BusinessTreeNode node = new BusinessTreeNode();
            try {
                node.setId(URLEncoder.encode(level + "_" + detail.getName(), "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                node.setId(URLEncoder.encode(level + "_" + detail.getName()));
            }

            int index = detail.getName().lastIndexOf('.');
            String realName = detail.getName();
            if (index > 0) {
                realName = detail.getName().substring(index + 1);
            }
            node.setName(realName);
            node.setType("folder");
            node.setHasChildren(detail.getChildrenNum() > 0 ? true : false);
            if (detail.getBusinessId() != -1L) {
                node.setLeafId(detail.getBusinessId());
            }
            nodes.add(node);
        }
        nodes.get(0).setExpanded(false);
        return nodes;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public BusinessUnit updateBusinessUnitAll(BusinessUnit businessUnit, AuthenticateInfo info)
            throws ServiceException {

        BusinessUnit orig_businessUnit = findById(businessUnit.getId());
        /* 1. ?sso???sso?  */
        //JSONObject jsonResult = businessUnitService.updateBusInfoInSSO(businessUnit, orig_businessUnit);
        /* 2. fsn??  */
        //if(jsonResult.getString("status").equals("true")){
        /* 2.1 ??? */
        licenseService.save(businessUnit.getLicense());
        /* 2.2 ???  */
        orgInstitutionService.save(businessUnit.getOrgInstitution(), true);
        /* 2.3 ?????? */
        circulationPermitService.save(businessUnit.getDistribution());
        /* 2.4 ????? 
        /* 2.5????*/
        businessCertificationService.save(businessUnit);
        /* ? ??*/
        businessSalesInfoService.save(businessUnit, info);
        /* 2.6 ??? */
        taxRegisterService.save(businessUnit.getTaxRegister());
        if (orig_businessUnit.getType().equals("??")) {
            /* 2.67?? */
            liquorSalesLicenseService.save(businessUnit.getLiquorSalesLicense());
            /* 2.8?? */
            producingDepartmentService.save(businessUnit, businessUnit.getStep());
            /* 2.9 ???? */
            /*producingDepartmentService.save(businessUnit.getSubDepartments(), businessUnit.getId(),false);*/
            /* 3.0 ??? */
            fieldValueService.save(businessUnit.getFieldValues(), businessUnit.getId());
            /* 3.1 ???? */
            //  businessBrandService.save(businessUnit.getBrands(), businessUnit.getId());
            /* 3.2 ??? */
            updateBusinessUnit(businessUnit, businessUnit.getStep());
        } else {
            updateBusinessUnit(businessUnit); // ???
        }
        enterpriseService.update(businessUnit); // ??

        return businessUnit;
    }

    /**
     * ??id????
     * @param organization
     * @author tangxin 2015-05-18
     */
    @Override
    public String findNameByOrganization(Long organization) throws ServiceException {
        try {
            return getDAO().findNameByOrganization(organization);
        } catch (DaoException dao) {
            throw new ServiceException(dao.getMessage(), dao.getException());
        }
    }

    /**
     * ????id???
     * @throws ServiceException
     * @author ZhangHui 2015/7/3
     */
    @Override
    public String findNameById(Long organization) throws ServiceException {
        try {
            return getDAO().findNameById(organization);
        } catch (DaoException dao) {
            throw new ServiceException(dao.getMessage(), dao.getException());
        }
    }

    /***************************************???List*******************************************************/
    /**
     * ??????
     * @author HY
     */
    @Override
    public List<AccountBusinessVO> getAccountEnRegisteList(int page, int pageSize, String province, String city,
            String area, String nameOrLicNo, String btype) throws ServiceException {
        try {
            return businessUnitDAO.getAccountEnRegisteList(page, pageSize, province, city, area, nameOrLicNo,
                    btype);
        } catch (DaoException e) {
            throw new ServiceException(e.getMessage(), e.getException());
        }
    }

    /**
     * ?????? 
     * @author HY
     */
    @Override
    public Long getAccountEnRegisteListTotal(String province, String city, String area, String nameOrLicNo,
            String btype) throws ServiceException {
        try {
            return businessUnitDAO.getAccountEnRegisteListTotal(province, city, area, nameOrLicNo, btype);
        } catch (DaoException e) {
            throw new ServiceException(e.getMessage(), e.getException());
        }
    }

    /**
     * ??id?
     * @author HY
     */
    @Override
    public AccountBusinessVO getAccountBusinessById(Long busId) throws ServiceException {
        try {
            AccountBusinessVO vo = businessUnitDAO.getAccountBusinessById(busId);
            if (vo != null) {
                String date = vo.getRegDate() != null && "".equals(vo.getRegDate()) ? vo.getRegDate().split(".")[0]
                        : vo.getRegDate();
                vo.setRegDate(date);
                EnterpriseRegiste er = enterpriseService.getEnteryByLicNoAndOrgCodeAndBName(vo.getLicNo(),
                        vo.getOrgCode(), vo.getName());
                if (er instanceof EnterpriseRegiste) {
                    /* ??? */
                    String orgImage = er.getOrgAttachments() != null && er.getOrgAttachments().size() > 0
                            ? er.getOrgAttachments().iterator().next().getUrl()
                            : "";
                    /* ???? */
                    String licImage = er.getLicAttachments() != null && er.getLicAttachments().size() > 0
                            ? er.getLicAttachments().iterator().next().getUrl()
                            : "";
                    vo.setOrgImage(orgImage);
                    vo.setLicImage(licImage);
                }
                /* ? */
                if (vo.getLinkMan() == null || "".equals(vo.getLinkMan())) {
                    vo.setLinkMan(vo.getPersonInCharge());
                }
            }
            return vo;
        } catch (DaoException e) {
            throw new ServiceException(e.getMessage(), e.getException());
        }
    }

    /***********************************************************************************************************/

    /**
     * ?
     * ?????
     * @throws ServiceException
     * @author ZhangHui 2015/6/5
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public BusinessUnitOfReportVO saveProducer(BusinessUnitOfReportVO bus_vo) throws ServiceException {
        try {
            if (bus_vo == null || bus_vo.getName() == null || "".equals(bus_vo.getName())) {
                //||bus_vo.getLicenseno()==null || "".equals(bus_vo.getLicenseno())
                throw new Exception("?");
            }

            /**
             * ??????????
             * wubiao  2016.2.18 10:20
             */
            //         BusinessUnit orig_bus = getDAO().findByName(bus_vo.getName());
            BusinessUnit orig_bus = getDAO().findByNameOrganization(bus_vo.getName());

            /**
             * ????????
             *       1  ???????
             *      2 ????????????
             */
            if (orig_bus != null) {
                bus_vo.setId(orig_bus.getId());
                if (!bus_vo.isCan_edit_bus()
                        || (orig_bus.getOrganization() != null && !orig_bus.getOrganization().equals(0L))) {
                    return bus_vo;
                } else {
                    // ??
                    BusinessUnit buss = new BusinessUnit();
                    buss.setId(bus_vo.getId());
                    buss.setName(bus_vo.getName());
                    buss.setAddress(bus_vo.getAddress());

                    /* ??? */
                    LicenseInfo orig_license = licenseService.save(bus_vo.getLicenseno());

                    getDAO().updateRecord(buss, orig_license == null ? "" : orig_license.getLicenseNo());
                }
            } else {
                // ???
                BusinessUnit buss = new BusinessUnit();
                buss.setName(bus_vo.getName());
                buss.setAddress(bus_vo.getAddress());

                /* ??? */
                String licenseno = bus_vo.getLicenseno();
                if (licenseno != null) {
                    licenseno = licenseno.replace(" ", "");
                }

                licenseService.save(licenseno);

                getDAO().createNewRecord(buss.getName(), buss.getAddress(), licenseno);

                // ??id
                Long id = findIdByName(bus_vo.getName());
                if (id == null) {
                    throw new Exception("?");
                }
                bus_vo.setId(id);
            }

            return bus_vo;
        } catch (Exception e) {
            throw new ServiceException("BusinessUnitServiceImpl.saveProducer()-->" + e.getMessage(), e);
        }
    }

    /**
     * ???/?
     * ???????
     * @param business_name  ???
     * @throws ServiceException
     * @author ZhangHui 2015/6/3
     */
    @Override
    public BusinessUnit saveProducerName(String business_name) throws ServiceException {
        try {
            if (business_name == null || "".equals(business_name.replace(" ", ""))) {
                throw new Exception("?");
            }

            business_name = business_name.replace(" ", "");

            BusinessUnit orig_producer = findByName(business_name);

            if (orig_producer == null) {
                BusinessUnit producer = new BusinessUnit();
                producer.setName(business_name);
                create(producer);
                orig_producer = producer;
            }

            return orig_producer;
        } catch (ServiceException e) {
            throw new ServiceException(
                    "[ServiceException]BusinessUnitServiceImpl.saveProducer()-->" + e.getMessage(),
                    e.getException());
        } catch (Exception e) {
            throw new ServiceException("[Exception]BusinessUnitServiceImpl.saveProducer()-->" + e.getMessage(), e);
        }
    }

    /**
     * ??id??
     * @author longxianzhen 2015-08-06
     */
    @Override
    public List<BussinessUnitVOToPortal> getBuVOToPortalByProId(Long proId) throws ServiceException {
        try {
            List<BussinessUnitVOToPortal> bus = businessUnitDAO.getBuVOToPortalByProId(proId);
            /*for(BussinessUnitVOToPortal bu:bus){
               Map<String,String> map=resourceService.getBusinessUnitCertById(bu.getId());
               if(map!=null){
                  String licUrl=map.get("licUrl");
                  if(licUrl!=null){
              bu.setLicImg(licUrl);
                  }
                  String disUrl=map.get("disUrl");
                  if(disUrl!=null){
              bu.setDisImg(disUrl);
                  }
               }
               List<Resource> qsResource = resourceService.getQsResourceByQsId(bu.getQsId());
               if(qsResource!=null&&qsResource.size()>0){
                  bu.setQsImg(qsResource.get(0).getUrl());
               }
            }*/
            return bus;
        } catch (DaoException e) {
            throw new ServiceException(
                    "[ServiceException]BusinessUnitServiceImpl.getBuVOToPortalByProId()-->" + e.getMessage(),
                    e.getException());
        }
    }

    public BusinessUnit findUnitNameSanZhengInfo(long orgId) throws ServiceException {
        BusinessUnit bsine = null;
        try {
            bsine = businessUnitDAO.finUnitSanZenInfo(orgId);
        } catch (DaoException e) {
            return null;
        }
        return bsine;
    }

    /**
     * ????
     * @author longxiaznhen 2015/08/07
     */
    @Override
    public BusinessUnit findSCBusinessByInfo(AuthenticateInfo info) throws ServiceException {
        try {
            /* 1. ??  */
            BusinessUnit businessUnit = getDAO().findSCByOrgnizationId(info.getOrganization());
            if (businessUnit == null) {
                return null;
            }
            LicenseInfo lic = licenseService.findByLic(businessUnit.getLicense().getLicenseNo());
            businessUnit.setLicense(lic);
            OrganizingInstitution org = orgInstitutionService
                    .findByOrgCode(businessUnit.getOrgInstitution().getOrgCode());
            businessUnit.setOrgInstitution(org);
            CirculationPermitInfo cir = circulationPermitService
                    .findByDistributionNo(businessUnit.getDistribution().getDistributionNo());
            businessUnit.setDistribution(cir);
            EnterpriseRegiste orig_enterprise = enterpriseService.findbyEnterpriteName(businessUnit.getName());
            /**
             * ????
             */
            CateringVO cateringVO = cateringService.getCateringVOBusinessId(businessUnit.getId());
            businessUnit.setCatering(cateringVO);

            if (orig_enterprise != null) {
                /* 4. ??  */
                businessUnit.setOrgAttachments(orig_enterprise.getOrgAttachments());
                businessUnit.setLicAttachments(orig_enterprise.getLicAttachments());
                businessUnit.setDisAttachments(orig_enterprise.getDisAttachments());
                businessUnit.setLogoAttachments(orig_enterprise.getLogoAttachments());
                businessUnit.setLiquorAttachments(orig_enterprise.getLiquorAttachments());
                businessUnit.setLiquorCode(orig_enterprise.getServiceNo());//????
            }

            return businessUnit;
        } catch (DaoException dex) {
            throw new ServiceException(
                    "?service-errorId??,?",
                    dex.getException());
        }
    }

    @Transactional(propagation = Propagation.NOT_SUPPORTED, rollbackFor = Exception.class)
    public BusinessUnit getBusinessUnitByCondition(String businessName, String qsNo, String licenseNo) {
        return businessUnitDAO.getBusinessUnitByCondition(businessName, qsNo, licenseNo);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void updateBusinessUnit(String strImg, Long id, String url) {

        businessUnitDAO.updateBusinessUnit(strImg, id, url);
    }

    /**
     * ?ID??
     *
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public List<Resource> getByIdResource(Long id, String strImg) {
        return businessUnitDAO.getByIdResourceList(id, strImg);
    }

    @Override
    public List<BussinessUnitVOToPortal> getBuVOToPortalByBarcode(String barcode) {

        return businessUnitDAO.getBuVOToPortalByBarcode(barcode);
    }

    /**
     * ???
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void updateBusinessBasic(BusinessUnit businessUnit, AuthenticateInfo info) throws ServiceException {
        try {
            BusinessUnit orig_businessUnit = findById(businessUnit.getId());
            orig_businessUnit.setAddress(businessUnit.getAddress());
            orig_businessUnit.setOtherAddress(businessUnit.getOtherAddress());
            orig_businessUnit.setPersonInCharge(businessUnit.getPersonInCharge());
            orig_businessUnit.setContact(businessUnit.getContact());
            orig_businessUnit.setTelephone(businessUnit.getTelephone());
            orig_businessUnit.setPostalCode(businessUnit.getPostalCode());
            orig_businessUnit.setEmail(businessUnit.getEmail());
            orig_businessUnit.setFax(businessUnit.getFax());
            orig_businessUnit.setAbout(businessUnit.getAbout());
            orig_businessUnit.setWebsite(businessUnit.getWebsite());

            update(orig_businessUnit);

            if (businessUnit.getCatering() != null) {
                cateringService.saveOrUpdate(businessUnit.getCatering());
            }
            /* 5.?Logo */
            testResourceService.saveLogoResource(businessUnit.getLogoAttachments(), businessUnit.getName());

            /* ? ??*/
            businessSalesInfoService.save(businessUnit, info);

            //???
            EnterpriseRegiste orig_enterprise = enterpriseService.findbyEnterpriteName(businessUnit.getName());
            if (orig_enterprise != null) {
                orig_enterprise.setEnterptiteAddress(businessUnit.getAddress());
                orig_enterprise.setLegalPerson(businessUnit.getPersonInCharge());
                orig_enterprise.setEmail(businessUnit.getEmail());
                orig_enterprise.setTelephone(businessUnit.getTelephone());
                enterpriseService.update(orig_enterprise);
            }

        } catch (Exception e) {
            throw new ServiceException("?service-error?FSN?", e);
        }

    }

    /**
     * ????
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void updateBusinessCert(BusinessUnit businessUnit, AuthenticateInfo info) throws ServiceException {
        try {
            /* 2.1 ??? */
            licenseService.save(businessUnit.getLicense());
            /* 2.2 ???  */
            orgInstitutionService.save(businessUnit.getOrgInstitution(), true);

            /* 2.3 ?????? */
            circulationPermitService.save(businessUnit.getDistribution());

            /* 2.6 ??? */
            taxRegisterService.save(businessUnit.getTaxRegister());

            /* 2.5????*/
            businessCertificationService.save(businessUnit);

            BusinessUnit orig_businessUnit = findById(businessUnit.getId());

            //setBusinessUnitValue(orig_businessUnit, businessUnit);

            if (businessUnit.getTaxRegister() != null) {
                orig_businessUnit
                        .setTaxRegister(taxRegisterService.findById(businessUnit.getTaxRegister().getId()));
            }
            if (businessUnit.getLicense() != null) {
                orig_businessUnit
                        .setLicense(licenseService.getDAO().findById(businessUnit.getLicense().getLicenseNo()));
            }
            if (businessUnit.getOrgInstitution() != null) {
                orig_businessUnit.setOrgInstitution(
                        orgInstitutionService.findByOrgCode(businessUnit.getOrgInstitution().getOrgCode()));
            }

            if (businessUnit.getDistribution() != null) {
                orig_businessUnit.setDistribution(circulationPermitService
                        .findByDistributionNo(businessUnit.getDistribution().getDistributionNo()));
            }

            update(orig_businessUnit);

        } catch (Exception e) {
            throw new ServiceException("?service-error?FSN?", e);
        }
    }
}