com.opendesign.service.ProjectService.java Source code

Java tutorial

Introduction

Here is the source code for com.opendesign.service.ProjectService.java

Source

/*
 * Copyright (c) 2016 OpenDesign All rights reserved.
 *
 * This software is the confidential and proprietary information of OpenDesign.
 * You shall not disclose such Confidential Information and shall use it
 * only in accordance with the terms of the license agreement you entered into
 * with OpenDesign.
 */
package com.opendesign.service;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.opendesign.dao.CommonDAO;
import com.opendesign.dao.ProjectDAO;
import com.opendesign.dao.UserDAO;
import com.opendesign.utils.CmnConst.CheckRule;
import com.opendesign.utils.CmnConst.FileUploadDomain;
import com.opendesign.utils.CmnConst.RstConst;
import com.opendesign.utils.CmnUtil;
import com.opendesign.utils.Day;
import com.opendesign.utils.ThumbnailManager;
import com.opendesign.vo.AlarmVO;
import com.opendesign.vo.CategoryVO;
import com.opendesign.vo.ItemLikeVO.ItemType;
import com.opendesign.vo.ProjectGroupReqVO;
import com.opendesign.vo.ProjectGroupReqVO.ProjectGroupReqStatus;
import com.opendesign.vo.ProjectGroupVO;
import com.opendesign.vo.ProjectMemberVO;
import com.opendesign.vo.ProjectSubjectVO;
import com.opendesign.vo.ProjectVO;
import com.opendesign.vo.ProjectWorkMemberVO;
import com.opendesign.vo.ProjectWorkVO;
import com.opendesign.vo.ProjectWorkVerVO;
import com.opendesign.vo.SearchGroupVO;
import com.opendesign.vo.SearchVO;
import com.opendesign.vo.UserVO;
import com.opendesign.websocket.SocketHandler;

/**
 * 
 * <pre>
 * ?? ?? ?  ?
 * </pre>
 * 
 * @author hanchanghao
 * @since 2016. 9. 21.
 */
@Service
public class ProjectService {

    /**
     *    
     */
    private static final String VERSION_START = "1.0";

    /**
     * (log4j) ?
     */
    private final Logger LOGGER = LogManager.getLogger(this.getClass());

    /**
     * ? DAO ?
     */
    @Autowired
    ProjectDAO dao;

    /**
     * ? DAO ?
     */
    @Autowired
    UserDAO userDao;

    /**
     *   ?
     */
    @Autowired
    CommonService commonService;

    /**
     *  DAO ?
     */
    @Autowired
    CommonDAO commonDao;

    /**
     *   ?
     */
    @Autowired
    SocketHandler websocketHandler;

    /**
     * ?? ? ? 
     * 
     * @param paramMap
     * @return
     */
    public List<ProjectVO> selectProjectList(Map<String, Object> paramMap) {
        List<ProjectVO> projectList = dao.selectProjectList(paramMap);

        for (ProjectVO vo : projectList) {
            vo.setCategoryList(dao.selectProjectCategoryList(vo.getSeq()));
        }

        return projectList;
    }

    /**
     * ? ? ? 
     * 
     * @param memberSeq
     * @return
     */
    public List<ProjectVO> selectMyProjectList(int memberSeq) {
        return dao.selectMyProjectList(memberSeq);
    }

    /**
     * ?? ? ? 
     * 
     * @param paramMap
     * @return
     */
    public int selectProjectCount(Map<String, Object> paramMap) {
        return dao.selectProjectCount(paramMap);
    }

    /**
     * ?  ? 
     * 
     * @param memberSeq
     * @return
     */
    public List<ProjectGroupVO> selectMyProjectGroupList(int memberSeq) {
        return dao.selectMyProjectGroupList(memberSeq);
    }

    /**
     * ?? ? ?
     * 
     * @param project
     * @param categorys
     * @param emails
     * @return
     */
    @Transactional
    public int insertProject(ProjectVO project, String[] categorys, String[] emails) {
        ProjectVO iProject = dao.insertProject(project);

        int projectSeq = iProject.getSeq();
        String registerTime = iProject.getRegisterTime();
        dao.insertProjectCategory(projectSeq, categorys, registerTime);
        dao.insertProjectMember(projectSeq, emails, registerTime);

        return projectSeq;
    }

    /**
     * ?? ? 
     * 
     * @param project
     * @param categorys
     * @param emails
     * @return
     */
    @Transactional
    public int updateProject(ProjectVO project, String[] categorys, String[] emails) {
        int result = dao.updateProject(project);

        int projectSeq = project.getSeq();
        String updateTime = project.getUpdateTime();
        dao.insertProjectCategory(projectSeq, categorys, updateTime);
        dao.insertProjectMember(projectSeq, emails, updateTime);

        return result;
    }

    /**
     * ?? ? 
     * 
     * @param projectVO
     *       seq
     * @param loginUser
     * @return
     */
    @Transactional
    public Map<String, Object> deleteProject(ProjectVO projectVO, UserVO loginUser) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        if (loginUser == null || StringUtils.isEmpty(loginUser.getSeq())) {
            resultMap.put(RstConst.P_NAME, RstConst.V_NEED_LOGIN);
            return resultMap;
        }
        projectVO.setOwnerSeq(Integer.parseInt(loginUser.getSeq()));

        dao.deleteProject(projectVO);

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ? 
     * 
     * @param schWord
     * @return
     */
    public List<ProjectMemberVO> selectFindMemberList(String schWord) {
        return dao.selectFindMember(schWord);
    }

    /**
     * ? ? ? 
     * 
     * @param memberSeq
     * @param projectSeq
     * @return
     */
    public ProjectVO selectMyProject(int memberSeq, int projectSeq) {
        return dao.selectMyProject(memberSeq, projectSeq);
    }

    /**
     * ?? ? ? 
     * 
     * @param projectSeq
     * @return
     */
    public ProjectVO selectProjectInfo(Map<String, Object> paramMap) {
        ProjectVO project = dao.selectProjectInfo(paramMap);

        if (project != null) {
            project.setCategoryList(dao.selectProjectCategoryList(project.getSeq()));
        }
        // 
        //      UserVO userVO = CmnUtil.getLoginUser(request);

        // === like  
        //      if (userVO != null) {
        //         boolean curUserLikedYN = commonService.selectProjectSubjectLiked(userVO.getSeq(), workSeq);
        //         workVO.setCurUserLikedYN(curUserLikedYN);
        //      }      

        return project;
    }

    //? .
    public int projectLiked() {
        return 0;
    }

    /**
     * ?? ?  ? 
     * 
     * @param projectSeq
     * @return
     */
    public List<CategoryVO> selectProjectCategoryList(int projectSeq) {
        return dao.selectProjectCategoryList(projectSeq);
    }

    /**
     * ?? ?  
     * 
     * @param projectSeq
     * @return
     */
    public Object selectProjectMemberList(int projectSeq) {
        return dao.selectProjectMemberList(projectSeq);
    }

    /**
     * ?  ?
     * 
     * @param subjectVO
     * @param request
     * @return
     */
    @Transactional
    public Map<String, Object> insertProjectSubject(ProjectSubjectVO subjectVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        UserVO user = CmnUtil.getLoginUser(request);
        subjectVO.setMemberSeq(user.getSeq());
        CmnUtil.setCmnDate(subjectVO);
        dao.insertProjectSubject(subjectVO);

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?  
     * 
     * @param subjectVO
     * @param request
     * @return
     */
    @Transactional
    public Map<String, Object> updateProjectSubject(ProjectSubjectVO subjectVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        UserVO user = CmnUtil.getLoginUser(request);
        subjectVO.setMemberSeq(user.getSeq());
        CmnUtil.setCmnDate(subjectVO);
        dao.updateProjectSubject(subjectVO);

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?    ?
     * 
     * @param subjectVO
     * @param request
     * @return
     */
    public Map<String, Object> checkDeleteProjectSubject(ProjectSubjectVO subjectVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        UserVO user = CmnUtil.getLoginUser(request);
        subjectVO.setMemberSeq(user.getSeq());
        int cnt = dao.checkDeleteProjectSubject(subjectVO);

        if (cnt > 0) {
            // ? .
            resultMap.put(RstConst.P_NAME, RstConst.V_FAIL);
        } else {
            resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        }
        return resultMap;
    }

    /**
     * ?  
     * 
     * @param subjectVO
     * @param request
     * @return
     */
    @Transactional
    public Map<String, Object> deleteProjectSubject(ProjectSubjectVO subjectVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        dao.deleteProjectSubject(subjectVO);

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?  ?
     * 
     * @param workVO
     * @param request
     * @return
     * @throws IOException
     */
    @Transactional
    public Map<String, Object> insertProjectWork(ProjectWorkVO workVO, MultipartHttpServletRequest request)
            throws IOException {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        // 00. ?:
        MultipartFile ckFile = request.getFile("fileUriFile");
        if (ckFile != null) {
            if (ckFile.getSize() > CheckRule.LIMIT_FILE_SIZE) {
                resultMap.put(RstConst.P_NAME, RstConst.V_FILE_SIZE);
                resultMap.put("fileName", ckFile.getOriginalFilename());
                return resultMap;
            }
        }

        // 
        CmnUtil.handleHtmlEnterRN2BR(workVO, "contents");

        //0.
        // === ?? ? 
        String fileUploadDbPathThumb = CmnUtil.handleFileUpload(request, "fileUriFileThumb",
                FileUploadDomain.PROJECT_WORK_FILE);
        workVO.setThumbUri(fileUploadDbPathThumb);
        /*
         * ?? ?  ??  Thumbnail 
         */
        String fileUploadDirThumb = CmnUtil.getFileUploadDir(request, FileUploadDomain.PROJECT_WORK_FILE);
        String fileNameThumb = File.separator + FilenameUtils.getName(fileUploadDbPathThumb);
        ThumbnailManager.saveThumbProjectWorkSmall(fileUploadDirThumb + fileNameThumb);

        // === 1.work
        // projectSubjectSeq  .
        UserVO user = CmnUtil.getLoginUser(request);
        workVO.setMemberSeq(user.getSeq());
        CmnUtil.setCmnDate(workVO);
        dao.insertProjectWork(workVO);

        // === 2.workVer
        // === ? 
        String fileUploadDbPath = CmnUtil.handleFileUpload(request, "fileUriFile",
                FileUploadDomain.PROJECT_WORK_FILE);

        /*
         * ?? ?  ??  Thumbnail 
         * ?? ?  ? ?  Thumbnail  
         */

        String fileUploadDir = CmnUtil.getFileUploadDir(request, FileUploadDomain.PROJECT_WORK_FILE);
        String fileName = File.separator + FilenameUtils.getName(fileUploadDbPath);
        if (CmnUtil.isImageFile(fileName)) {
            ThumbnailManager.saveThumbProjectWorkSmall(fileUploadDir + fileName);
            ThumbnailManager.saveThumbProjectWorkLarge(fileUploadDir + fileName);
        }

        String oriFileName = CmnUtil.handleFileUploadGetOriFileName(request, "fileUriFile");
        ProjectWorkVerVO verVO = new ProjectWorkVerVO();
        verVO.setProjectWorkSeq(workVO.getSeq());
        verVO.setFileUri(fileUploadDbPath);
        verVO.setFilename(oriFileName);
        verVO.setVer(VERSION_START);
        CmnUtil.setCmnDate(verVO);
        dao.insertProjectWorkVer(verVO);

        // 2.1   ver 
        workVO.setLastVer(VERSION_START);
        dao.updateProjectWorkLastVer(workVO);

        // === 3. workMember
        // ?: (??? ?).
        Set<String> allEmails = new HashSet<String>();
        allEmails.add(user.getEmail());
        if (!CmnUtil.isEmpty(workVO.getWorkMemberEmails())) {
            for (String item : workVO.getWorkMemberEmails()) {
                allEmails.add(item);
            }
        }
        List<String> seqs = userDao.selectMemberSeqsFromEmails(allEmails);
        for (String seq : seqs) {
            insertWorkMember(workVO.getSeq(), seq);
        }

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?   ?
     * 
     * @param workSeq
     * @param memberSeq
     */
    private void insertWorkMember(String workSeq, String memberSeq) {
        ProjectWorkMemberVO wmVO = new ProjectWorkMemberVO();
        wmVO.setMemberSeq(memberSeq);
        wmVO.setProjectWorkSeq(workSeq);
        CmnUtil.setCmnDate(wmVO);
        dao.insertProjectWorkMember(wmVO);
    }

    /**
     * <pre>
     * ?  /   ?? ?
     * ?? .
     * </pre>
     * 
     * @param workVO
     * @param request
     * @return
     */
    public boolean selectIsProjectWorkAuthUser(String workSeq, HttpServletRequest request) {
        boolean result = false;

        UserVO userVO = CmnUtil.getLoginUser(request);
        ProjectWorkVO workVO = dao.selectProjectWork(workSeq);
        if (userVO != null && workVO != null) {
            String memberSeq = StringUtils.stripToEmpty(workVO.getMemberSeq()); // ??
            if (memberSeq.equals(userVO.getSeq())) {
                result = true;
            }
        }
        return result;
    }

    /**
     * ?  ? 
     * 
     * @param workVO
     * @param request
     * @return
     */
    public Map<String, Object> selectProjectWorkDetail(ProjectWorkVO workVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        ProjectWorkVO resultVO = selectProjectWorkWhole(workVO.getSeq());
        UserVO userVo = CmnUtil.getLoginUser(request);

        if (userVo != null) {
            // === auth ?
            boolean curUserAuthYN = this.selectIsProjectWorkAuthUser(workVO.getSeq(), request);
            resultVO.setCurUserAuthYN(curUserAuthYN);

            // === like  
            boolean curUserLikedYN = commonService.selectItemWorkLiked(userVo.getSeq(), workVO.getSeq(),
                    ItemType.PROJECT_WORK);
            resultVO.setCurUserLikedYN(curUserLikedYN);
        }

        resultMap.put(RstConst.P_NAME, resultVO);
        return resultMap;
    }

    /**
     * ?  : ? ??  
     * 
     * @param seq
     * @return
     */
    private ProjectWorkVO selectProjectWorkWhole(String seq) {
        ProjectWorkVO resultVO = dao.selectProjectWork(seq);
        List<ProjectWorkVerVO> verList = dao.selectProjectWorkVerList(seq);
        resultVO.setProjectWorkVerList(verList);
        List<ProjectWorkMemberVO> memberList = dao.selectProjectWorkMemberList(seq);
        resultVO.setProjectWorkMemberList(memberList);
        return resultVO;
    }

    /**
     * ?   ?
     * 
     * @param workVO
     * @param request
     * @return
     */
    public Map<String, Object> openUpdateProjectWork(ProjectWorkVO workVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        ProjectWorkVO resultVO = selectProjectWorkWhole(workVO.getSeq());

        // 
        CmnUtil.handleHtmlEnterBR2RN(resultVO, "contents");

        resultMap.put(RstConst.P_NAME, resultVO);
        return resultMap;
    }

    /**
     * <pre>
     * ?  
     * 1.  ?    0.1 ?
     * </pre>
     * 
     * @param workVO
     * @param request
     * @return
     * @throws IOException
     */
    @Transactional
    public Map<String, Object> updateProjectWork(ProjectWorkVO workVO, MultipartHttpServletRequest request)
            throws IOException {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        // 00. ?:
        MultipartFile ckFile = request.getFile("fileUriFile");
        if (ckFile != null) {
            if (ckFile.getSize() > CheckRule.LIMIT_FILE_SIZE) {
                resultMap.put(RstConst.P_NAME, RstConst.V_FILE_SIZE);
                resultMap.put("fileName", ckFile.getOriginalFilename());
                return resultMap;
            }
        }

        // 
        CmnUtil.handleHtmlEnterRN2BR(workVO, "contents");

        //0.
        // === ?? ? 
        String fileUploadDbPathThumb = CmnUtil.handleFileUpload(request, "fileUriFileThumb",
                FileUploadDomain.PROJECT_WORK_FILE);
        workVO.setThumbUri(fileUploadDbPathThumb);

        if (!StringUtils.isEmpty(fileUploadDbPathThumb)) {
            /*
             * ?? ?  ??  Thumbnail 
             */
            String fileUploadDirThumb = CmnUtil.getFileUploadDir(request, FileUploadDomain.PROJECT_WORK_FILE);
            String fileNameThumb = File.separator + FilenameUtils.getName(fileUploadDbPathThumb);
            ThumbnailManager.saveThumbProjectWorkSmall(fileUploadDirThumb + fileNameThumb);
        }

        // === 1.work
        // projectSubjectSeq  .
        UserVO user = CmnUtil.getLoginUser(request);
        workVO.setMemberSeq(user.getSeq());
        CmnUtil.setCmnDate(workVO);
        dao.updateProjectWork(workVO);

        // === 2.workVer: ?   0.1 ?
        // === ? 
        String fileUploadDbPath = CmnUtil.handleFileUpload(request, "fileUriFile",
                FileUploadDomain.PROJECT_WORK_FILE);
        if (!StringUtils.isEmpty(fileUploadDbPath)) {
            /*
             * ?? ?  ??  Thumbnail 
             * ?? ?  ? ?  Thumbnail  
             */
            String fileUploadDir = CmnUtil.getFileUploadDir(request, FileUploadDomain.PROJECT_WORK_FILE);
            String fileName = File.separator + FilenameUtils.getName(fileUploadDbPath);
            if (CmnUtil.isImageFile(fileName)) {
                ThumbnailManager.saveThumbProjectWorkSmall(fileUploadDir + fileName);
                ThumbnailManager.saveThumbProjectWorkLarge(fileUploadDir + fileName);
            }
        }

        if (!StringUtils.isEmpty(fileUploadDbPath)) {
            String oriFileName = CmnUtil.handleFileUploadGetOriFileName(request, "fileUriFile");
            // ?  
            String lastVer = dao.selectProjectWorkLastVer(workVO.getSeq());
            String nextVer = CmnUtil.getNextVersion(lastVer);
            //
            ProjectWorkVerVO verVO = new ProjectWorkVerVO();
            verVO.setProjectWorkSeq(workVO.getSeq());
            verVO.setFileUri(fileUploadDbPath);
            verVO.setFilename(oriFileName);
            verVO.setVer(nextVer);
            CmnUtil.setCmnDate(verVO);
            dao.insertProjectWorkVer(verVO);

            // 2.1   ver 
            workVO.setLastVer(nextVer);
            dao.updateProjectWorkLastVer(workVO);
        }

        // === 3. workMember
        // ?: (??? ?).
        Set<String> allEmails = new HashSet<String>();
        allEmails.add(user.getEmail());
        if (!CmnUtil.isEmpty(workVO.getWorkMemberEmails())) {
            for (String item : workVO.getWorkMemberEmails()) {
                allEmails.add(item);
            }
        }
        List<String> seqs = userDao.selectMemberSeqsFromEmails(allEmails);
        dao.deleteProjectWorkMember(workVO.getSeq());
        for (String seq : seqs) {
            insertWorkMember(workVO.getSeq(), seq);
        }

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * <pre>
     * ?   (  )
     * </pre>
     * 
     * @param workVO
     * @param request
     * @return
     */
    @Transactional
    public Map<String, Object> deleteProjectWork(ProjectWorkVO workVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        //  flag :
        // === 2.workVer
        //dao.deleteProjectWorkVer(workVO.getSeq());
        // === 3. workMember
        //dao.deleteProjectWorkMember(workVO.getSeq());
        // === 1.work
        dao.deleteProjectWork(workVO.getSeq());

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ? , 
     * 
     * @param projectSeq
     * @return
     */
    public List<ProjectSubjectVO> selectProjectSubjectWholeList(Map<String, Object> paramMap) {

        // 1.  
        List<ProjectSubjectVO> subjectList = dao.selectProjectSubjectList(paramMap);

        // 2.  
        if (!CmnUtil.isEmpty(subjectList)) {
            for (ProjectSubjectVO subject : subjectList) {
                Map<String, Object> subParamMap = new HashMap<>();

                subParamMap.put("subjectSeq", subject.getSeq());
                subParamMap.put("logonUserSeq", paramMap.get("logonUserSeq"));

                List<ProjectWorkVO> workList = dao.selectProjectWorkList(subParamMap);
                subject.setProjectWorkList(workList);
            }
        }

        return subjectList;
    }

    /**
     * <pre>
     * ?  ?
     * 1. ?? (? ? ?)? ? ?. 
     * 2. ? ?  . ? ?   .
     * 3.  ?? ?
     * </pre>
     * 
     * @param workVO:
     *            seq: ? workSeq
     * @param workVO:
     *            fromVerSeq: ? seq
     * @param workVO:
     *            toSubjectSeq: ?  seq
     * @param request
     * @return
     */
    @Transactional
    public Map<String, Object> shareProjectWork(ProjectWorkVO paramWorkVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        // ?  seq
        String fromWorkSeq = paramWorkVO.getSeq();
        // ? seq
        String fromVerSeq = paramWorkVO.getFromVerSeq();
        // ?  seq
        String toSubjectSeq = paramWorkVO.getToSubjectSeq();

        // === 0 parameter 
        // ?  
        ProjectWorkVO fromWorkVO = this.selectProjectWorkWhole(fromWorkSeq);
        // ?   :
        ProjectWorkVerVO fromWorkVerVO = null;
        for (ProjectWorkVerVO item : fromWorkVO.getProjectWorkVerList()) {
            if (fromVerSeq.equals(item.getSeq())) {
                fromWorkVerVO = item;
                break;
            }
        }

        // === 1.work
        UserVO user = CmnUtil.getLoginUser(request);
        ProjectWorkVO workVO = new ProjectWorkVO();
        workVO.setTitle(fromWorkVO.getTitle());
        workVO.setContents(fromWorkVO.getContents());
        workVO.setProjectSubjectSeq(toSubjectSeq);
        workVO.setMemberSeq(user.getSeq());
        workVO.setReferProjectWorkSeq(fromWorkSeq);
        workVO.setThumbUri(fromWorkVO.getThumbUri());
        CmnUtil.setCmnDate(workVO);

        dao.insertProjectWork(workVO);

        // === 2.workVer
        ProjectWorkVerVO verVO = new ProjectWorkVerVO();
        verVO.setProjectWorkSeq(workVO.getSeq());
        verVO.setFileUri(fromWorkVerVO.getFileUri());
        verVO.setFilename(fromWorkVerVO.getFilename());
        verVO.setVer(fromWorkVerVO.getVer());
        CmnUtil.setCmnDate(verVO);

        dao.insertProjectWorkVer(verVO);

        // 2.1   ver 
        workVO.setLastVer(fromWorkVerVO.getVer());
        dao.updateProjectWorkLastVer(workVO);

        // === 3. workMember
        // ?: (??? ?).
        insertWorkMember(workVO.getSeq(), user.getSeq());

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * <pre>
     * ?  ? ?:  ?  
     * (? ??  )
     * </pre>
     * 
     * @param workVOselectShareProjectSubjectList
     * @param request
     * @return
     */
    public Map<String, Object> selectShareProjectSubjectList(ProjectWorkVO workVO, HttpServletRequest request) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        List<ProjectSubjectVO> subjectList = dao.selectShareProjectSubjectList(workVO.getSeq());
        resultMap.put("subjectList", subjectList);

        return resultMap;
    }

    /**
     * ? ? ? ?? 
     * 
     * @param memberSeq
     * @param groupVO
     * @return
     */
    public List<ProjectVO> selectMyGroupProjectList(int memberSeq, ProjectGroupVO groupVO) {
        groupVO.setMemberSeq(memberSeq);
        return dao.selectMyGroupProjectList(groupVO);
    }

    /**
     *  ?
     * 
     * @param memberSeq
     * @param groupVO
     * @return
     */
    @Transactional
    public ProjectGroupVO insertMyGroup(int memberSeq, ProjectGroupVO groupVO) {
        String currentDate = Day.getYYYYMMddHHmm();
        groupVO.setMemberSeq(memberSeq);
        groupVO.setRegisterTime(currentDate);
        groupVO.setUpdateTime(currentDate);

        dao.insertMyGroup(groupVO);
        return groupVO;
    }

    /**
     *   
     * 
     * @param memberSeq
     * @param groupVO
     */
    @Transactional
    public void deleteMyGroup(int memberSeq, ProjectGroupVO groupVO) {
        groupVO.setMemberSeq(memberSeq);
        dao.deleteMyGroup(groupVO);
        dao.deleteProjectGroupRequestByGroupSeq(String.valueOf(groupVO.getSeq())); // 
        // ?
        // 
    }

    /**
     * ? ? 
     * 
     * @param memberSeq
     * @param projectVO
     * @return
     */
    public List<ProjectVO> selectMyProjectList(int memberSeq, ProjectVO projectVO) {
        projectVO.setOwnerSeq(memberSeq);
        return dao.selectMyProjectList(projectVO);
    }

    /**
     * ? ? ?
     * 
     * @param memberSeq
     * @param groupSeq
     * @param projectSeqs
     */
    @Transactional
    public void insertGroupProject(String memberSeq, String groupSeq, String[] projectSeqs) {
        int iMemberSeq = Integer.parseInt(memberSeq);
        int iGroupSeq = Integer.parseInt(groupSeq);
        int myGroupCount = dao.selectMyGroupCount(iMemberSeq, iGroupSeq);

        /* ? ?? ? ? */
        if (myGroupCount > 0 && projectSeqs != null && projectSeqs.length > 0) {
            int index = 0;
            int[] iProjectSeqs = new int[projectSeqs.length];
            for (String aProjectSeq : projectSeqs) {
                iProjectSeqs[index] = (Integer.parseInt(aProjectSeq));
                index++;
            }

            dao.insertMyGroupProject(iGroupSeq, iProjectSeqs, Day.getYYYYMMddHHmm());

        }
    }

    /**
     * ? ? 
     * 
     * @param memberSeq
     * @param groupSeq
     * @param projectSeq
     */
    @Transactional
    public void deleteGroupProject(String memberSeq, String groupSeq, String projectSeq) {
        int iMemberSeq = Integer.parseInt(memberSeq);
        int iGroupSeq = Integer.parseInt(groupSeq);
        int myGroupCount = dao.selectMyGroupCount(iMemberSeq, iGroupSeq);

        /* ? ?? ? ? */
        if (myGroupCount > 0) {
            dao.deleteMyGroupProject(iGroupSeq, Integer.parseInt(projectSeq));
            dao.deleteProjectGroupRequest(groupSeq, projectSeq); //  ? ? 
        }
    }

    /**
     * ? 
     * 
     * @param type: ,
     * @param seq
     * @return
     */
    public ProjectVO selectProjectByTypeAndSeq(String type, String seq) {
        return dao.selectProjectByTypeAndSeq(type, seq);
    }

    // =================================  =================================
    /**
     * ?  ? ? 
     * 
     * @param reqVO
     *            schProjectSeq
     * @return
     */
    public Map<String, Object> selectProjectGroupRequestInfo(SearchGroupVO reqVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        List<ProjectGroupReqVO> list = dao.selectProjectGroupRequestInfo(reqVO);
        resultMap.put(RstConst.P_NAME, list);

        return resultMap;
    }

    /**
     *  ?  (? )
     * 
     * @param reqVO
     *            schGroupName, schProjectSeq
     * @return
     */
    public Map<String, Object> selectProjectGroupListByName(SearchGroupVO reqVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        List<ProjectGroupReqVO> list = dao.selectProjectGroupListByName(reqVO);
        resultMap.put(RstConst.P_NAME, list);

        return resultMap;
    }

    /**
     * ? ? 
     * 
     * @param reqVO
     *            projectSeq,projectGroupSeq
     * @param loginUserVO
     * @return
     */
    @Transactional
    public Map<String, Object> insertProjectGroupRequest(ProjectGroupReqVO reqVO, UserVO loginUserVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        // 0. ? ?
        if (loginUserVO == null || StringUtils.isEmpty(loginUserVO.getSeq())) {
            resultMap.put(RstConst.P_NAME, RstConst.V_NEED_LOGIN);
            return resultMap;
        }

        // 1. ?  ?
        int checkGroupContain = dao.checkProjExistInGroup(reqVO);
        if (checkGroupContain > 0) {
            resultMap.put(RstConst.P_NAME, RstConst.V_GROUP_CONTAIN);
            return resultMap;
        }
        // 2. ? ?
        int checkGroupRequested = dao.checkProjAlreadyRequested(reqVO);
        if (checkGroupRequested > 0) {
            resultMap.put(RstConst.P_NAME, RstConst.V_GROUP_REQUESTED);
            return resultMap;
        }

        // 3.   record:   
        ProjectGroupReqVO existRequest = dao.selectProjectGroupRequestBySeq(reqVO.getProjectGroupSeq(),
                reqVO.getProjectSeq());
        if (existRequest != null) {
            dao.deleteProjectGroupRequest(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq());
        }
        CmnUtil.setCmnDate(reqVO);
        dao.insertProjectGroupRequest(reqVO);
        ProjectGroupReqVO groupVO = dao.selectProjectGroupRequestBySeq(reqVO.getProjectGroupSeq(),
                reqVO.getProjectSeq());

        // =====   ====
        notifyAlarmChangedForGroup(reqVO, loginUserVO, AlarmGroup.APPLY);
        // ===== ]]  ====

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        resultMap.put("groupVO", groupVO); // ?  
        return resultMap;
    }

    /**
     * ? ? ? 
     * 
     * @param reqVO
     * @param loginUserVO
     * @return
     */
    @Transactional
    public Map<String, Object> updateProjectGroupRequestCancel(ProjectGroupReqVO reqVO, UserVO loginUserVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        // 0. ? ?
        if (loginUserVO == null || StringUtils.isEmpty(loginUserVO.getSeq())) {
            resultMap.put(RstConst.P_NAME, RstConst.V_NEED_LOGIN);
            return resultMap;
        }

        // 0. 
        ProjectGroupReqVO searchedReq = dao.selectProjectGroupRequestBySeq(reqVO.getProjectGroupSeq(),
                reqVO.getProjectSeq());
        if (searchedReq == null) {
            LOGGER.error(">>> NO ProjectGroupReqVO ");
            resultMap.put(RstConst.P_NAME, RstConst.V_FAIL);
            return resultMap;
        }

        if (ProjectGroupReqStatus.WAITING.equals(searchedReq.getStatus())) {
            // 1.  
            dao.deleteProjectGroupRequest(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq());
        } else if (ProjectGroupReqStatus.APPROVE.equals(searchedReq.getStatus())) {
            // 2.  
            dao.deleteProjectGroup(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq());
            dao.deleteProjectGroupRequest(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq());
        }

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?  ?  ? 
     * 
     * @param reqVO
     * @return
     */
    public Map<String, Object> selectProjectGroupRequestWaitingList(SearchGroupVO reqVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        List<ProjectGroupReqVO> list = dao.selectProjectGroupRequestWaitingList(reqVO);

        resultMap.put(RstConst.P_NAME, list);
        return resultMap;
    }

    /**
     * ?  ? ?
     * 
     * @param reqVO
     * @param loginUserVO
     * @return
     */
    @Transactional
    public Map<String, Object> updateProjectGroupRequestApprove(ProjectGroupReqVO reqVO, UserVO loginUserVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        // 0. ? ?
        if (loginUserVO == null || StringUtils.isEmpty(loginUserVO.getSeq())) {
            resultMap.put(RstConst.P_NAME, RstConst.V_NEED_LOGIN);
            return resultMap;
        }

        // 0. 
        ProjectGroupReqVO searchedReq = dao.selectProjectGroupRequestBySeq(reqVO.getProjectGroupSeq(),
                reqVO.getProjectSeq());
        if (searchedReq == null) {
            LOGGER.error(">>> NO ProjectGroupReqVO ");
            resultMap.put(RstConst.P_NAME, RstConst.V_FAIL);
            return resultMap;
        }

        if (ProjectGroupReqStatus.WAITING.equals(searchedReq.getStatus())) {
            // 1. ?
            dao.updateProjectGroupRequestStatus(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq(),
                    ProjectGroupReqStatus.APPROVE);
            // ?? t_pgroup_project .
            dao.deleteProjectGroup(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq());
            dao.insertProjectGroup(reqVO);

            // =====   ====
            notifyAlarmChangedForGroup(reqVO, loginUserVO, AlarmGroup.APPROVE);
            // ===== ]]  ====

        }

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     * ?  ? 
     * 
     * @param reqVO
     * @param loginUserVO
     * @return
     */
    @Transactional
    public Map<String, Object> updateProjectGroupRequestReject(ProjectGroupReqVO reqVO, UserVO loginUserVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        // 0. ? ?
        if (loginUserVO == null || StringUtils.isEmpty(loginUserVO.getSeq())) {
            resultMap.put(RstConst.P_NAME, RstConst.V_NEED_LOGIN);
            return resultMap;
        }

        // 0. 
        ProjectGroupReqVO searchedReq = dao.selectProjectGroupRequestBySeq(reqVO.getProjectGroupSeq(),
                reqVO.getProjectSeq());
        if (searchedReq == null) {
            LOGGER.error(">>> NO ProjectGroupReqVO ");
            resultMap.put(RstConst.P_NAME, RstConst.V_FAIL);
            return resultMap;
        }

        if (ProjectGroupReqStatus.WAITING.equals(searchedReq.getStatus())) {
            // 1. 
            dao.updateProjectGroupRequestStatus(reqVO.getProjectGroupSeq(), reqVO.getProjectSeq(),
                    ProjectGroupReqStatus.REJECT);

            // =====   ====
            notifyAlarmChangedForGroup(reqVO, loginUserVO, AlarmGroup.REJECT);
            // ===== ]]  ====

        }

        resultMap.put(RstConst.P_NAME, RstConst.V_SUCESS);
        return resultMap;
    }

    /**
     *   
     * 
     * <pre>
     * </pre>
     * 
     * @author hanchanghao
     * @since 2016. 10. 20.
     */
    public static enum AlarmGroup {
        /**  */
        APPLY,
        /** ? */
        APPROVE,
        /**  */
        REJECT;
    }

    /**
     * ? ?  ?
     * 
     * @param itemVO
     * @param groupVO
     * @param userVO
     * @return
     */
    private AlarmVO notifyAlarmChangedForGroup(ProjectGroupReqVO groupVO, UserVO userVO, AlarmGroup alarmGroup) {
        ProjectGroupReqVO schGroupVO = dao.selectProjectGroupRequestBySeq(groupVO.getProjectGroupSeq(),
                groupVO.getProjectSeq());
        String alarmContents = "";
        String memberSeq = "";
        if (alarmGroup == AlarmGroup.APPLY) {
            alarmContents = String.format("?  \"%s\"? .",
                    schGroupVO.getProjectGroupName());
            memberSeq = schGroupVO.getProjectGroupOwnerSeq();
        } else if (alarmGroup == AlarmGroup.APPROVE) {
            alarmContents = String.format(" \"%s\"?  ? ?.",
                    schGroupVO.getProjectGroupName());
            memberSeq = schGroupVO.getProjectOwnerSeq();
        } else if (alarmGroup == AlarmGroup.REJECT) {
            alarmContents = String.format(" \"%s\"?  ? .",
                    schGroupVO.getProjectGroupName());
            memberSeq = schGroupVO.getProjectOwnerSeq();
        }

        // 
        //
        AlarmVO alarmVO = new AlarmVO();
        alarmVO.setMemberSeq(memberSeq);
        alarmVO.setContents(alarmContents);
        alarmVO.setActionUri("");
        alarmVO.setActorSeq(userVO.getSeq());
        CmnUtil.setCmnDate(alarmVO);
        commonDao.insertAlarm(alarmVO);

        // =====   ====
        websocketHandler.notifyAlarmChanged(alarmVO.getMemberSeq());
        // ===== ]]  ====

        return alarmVO;
    }

    /**
     *  ? 
     * 
     * @param searchVO
     * @param loginUserVO
     * @return
     */
    public Map<String, Object> selectGroupList(SearchVO searchVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();

        // 
        int allCount = dao.selectGroupAllCount(searchVO);
        List<ProjectGroupVO> list = dao.selectGroupPagingList(searchVO);

        resultMap.put("all_count", allCount);
        resultMap.put("list", list);
        return resultMap;
    }

    // ================================= ]] =================================

}