com.foya.noms.service.st.ST002Service.java Source code

Java tutorial

Introduction

Here is the source code for com.foya.noms.service.st.ST002Service.java

Source

package com.foya.noms.service.st;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.foya.dao.mybatis.model.TbAuthPersonnel;
import com.foya.dao.mybatis.model.TbComEqpModel;
import com.foya.dao.mybatis.model.TbComEqpModelExample;
import com.foya.dao.mybatis.model.TbComTown;
import com.foya.dao.mybatis.model.TbComTownExample;
import com.foya.dao.mybatis.model.TbOrgDept;
import com.foya.dao.mybatis.model.TbSiteIdPool;
import com.foya.dao.mybatis.model.TbSiteIdPoolExample;
import com.foya.dao.mybatis.model.TbSiteLocation;
import com.foya.dao.mybatis.model.TbSiteMain;
import com.foya.dao.mybatis.model.TbSiteMainExample;
import com.foya.dao.mybatis.model.TbSiteSearchRing;
import com.foya.dao.mybatis.model.TbSiteWork;
import com.foya.dao.mybatis.model.TbSiteWorkExample;
import com.foya.dao.mybatis.model.TbSiteWorkOrder;
import com.foya.dao.mybatis.model.TbSiteWorkOrderExample;
import com.foya.dao.mybatis.model.TbSysLookup;
import com.foya.exception.CreateFailException;
import com.foya.exception.NomsException;
import com.foya.exception.UpdateFailException;
import com.foya.noms.dao.auth.PersonnelDao;
import com.foya.noms.dao.common.CityDao;
import com.foya.noms.dao.common.TownDao;
import com.foya.noms.dao.common.TownDomainTeamDao;
import com.foya.noms.dao.org.DeptDao;
import com.foya.noms.dao.st.LocationDao;
import com.foya.noms.dao.st.ST002Dao;
import com.foya.noms.dao.st.ST002SP1Dao;
import com.foya.noms.dao.st.SearchRingDao;
import com.foya.noms.dao.st.SiteIdPoolDao;
import com.foya.noms.dao.st.SiteMainDao;
import com.foya.noms.dao.st.WorkDao;
import com.foya.noms.dao.st.WorkOrderDao;
import com.foya.noms.dao.system.OrderTypeDao;
import com.foya.noms.dao.system.WorkOrderTypeDao;
import com.foya.noms.dto.common.TownDomainTeamDTO;
import com.foya.noms.dto.st.SiteHuntApplyDTO;
import com.foya.noms.dto.st.SiteIdPoolDTO;
import com.foya.noms.dto.st.SiteWorkDTO;
import com.foya.noms.dto.st.SiteWorkOrderDTO;
import com.foya.noms.dto.system.OrderTypeDTO;
import com.foya.noms.enums.EmailType;
import com.foya.noms.enums.IncludeRange;
import com.foya.noms.enums.OrderStatus;
import com.foya.noms.enums.PurchaseOrderType;
import com.foya.noms.enums.SiteStatus;
import com.foya.noms.enums.WorkStatus;
import com.foya.noms.enums.WorkType;
import com.foya.noms.service.BaseService;
import com.foya.noms.service.common.EmailTemplateService;
import com.foya.noms.service.system.LookupService;
import com.foya.noms.service.system.OrderTypeService;
import com.foya.noms.service.system.RespUserService;
import com.foya.noms.service.system.UniqueSeqService;
import com.foya.noms.service.workflow.WorkflowActionService;

@Service
public class ST002Service extends BaseService {
    @Autowired
    private ST002Dao st002Dao;
    @Autowired
    private TownDao townDao;
    @Autowired
    private ST002SP1Dao sT002SP1Dao;
    @Autowired
    private WorkDao workDao;
    @Autowired
    private SiteMainDao siteMainDao;
    @Autowired
    private LocationDao locationDao;
    @Autowired
    private UniqueSeqService uniqueSeqService;
    @Autowired
    private OrderTypeDao orderTypeDao;
    @Autowired
    private DeptDao deptDao;
    @Autowired
    private OrderTypeService orderTypeService;
    @Autowired
    private WorkOrderDao workOrderDao;
    @Autowired
    private SearchRingDao searchRingDao;
    @Autowired
    private SiteIdPoolDao siteIdPoolDao;
    @Autowired
    private WorkflowActionService workflowActionService;
    @Autowired
    private WorkOrderTypeDao workOrderTypeDao;
    @Autowired
    private TownDomainTeamDao townDomainTeamDao;
    @Autowired
    private SiteStatusLogService siteStatusLogService;
    @Autowired
    private CityDao cityDao;
    @Autowired
    private RespUserService respUserService;
    @Autowired
    private SiteEmailService siteEmailService;
    @Autowired
    private EmailTemplateService emailTemplateService;
    @Autowired
    private LookupService lookupService;
    @Autowired
    private PersonnelDao personnelDao;

    /**
     * siteWork
     * 
     * @param map
     * @return
     */
    public List<SiteWorkDTO> getWorkList(Map<String, Object> map) {
        return st002Dao.findWorkList(map);
    }

    /**
     * 
     * 
     * @param example
     * @return
     */
    public List<TbComEqpModel> getEqpModelList(TbComEqpModelExample example) {
        return st002Dao.findEqpModelList(example);
    }

    /**
     * DeptIdsiteWork
     * 
     * @param deptIdList
     * @return
     */
    public List<SiteWorkDTO> getWorkListByDeptId(List<String> deptIdList) {
        return st002Dao.findWorkListByDeptId(deptIdList);
    }

    /**
     * TbComTownExample?
     * 
     * @param example
     * @return
     */
    public List<TbComTown> getTownByCondition(TbComTownExample example) {
        return townDao.findTownByCondition(example);
    }

    /**
     * workIdsiteWork
     * 
     * @return
     */
    public SiteWorkDTO getSiteWorkByWorkId(String workId) {
        return st002Dao.findSiteWorkByWorkId(workId);
    }

    /**
     * workIdSiteWorkOrder
     * 
     * @param workId
     * @return
     */
    public List<SiteWorkOrderDTO> getSiteWorkOrderByWorkId(String workId) {
        return st002Dao.findSiteWorkOrderByWorkId(workId);
    }

    /**
     * siteIdPool
     * 
     * @param map
     * @return
     */
    public List<SiteIdPoolDTO> getUnuseBTSSiteId(Map<String, String> map) {
        return siteIdPoolDao.findUnuseBTSSiteId(map);
    }

    /**
     * SiteHunt ?
     * 
     * @param siteHuntApply
     * @return
     */
    public String doValidate(SiteHuntApplyDTO siteHuntApply) {
        String errorMessages = "";

        String feqType = siteHuntApply.getFeqId().split(",")[1];
        String feqId = siteHuntApply.getFeqId().split(",")[0];
        String eqpTypeId = siteHuntApply.getEqpTypeId();
        String btsSiteId = StringUtils.trimToNull(siteHuntApply.getBtsSiteId());
        String domain = townDomainTeamDao
                .getTownDomainTeamByCityIdTownId(siteHuntApply.getCity(), siteHuntApply.getArea()).getDOMAIN();
        domain = domain.substring(0, 1);
        String coverageType = siteHuntApply.getCoverageType();
        String srId = siteHuntApply.getSrId();
        // btsSiteId
        if (btsSiteId != null || !WorkType.NSR.name().equals(siteHuntApply.getWorkType())) {
            errorMessages += doValidateBTSSiteId(eqpTypeId, feqType, domain, btsSiteId, coverageType);
        }
        if (WorkType.NSR.name().equals(siteHuntApply.getWorkType()) && btsSiteId != null) {
            TbSiteMainExample example = new TbSiteMainExample();
            example.createCriteria().andBTS_SITE_IDEqualTo(btsSiteId);
            List<TbSiteMain> siteMain = sT002SP1Dao.findWorkSiteListByExample(example);
            if (siteMain.size() != 0) {
                errorMessages += "?\n";
            }
        } else if (WorkType.SH.name().equals(siteHuntApply.getWorkType())) {
            TbSiteMainExample example = new TbSiteMainExample();
            example.createCriteria().andBTS_SITE_IDEqualTo(btsSiteId);
            List<TbSiteMain> siteMain = sT002SP1Dao.findWorkSiteListByExample(example);
            if (siteMain.size() != 0) {
                if (!SiteStatus.S02.name().equals(siteMain.get(0).getSITE_STATUS())) {
                    errorMessages += "?" + SiteStatus.S02.getLocalName()
                            + "??\n";
                }
            }
        }
        // srIdFeqId?? Search Ring?
        TbSiteSearchRing searchRing = searchRingDao.findSearchRingByPrimaryKey(srId);
        if (StringUtils.isNotEmpty(siteHuntApply.getSrId())) {
            if (!feqId.equals(searchRing.getFEQ_ID()) && !"all".equals(searchRing.getFEQ_ID())) {
                errorMessages += "Search Ring?";
            }
        }
        return errorMessages;
    }

    /**
     * btsSiteId???
     * 
     * @param eqpTypeId
     * @param feqType
     * @param domain
     * @param btsSiteId
     * @param coverageType
     * @return
     */
    public String doValidateBTSSiteId(String eqpTypeId, String feqType, String domain, String btsSiteId,
            String coverageType) {
        log.debug(" IncludeRange.B.name() : " + IncludeRange.B.name());
        log.debug("eqpTypeId : " + eqpTypeId);
        log.debug("feqType : " + feqType);
        log.debug("domain : " + domain);
        log.debug("btsSiteId : " + btsSiteId);
        log.debug("coverageType : " + coverageType);
        String errorMessages = "";
        if ("1".equals(eqpTypeId) && "U".equals(feqType)) {
            String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "^1[0-9]{4,4}$", "^1[0-9]{4,4}$",
                    "^2[0-9]{4,4}$", "^3[0-9]{4,4}$");
            String msg2 = this.dovalidateBtsSiteId(domain, btsSiteId, "^4[0-9]{4,4}$", "^4[0-9]{4,4}$",
                    "^5[0-9]{4,4}$", "^0[0-9]{4,4}$");
            if (!msg.isEmpty() && !msg2.isEmpty()) {
                return errorMessages += msg;
            }
        } else if ("2".equals(eqpTypeId)) {
            TbSiteIdPoolExample siteIdPoolExample = new TbSiteIdPoolExample();
            siteIdPoolExample.createCriteria().andBTS_SITE_IDEqualTo(btsSiteId).andDOMAINEqualTo(domain);
            List<TbSiteIdPool> siteIdPoolList = siteIdPoolDao.findSiteIdPoolByConditions(siteIdPoolExample);
            if (siteIdPoolList.size() == 0) {
                errorMessages += "?SR ID??\n";
            } else {
                TbSiteMainExample example = new TbSiteMainExample();
                example.createCriteria().andBTS_SITE_IDEqualTo(btsSiteId);
                List<TbSiteMain> siteList = sT002SP1Dao.findWorkSiteListByExample(example);
                if (siteList.size() < 0) {
                    errorMessages += "?\n";
                }
            }
        } else if ("3".equals(eqpTypeId)) {
            if (IncludeRange.O.name().equals(coverageType)) {
                if ("U".equals(feqType)) {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[R,N]{2,2}[0001-5000]{4,4}$",
                            "[R,M]{2,2}[0001-5000]{4,4}$", "[R,C]{2,2}[0001-5000]{4,4}$",
                            "[R,S]{2,2}[0001-5000]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                } else {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[L,R,N]{3,3}[0][0001-5000]{4,4}$",
                            "[L,R,M]{3,3}[0][0001-5000]{4,4}$", "[L,R,C]{3,3}[0][0001-5000]{4,4}$",
                            "[L,R,S]{3,3}[0][0001-5000]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                }
            } else {
                if ("U".equals(feqType)) {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[R,N]{2,2}[5001-9999]{4,4}$",
                            "[R,M]{2,2}[5001-9999]{4,4}$", "[R,C]{2,2}[5001-9999]{4,4}$",
                            "[R,S]{2,2}[5001-9999]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                } else {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[L,R,N]{3,3}[0][5001-9999]{4,4}$",
                            "[L,R,M]{3,3}[0][5001-9999]{4,4}$", "[L,R,C]{3,3}[0][5001-9999]{4,4}$",
                            "[L,R,S]{3,3}[0][5001-9999]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                }
            }
        } else if ("4".equals(eqpTypeId)) {
            if ("U".equals(feqType)) {
                String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[B,N]{2,2}[0-9]{4,4}$",
                        "[B,M]{2,2}[0-9]{4,4}$", "[B,C]{2,2}[0-9]{4,4}$", "[B,S]{2,2}[0-9]{4,4}$");
                if (!msg.isEmpty()) {
                    return errorMessages += msg;
                }
            } else {
                String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[L,B,N]{3,3}[0][0-9]{4,4}$",
                        "[L,B,M]{3,3}[0][0-9]{4,4}$", "[L,B,C]{3,3}[0][0-9]{4,4}$", "[L,B,S]{3,3}[0][0-9]{4,4}$");
                if (!msg.isEmpty()) {
                    return errorMessages += msg;
                }
            }
        } else if ("5".equals(eqpTypeId)) {
            if (IncludeRange.O.name().equals(coverageType)) {
                if ("U".equals(feqType)) {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[X,N]{2,2}[0001-5000]{4,4}$",
                            "[X,M]{2,2}[0001-5000]{4,4}$", "[X,C]{2,2}[0001-5000]{4,4}$",
                            "[X,S]{2,2}[0001-5000]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                } else {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[L,X,N]{3,3}[0][0001-5000]{4,4}$",
                            "[L,X,M]{3,3}[0][0001-5000]{4,4}$", "[L,X,C][0][0001-5000]{4,4}$",
                            "[L,X,S]{3,3}[0][0001-5000]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                }
            } else {
                if ("U".equals(feqType)) {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[X,N]{2,2}[5001-9999]{4,4}$",
                            "[X,M]{2,2}[5001-9999]{4,4}$", "[X,C]{2,2}[5001-9999]{4,4}$",
                            "[X,S]{2,2}[5001-9999]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                } else {
                    String msg = this.dovalidateBtsSiteId(domain, btsSiteId, "[L,X,N]{3,3}[0][5001-9999]{4,4}$",
                            "[L,X,M]{3,3}[0][5001-9999]{4,4}$", "[L,X,C]{3,3}[0][5001-9999]{4,4}$",
                            "[L,X,S]{3,3}[0][5001-9999]{4,4}$");
                    if (!msg.isEmpty()) {
                        return errorMessages += msg;
                    }
                }
            }
        } else {
            errorMessages += "\n";
            return errorMessages;
        }

        return errorMessages;
    }

    /**
     * siteHuntApply
     * 
     * @param siteHuntApply
     * @return
     */
    @Transactional
    public TbSiteWork insert(SiteHuntApplyDTO siteHuntApply, String loginUserDept)
            throws NomsException, CreateFailException, Exception {
        String siteId = uniqueSeqService.getNextSiteId();
        Date date = new Date();
        String user = getLoginUser().getUsername();
        String workId = uniqueSeqService.getNextWorkId();
        TbSiteWork siteWork = this.getSiteWorkBySiteHuntApplyDTO(siteHuntApply, workId, siteId);
        siteWork.setCR_USER(user);
        siteWork.setCR_TIME(date);
        siteWork.setMD_USER(user);
        siteWork.setMD_TIME(date);
        siteWork.setAPP_DEPT(loginUserDept);
        int siteWorkItem = workDao.insert(siteWork);
        if (siteWorkItem == 0) {
            log.error("siteWorkItem update count= " + siteWorkItem + " , workId = " + siteWork.getWORK_ID());
            throw new CreateFailException("");
        }
        List<OrderTypeDTO> orderTypeList = orderTypeDao.findOrderTypeByWorkTypeId(siteHuntApply.getWorkType(),
                null);
        TownDomainTeamDTO domainTeam = townDomainTeamDao.getTownDomainTeamByCityIdTownId(siteHuntApply.getCity(),
                siteHuntApply.getArea());
        for (OrderTypeDTO orderType : orderTypeList) {
            TbSiteWorkOrder siteWorkOrder = this.getSiteWorkOrderBySiteHuntApplyDTO(siteHuntApply, workId,
                    OrderStatus.OR01.name(), uniqueSeqService.getNextOrderId(workId), orderType, domainTeam);
            siteWorkOrder.setCR_USER(user);
            siteWorkOrder.setCR_TIME(date);
            siteWorkOrder.setMD_USER(user);
            siteWorkOrder.setMD_TIME(date);
            int workOrderItem = workOrderDao.insert(siteWorkOrder);
            if (workOrderItem == 0) {
                log.error("workOrderItem update count= " + workOrderItem + " , orderId = "
                        + siteWorkOrder.getORDER_ID());
                throw new NomsException("");
            }
        }
        return siteWork;
    }

    /**
     * siteHuntApply
     * 
     * @param siteHuntApply
     * @return
     */
    @Transactional
    public TbSiteWork update(SiteHuntApplyDTO siteHuntApply, String[] orderIdArray, String mdUser)
            throws UpdateFailException {
        Date mdTime = new Date();
        boolean hasChangeDomain = false;
        TownDomainTeamDTO domainTeam = null;
        String workId = siteHuntApply.getWorkId();
        TbSiteWork siteWorkTarget = workDao.findByPk(workId);

        // ?????? add by Charlie 20150415
        if (!StringUtils.equals(siteHuntApply.getArea(), siteWorkTarget.getAREA())) {
            hasChangeDomain = true;
            domainTeam = townDomainTeamDao.getTownDomainTeamByCityIdTownId(siteHuntApply.getCity(),
                    siteHuntApply.getArea());
        }

        TbSiteWork siteWork = this.getSiteWorkBySiteHuntApplyDTO(siteHuntApply, workId, siteHuntApply.getSiteId());
        siteWork.setMD_USER(mdUser);
        siteWork.setMD_TIME(mdTime);
        String[] ignoreProperties = { "CR_USER", "CR_TIME", "APP_DEPT", "APL_USER", "APL_TIME", "END_TIME",
                "OS_VEN", "END_DATE", "CPL_NO", "PERMIT_NO", "LICENSE_NO", "OS_TYPE" };
        BeanUtils.copyProperties(siteWork, siteWorkTarget, ignoreProperties);
        int siteWorkItem = workDao.update(siteWorkTarget);
        if (siteWorkItem == 0) {
            log.error("siteWorkItem update count= " + siteWorkItem + " , workId = " + siteWork.getWORK_ID());
            throw new UpdateFailException("");
        }
        for (String orderId : orderIdArray) {
            TbSiteWorkOrder siteWorkOrder = workOrderDao.findOrderByPk(orderId);
            siteWorkOrder.setORDER_ID(orderId);
            siteWorkOrder.setPRIORITY(siteHuntApply.getPriority());
            siteWorkOrder.setMD_USER(mdUser);
            siteWorkOrder.setMD_TIME(mdTime);
            if (hasChangeDomain) { // ?DOMAIN??? add by Charlie 20150415
                String deptKey = orderTypeService.getOrdersDeptKey(siteWorkOrder.getORDER_TYPE(),
                        domainTeam.getDOMAIN(), siteWorkTarget.getEQP_TYPE_ID());
                TbOrgDept newNept = orderTypeService.getOrderTypeForWorkArea(deptKey, domainTeam);
                siteWorkOrder.setREP_DEPT(newNept.getDEPT_ID());
            }
            int workOrderItem = workOrderDao.updateSelective(siteWorkOrder);
            if (workOrderItem == 0) {
                log.error("workOrderItem update count= " + workOrderItem + " , orderId = "
                        + siteWorkOrder.getORDER_ID());
                throw new UpdateFailException("");
            }
        }
        return siteWorkTarget;
    }

    /**
     * 
     * 
     * @param aplUser
     * @param workId
     * @param appDept
     * @return
     * @throws Exception
     */
    @Transactional
    public TbSiteWork updateApplyInfo(String aplUser, SiteHuntApplyDTO siteHuntApply, String appDept,
            String siteHuntApplyEvent, String[] orderIdArray) throws NomsException, Exception {
        try {
            if ("insert".equals(siteHuntApplyEvent)) {
                TbSiteWork siteWork = this.insert(siteHuntApply, appDept);
                siteHuntApply.setWorkId(siteWork.getWORK_ID());
                log.debug("insert siteWork : " + siteWork.toString());
            } else {
                this.update(siteHuntApply, orderIdArray, aplUser);
            }
        } catch (Exception e) {
            throw new NomsException(e.getMessage());
        }
        String workId = siteHuntApply.getWorkId();
        TbSiteWork siteWork = workDao.findByPk(workId);
        siteWork.setWORK_ID(workId);
        siteWork.setAPL_USER(aplUser);
        siteWork.setAPL_TIME(new Date());
        siteWork.setAPP_DEPT(appDept);
        siteWork.setWORK_STATUS(WorkStatus.W03.name());
        int workItem = workDao.update(siteWork);
        siteWork = workDao.findByPk(workId);
        log.debug("update siteWork : " + siteWork.toString());
        Date crTime = new Date();
        TbSiteMain siteMain = this.getSiteMainBySiteWork(siteWork, crTime);
        int mainItem = 0;
        if (siteMainDao.findByPk(siteMain.getSITE_ID()) == null) {
            siteMain.setCR_USER(aplUser);
            siteMain.setCR_TIME(crTime);
            mainItem = siteMainDao.insert(siteMain);
        } else {
            siteMain.setMD_USER(aplUser);
            siteMain.setMD_TIME(crTime);
            mainItem = siteMainDao.update(siteMain);
        }

        TbSiteWorkOrderExample example = new TbSiteWorkOrderExample();
        example.createCriteria().andWORK_IDEqualTo(workId); // fix bug add by
        // Charlie
        // 2015/01/05
        List<TbSiteWorkOrder> orderList = workOrderDao.findByConditions(example);
        for (TbSiteWorkOrder order : orderList) {
            int workOrderItem = workOrderDao.updateStatusByOrder(order.getORDER_ID(), OrderStatus.OR02);
            if (workOrderItem == 0) {
                log.error("workOrderItem update count =" + workOrderItem + ", ORDER_ID = " + order.getORDER_ID());
                throw new NomsException("");
            }
        }

        // 
        siteEmailService.sendWorkApplyMail(workId);

        if (workItem == 1 && mainItem == 1) {
            // ?workflow?
            if ("NSR".equals(siteWork.getWORK_TYPE())) {
                workflowActionService.apply("SearchSiteApplyNSR", siteWork.getWORK_ID(),
                        "New Site Request", emailTemplateService.getMailVarMapForWorkflow(
                                EmailType.WORKFLOW_TODO_WORK_APPLY, siteWork.getWORK_ID()));
            } else {
                workflowActionService.apply("SearchSiteApplySH", siteWork.getWORK_ID(), "Site Hunt",
                        emailTemplateService.getMailVarMapForWorkflow(EmailType.WORKFLOW_TODO_WORK_APPLY,
                                siteWork.getWORK_ID()));
            }
        } else {
            log.error("workItem update count =" + workItem + " , mainItem update count = " + mainItem
                    + " , workId = " + workId);
            throw new NomsException("");
        }
        return siteWork;
    }

    /**
     * ?
     * 
     * @param workId
     * @return
     * @throws NomsException
     */
    @Transactional
    public TbSiteWork cancelApplyInfo(String workId, String mdUser) throws NomsException {
        TbSiteWork siteWork = workDao.findByPk(workId);
        siteWork.setMD_USER(getLoginUser().getUsername());
        siteWork.setMD_TIME(new Date());
        siteWork.setWORK_STATUS(WorkStatus.W08.toString());
        int updateWorkItem = workDao.update(siteWork);
        TbSiteWorkOrderExample example = new TbSiteWorkOrderExample();
        example.createCriteria().andWORK_IDEqualTo(workId);
        TbSiteWorkOrder siteWorkOrder = new TbSiteWorkOrder();
        siteWorkOrder.setIS_ACTIVE("N");
        siteWorkOrder.setMD_USER(mdUser);
        siteWorkOrder.setMD_TIME(new Date());
        int updateWorkOrderItem = workOrderDao.updateByExample(siteWorkOrder, example);
        if (updateWorkItem == 0 || updateWorkOrderItem == 0) {
            log.error("updateWorkItem update count = " + updateWorkItem + " , updateWorkOrderItem = "
                    + updateWorkOrderItem + " , workId = " + siteWork.getWORK_ID());
            throw new NomsException("?");
        }
        // modify by Kevin said ?? 20150410
        //      TbSiteMain siteMain = siteMainDao.findByPk(siteWork.getSITE_ID());
        //      if(siteMain != null){
        //         int updateSiteStatusItme = siteMainDao.updateSiteStatusBySiteId(siteMain.getSITE_ID(), SiteStatus.S11);
        //         if(updateSiteStatusItme == 0){
        //            log.error("?" + "updateSiteStatusItme update count =" + updateSiteStatusItme
        //                  +" , siteID = " + siteWork.getSITE_ID());
        //            throw new NomsException("?");
        //         }
        //      }
        return siteWork;
    }

    /**
     * 
     * 
     * @param orderId
     * @param result
     * @return
     * @throws NomsException
     */
    @Transactional
    public void updateApprResult(String workId, boolean result) throws NomsException, Exception {
        // boolean isTrue = false;
        TbSiteWork siteWork = workDao.findByPk(workId);
        if (siteWork == null) {
            String msg = "Not found TbSiteWork, workId = " + workId;
            log.error(msg);
            throw new NomsException(msg);
        }
        Date endTime = new Date();
        TbSiteWorkOrderExample example = new TbSiteWorkOrderExample();
        example.createCriteria().andWORK_IDEqualTo(siteWork.getWORK_ID());
        List<TbSiteWorkOrder> siteWorkOrderList = workOrderDao.findByConditions(example);
        if (WorkType.NSR.name().equals(siteWork.getWORK_TYPE())) {
            int updateSiteMainItem = siteMainDao.updateSiteStatusBySiteId(siteWork.getSITE_ID(), SiteStatus.S02);
            if (updateSiteMainItem == 0) {
                throw new NomsException("");
            }
            // siteStatusLogService.updateSiteStatusLog(siteWork.getSITE_ID(),SiteStatus.S01,
            // endTime);
            // siteStatusLogService.insertSiteStatusLogBySiteWork(siteWork,
            // SiteStatus.S02, new Date());
            siteStatusLogService.updateSiteStatusLog(siteWork.getSITE_ID(), siteWork.getBTS_SITE_ID(),
                    SiteStatus.S01, SiteStatus.S02, new Date());
        }
        if (result) {
            int workUpdateItem = 0;
            int workOrderUpdateItem = 0;
            // ?new site request
            TbSysLookup lookup = lookupService.getByTypeAndCode("ORG_SPECIFIC_DEPT_ID", "SEARCH_RING_DEPT_ID");
            boolean isTrue = false;
            if (lookup.getVALUE1() != null) {
                String[] deptArray = lookup.getVALUE1().split(",");
                for (String dept : deptArray) {
                    if (dept.equals(siteWork.getAPP_DEPT())
                            && WorkType.NSR.name().equals(siteWork.getWORK_TYPE())) {
                        isTrue = true;
                        break;
                    }
                }
            }
            if (isTrue) {
                TbSiteWork record = workDao.findByPk(workId);
                record.setWORK_STATUS(WorkStatus.W07.name());
                record.setEND_TIME(endTime);
                workUpdateItem = workDao.updateByPrimaryKey(record);
                workOrderUpdateItem = workOrderDao.updateStatusByOrder(siteWorkOrderList.get(0).getORDER_ID(),
                        OrderStatus.OR09);
                try {
                    this.completionNewSiteRequest(siteWork, isTrue);
                } catch (Exception e) {
                    throw new NomsException(e.getMessage());
                }

            } else {
                TbSiteWork record = workDao.findByPk(siteWork.getWORK_ID());// new
                // TbSiteWork();
                record.setWORK_ID(siteWork.getWORK_ID());
                record.setWORK_STATUS(WorkStatus.W05.name());
                workUpdateItem = workDao.updateByPrimaryKey(record);
                workOrderUpdateItem = workOrderDao.updateStatusByWork(siteWork.getWORK_ID(), OrderStatus.OR03);

                // add by Charlie 20150109 
                TbSiteWorkOrderExample criteria = new TbSiteWorkOrderExample();
                criteria.createCriteria().andWORK_IDEqualTo(workId).andIS_ACTIVEEqualTo("Y")
                        .andODR_STATUSEqualTo(OrderStatus.OR03.name());
                criteria.setOrderByClause("ODR_SEQ"); // ?
                List<TbSiteWorkOrder> orders = workOrderDao.findByConditions(criteria);
                int odr = 0;
                log.debug("??:" + orders.size());
                for (TbSiteWorkOrder order : orders) {
                    log.debug("==>" + order.getORDER_ID() + ",order.getODR_SEQ()="
                            + order.getODR_SEQ());
                    if (odr == 0 || odr == order.getODR_SEQ()) { // first time
                        // in.
                        odr = order.getODR_SEQ();
                        boolean autoAssign = respUserService.autoAssignOrder(siteWork.getAREA(), order); // ??
                        if (autoAssign) {
                            siteEmailService.sendOrderAutoAssignMail(order.getORDER_ID());
                            siteEmailService.sendOrderPickupMail(order.getORDER_ID());
                        } else {
                            siteEmailService.sendOrderAssignMail(order.getORDER_ID());

                        }
                    } else {
                        break;
                    }
                }
            }
            if (workUpdateItem == 0 || workOrderUpdateItem == 0) {
                log.error("" + "workUpdateItem update count =" + workUpdateItem
                        + ", workOrderUpdateItem update count = " + workOrderUpdateItem + " , workId = "
                        + siteWork.getWORK_ID());
                throw new NomsException("");
            }
        } else {
            int workOrderUpdateItem = workOrderDao.updateStatusByOrder(siteWorkOrderList.get(0).getORDER_ID(),
                    OrderStatus.OR01);
            TbSiteWork record = new TbSiteWork();
            record.setWORK_ID(siteWork.getWORK_ID());
            record.setWORK_STATUS(WorkStatus.W04.name());
            int workUpdateItem = workDao.updateByPrimaryKey(record);
            TbSiteWorkExample workExample = new TbSiteWorkExample();
            workExample.createCriteria().andWORK_IDNotEqualTo(siteWork.getWORK_ID())
                    .andSITE_IDEqualTo(siteWork.getSITE_ID()).andWORK_TYPEEqualTo(WorkType.NSR.name());
            List<TbSiteWork> workList = workDao.findByConditions(workExample);
            if (workList.size() > 0) {
                int updateSiteMainItem = siteMainDao.updateSiteStatusBySiteId(siteWork.getSITE_ID(),
                        SiteStatus.S02);
                if (updateSiteMainItem == 0) {
                    log.error("" + "updateSiteMainItem update count =" + updateSiteMainItem
                            + " ,siteId = " + siteWork.getSITE_ID());
                    throw new NomsException("");
                }
            } else {
                int mainDeleteItem = siteMainDao.deleteByPrimaryKey(siteWork.getSITE_ID());
                if (mainDeleteItem == 0) {
                    log.error("" + "mainDeleteItem delete count =" + mainDeleteItem + " ,siteId = "
                            + siteWork.getSITE_ID());
                    throw new NomsException("");
                }
            }
            if (workOrderUpdateItem == 0 || workUpdateItem == 0) {
                log.error("" + "workUpdateItem update count =" + workUpdateItem
                        + ", workOrderUpdateItem update count = " + workOrderUpdateItem + " , workId = "
                        + siteWork.getWORK_ID());
                throw new NomsException("");
            }
        }
    }

    // NSR??
    // @Transactional
    public void completionNewSiteRequest(TbSiteWork siteWork, boolean isSearchRingDept)
            throws NomsException, Exception {
        TownDomainTeamDTO domainTeam = townDomainTeamDao.getTownDomainTeamByCityIdTownId(siteWork.getCITY(),
                siteWork.getAREA());
        Date date = new Date();
        String appUser = siteWork.getAPL_USER();
        TbOrgDept orgDept = deptDao.getDeptById(siteWork.getAPP_DEPT());
        TbAuthPersonnel personnel = personnelDao.searchByPsnNo(appUser);
        siteWork.setWORK_DESC("NSR:" + siteWork.getWORK_ID() + "\n?:" + orgDept.getDEPT_NAME()
                + "\n:" + personnel.getCHN_NM());
        String work_Id = uniqueSeqService.getNextWorkId();
        siteWork.setWORK_ID(work_Id);
        siteWork.setWORK_TYPE(WorkType.SH.toString());
        siteWork.setWORK_STATUS(WorkStatus.W02.toString());
        siteWork.setCR_USER(appUser); // modify by Kevin ? 20150330
        siteWork.setCR_TIME(date);
        siteWork.setMD_USER(appUser);
        siteWork.setMD_TIME(date);
        siteWork.setAPL_USER(null);
        siteWork.setAPL_TIME(null);
        siteWork.setEND_TIME(null);

        // 20150303 modify by Charlie NSR????
        if (isSearchRingDept) {
            TbOrgDept srDept = orderTypeService.getOrderTypeForWorkArea("", domainTeam);
            if (srDept != null)
                siteWork.setAPP_DEPT(srDept.getDEPT_ID());
        }
        int siteWorkItem = workDao.insert(siteWork);

        List<OrderTypeDTO> workOrderTypeList = orderTypeDao.findOrderTypeByWorkTypeId(WorkType.SH.name(), null);
        for (OrderTypeDTO workOrderType : workOrderTypeList) {
            TbSiteWorkOrder workOrder = new TbSiteWorkOrder();
            workOrder.setORDER_ID(uniqueSeqService.getNextOrderId(work_Id));
            workOrder.setODR_STATUS(OrderStatus.OR01.toString());
            workOrder.setWORK_ID(work_Id);
            workOrder.setODR_SEQ(workOrderType.getOrderSeq());
            workOrder.setORDER_TYPE(workOrderType.getOD_TYPE_ID());
            workOrder.setCR_USER(appUser); // modify by Kevin ? 20150330
            workOrder.setCR_TIME(date);
            workOrder.setMD_USER(appUser);
            workOrder.setMD_TIME(date);
            workOrder.setIS_ACTIVE("Y"); // add by Charlie 20150126 IS_ACTIVE=Y
            String deptKey = orderTypeService.getOrdersDeptKey(workOrderType.getOD_TYPE_ID(),
                    domainTeam.getDOMAIN(), siteWork.getEQP_TYPE_ID());
            TbOrgDept dept = orderTypeService.getOrderTypeForWorkArea(deptKey, domainTeam);
            workOrder.setREP_DEPT(dept.getDEPT_ID());

            int orderItem = workOrderDao.insert(workOrder);
            if (orderItem == 0) {
                log.error("" + "orderItem update count =" + orderItem + " , workId = " + work_Id);
                throw new NomsException("");
            }
        }
        if (siteWorkItem == 0) {
            log.error("" + "siteWorkItem update count =" + siteWorkItem + " , workId = " + work_Id);
            throw new NomsException("");
        }
    }

    private TbSiteWork getSiteWorkBySiteHuntApplyDTO(SiteHuntApplyDTO siteHuntApply, String workId, String siteId) {
        TbSiteWork siteWork = workDao.findByPk(siteHuntApply.getWorkId());
        if (siteWork == null) {
            siteWork = new TbSiteWork();
        }
        siteWork.setWORK_ID(workId);
        siteWork.setWORK_TYPE(siteHuntApply.getWorkType());
        siteWork.setWORK_STATUS(siteHuntApply.getWorkStatus());
        siteWork.setSR_LAT(siteHuntApply.getLat());
        siteWork.setSR_LON(siteHuntApply.getLon());
        siteWork.setSR_COVER_RANG(siteHuntApply.getCoverRange());
        siteWork.setSITE_ID(siteId);
        siteWork.setBTS_SITE_ID(StringUtils.trimToNull(siteHuntApply.getBtsSiteId()));
        siteWork.setPURPOSE(siteHuntApply.getPurpose());
        siteWork.setSITE_NAME(siteHuntApply.getSiteName());
        siteWork.setPREDICE_END_DATE(siteHuntApply.getPrediceEndDate());
        siteWork.setCITY(siteHuntApply.getCity());
        siteWork.setAREA(siteHuntApply.getArea());
        siteWork.setFEQ_ID(siteHuntApply.getFeqId().split(",")[0]);
        siteWork.setEQP_TYPE_ID(StringUtils.trimToNull(siteHuntApply.getEqpTypeId()));
        siteWork.setEQP_MODEL_ID(StringUtils.trimToNull(siteHuntApply.getEqpModelId()));
        siteWork.setCOVERAGE_TYPE(StringUtils.trimToNull(siteHuntApply.getCoverageType()));
        if (StringUtils.isNotEmpty(siteHuntApply.getLocationId())) {
            siteWork.setLOCATION_ID(siteHuntApply.getLocationId());
            TbSiteLocation location = locationDao.findByPk(siteWork.getLOCATION_ID());
            if (location != null) {
                siteWork.setADDR(location.getADDR());
                siteWork.setZIP(location.getZIP());
                siteWork.setVILLAGE(location.getVILLAGE());
                siteWork.setADJACENT(location.getADJACENT());
                siteWork.setROAD(location.getROAD());
                siteWork.setLANE(location.getLANE());
                siteWork.setALLEY(location.getALLEY());
                siteWork.setSUB_ALLEY(location.getSUB_ALLEY());
                siteWork.setDOOR_NO(location.getDOOR_NO());
                siteWork.setDOOR_NO_EX(location.getDOOR_NO_EX());
                siteWork.setFLOOR(location.getFLOOR());
                siteWork.setFLOOR_EX(location.getFLOOR_EX());
                siteWork.setROOM(location.getROOM());
                siteWork.setADD_OTHER(location.getADD_OTHER());
            }
        }
        siteWork.setPRIORITY(StringUtils.trimToNull(siteHuntApply.getPriority()));
        siteWork.setWORK_DESC(StringUtils.trimToNull(siteHuntApply.getWorkDesc()));
        siteWork.setSR_ID(StringUtils.trimToNull(siteHuntApply.getSrId()));
        siteWork.setBTS_CONFIG(StringUtils.trimToNull(StringUtils.trimToNull(siteHuntApply.getBtsConfig())));
        siteWork.setDONOR_SITE(StringUtils.trimToNull(siteHuntApply.getDonorSite()));
        siteWork.setFEEDERLESS(StringUtils.trimToNull(siteHuntApply.getFeederless()));
        siteWork.setMASTER_SITE(StringUtils.trimToNull(siteHuntApply.getMasterSite()));
        siteWork.setOS_TYPE(PurchaseOrderType.P.name()); // add by Charlie
        // 20141217
        // ? 
        log.debug("siteWork : " + siteWork.toString());
        log.debug("siteWork : " + siteWork.getFEQ_ID());
        return siteWork;
    }

    private TbSiteMain getSiteMainBySiteWork(TbSiteWork siteWork, Date startTime) {
        TbSiteMain siteMain = new TbSiteMain();
        siteMain.setSITE_ID(siteWork.getSITE_ID());
        siteMain.setFEQ_ID(siteWork.getFEQ_ID());
        siteMain.setBTS_SITE_ID(StringUtils.trimToNull(siteWork.getBTS_SITE_ID()));
        siteMain.setPURPOSE(siteWork.getPURPOSE());
        siteMain.setSITE_NAME(siteWork.getSITE_NAME());
        siteMain.setLOCATION_ID(StringUtils.trimToNull(siteWork.getLOCATION_ID()));
        siteMain.setSR_ID(StringUtils.trimToNull(siteWork.getSR_ID()));
        siteMain.setEQP_TYPE_ID(StringUtils.trimToNull(siteWork.getEQP_TYPE_ID()));
        siteMain.setEQP_MODEL_ID(StringUtils.trimToNull(siteWork.getEQP_MODEL_ID()));
        siteMain.setCOVERAGE_TYPE(StringUtils.trimToNull(siteWork.getCOVERAGE_TYPE()));
        siteMain.setBTS_CONFIG(StringUtils.trimToNull(siteWork.getBTS_CONFIG()));
        siteMain.setDONOR_SITE(StringUtils.trimToNull(siteWork.getDONOR_SITE()));
        siteMain.setFEEDERLESS(StringUtils.trimToNull(siteWork.getFEEDERLESS()));
        siteMain.setMASTER_SITE(StringUtils.trimToNull(siteWork.getMASTER_SITE()));
        siteMain.setLAT(siteWork.getSR_LAT());
        siteMain.setLON(siteWork.getSR_LON());
        if (WorkType.NSR.name().equals(siteWork.getWORK_TYPE())) {
            siteMain.setSITE_STATUS(SiteStatus.S01.name());
            // siteStatusLogService.insertSiteStatusLogBySiteWork(siteWork,
            // SiteStatus.S01, startTime);
            siteStatusLogService.updateSiteStatusLog(siteWork.getSITE_ID(), siteWork.getBTS_SITE_ID(),
                    SiteStatus.S01, SiteStatus.S01, new Date());
        } else if (WorkType.SH.name().equals(siteWork.getWORK_TYPE())) {
            siteMain.setSITE_STATUS(SiteStatus.S03.name());
            // siteStatusLogService.insertSiteStatusLogBySiteWork(siteWork,
            // SiteStatus.S03, startTime);
            siteStatusLogService.updateSiteStatusLog(siteWork.getSITE_ID(), siteWork.getBTS_SITE_ID(),
                    SiteStatus.S03, SiteStatus.S03, new Date());
        }
        return siteMain;
    }

    private TbSiteWorkOrder getSiteWorkOrderBySiteHuntApplyDTO(SiteHuntApplyDTO siteHuntApply, String workId,
            String orderStatus, String orderId, OrderTypeDTO orderType, TownDomainTeamDTO domainTeam)
            throws Exception {
        TbSiteWorkOrder siteWorkOrder = new TbSiteWorkOrder();
        siteWorkOrder.setORDER_ID(orderId);
        siteWorkOrder.setWORK_ID(workId);
        siteWorkOrder.setODR_STATUS(orderStatus);
        siteWorkOrder.setPRIORITY(siteHuntApply.getPriority());
        siteWorkOrder.setODR_SEQ(orderType.getOrderSeq());
        siteWorkOrder.setORDER_TYPE(orderType.getOD_TYPE_ID());
        siteWorkOrder.setIS_ACTIVE("Y");
        String deptKey = orderTypeService.getOrdersDeptKey(orderType.getOD_TYPE_ID(), domainTeam.getDOMAIN(),
                siteHuntApply.getEqpTypeId());
        TbOrgDept dept = orderTypeService.getOrderTypeForWorkArea(deptKey, domainTeam);
        siteWorkOrder.setREP_DEPT(dept.getDEPT_ID());

        return siteWorkOrder;
    }

    private String dovalidateBtsSiteId(String domain, String btsSiteId, String nRegex, String mRegex, String cRegex,
            String sRegex) {
        btsSiteId = btsSiteId.toUpperCase();
        String errorMessages = "";
        String msg = "?SR ID??\n";
        // try{
        if ("N".equals(domain)) {
            if (!btsSiteId.matches(nRegex)) {
                errorMessages += msg;
                log.debug("errorMessages : " + errorMessages);
            }
        } else if ("M".equals(domain)) {
            if (!btsSiteId.matches(mRegex)) {
                errorMessages += msg;
                log.debug("errorMessages : " + errorMessages);
            }
        } else if ("C".equals(domain)) {
            if (!btsSiteId.matches(cRegex)) {
                errorMessages += msg;
                log.debug("errorMessages : " + errorMessages);
            }
        } else if ("S".equals(domain)) {
            if (!btsSiteId.matches(sRegex)) {
                errorMessages += msg;
                log.debug("errorMessages : " + errorMessages);
            }
        } else {
            errorMessages += "?\n";
        }
        return errorMessages;
    }

    /**
     *  order id 
     * 
     * @param orderId
     * @return
     */
    public TbSiteWorkOrder selectSiteWorkOrderByOrderId(String orderId) {
        return st002Dao.selectSiteWorkOrderByOrderId(orderId);
    }

    /**
     * 
     * 
     * @param record
     * @return
     */
    public int update(TbSiteWorkOrder record) {
        return workOrderDao.update(record);
    }

    /**
     * siteWork
     * @param example
     * @return
     */
    public List<TbSiteWork> getSiteWorkByConditions(TbSiteWorkExample example) {
        return workDao.findByConditions(example);
    }
}