OWL ITS + 탐지시스템(인터넷 진흥원)
jhjang
2021-11-10 43a910170d8049ef99ba38cc2a81b99cad89fb0d
Merge remote-tracking branch 'origin/master'
36개 파일 추가됨
5개 파일 이름 변경됨
31개 파일 변경됨
5개 파일 삭제됨
4104 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/constant/MsgConstants.java 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/Department.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/HostingField.java 80 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/IspField.java 80 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/User.java 16 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/UserDepartment.java 44 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/DepartmentManageMapper.java 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/DepartmentMapper.java 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/HostingFieldMapper.java 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/IspFieldMapper.java 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/UserLevelMapper.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/DepartmentManageRepository.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/DepartmentRepository.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/CompanyFieldService.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/DepartmentManageService.java 32 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/DepartmentService.java 32 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/HostingFieldService.java 30 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IspFieldService.java 29 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/DepartmentManageServiceImpl.java 196 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java 196 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/HostingFieldFieldServiceImpl.java 182 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IspFieldFieldServiceImpl.java 181 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java 25 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserWorkspaceServiceImpl.java 16 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/DepartmentVo.java 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/HostingFieldVo.java 81 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IspFieldVo.java 81 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/DepartmentCondition.java 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/HostingFieldCondition.java 95 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/IspFieldCondition.java 94 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/DepartmentController.java 34 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/HostingFieldController.java 96 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/IspFieldController.java 96 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/DepartmentForm.java 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/HostingFieldForm.java 94 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IspFieldForm.java 94 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_10__Alter_Table.sql 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_11__Alter_Table.sql 43 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/HostingField-template.xml 42 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/IspField-template.xml 42 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/department-template.xml 39 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/departmentManage-template.xml 40 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/userWorkspace-template.xml 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/WEB-INF/i18n/code_ko_KR.properties 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js 30 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 32 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingField.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js 79 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js 192 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js 114 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispField.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js 79 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js 200 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js 113 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspace.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspaceDepartmentModify.controller.js 112 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/workspace/workspaceUserConfig.controller.js 28 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/HostingField/hostingField.service.js 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/ispField/ispField.service.js 26 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js 22 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/autoComplete.controller.js 45 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/main.js 7 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldAdd.html 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldAdd.html 137 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldList.html 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/hostingField/hostingFieldModify.html 134 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldAdd.html 137 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldList.html 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/ispField/ispFieldModify.html 135 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/departmentModify.html 56 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/workspaceDepartmentConfig.html 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/workspace/workspaceDepartmentModify.html 55 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -215,10 +215,12 @@
    public static final String DEPARTMENT_ALREADY_IN_USE = "DEPARTMENT_ALREADY_IN_USE";   // 선택한 부서는 이미 사용하고 있습니다.
    public static final String DEPARTMENT_REMOVE_NOT_SELECT = "DEPARTMENT_REMOVE_NOT_SELECT";   // 삭제할 부서가 선택되지 않았습니다.
    public static final String COMPANY_REMOVE_NOT_SELECT = "COMPANY_REMOVE_NOT_SELECT";   // 삭제할 업체가 선택되지 않았습니다.
    public static final String COMPANYFIELD_NOT_EXIST = "COMPANYFIELD_NOT_EXIST";   // 업체가 존재하지 않습니다.
    public static final String HOSTING_NOT_EXIST = "HOSTING_NOT_EXIST";   // 호스팅이 존재하지 않습니다.
    public static final String HOSTING_REMOVE_NOT_SELECT = "HOSTING_REMOVE_NOT_SELECT";   // 삭제할 호스팅이 선택되지 않았습니다.
    public static final String ISP_NOT_EXIST = "ISP_NOT_EXIST";   // ISP가 존재하지 않습니다.
    public static final String ISP_REMOVE_NOT_SELECT = "ISP_REMOVE_NOT_SELECT";   // 삭제할 ISP가 선택되지 않았습니다.
}
src/main/java/kr/wisestone/owl/domain/Department.java
File was renamed from src/main/java/kr/wisestone/owl/domain/DepartmentManage.java
@@ -7,7 +7,7 @@
import java.io.Serializable;
@Entity
public class DepartmentManage extends BaseEntity implements Serializable {
public class Department extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -17,7 +17,7 @@
    private String departmentName;
    private String departmentDescription;
    public DepartmentManage() {
    public Department() {
    }
    public Long getId() {
src/main/java/kr/wisestone/owl/domain/HostingField.java
New file
@@ -0,0 +1,80 @@
package kr.wisestone.owl.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
@Entity
public class HostingField extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public HostingField() {}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
}
src/main/java/kr/wisestone/owl/domain/IspField.java
New file
@@ -0,0 +1,80 @@
package kr.wisestone.owl.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
@Entity
public class IspField extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public IspField() {}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
}
src/main/java/kr/wisestone/owl/domain/User.java
@@ -29,7 +29,6 @@
    private String phone;
    private String profile;
    private String awsKey;
//    private Long departmentId;
    @Enumerated(EnumType.STRING)
    private SocialType socialType;
    private Long lastWorkspaceId;
@@ -64,10 +63,9 @@
    @JoinColumn(name="level_id")
    private UserLevel userLevel;
    @ManyToOne(targetEntity = DepartmentManage.class, fetch = FetchType.LAZY)
    @JoinColumn(name="department_id")
    private DepartmentManage departmentManage;
//    @ManyToOne(targetEntity = Department.class, fetch = FetchType.LAZY)
//    @JoinColumn(name="department_id")
//    private Department department;
    public User() {
    }
@@ -76,14 +74,6 @@
        this.id = id;
        this.name = name;
        this.account = account;
    }
    public DepartmentManage getDepartmentManage() {
        return departmentManage;
    }
    public void setDepartmentManage(DepartmentManage departmentManage) {
        this.departmentManage = departmentManage;
    }
    public UserLevel getUserLevel() {
src/main/java/kr/wisestone/owl/domain/UserDepartment.java
New file
@@ -0,0 +1,44 @@
package kr.wisestone.owl.domain;
import javax.persistence.*;
import java.io.Serializable;
@Entity
public class UserDepartment extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String departmentId;
    @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;
    public UserDepartment(){}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getDepartmentId() {
        return departmentId;
    }
    public void setDepartmentId(String departmentId) {
        this.departmentId = departmentId;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}
src/main/java/kr/wisestone/owl/mapper/CompanyFieldMapper.java
@@ -1,7 +1,6 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.CompanyFieldCondition;
import kr.wisestone.owl.web.condition.DepartmentManageCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
src/main/java/kr/wisestone/owl/mapper/DepartmentManageMapper.java
File was deleted
src/main/java/kr/wisestone/owl/mapper/DepartmentMapper.java
New file
@@ -0,0 +1,21 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-02-26.
 */
@Repository
public interface DepartmentMapper {
    List<Map<String, Object>> find(DepartmentCondition departmentCondition);
    Long count(DepartmentCondition departmentCondition);
    List<Map<String, Object>> findEvent();
    Long findBydepartmentId(Long Id);
}
src/main/java/kr/wisestone/owl/mapper/HostingFieldMapper.java
New file
@@ -0,0 +1,21 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.HostingFieldCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-02-26.
 */
@Repository
public interface HostingFieldMapper {
    List<Map<String, Object>> find(HostingFieldCondition hostingFieldCondition);
    Long count(HostingFieldCondition hostingFieldCondition);
    List<Map<String, Object>> findEvent();
    Long findByHosting(Long id);
}
src/main/java/kr/wisestone/owl/mapper/IspFieldMapper.java
New file
@@ -0,0 +1,21 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.IspFieldCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-02-26.
 */
@Repository
public interface IspFieldMapper {
    List<Map<String, Object>> find(IspFieldCondition ispFieldCondition);
    Long count(IspFieldCondition ispFieldCondition);
    List<Map<String, Object>> findEvent();
    Long findByIsp(Long id);
}
src/main/java/kr/wisestone/owl/mapper/UserLevelMapper.java
@@ -1,6 +1,5 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.UserCondition;
import kr.wisestone.owl.web.condition.UserLevelCondition;
import org.springframework.stereotype.Repository;
src/main/java/kr/wisestone/owl/repository/DepartmentManageRepository.java
File was deleted
src/main/java/kr/wisestone/owl/repository/DepartmentRepository.java
New file
@@ -0,0 +1,8 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.Department;
import org.springframework.data.jpa.repository.JpaRepository;
public interface DepartmentRepository extends JpaRepository<Department, Long> {
}
src/main/java/kr/wisestone/owl/repository/HostingFieldRepository.java
New file
@@ -0,0 +1,8 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.HostingField;
import org.springframework.data.jpa.repository.JpaRepository;
public interface HostingFieldRepository extends JpaRepository<HostingField, Long> {
}
src/main/java/kr/wisestone/owl/repository/IspFieldRepository.java
New file
@@ -0,0 +1,8 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.IspField;
import org.springframework.data.jpa.repository.JpaRepository;
public interface IspFieldRepository extends JpaRepository<IspField, Long> {
}
src/main/java/kr/wisestone/owl/service/CompanyFieldService.java
@@ -26,6 +26,4 @@
    void removeCompany(CompanyFieldForm make);
    ModelAndView downloadExcel(HttpServletRequest request, Model model);
    boolean company(Long id);
}
src/main/java/kr/wisestone/owl/service/DepartmentManageService.java
File was deleted
src/main/java/kr/wisestone/owl/service/DepartmentService.java
New file
@@ -0,0 +1,32 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.Department;
import kr.wisestone.owl.vo.DepartmentVo;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.form.DepartmentForm;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface DepartmentService extends AbstractService<Department, Long, JpaRepository<Department, Long>> {
    Department add(DepartmentForm departmentForm);
    List<DepartmentVo> find(Map<String, Object> resJsonData,
                                      DepartmentCondition make, Pageable pageable);
    Department getDepartment(Long id);
    void modify(DepartmentForm departmentForm);
    void remove(DepartmentForm departmentForm);
    void detail(Map<String, Object> resJsonData, DepartmentCondition make);
    ModelAndView downloadExcel(HttpServletRequest request, Model model);
    boolean department(Long id);
}
src/main/java/kr/wisestone/owl/service/HostingFieldService.java
New file
@@ -0,0 +1,30 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.HostingField;
import kr.wisestone.owl.vo.HostingFieldVo;
import kr.wisestone.owl.web.condition.HostingFieldCondition;
import kr.wisestone.owl.web.form.HostingFieldForm;
import org.springframework.data.domain.Pageable;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface HostingFieldService {
    HostingField add(HostingFieldForm hostingFieldForm);
    List<HostingFieldVo> find(Map<String, Object> resJsonData, HostingFieldCondition make, Pageable pageable);
    HostingField getHosting(Long id);
    void detail(Map<String, Object> resJsonData, HostingFieldCondition make);
    void modify(HostingFieldForm make);
    void remove(HostingFieldForm make);
    ModelAndView downloadExcel(HttpServletRequest request, Model model);
}
src/main/java/kr/wisestone/owl/service/IspFieldService.java
New file
@@ -0,0 +1,29 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.IspField;
import kr.wisestone.owl.vo.IspFieldVo;
import kr.wisestone.owl.web.condition.IspFieldCondition;
import kr.wisestone.owl.web.form.IspFieldForm;
import org.springframework.data.domain.Pageable;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface IspFieldService {
    IspField add(IspFieldForm ispFieldForm);
    List<IspFieldVo> find(Map<String, Object> resJsonData, IspFieldCondition make, Pageable pageable);
    IspField getIsp(Long id);
    void detail(Map<String, Object> resJsonData, IspFieldCondition make);
    void modify(IspFieldForm make);
    void remove(IspFieldForm make);
    ModelAndView downloadExcel(HttpServletRequest request, Model model);
}
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -151,12 +151,6 @@
        return new ModelAndView(this.excelView);
    }
    // 삭제 할 업체가 있는지 확인
    @Override
    public boolean company(Long Id) {
        return this.companyFieldMapper.findByCompany(Id) > 0;
    }
    //  검색 결과를 CompanyFieldVo 로 변환한다.
    private List<CompanyFieldVo> convertCompanyVoToMap(List<Map<String, Object>> results, Long totalCompanyCount, Pageable pageable, Map<String, Object> resJsonData) {
        List<CompanyFieldVo> companyFieldVos = Lists.newArrayList();
src/main/java/kr/wisestone/owl/service/impl/DepartmentManageServiceImpl.java
File was deleted
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java
New file
@@ -0,0 +1,196 @@
package kr.wisestone.owl.service.impl;
import kr.wisestone.owl.domain.Department;
import kr.wisestone.owl.mapper.DepartmentMapper;
import kr.wisestone.owl.service.UserService;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.form.DepartmentForm;
import org.springframework.ui.Model;
import com.google.common.collect.Lists;
import kr.wisestone.owl.common.ExcelConditionCheck;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.constant.MsgConstants;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.repository.DepartmentRepository;
import kr.wisestone.owl.service.DepartmentService;
import kr.wisestone.owl.service.WorkspaceService;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.vo.*;
import kr.wisestone.owl.web.view.ExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DepartmentServiceImpl extends AbstractServiceImpl<Department, Long, JpaRepository<Department, Long>> implements DepartmentService {
    @Autowired
    private DepartmentRepository departmentRepository;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private UserService userService;
    @Autowired
    private WorkspaceService workspaceService;
    @Autowired
    private ExcelView excelView;
    @Autowired
    private ExcelConditionCheck excelConditionCheck;
    @Override
    protected JpaRepository<Department, Long> getRepository() {
        return this.departmentRepository;
    }
    // 부서 추가
    @Override
    public Department add(DepartmentForm departmentForm) {
        Department department = ConvertUtil.copyProperties(departmentForm, Department.class);
        departmentRepository.saveAndFlush(department);
        return department;
    }
    // 부서 목록을 가져온다.
    @Override
    public List<DepartmentVo>find(Map<String, Object> resJsonData,
                                            DepartmentCondition condition, Pageable pageable) {
        condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
        condition.setPageSize(pageable.getPageSize());
        List<Map<String, Object>> results = this.departmentMapper.find(condition);
        Long totalDepartmentCount = this.departmentMapper.count(condition);
        return this.convertDepartmentVoToMap(results, totalDepartmentCount, pageable, resJsonData);
    }
    // 부서 상세 조회한다.
    @Override
    public void detail(Map<String, Object> resJsonData, DepartmentCondition departmentCondition) {
        DepartmentVo departmentVo = new DepartmentVo();
        Long departmentId = departmentCondition.getId();
        if (departmentId != null) {
            Department department = this.getDepartment(departmentId);
            departmentVo = ConvertUtil.copyProperties(department, DepartmentVo.class);
        }
        resJsonData.put(Constants.RES_KEY_CONTENTS, departmentVo);
    }
    // 부서 정보를 수정한다.
    @Override
    public void modify(DepartmentForm departmentForm) {
        Department department = ConvertUtil.copyProperties(departmentForm, Department.class);
        departmentRepository.saveAndFlush(department);
    }
    // 부서를 삭제한다.
    @Override
    public void remove(DepartmentForm departmentForm) {
        if (departmentForm.getRemoveIds().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.DEPARTMENT_REMOVE_NOT_SELECT));
        }
        for (Long id : departmentForm.getRemoveIds()) {
            if (!this.userService.useUserLevel(id)) {
                this.departmentRepository.deleteById(id);
            } else {
                throw new OwlRuntimeException(
                        this.messageAccessor.getMessage(MsgConstants.DEPARTMENT_ALREADY_IN_USE));
            }
        }
        this.departmentRepository.flush();
    }
    // 부서 목록을 엑셀로 다운로드 한다.
    @Override
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        ModelAndView modelAndView = this.workspaceService.checkUseExcelDownload(model);
        if (modelAndView != null) {
            return modelAndView;
        }
        Map<String, Object> conditions = new HashMap<>();
        //  엑셀 다운로드에 필요한 검색 조건 정보를 추출하고 검색 조건 추출에 오류가 발생하면 경고를 표시해준다.
        modelAndView = this.excelConditionCheck.checkCondition(conditions, request, model);
        if (modelAndView != null) {
            return modelAndView;
        }
        DepartmentCondition departmentCondition = DepartmentCondition.make(conditions);
        List<Map<String, Object>> results = this.departmentMapper.find(departmentCondition);
        List<DepartmentVo> departmentVos = ConvertUtil.convertListToListClass(results, DepartmentVo.class);
        // code_ko_KR 에 code명 설정
        ExportExcelVo excelInfo = new ExportExcelVo();
        excelInfo.setFileName(this.messageAccessor.message("부서 목록"));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("departmentName", this.messageAccessor.message("department.departmentName"), 6, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("departmentDescription", this.messageAccessor.message("department.departmentDescription"), 20, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("departmentCount", this.messageAccessor.message("department.departmentCount"), 3, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.setDatas(departmentVos);
        model.addAttribute(Constants.EXCEL, excelInfo);
        return new ModelAndView(this.excelView);
    }
    // 사용자 부서 ID로 조회한다.
    @Override
    public Department getDepartment(Long id) {
        if (id == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.DEPARTMENT_NOT_EXIST));
        }
        Department department = this.findOne(id);
        if (department == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.DEPARTMENT_NOT_EXIST));
        }
        return department;
    }
    //  삭제 할 부서 유저가 사용하고 있는지 확인
    @Override
    public boolean department(Long Id) {
        return this.departmentMapper.findBydepartmentId(Id) > 0;
    }
    //  검색 결과를 DepartmentVo 로 변환한다.
    private List<DepartmentVo> convertDepartmentVoToMap(List<Map<String, Object>> results, Long totalDepartmentsCount, Pageable pageable, Map<String, Object> resJsonData) {
        List<DepartmentVo> departmentVos = Lists.newArrayList();
        for (Map<String, Object> result : results) {
            DepartmentVo departmentVo = ConvertUtil.convertMapToClass(result, DepartmentVo.class);
            departmentVos.add(departmentVo);
        }
        int totalPage = (int) Math.ceil((totalDepartmentsCount - 1) / pageable.getPageSize()) + 1;
        resJsonData.put(Constants.RES_KEY_CONTENTS, departmentVos);
        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
                totalPage, totalDepartmentsCount));
        return departmentVos;
    }
}
src/main/java/kr/wisestone/owl/service/impl/HostingFieldFieldServiceImpl.java
New file
@@ -0,0 +1,182 @@
package kr.wisestone.owl.service.impl;
import com.google.common.collect.Lists;
import kr.wisestone.owl.common.ExcelConditionCheck;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.constant.MsgConstants;
import kr.wisestone.owl.domain.HostingField;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.mapper.HostingFieldMapper;
import kr.wisestone.owl.repository.HostingFieldRepository;
import kr.wisestone.owl.service.HostingFieldService;
import kr.wisestone.owl.service.WorkspaceService;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.vo.HostingFieldVo;
import kr.wisestone.owl.vo.ExportExcelAttrVo;
import kr.wisestone.owl.vo.ExportExcelVo;
import kr.wisestone.owl.vo.ResPage;
import kr.wisestone.owl.web.condition.HostingFieldCondition;
import kr.wisestone.owl.web.form.HostingFieldForm;
import kr.wisestone.owl.web.view.ExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class HostingFieldFieldServiceImpl extends AbstractServiceImpl<HostingField, Long, JpaRepository<HostingField, Long>> implements HostingFieldService {
    @Autowired
    private HostingFieldRepository hostingFieldRepository;
    @Autowired
    private HostingFieldMapper hostingFieldMapper;
    @Autowired
    private WorkspaceService workspaceService;
    @Autowired
    private ExcelView excelView;
    @Autowired
    private ExcelConditionCheck excelConditionCheck;
    @Override
    protected JpaRepository<HostingField, Long> getRepository() {
        return this.hostingFieldRepository;
    }
    // Hosting 추가
    @Override
    public HostingField add(HostingFieldForm HostingFieldForm) {
        HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
        hostingFieldRepository.saveAndFlush(HostingField);
        return HostingField;
    }
    // Hosting 목록을 가져온다.
    @Override
    public List<HostingFieldVo> find(Map<String, Object> resJsonData,
                                     HostingFieldCondition condition, Pageable pageable) {
        condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
        condition.setPageSize(pageable.getPageSize());
        List<Map<String, Object>> results = this.hostingFieldMapper.find(condition);
        Long totalHostingCount = this.hostingFieldMapper.count(condition);
        return this.convertHostingVoToMap(results, totalHostingCount, pageable, resJsonData);
    }
    // Hosting 상세 조회한다.
    @Override
    public void detail(Map<String, Object> resJsonData, HostingFieldCondition hostingFieldCondition) {
        HostingFieldVo HostingFieldVo = new HostingFieldVo();
        Long hostingId = hostingFieldCondition.getId();
        if (hostingId != null) {
            HostingField HostingField = this.getHosting(hostingId);
            HostingFieldVo = ConvertUtil.copyProperties(HostingField, HostingFieldVo.class);
        }
        resJsonData.put(Constants.REQ_KEY_CONTENT, HostingFieldVo);
    }
    // Hosting 정로를 수정한다.
    @Override
    public void modify(HostingFieldForm HostingFieldForm) {
        HostingField HostingField = ConvertUtil.copyProperties(HostingFieldForm, HostingField.class);
        hostingFieldRepository.saveAndFlush(HostingField);
    }
    // Hosting를 삭제한다.
    @Override
    public void remove(HostingFieldForm HostingFieldForm) {
        if (HostingFieldForm.getRemoveIds().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.COMPANY_REMOVE_NOT_SELECT));
        }
        for (Long id : HostingFieldForm.getRemoveIds()) {
                this.hostingFieldRepository.deleteById(id);
        }
        this.hostingFieldRepository.flush();
    }
    // Hosting 목록을 엑셀로 다운로드 한다.
    @Override
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        ModelAndView modelAndView = this.workspaceService.checkUseExcelDownload(model);
        if (modelAndView != null) {
            return modelAndView;
        }
        Map<String, Object> conditions = new HashMap<>();
        //  엑셀 다운로드에 필요한 검색 조건 정보를 추출하고 검색 조건 추출에 오류가 발생하면 경고를 표시해준다.
        modelAndView = this.excelConditionCheck.checkCondition(conditions, request, model);
        if (modelAndView != null) {
            return modelAndView;
        }
        HostingFieldCondition hostingFieldCondition = HostingFieldCondition.make(conditions);
        List<Map<String, Object>> results = this.hostingFieldMapper.find(hostingFieldCondition);
        List<HostingFieldVo> hostingFieldVos = ConvertUtil.convertListToListClass(results, HostingFieldVo.class);
        // code_ko_KR 에 code명 설정
        ExportExcelVo excelInfo = new ExportExcelVo();
        excelInfo.setFileName(this.messageAccessor.message("Hosting 목록"));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyName", this.messageAccessor.message("Hosting.companyName"), 6, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyManager", this.messageAccessor.message("Hosting.companyManager"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyTel", this.messageAccessor.message("Hosting.companyTel"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyEmail", this.messageAccessor.message("Hosting.companyEmail"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyMemo", this.messageAccessor.message("Hosting.companyMemo"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.setDatas(hostingFieldVos);
        model.addAttribute(Constants.EXCEL, excelInfo);
        return new ModelAndView(this.excelView);
    }
    //  검색 결과를 HostingVo 로 변환한다.
    private List<HostingFieldVo> convertHostingVoToMap(List<Map<String, Object>> results, Long totalHostingCount, Pageable pageable, Map<String, Object> resJsonData) {
        List<HostingFieldVo> hostingFieldVos = Lists.newArrayList();
        for (Map<String, Object> result : results) {
            HostingFieldVo HostingFieldVo = ConvertUtil.convertMapToClass(result, HostingFieldVo.class);
            hostingFieldVos.add(HostingFieldVo);
        }
        int totalPage = (int) Math.ceil((totalHostingCount - 1) / pageable.getPageSize()) + 1;
        resJsonData.put(Constants.RES_KEY_CONTENTS, hostingFieldVos);
        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
                totalPage, totalHostingCount));
        return hostingFieldVos;
    }
    // Hosting ID 로 조회한다
    @Override
    public HostingField getHosting(Long id) {
        if (id == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.HOSTING_NOT_EXIST));
        }
        HostingField HostingField = this.findOne(id);
        if (HostingField == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.HOSTING_NOT_EXIST));
        }
        return HostingField;
    }
}
src/main/java/kr/wisestone/owl/service/impl/IspFieldFieldServiceImpl.java
New file
@@ -0,0 +1,181 @@
package kr.wisestone.owl.service.impl;
import com.google.common.collect.Lists;
import kr.wisestone.owl.common.ExcelConditionCheck;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.constant.MsgConstants;
import kr.wisestone.owl.domain.IspField;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.mapper.IspFieldMapper;
import kr.wisestone.owl.repository.IspFieldRepository;
import kr.wisestone.owl.service.IspFieldService;
import kr.wisestone.owl.service.WorkspaceService;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.vo.IspFieldVo;
import kr.wisestone.owl.vo.ExportExcelAttrVo;
import kr.wisestone.owl.vo.ExportExcelVo;
import kr.wisestone.owl.vo.ResPage;
import kr.wisestone.owl.web.condition.IspFieldCondition;
import kr.wisestone.owl.web.form.IspFieldForm;
import kr.wisestone.owl.web.view.ExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class IspFieldFieldServiceImpl extends AbstractServiceImpl<IspField, Long, JpaRepository<IspField, Long>> implements IspFieldService {
    @Autowired
    private IspFieldRepository ispFieldRepository;
    @Autowired
    private IspFieldMapper ispFieldMapper;
    @Autowired
    private WorkspaceService workspaceService;
    @Autowired
    private ExcelView excelView;
    @Autowired
    private ExcelConditionCheck excelConditionCheck;
    @Override
    protected JpaRepository<IspField, Long> getRepository() {
        return this.ispFieldRepository;
    }
    // Isp 추가
    @Override
    public IspField add(IspFieldForm IspFieldForm) {
        IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
        ispFieldRepository.saveAndFlush(IspField);
        return IspField;
    }
    // Isp 목록을 가져온다.
    @Override
    public List<IspFieldVo> find(Map<String, Object> resJsonData,
                                 IspFieldCondition condition, Pageable pageable) {
        condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
        condition.setPageSize(pageable.getPageSize());
        List<Map<String, Object>> results = this.ispFieldMapper.find(condition);
        Long totalIspCount = this.ispFieldMapper.count(condition);
        return this.convertIspVoToMap(results, totalIspCount, pageable, resJsonData);
    }
    // Isp 상세 조회한다.
    @Override
    public void detail(Map<String, Object> resJsonData, IspFieldCondition ispFieldCondition) {
        IspFieldVo IspFieldVo = new IspFieldVo();
        Long IspId = ispFieldCondition.getId();
        if (IspId != null) {
            IspField IspField = this.getIsp(IspId);
            IspFieldVo = ConvertUtil.copyProperties(IspField, IspFieldVo.class);
        }
        resJsonData.put(Constants.REQ_KEY_CONTENT, IspFieldVo);
    }
    // Isp 정로를 수정한다.
    @Override
    public void modify(IspFieldForm IspFieldForm) {
        IspField IspField = ConvertUtil.copyProperties(IspFieldForm, IspField.class);
        ispFieldRepository.saveAndFlush(IspField);
    }
    // Isp를 삭제한다.
    @Override
    public void remove(IspFieldForm IspFieldForm) {
        if (IspFieldForm.getRemoveIds().size() < 1) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISP_REMOVE_NOT_SELECT));
        }
        for (Long id : IspFieldForm.getRemoveIds()) {
                this.ispFieldRepository.deleteById(id);
        }
        this.ispFieldRepository.flush();
    }
    // Isp 목록을 엑셀로 다운로드 한다.
    @Override
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        ModelAndView modelAndView = this.workspaceService.checkUseExcelDownload(model);
        if (modelAndView != null) {
            return modelAndView;
        }
        Map<String, Object> conditions = new HashMap<>();
        //  엑셀 다운로드에 필요한 검색 조건 정보를 추출하고 검색 조건 추출에 오류가 발생하면 경고를 표시해준다.
        modelAndView = this.excelConditionCheck.checkCondition(conditions, request, model);
        if (modelAndView != null) {
            return modelAndView;
        }
        IspFieldCondition ispFieldCondition = IspFieldCondition.make(conditions);
        List<Map<String, Object>> results = this.ispFieldMapper.find(ispFieldCondition);
        List<IspFieldVo> ispFieldVos = ConvertUtil.convertListToListClass(results, IspFieldVo.class);
        // code_ko_KR 에 code명 설정
        ExportExcelVo excelInfo = new ExportExcelVo();
        excelInfo.setFileName(this.messageAccessor.message("Isp 목록"));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("IspName", this.messageAccessor.message("Isp.IspName"), 6, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("IspManager", this.messageAccessor.message("Isp.IspManager"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("IspTel", this.messageAccessor.message("Isp.IspTel"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("IspEmail", this.messageAccessor.message("Isp.IspEmail"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.addAttrInfos(new ExportExcelAttrVo("IspMemo", this.messageAccessor.message("Isp.IspMemo"), 10, ExportExcelAttrVo.ALIGN_CENTER));
        excelInfo.setDatas(ispFieldVos);
        model.addAttribute(Constants.EXCEL, excelInfo);
        return new ModelAndView(this.excelView);
    }
    //  검색 결과를 IspVo 로 변환한다.
    private List<IspFieldVo> convertIspVoToMap(List<Map<String, Object>> results, Long totalIspCount, Pageable pageable, Map<String, Object> resJsonData) {
        List<IspFieldVo> ispFieldVos = Lists.newArrayList();
        for (Map<String, Object> result : results) {
            IspFieldVo IspFieldVo = ConvertUtil.convertMapToClass(result, IspFieldVo.class);
            ispFieldVos.add(IspFieldVo);
        }
        int totalPage = (int) Math.ceil((totalIspCount - 1) / pageable.getPageSize()) + 1;
        resJsonData.put(Constants.RES_KEY_CONTENTS, ispFieldVos);
        resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
                totalPage, totalIspCount));
        return ispFieldVos;
    }
    // Isp ID 로 조회한다
    @Override
    public IspField getIsp(Long id) {
        if (id == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISP_NOT_EXIST));
        }
        IspField IspField = this.findOne(id);
        if (IspField == null) {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.ISP_NOT_EXIST));
        }
        return IspField;
    }
}
src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java
@@ -12,12 +12,13 @@
import kr.wisestone.owl.domain.enumType.SocialType;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.mapper.UserMapper;
import kr.wisestone.owl.repository.DepartmentRepository;
import kr.wisestone.owl.repository.UserRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.*;
import kr.wisestone.owl.vo.*;
import kr.wisestone.owl.web.condition.UserCondition;
import kr.wisestone.owl.web.form.DepartmentManageForm;
import kr.wisestone.owl.web.form.DepartmentForm;
import kr.wisestone.owl.web.form.UserForm;
import kr.wisestone.owl.web.view.ExcelView;
import org.apache.commons.validator.routines.EmailValidator;
@@ -56,10 +57,13 @@
    private UserRepository userRepository;
    @Autowired
    private DepartmentRepository departmentRepository;
    @Autowired
    private UserLevelService userLevelService;
    @Autowired
    private DepartmentManageService departmentManageService;
    private DepartmentService departmentService;
    @Autowired
    private SystemRoleService systemRoleService;
@@ -241,14 +245,6 @@
            this.userLevelService.addNormalUserLevel();
            // DepartmentManage에 임시로 Name, Description 값 추가
            DepartmentManageForm departmentManageForm = new DepartmentManageForm();
            departmentManageForm.setDepartmentName("개발팀");
            departmentManageForm.setDepartmentDescription("웹사이트 및 앱 서비스 개발");
            DepartmentManage departmentManage = this.departmentManageService.addDepartmentManage(departmentManageForm);
            user.setDepartmentManage(departmentManage);
            if(primaryWorkspace == null || primaryWorkspace.getName() != userForm.getWorkspaceName()) {
                //  업무 공간를 생성한다. 가입한 사용자는 업무 공간의 주인이다.
                Workspace workspace = this.workspaceService.addWorkspace(userForm.getWorkspaceName());
@@ -267,6 +263,13 @@
                /*user.setPermission(MngPermission.makeSubAllPermission());*/
            }
        }
        DepartmentForm departmentForm = new DepartmentForm();
        departmentForm.setDepartmentName("부서 없음");
        Department department = this.departmentService.add(departmentForm);
        // wyu
        this.departmentRepository.saveAndFlush(department);
        this.userRepository.saveAndFlush(user);
        //  이메일 알림 예정 시간이 공백이면 디폴트 이메일 알림 예정 시간으로 설정한다.
@@ -1196,7 +1199,7 @@
    @Transactional(readOnly = true)
    public User getUserSession(Map<String, Object> resJsonData, HttpServletRequest httpServletRequest) {
        User user = this.getUser(this.webAppUtil.getLoginId());
        UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class, "password","permission"); // wyu - ignores permission ??
        UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class, "password","permission");
        // user에서 Permission 값을 가져와서 userVo 에 setPermission 함
        userVo.setPermission(user.getPermission());
        userVo.setAccount(CommonUtil.decryptAES128(userVo.getAccount()));
src/main/java/kr/wisestone/owl/service/impl/UserWorkspaceServiceImpl.java
@@ -40,7 +40,7 @@
    private UserLevelService userLevelService;
    @Autowired
    private DepartmentManageService departmentManageService;
    private DepartmentService departmentService;
    @Autowired
    private UserWorkspaceMapper userWorkspaceMapper;
@@ -117,13 +117,13 @@
        }
        // 부서 변경
        DepartmentManage currentDepartment = user.getDepartmentManage();
        if (currentDepartment == null || (userWorkspaceForm.getDepartmentId() != null && currentDepartment.getId() != userWorkspaceForm.getDepartmentId())) {
            // 부서명 변경시
            DepartmentManage departmentManage = this.departmentManageService.getDepartment(userWorkspaceForm.getDepartmentId());
            user.setDepartmentManage(departmentManage);
            userWorkspace.setUser(user);
        }
//        DepartmentManage currentDepartment = user.getDepartmentManage();
//        if (currentDepartment == null || (userWorkspaceForm.getDepartmentId() != null && currentDepartment.getId() != userWorkspaceForm.getDepartmentId())) {
//            // 부서명 변경시
//            DepartmentManage departmentManage = this.departmentService.getDepartment(userWorkspaceForm.getDepartmentId());
//            user.setDepartmentManage(departmentManage);
//            userWorkspace.setUser(user);
//        }
        //  참여로 상태를 변경하려고 할때
        if (userWorkspace.getUseYn() != userWorkspaceForm.getUseYn()) {
src/main/java/kr/wisestone/owl/vo/DepartmentVo.java
File was renamed from src/main/java/kr/wisestone/owl/vo/DepartmentManageVo.java
@@ -3,16 +3,16 @@
/**
 * Created by wyu on 2021-11-05.
 */
public class DepartmentManageVo extends BaseVo{
public class DepartmentVo extends BaseVo{
    private Long id;
    private String departmentName;
    private String departmentDescription;
    private Long departmentCount;
    public DepartmentManageVo() {}
    public DepartmentVo() {}
    public DepartmentManageVo(Long id, String departmentName, String departmentDescription) {
    public DepartmentVo(Long id, String departmentName, String departmentDescription) {
        this.id = id;
        this.departmentName = departmentName;
        this.departmentDescription = departmentDescription;
src/main/java/kr/wisestone/owl/vo/HostingFieldVo.java
New file
@@ -0,0 +1,81 @@
package kr.wisestone.owl.vo;
public class HostingFieldVo extends BaseVo{
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public HostingFieldVo() {}
    public HostingFieldVo(Long id, String code, String name, String manager, String tel, String email, String memo) {
        this.id = id;
        this.code = code;
        this.name = name;
        this.manager = manager;
        this.tel = tel;
        this.email = email;
        this.memo = memo;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
}
src/main/java/kr/wisestone/owl/vo/IspFieldVo.java
New file
@@ -0,0 +1,81 @@
package kr.wisestone.owl.vo;
public class IspFieldVo extends BaseVo{
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public IspFieldVo() {}
    public IspFieldVo(Long id, String code, String name, String manager, String tel, String email, String memo) {
        this.id = id;
        this.code = code;
        this.name = name;
        this.manager = manager;
        this.tel = tel;
        this.email = email;
        this.memo = memo;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
}
src/main/java/kr/wisestone/owl/web/condition/DepartmentCondition.java
File was renamed from src/main/java/kr/wisestone/owl/web/condition/DepartmentManageCondition.java
@@ -7,7 +7,7 @@
/**
 * Created by wyu on 2021-11-05.
 */
public class DepartmentManageCondition {
public class DepartmentCondition {
    private Long id;
    private String departmentName;
    private String departmentDescription;
@@ -16,8 +16,8 @@
    private Integer Page;
    private Integer PageSize;
    public static DepartmentManageCondition make(Map<String, Object> departmentManageConditions) {
        return ConvertUtil.convertMapToClass(departmentManageConditions, DepartmentManageCondition.class);
    public static DepartmentCondition make(Map<String, Object> departmentConditions) {
        return ConvertUtil.convertMapToClass(departmentConditions, DepartmentCondition.class);
    }
    public Long getId() {
src/main/java/kr/wisestone/owl/web/condition/HostingFieldCondition.java
New file
@@ -0,0 +1,95 @@
package kr.wisestone.owl.web.condition;
import kr.wisestone.owl.util.ConvertUtil;
import java.util.Map;
public class HostingFieldCondition {
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    private Integer Page;
    private Integer PageSize;
    public static HostingFieldCondition make(Map<String, Object> hostingFieldCondition) {
        return ConvertUtil.convertMapToClass(hostingFieldCondition, HostingFieldCondition.class);
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    public Integer getPage() {
        return Page;
    }
    public void setPage(Integer page) {
        Page = page;
    }
    public Integer getPageSize() {
        return PageSize;
    }
    public void setPageSize(Integer pageSize) {
        PageSize = pageSize;
    }
}
src/main/java/kr/wisestone/owl/web/condition/IspFieldCondition.java
New file
@@ -0,0 +1,94 @@
package kr.wisestone.owl.web.condition;
import kr.wisestone.owl.util.ConvertUtil;
import java.util.Map;
public class IspFieldCondition {
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    private Integer Page;
    private Integer PageSize;
    public static IspFieldCondition make(Map<String, Object> companyFieldCondition) {
        return ConvertUtil.convertMapToClass(companyFieldCondition, IspFieldCondition.class);
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    public Integer getPage() {
        return Page;
    }
    public void setPage(Integer page) {
        Page = page;
    }
    public Integer getPageSize() {
        return PageSize;
    }
    public void setPageSize(Integer pageSize) {
        PageSize = pageSize;
    }
}
src/main/java/kr/wisestone/owl/web/controller/DepartmentController.java
File was renamed from src/main/java/kr/wisestone/owl/web/controller/DepartmentManageController.java
@@ -1,9 +1,9 @@
package kr.wisestone.owl.web.controller;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.service.DepartmentManageService;
import kr.wisestone.owl.web.condition.DepartmentManageCondition;
import kr.wisestone.owl.web.form.DepartmentManageForm;
import kr.wisestone.owl.service.DepartmentService;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.form.DepartmentForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
@@ -23,77 +23,77 @@
 * Created by jeong on 2017-08-02.
 */
@Controller
public class DepartmentManageController extends BaseController {
public class DepartmentController extends BaseController {
    @Autowired
    private DepartmentManageService departmentManageService;
    private DepartmentService departmentService;
    // 부서 생성
    @RequestMapping(value = "/departmentManage/add", method = RequestMethod.POST)
    @RequestMapping(value = "/department/add", method = RequestMethod.POST)
    public
    @ResponseBody
    Map<String, Object> add(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.departmentManageService.addDepartmentManage(DepartmentManageForm.make(content));
        this.departmentService.add(DepartmentForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 부서 조회
    @RequestMapping(value = "/departmentManage/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @RequestMapping(value = "/department/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Pageable pageable = this.pageUtil.convertPageable(this.getPageVo(params));
        this.departmentManageService.findDepartment(resJsonData, DepartmentManageCondition.make(params.get(Constants.REQ_KEY_CONTENT)), pageable);
        this.departmentService.find(resJsonData, DepartmentCondition.make(params.get(Constants.REQ_KEY_CONTENT)), pageable);
        return this.setSuccessMessage(resJsonData);
    }
   // 부서 상세 조회
   @RequestMapping(value = "/departmentManage/detail", produces = MediaType.APPLICATION_JSON_VALUE)
   @RequestMapping(value = "/department/detail", produces = MediaType.APPLICATION_JSON_VALUE)
   public
   @ResponseBody
   Map<String, Object> detail(@RequestBody Map<String, Map<String, Object>> params) {
       Map<String, Object> resJsonData = new HashMap<>();
       this.departmentManageService.detailDepartment(resJsonData, DepartmentManageCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
       this.departmentService.detail(resJsonData, DepartmentCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
       return this.setSuccessMessage(resJsonData);
   }
   // 부서 수정
   @RequestMapping(value = "/departmentManage/modify", produces = MediaType.APPLICATION_JSON_VALUE)
   @RequestMapping(value = "/department/modify", produces = MediaType.APPLICATION_JSON_VALUE)
   public
   @ResponseBody
   Map<String, Object> modify(@RequestBody Map<String, Map<String, Object>> params) {
       Map<String, Object> resJsonData = new HashMap<>();
       this.departmentManageService.modifyDepartment(DepartmentManageForm.make(params.get(Constants.REQ_KEY_CONTENT)));
       this.departmentService.modify(DepartmentForm.make(params.get(Constants.REQ_KEY_CONTENT)));
       return this.setSuccessMessage(resJsonData);
   }
   // 부서 삭제
    @RequestMapping(value = "/departmentManage/remove", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    @RequestMapping(value = "/department/remove", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> remove(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.departmentManageService.removeDepartment(DepartmentManageForm.make(content));
        this.departmentService.remove(DepartmentForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 부서 엑셀 다운로드
    @RequestMapping(value = "/departmentManage/downloadExcel", method = RequestMethod.POST)
    @RequestMapping(value = "/department/downloadExcel", method = RequestMethod.POST)
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        return this.departmentManageService.downloadExcel(request, model);
        return this.departmentService.downloadExcel(request, model);
    }
}
src/main/java/kr/wisestone/owl/web/controller/HostingFieldController.java
New file
@@ -0,0 +1,96 @@
package kr.wisestone.owl.web.controller;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.service.HostingFieldService;
import kr.wisestone.owl.web.condition.HostingFieldCondition;
import kr.wisestone.owl.web.form.HostingFieldForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Controller
public class HostingFieldController extends BaseController{
    @Autowired
    private HostingFieldService HostingFieldService;
    // 업체 생성
    @RequestMapping(value = "/hostingField/add", method = RequestMethod.POST)
    public
    @ResponseBody
    Map<String, Object> add(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.HostingFieldService.add(HostingFieldForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 조회
    @RequestMapping(value = "/hostingField/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Pageable pageable = this.pageUtil.convertPageable(this.getPageVo(params));
        this.HostingFieldService.find(resJsonData, HostingFieldCondition.make(params.get(Constants.REQ_KEY_CONTENT)), pageable);
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 상세 조회
    @RequestMapping(value = "/hostingField/detail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> detail(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.HostingFieldService.detail(resJsonData, HostingFieldCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 수정
    @RequestMapping(value = "/hostingField/modify", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> modify(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.HostingFieldService.modify(HostingFieldForm.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 삭제
    @RequestMapping(value = "/hostingField/remove", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> remove(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.HostingFieldService.remove(HostingFieldForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 엑셀 다운로드
    @RequestMapping(value = "/hostingField/downloadExcel", method = RequestMethod.POST)
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        return this.HostingFieldService.downloadExcel(request, model);
    }
}
src/main/java/kr/wisestone/owl/web/controller/IspFieldController.java
New file
@@ -0,0 +1,96 @@
package kr.wisestone.owl.web.controller;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.service.IspFieldService;
import kr.wisestone.owl.web.condition.IspFieldCondition;
import kr.wisestone.owl.web.form.IspFieldForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Controller
public class IspFieldController extends BaseController{
    @Autowired
    private IspFieldService IspFieldService;
    // 업체 생성
    @RequestMapping(value = "/ispField/add", method = RequestMethod.POST)
    public
    @ResponseBody
    Map<String, Object> add(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.IspFieldService.add(IspFieldForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 조회
    @RequestMapping(value = "/ispField/find", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> find(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Pageable pageable = this.pageUtil.convertPageable(this.getPageVo(params));
        this.IspFieldService.find(resJsonData, IspFieldCondition.make(params.get(Constants.REQ_KEY_CONTENT)), pageable);
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 상세 조회
    @RequestMapping(value = "/ispField/detail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> detail(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.IspFieldService.detail(resJsonData, IspFieldCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 수정
    @RequestMapping(value = "/ispField/modify", produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> modify(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.IspFieldService.modify(IspFieldForm.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 삭제
    @RequestMapping(value = "/ispField/remove", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> remove(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        Map<String, Object> content = params.get(Constants.REQ_KEY_CONTENT);
        this.IspFieldService.remove(IspFieldForm.make(content));
        return this.setSuccessMessage(resJsonData);
    }
    // 업체 엑셀 다운로드
    @RequestMapping(value = "/ispField/downloadExcel", method = RequestMethod.POST)
    public ModelAndView downloadExcel(HttpServletRequest request, Model model) {
        return this.IspFieldService.downloadExcel(request, model);
    }
}
src/main/java/kr/wisestone/owl/web/form/DepartmentForm.java
File was renamed from src/main/java/kr/wisestone/owl/web/form/DepartmentManageForm.java
@@ -10,17 +10,17 @@
/**
 * Created by jeong on 2017-12-30.
 */
public class DepartmentManageForm {
public class DepartmentForm {
    private Long id;
    private String departmentName;
    private String departmentDescription;
    private List<Long> removeIds = Lists.newArrayList();
    public DepartmentManageForm() {
    public DepartmentForm() {
    }
    public static DepartmentManageForm make(Map<String, Object> params) {
        DepartmentManageForm form = ConvertUtil.convertMapToClass(params, DepartmentManageForm.class);
    public static DepartmentForm make(Map<String, Object> params) {
        DepartmentForm form = ConvertUtil.convertMapToClass(params, DepartmentForm.class);
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
src/main/java/kr/wisestone/owl/web/form/HostingFieldForm.java
New file
@@ -0,0 +1,94 @@
package kr.wisestone.owl.web.form;
import com.google.common.collect.Lists;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import java.util.List;
import java.util.Map;
public class HostingFieldForm {
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    private List<Long> removeIds = Lists.newArrayList();
    public HostingFieldForm() {
    }
    public static HostingFieldForm make(Map<String, Object> params) {
        HostingFieldForm form = ConvertUtil.convertMapToClass(params, HostingFieldForm.class);
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
        }
        return form;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    public List<Long> getRemoveIds() {
        return removeIds;
    }
    public void setRemoveIds(List<Long> removeIds) {
        this.removeIds = removeIds;
    }
}
src/main/java/kr/wisestone/owl/web/form/IspFieldForm.java
New file
@@ -0,0 +1,94 @@
package kr.wisestone.owl.web.form;
import com.google.common.collect.Lists;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import java.util.List;
import java.util.Map;
public class IspFieldForm {
    private Long id;
    private String code;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    private List<Long> removeIds = Lists.newArrayList();
    public IspFieldForm() {
    }
    public static IspFieldForm make(Map<String, Object> params) {
        IspFieldForm form = ConvertUtil.convertMapToClass(params, IspFieldForm.class);
        if (MapUtil.getLongs(params,"removeIds") != null) {
            form.setRemoveIds(MapUtil.getLongs(params, "removeIds"));
        }
        return form;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    public List<Long> getRemoveIds() {
        return removeIds;
    }
    public void setRemoveIds(List<Long> removeIds) {
        this.removeIds = removeIds;
    }
}
src/main/resources/migration/V1_10__Alter_Table.sql
@@ -1,16 +1,14 @@
ALTER TABLE `user` DROP COLUMN `permission`;
ALTER TABLE `user` ADD COLUMN  `level_id` BIGINT(11) NULL;
ALTER TABLE `user` ADD COLUMN  `department_id` BIGINT(11) NULL;
CREATE TABLE `department_manage`(
CREATE TABLE `department`(
    `id` BIGINT(11) AUTO_INCREMENT,
    `department_name` VARCHAR(50) NOT NULL,
    `department_description` VARCHAR(255) NOT NULL,
    `department_description` VARCHAR(255) NULL,
    `register_id` BIGINT(20) NOT NULL,
    `register_date` TIMESTAMP NULL,
    `modify_id` BIGINT(20) NOT NULL,
    `modify_date` TIMESTAMP NULL,
    `default_department` VARCHAR (50) NULL DEFAULT '부서 없음',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
src/main/resources/migration/V1_11__Alter_Table.sql
@@ -11,4 +11,45 @@
    `modify_date` TIMESTAMP NULL,
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/* 이메일은 ID 값으로 받고 연락처도 user에 phone에서 받으면 되고*/
CREATE TABLE `isp_field`(
    `id` BIGINT(11) AUTO_INCREMENT,
    `code` varchar (50) NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    `manager` VARCHAR(50) NULL,
    `tel` VARCHAR (50) NULL,
    `email` VARCHAR (255) NULL,
    `memo` VARCHAR(255) NULL,
    `register_id` BIGINT(20) NOT NULL,
    `register_date` TIMESTAMP NULL,
    `modify_id` BIGINT(20) NOT NULL,
    `modify_date` TIMESTAMP NULL,
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `hosting_field`(
    `id` BIGINT(11) AUTO_INCREMENT,
    `code` VARCHAR(50) NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    `manager` VARCHAR(50) NULL,
    `tel` VARCHAR (50) NULL,
    `email` VARCHAR (255) NULL,
    `memo` VARCHAR(255) NULL,
    `register_id` BIGINT(20) NOT NULL,
    `register_date` TIMESTAMP NULL,
    `modify_id` BIGINT(20) NOT NULL,
    `modify_date` TIMESTAMP NULL,
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `user_department`(
    `id` BIGINT(11) AUTO_INCREMENT,
    `department_id` VARCHAR(50) NULL,
    `user_id` VARCHAR(50) NULL,
    `register_id` BIGINT(20) NOT NULL,
    `register_date` TIMESTAMP NULL,
    `modify_id` BIGINT(20) NOT NULL,
    `modify_date` TIMESTAMP NULL,
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
src/main/resources/mybatis/query-template/HostingField-template.xml
New file
@@ -0,0 +1,42 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.HostingFieldMapper">
    <select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.HostingFieldCondition">
        SELECT
        h.id as id,
        h.code as code,
        h.name as name,
        h.manager as manager,
        h.tel as tel,
        h.email as email,
        h.memo as memo
        FROM
        hosting_field h
        WHERE 1=1
        <if test="name != '' and name != null">
            AND h.name like CONCAT('%',#{name},'%')
        </if>
        <if test="id != '' and id != null">
            AND h.id like CONCAT('%',#{id},'%')
        </if>
        <if test="pageSize != '' and pageSize != null">
            limit #{pageSize} offset #{page};
        </if>
    </select>
    <select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.HostingFieldCondition">
        SELECT
        count(h.id)
        FROM
        hosting_field h
        WHERE 1=1
        <if test="name != '' and name != null">
            AND h.name like CONCAT('%',#{name},'%')
        </if>
        <if test="id != '' and id != null">
            AND h.id like CONCAT('%',#{id},'%')
        </if>
    </select>
</mapper>
src/main/resources/mybatis/query-template/IspField-template.xml
New file
@@ -0,0 +1,42 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.IspFieldMapper">
    <select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IspFieldCondition">
        SELECT
        i.id as id,
        i.code as code,
        i.name as name,
        i.manager as manager,
        i.tel as tel,
        i.email as email,
        i.memo as memo
        FROM
        isp_field i
        WHERE 1=1
        <if test="name != '' and name != null">
            AND i.name like CONCAT('%',#{name},'%')
        </if>
        <if test="id != '' and id != null">
            AND i.id like CONCAT('%',#{id},'%')
        </if>
        <if test="pageSize != '' and pageSize != null">
            limit #{pageSize} offset #{page};
        </if>
    </select>
    <select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.IspFieldCondition">
        SELECT
        count(i.id)
        FROM
        isp_field i
        WHERE 1=1
        <if test="name != '' and name != null">
            AND i.name like CONCAT('%',#{name},'%')
        </if>
        <if test="id != '' and id != null">
            AND i.id like CONCAT('%',#{id},'%')
        </if>
    </select>
</mapper>
src/main/resources/mybatis/query-template/department-template.xml
New file
@@ -0,0 +1,39 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.DepartmentMapper">
    <select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.DepartmentCondition">
        SELECT
        d.id as id,
        d.department_name as departmentName,
        d.department_description as departmentDescription,
        (SELECT COUNT(ud.department_id) FROM user_department ud WHERE d.id = ud.department_id) AS departmentCount
        FROM
        department d
        WHERE 1=1
        <if test="departmentName != '' and departmentName != null">
            AND d.department_name like CONCAT('%',#{departmentName},'%')
        </if>
        <if test="id != '' and id != null">
            AND d.id like CONCAT('%',#{id},'%')
        </if>
        <if test="pageSize != '' and pageSize != null">
            limit #{pageSize} offset #{page};
        </if>
    </select>
    <select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.DepartmentCondition">
        SELECT
        count(d.id)
        FROM
        department d
        WHERE 1=1
        <if test="departmentName != '' and departmentName != null">
            AND d.department_name like CONCAT('%',#{departmentName},'%')
        </if>
        <if test="id != '' and id != null">
            AND d.id like CONCAT('%',#{id},'%')
        </if>
    </select>
</mapper>
src/main/resources/mybatis/query-template/departmentManage-template.xml
File was deleted
src/main/resources/mybatis/query-template/userWorkspace-template.xml
@@ -10,7 +10,6 @@
        u.name as userName,
        u.account as account,
        u.level_id as levelId,
        u.department_id as departmentId,
        CASE WHEN uw.use_yn = 'Y' THEN 'true' ELSE 'false' END as useYn
        FROM
        user_workspace uw
@@ -44,16 +43,6 @@
                </foreach>
            </when>
        </choose>
        <choose>
            <when test="departmentIds.size != 0">
                AND u.department_id IN
                <foreach collection="departmentIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
        limit #{pageSize} offset #{page};
    </select>
src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
@@ -109,9 +109,9 @@
manageUser.manageFAQPerm=FAQ \uAD00\uB9AC
manageUser.manageQnAPerm=QnA \uAD00\uB9AC
manageUser.manageGuidePerm=\uAC00\uC774\uB4DC \uAD00\uB9AC
departmentManage.departmentName=\uBD80\uC11C\uBA85
departmentManage.departmentDescription=\uBD80\uC11C\uC124\uBA85
departmentManage.departmentCount=\uBD80\uC11C\uC778\uC6D0
department.departmentName=\uBD80\uC11C\uBA85
department.departmentDescription=\uBD80\uC11C\uC124\uBA85
department.departmentCount=\uBD80\uC11C\uC778\uC6D0
companyField.companyName=\uC5C5\uCCB4\uBA85
companyField.companyManager=\uB2F4\uB2F9\uC790
companyField.companyTel=\uC804\uD654\uBC88\uD638
src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -132,6 +132,18 @@
                                            makeTag += "</ul>";
                                            break;
                                        case "USE_DEPARTMENT_LIST" :
                                            makeTag += "<ul class='ul-not-comma'>";
                                            makeTag += "<div style='cursor: pointer' ng-click='event.modifyUserDepartments(scope.data.id)'>";
                                            angular.forEach(scope.data.departments, function (department) { //departmentVO로 수정 체크 필요
                                                makeTag += "<li>" + department.fieldValue + "</li>";
                                            });
                                            makeTag += "</div>";
                                            makeTag += "</ul>";
                                            break;
                                        case "CONFIG" :
                                            makeTag += '<a ng-click="event.modify(data.id)"><i class="fa fa-pencil fa-lg" uib-tooltip="수정"></i></a>';
                                            break;
@@ -375,6 +387,24 @@
                                            }
                                            break;
                                        case "ISPFIELD_MODIFY" :
                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')) {
                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            else {
                                                makeTag += "<span class='titlename not-modify table-word-break-all'>" + scope.data.name + "</span>";
                                            }
                                            break;
                                        case "HOSTINGFIELD_MODIFY" :
                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')) {
                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modify(data.id)'>" + scope.data.name.replace(/</gi, '&lt;') + "</span>";
                                            }
                                            else {
                                                makeTag += "<span class='titlename not-modify table-word-break-all'>" + scope.data.name + "</span>";
                                            }
                                            break;
                                        case "ISSUE_CUSTOM_FIELD_VALUE_VIEW" :
                                            var values = [];
src/main/webapp/i18n/ko/global.json
@@ -147,7 +147,8 @@
        "failedToSelectWorkspaceFullUserList": "업무 공간 전체 사용자 목록 조회 실패",
        "failedToSelectWorkspaceFullLevelList": "사용자 등급 목록 조회 실패",
        "failedToSelectWorkspaceFullDepartmentList": "부서 목록 조회 실패",
        "failedToModifyUserLevel": "사용자 등급 상세 정보 조회 실패"
        "failedToModifyUserLevel": "사용자 등급 상세 정보 조회 실패",
        "failedToDepartmentsOfUserDetails": "사용자의 부서 상세 정보 조회 실패"
    },
    "issue": {
        "issueType": "이슈 유형",
@@ -789,13 +790,14 @@
    },
    "companyField" : {
        "add" : "업체 생성",
        "name" : "업체명",
        "name" : "업체 이름",
        "company" : "업체 분류",
        "profitYN" : "영리/비영리",
        "industry" : "산업 분류",
        "domain" : "도메인",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고",
        "failedToSelectCompanyFieldFullList" : "업체 관리 목록 조회 실패",
@@ -803,22 +805,42 @@
        "wantToDeleteSelectCompanyField" : "선택한 업체를 삭제하겠습니까? 삭제된 업체는 복구할 수 없습니다.",
        "failedCompanyFieldRegistration" : "업체 등록 실패",
        "failedToDetailCompanyFieldModify" : "업체 상세 정보 조회 실패",
        "pleaseEnterCompanyFieldName": "업체명을 입력하세요."
        "pleaseEnterCompanyFieldName": "업체 이름을 입력하세요.",
        "enterSpecialCharacters": "업체 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidTelFormat": "전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요."
    },
    "ispField" : {
        "add" : "ISP 생성",
        "name" : "ISP 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고"
        "desc" : "비고",
        "failedToSelectIspFieldFullList" : "ISP 관리 목록 조회 실패",
        "delete" : "ISP 삭제",
        "wantToDeleteSelectIspField" : "선택한 ISP를 삭제하겠습니까? 삭제된 ISP는 복구할 수 없습니다.",
        "failedIspFieldRegistration" : "ISP 등록 실패",
        "failedToDetailIspFieldModify" : "ISP 상세 정보 조회 실패",
        "pleaseEnterIspFieldName": "ISP 이름을 입력하세요.",
        "enterSpecialCharacters": "ISP 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidCodeFormat": "코드명에는 특수 문자를 입력 할 수 없습니다."
    },
    "hostingField" : {
        "add" : "호스팅 생성",
        "name" : "호스팅 이름",
        "manager" : "담당자",
        "tel" : "전화번호",
        "code" : "코드",
        "email" : "이메일",
        "desc" : "비고"
        "desc" : "비고",
        "failedToSelectHostingFieldFullList" : "호스팅 관리 목록 조회 실패",
        "delete" : "호스팅 삭제",
        "wantToDeleteSelectHostingField" : "선택한 호스팅을 삭제하겠습니까? 삭제된 호스팅은 복구할 수 없습니다.",
        "failedHostingFieldRegistration" : "호스팅 등록 실패",
        "failedToDetailHostingFieldModify" : "호스팅 상세 정보 조회 실패",
        "pleaseEnterHostingFieldName": "호스팅 이름을 입력하세요.",
        "enterSpecialCharacters": "호스팅 이름에는 특수 문자를 입력 할 수 없습니다.",
        "invalidCodeFormat": "코드명에는 특수 문자를 입력 할 수 없습니다."
    }
}
src/main/webapp/scripts/app/hostingField/hostingField.js
@@ -33,6 +33,7 @@
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["hostingFieldListController", 'jsTable', 'tableColumnGenerator', 'hostingFieldService', 'modalFormAutoScroll'
                                , 'hostingFieldAddController', 'hostingFieldModifyController'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/hostingField/hostingFieldAdd.controller.js
New file
@@ -0,0 +1,79 @@
/**
 * Created by wisestone on 2018-02-19.
 */
'use strict';
define([
        'app'
    ],
    function (app) {
        app.controller('hostingFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'HostingField', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, HostingField, $filter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                };
                $scope.vm = {
                    form : {
                        code : "",  //코드
                        name : "",  //호스팅명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //비고
                    }
                };
                //  폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit(condition) {
                    $rootScope.spinner = true;
                    var content = {
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  호스팅명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        memo : $scope.vm.form.memo  //비고
                    };
                    HostingField.add($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedHostingFieldRegistration"), result.data.message.message);
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
            }
        ]);
    }
);
src/main/webapp/scripts/app/hostingField/hostingFieldList.controller.js
@@ -13,13 +13,46 @@
                //  함수
                $scope.fn = {
                    getPageList : getPageList, // 호스팅 관리 리스트
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                    initSearch : initSearch, //검색 조건 초기화
                    add : add, //호스팅 생성
                    removes : removes, //호스팅 삭제
                    makeSearchConditions : makeSearchConditions //엑셀 다운로드
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                $scope.tableEvent = {
                    modify : modify //호스팅 정보 변경
                };
                $scope.vm.search = {
                    name : "",  //  호스팅 이름
                };
                $scope.vm.page = {
                    selectedPage : 0,
                    selectedPageRowCount : String(10)
                };
                $scope.vm.responseData = {
                    data : []
                };
                //  호스팅 관리 리스트 불러오기
                $scope.$on("getPageList", function () {
                    $scope.fn.getPageList(0);
                });
                //  검색 조건 초기화
                function initSearch() {
                    $scope.vm.search.name = "";
                    $scope.fn.getPageList(0);
                }
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
@@ -35,38 +68,171 @@
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDRenderer("HOSTINGFIELD_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.code")
                        .setHWidth("bold")
                        .setDName("code")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("hostingField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDAlign("text-center"));
                }
                //  호스팅 관리 목록 조회
                function getPageList(selectedPage) {
                    if (selectedPage < 0) {
                        selectedPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedPage) || selectedPage === "") {
                        currentPage = $scope.vm.page.selectedPage;
                    }
                    else {
                        currentPage = selectedPage;
                    }
                    var conditions = {
                        name : $scope.vm.search.name //호스팅 명
                    };
                    //테이블 리스트 데이터 컨트롤러 요청
                    HostingField.find($resourceProvider.getContent(conditions,
                        $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.vm.page.selectedPage = currentPage + 1;
                            $scope.vm.responseData = result.data;
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedToSelectHostingFieldFullList"), result.data.message.message); // 호스팅 관리 목록 조회 실패
                        }
                    });
                }
                //  호스팅 생성
                function add() {
                    $uibModal.open({
                        templateUrl : 'views/hostingField/hostingFieldAdd.html',
                        size : "md",
                        controller : 'hostingFieldAddController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                };
                            }
                        }
                    });
                }
                //  호스팅 수정
                function modify(id) {
                    $uibModal.open({
                        templateUrl : 'views/hostingField/hostingFieldModify.html',
                        size : "md",
                        controller : 'hostingFieldModifyController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
                //  호스팅 삭제
                function removes() {
                    var removeIds = [];
                    angular.forEach($scope.vm.responseData.data, function (data) {
                        if (data.checked) {
                            removeIds.push(data.id);
                        }
                    });
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("hostingField.delete"), // "삭제"
                            text : $filter("translate")("hostingField.wantToDeleteSelectHostingField"), // 선택한 호스팅을 삭제하겠습니까? 삭제된 호스팅은 복구할 수 없습니다.
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
                            confirmButtonText : $filter("translate")("common.delete"), // 삭제
                            cancelButtonText : $filter("translate")("common.cancel"), // 취소
                            closeOnConfirm : false,
                            closeOnCancel : true
                        },
                        function (isConfirm) {
                            SweetAlert.close();
                            if (isConfirm) {
                                $rootScope.spinner = true;
                                HostingField.removes($resourceProvider.getContent(
                                    { removeIds : removeIds },
                                    $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.getPageList(0);
                                    }
                                    else {
                                        $timeout(function () {
                                            SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                        }, 100);
                                    }
                                    $rootScope.spinner = false;
                                });
                            }
                        });
                }
                function makeSearchConditions() {
                    var conditions = {
                        name: $scope.vm.search.name
                    }
                    return conditions;
                }
                $scope.fn.makeTableConfigs();
                $scope.fn.getPageList();
            }
        ]);
    }
src/main/webapp/scripts/app/hostingField/hostingFieldModify.controller.js
New file
@@ -0,0 +1,114 @@
/**
 * Created by wisestone on 2018-05-08.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('hostingFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'HostingField', 'parameter', 'SweetAlert', '$filter', '$q',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, HostingField, parameter, SweetAlert, $filter, $q) {
                $scope.fn = {
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                };
                $scope.vm = {
                    id : parameter.id,
                    form : {
                        code : "",  //코드
                        name : "",  //호스팅명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //메모(비고)
                    }
                };
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id,
                        code : $rootScope.preventXss($scope.vm.form.name),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
                    HostingField.modify($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("hostingField.failedHostingFieldRegistration"), result.data.message.message); //등록 실패
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  상세 정보
                function detail() {
                    var deferred = $q.defer();
                    var conditions = {
                        id : parameter.id
                    }
                    HostingField.detail($resourceProvider.getContent(
                        conditions,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("hostingField.failedToDetailHostingFieldModify"), result.data.message.message, "error"); // "상세 정보 조회 실패"
                        }
                        deferred.resolve(result.data.data);
                    });
                    return deferred.promise;
                }
                $scope.fn.detail();
            }]);
    });
src/main/webapp/scripts/app/ispField/ispField.js
@@ -33,6 +33,7 @@
                        loadController : ["$q", function ($q) {
                            var deferred = $q.defer();
                            require(["ispFieldListController", 'jsTable', 'tableColumnGenerator', 'ispFieldService', 'modalFormAutoScroll'
                                , 'ispFieldAddController', 'ispFieldModifyController'
                                , 'formSubmit', 'jsShortCut', 'inputRegex'], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/ispField/ispFieldAdd.controller.js
New file
@@ -0,0 +1,79 @@
/**
 * Created by wisestone on 2018-02-19.
 */
'use strict';
define([
        'app'
    ],
    function (app) {
        app.controller('ispFieldAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$uibModalInstance', '$state', 'IspField', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $uibModalInstance, $state, IspField, $filter) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,   //  폼 체크
                };
                $scope.vm = {
                    form : {
                        code : "",  //코드
                        name : "",  //ISP명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //비고
                    }
                };
                //  폼 체크
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit(condition) {
                    $rootScope.spinner = true;
                    var content = {
                        code : $rootScope.preventXss($scope.vm.form.code),  //코드
                        name : $rootScope.preventXss($scope.vm.form.name),    //  ISP명
                        manager : $scope.vm.form.manager,   //담당자
                        tel : $scope.vm.form.tel,  //전화번호
                        email : $scope.vm.form.email,  //이메일
                        memo : $scope.vm.form.memo  //비고
                    };
                    IspField.add($resourceProvider.getContent(content,
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedToSelectIspFieldFullList"), result.data.message.message);
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
            }
        ]);
    }
);
src/main/webapp/scripts/app/ispField/ispFieldList.controller.js
@@ -13,13 +13,46 @@
                //  함수
                $scope.fn = {
                    getPageList : getPageList, // ISP 관리 리스트
                    makeTableConfigs : makeTableConfigs, //  테이블 설정
                    initSearch : initSearch, //검색 조건 초기화
                    add : add, //ISP 생성
                    removes : removes, //ISP 삭제
                    makeSearchConditions : makeSearchConditions //엑셀 다운로드
                };
                //  변수
                $scope.vm = {
                    tableConfigs : [],
                };
                $scope.tableEvent = {
                    modify : modify //ISP 정보 변경
                };
                $scope.vm.search = {
                    name : "",  //  ISP 이름
                };
                $scope.vm.page = {
                    selectedPage : 0,
                    selectedPageRowCount : String(10)
                };
                $scope.vm.responseData = {
                    data : []
                };
                //  iSP 관리 리스트 불러오기
                $scope.$on("getPageList", function () {
                    $scope.fn.getPageList(0);
                });
                //  검색 조건 초기화
                function initSearch() {
                    $scope.vm.search.name = "";
                    $scope.fn.getPageList(0);
                }
                //  사용자 정의 필드 목록 테이블 설정
                function makeTableConfigs() {
@@ -35,38 +68,171 @@
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDRenderer("ISPFIELD_MODIFY"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.code")
                        .setHWidth("bold")
                        .setDName("code")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.manager")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("manager")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.tel")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("tel")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.email")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("email")
                        .setDAlign("text-center"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("ispField.desc")
                        .setHWidth("bold")
                        .setDName("name")
                        .setDType("renderer")
                        .setDAlign("text-center")
                        .setDRenderer("COMMON_MODIFY"));
                        .setDName("memo")
                        .setDAlign("text-center"));
                }
                //  ISP 관리 목록 조회
                function getPageList(selectedPage) {
                    if (selectedPage < 0) {
                        selectedPage = 0;
                    }
                    //  현재 페이지 정보
                    var currentPage = 0;
                    //  쿠키에 선택한 페이지 정보가 없으면 기본 페이지 정보 0 을 저장
                    if (angular.isUndefined(selectedPage) || selectedPage === "") {
                        currentPage = $scope.vm.page.selectedPage;
                    }
                    else {
                        currentPage = selectedPage;
                    }
                    var conditions = {
                        name : $scope.vm.search.name //ISP 명
                    };
                    //테이블 리스트 데이터 컨트롤러 요청
                    IspField.find($resourceProvider.getContent(conditions,
                        $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.vm.page.selectedPage = currentPage + 1;
                            $scope.vm.responseData = result.data;
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedToSelectIspFieldFullList"), result.data.message.message); // 목록 조회 실패
                        }
                    });
                }
                //  ISP 생성
                function add() {
                    $uibModal.open({
                        templateUrl : 'views/ispField/ispFieldAdd.html',
                        size : "md",
                        controller : 'ispFieldAddController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                };
                            }
                        }
                    });
                }
                //  ISP 수정
                function modify(id) {
                    $uibModal.open({
                        templateUrl : 'views/ispField/ispFieldModify.html',
                        size : "md",
                        controller : 'ispFieldModifyController',
                        backdrop : 'static',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
                //  ISP 삭제
                function removes() {
                    var removeIds = [];
                    angular.forEach($scope.vm.responseData.data, function (data) {
                        if (data.checked) {
                            removeIds.push(data.id);
                        }
                    });
                    if (removeIds.length < 1) {
                        SweetAlert.swal({
                            title : $filter("translate")("common.checkPurgingTargets"), // 삭제 대상 확인
                            text : $filter("translate")("common.selectDestinationDeletion"), // 삭제 대상을 선택하세요.
                            type : "warning"
                        });
                        return;
                    }
                    //  삭제 알림
                    SweetAlert.swal({
                            title : $filter("translate")("ispField.delete"), // "삭제"
                            text : $filter("translate")("ispField.wantToDeleteSelectIspField"),
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
                            confirmButtonText : $filter("translate")("common.delete"), // 삭제
                            cancelButtonText : $filter("translate")("common.cancel"), // 취소
                            closeOnConfirm : false,
                            closeOnCancel : true
                        },
                        function (isConfirm) {
                            SweetAlert.close();
                            if (isConfirm) {
                                $rootScope.spinner = true;
                                IspField.removes($resourceProvider.getContent(
                                    { removeIds : removeIds },
                                    $resourceProvider.getPageContent(0, 0))).then(function (result) {
                                    if (result.data.message.status === "success") {
                                        $timeout(function () {
                                            SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // 삭제 성공
                                        }, 100);
                                        $scope.fn.getPageList(0);
                                    }
                                    else {
                                        $timeout(function () {
                                            SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // 삭제 실패
                                        }, 100);
                                    }
                                    $rootScope.spinner = false;
                                });
                            }
                        });
                }
                function makeSearchConditions() {
                    var conditions = {
                        name: $scope.vm.search.name
                    }
                    return conditions;
                }
                $scope.fn.makeTableConfigs();
                $scope.fn.getPageList();
            }
        ]);
    }
src/main/webapp/scripts/app/ispField/ispFieldModify.controller.js
New file
@@ -0,0 +1,113 @@
/**
 * Created by wisestone on 2018-05-08.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('ispFieldModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'IspField', 'parameter', 'SweetAlert', '$filter', '$q',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, IspField, parameter, SweetAlert, $filter, $q) {
                $scope.fn = {
                    detail : detail,  //  상세 조회
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                };
                $scope.vm = {
                    id : parameter.id,
                    form : {
                        name : "",  //ISP명
                        manager : "",   //담당자
                        tel : "",  //전화번호
                        email : "",  //이메일
                        memo : ""  //메모(비고)
                    }
                };
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : parameter.id,
                        code : $rootScope.preventXss($scope.vm.form.name),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        manager : $rootScope.preventXss($scope.vm.form.manager),
                        tel : $rootScope.preventXss($scope.vm.form.tel),
                        email : $rootScope.preventXss($scope.vm.form.email),
                        memo : $rootScope.preventXss($scope.vm.form.memo)
                    };
                    IspField.modify($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getPageList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("ispField.failedIspFieldRegistration"), result.data.message.message); //등록 실패
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  상세 정보
                function detail() {
                    var deferred = $q.defer();
                    var conditions = {
                        id : parameter.id
                    }
                    IspField.detail($resourceProvider.getContent(
                        conditions,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.content)) {
                                $scope.vm.form.code = result.data.content.code;
                                $scope.vm.form.name = result.data.content.name;
                                $scope.vm.form.manager = result.data.content.manager;
                                $scope.vm.form.email = result.data.content.email;
                                $scope.vm.form.tel = result.data.content.tel;
                                $scope.vm.form.memo = result.data.content.memo;
                            }
                        }
                        else {
                            SweetAlert.swal($filter("translate")("ispField.failedToDetailIspFieldModify"), result.data.message.message, "error"); // "상세 정보 조회 실패"
                        }
                        deferred.resolve(result.data.data);
                    });
                    return deferred.promise;
                }
                $scope.fn.detail();
            }]);
    });
src/main/webapp/scripts/app/workspace/workspace.js
@@ -34,7 +34,7 @@
                            var deferred = $q.defer();
                            require(["modalFormAutoScroll", "workspaceController", "workspaceLevelAddController", "workspaceDepartmentAddController", "workspacePaymentExecuteController", "workspaceUserConfigController", "workspacePaymentModifyController",
                                "workspacePaymentAgreeTermController", "paymentService", "userWorkspaceService", "workspaceService", "numberOnly", 'jsTable', 'tableColumnGenerator', 'summerNote', 'summerNote-ko-KR', 'formSubmit',
                                "crypto", "reservationDisableUserService", "workspacePaymentAddController", "workspaceUserLevelController", "workspaceDepartmentConfigController", "levelModifyController","departmentModifyController"], function () {
                                "crypto", "reservationDisableUserService", "workspacePaymentAddController", "workspaceUserLevelController", "workspaceDepartmentConfigController", "levelModifyController","departmentModifyController","workspaceDepartmentModifyController"], function () {
                                deferred.resolve();
                            });
src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js
@@ -107,8 +107,10 @@
                        if (result.data.message.status === "success") {
                            $scope.vm.page.selectedPage = currentPage + 1;
                            /*if(result.data.data[0].id == 1){
                                result.data.data.shift();
                            }*/
                            $scope.vm.responseData = result.data;
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullDepartmentList"), result.data.message.message); // 부서 목록 조회 실패
@@ -137,7 +139,7 @@
                //  부서 수정
                function departmentModify(id) {
                    $uibModal.open({
                        templateUrl : 'views/workspace/workspaceDepartmentModify.html',
                        templateUrl : 'views/workspace/departmentModify.html',
                        size : "md",
                        controller : 'departmentModifyController',
                        backdrop : 'static',
src/main/webapp/scripts/app/workspace/workspaceDepartmentModify.controller.js
New file
@@ -0,0 +1,112 @@
/**
 * Created by wisestone on 2018-05-08.
 */
'use strict';
define([
        'app',
        'angular'
    ],
    function (app, angular) {
        app.controller('workspaceDepartmentModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'UserWorkspace', 'parameter', 'SweetAlert', '$filter', '$injector', '$controller',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, UserWorkspace, parameter, SweetAlert, $filter, $injector, $controller) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
                    formSubmit : formSubmit,    //  폼 전송
                    formCheck : formCheck,  //  폼 체크
                    detail : detail,    //  상세 정보 조회
                    removeDepartments : removeDepartments,  //  추가한 부서 제거
                };
                $scope.vm = {
                    id : parameter.id,
                    form : {
                        id : parameter.id,
                        /*users : [],*/
                        departments : [] // 부서
                    },
                    departmentName : "", //부서명 검색
                    /*autoCompletePage : {
                        project : {
                            page : 0,
                            totalPage : 0
                        }
                    },*/
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                //  선택 한 부서 제거
                function removeDepartments(index) {
                    $scope.vm.form.departments.splice(index, 1);
                }
                function formCheck(formInvalid) {
                    if (formInvalid) {
                        return true;
                    }
                    return false;
                }
                //  폼 전송
                function formSubmit() {
                    $rootScope.spinner = true;
                    var content = {
                        id : $scope.vm.form.id,
                        departmentName : (function () {
                            var departmentIds = [];
                            angular.forEach($scope.vm.form.departments, function (department) {
                                departmentIds.push(department.id);
                            });
                            return departmentIds;
                        })()
                    };
                    //user_department INSERT 요청
                    UserWorkspace.userDepartmentModify($resourceProvider.getContent(
                        content,
                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.cancel();
                            //  목록 화면 갱신
                            $rootScope.$broadcast("getUserWorkspaceList", {});
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedDepartmentRegistration"), result.data.message.message);
                        }
                        $rootScope.spinner = false;
                    });
                }
                //  팝업 창 닫기
                function cancel() {
                    $rootScope.$broadcast("closeLayer");    //  팝업이 열리고 나서 js-multi, js-single 등에서 body 이벤트가 날아가는 현상 수정
                    $uibModalInstance.dismiss('cancel');
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                function detail() {
                    UserWorkspace.userDepartmentDetail($resourceProvider.getContent(
                        $scope.vm.search,
                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if (angular.isDefined(result.data.data)) {
                                $scope.vm.form.departments = result.data.data.userDepartmentVos; //체크 필요
                            }
                        }
                        else {
                            SweetAlert.error($filter("translate")("managementWorkspace.failedToDepartmentsOfUserDetails"), result.data.message.message); //"사용자의 부서 상세 정보 조회 실패"
                        }
                    });
                }
                $scope.fn.detail();
            }]);
    });
src/main/webapp/scripts/app/workspace/workspaceUserConfig.controller.js
@@ -9,8 +9,8 @@
    ],
    function (app, angular) {
        app.controller('workspaceUserConfigController', ['$scope', '$rootScope', '$log', '$resourceProvider', 'SweetAlert', '$uibModal', '$q', '$state', '$tableProvider', 'Payment', 'Workspace',
            'UserWorkspace', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $q, $state, $tableProvider, Payment, Workspace, UserWorkspace, $filter) {
            'UserWorkspace', '$filter', '$injector', '$controller',
            function ($scope, $rootScope, $log, $resourceProvider, SweetAlert, $uibModal, $q, $state, $tableProvider, Payment, Workspace, UserWorkspace, $filter, $injector, $controller) {
                /*  $scope.fn 상속 중  */
@@ -55,7 +55,10 @@
                //  테이블 이벤트
                $scope.vm.tableEvent = {
                    modifyUserWorkspace : modifyUserWorkspace,   //  업무 공간 참여하는 사용자의 참여 상태 변경
                    modifyUserDepartments : modifyUserDepartments //사용자 부서 변경
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                //  상세 정보
                $scope.$on("getUserWorkspaceList", function () {
@@ -99,8 +102,7 @@
                        .setHWidth("width-120-p")
                        .setDAlign("text-center")
                        .setDType("renderer")
                        .setDName("department")
                        .setDRenderer("DEPARTMENT_OPTION"));
                        .setDRenderer("USE_DEPARTMENT_LIST"));
                    $scope.vm.tableConfigs.push($tableProvider.config()
                        .setHName("common.level")
                        .setHWidth("width-120-p")
@@ -267,6 +269,24 @@
                        }
                    });
                }
                //  사용자가 속해있는 부서 수정 팝업
                function modifyUserDepartments(id) {
                    $uibModal.open({
                        templateUrl : 'views/workspace/workspaceDepartmentModify.html',
                        size : "xlg",
                        controller : 'workspaceDepartmentModifyController',
                        backdrop : 'static',
                        windowClass : 'workflow-window',
                        resolve : {
                            parameter : function () {
                                return {
                                    id : id
                                };
                            }
                        }
                    });
                }
            }
        ]);
    }
src/main/webapp/scripts/components/HostingField/hostingField.service.js
@@ -9,11 +9,37 @@
    app.factory("HostingField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("HostingField/find", conditions).then(function (response) {
                return $http.post("hostingField/find", conditions).then(function (response) {
                    $log.debug("Hosting 필드 목록 데이터 : ", response);
                    return response;
                });
            },
            add : function (conditions) {
                return $http.post("hostingField/add", conditions).then(function (response) {
                    $log.debug("HostingField 생성 결과 : ", response);
                    return response;
                });
            },
            modify : function (conditions) {
                return $http.post("hostingField/modify", conditions).then(function (response) {
                    $log.debug("HostingField 수정 결과 : ", response);
                    return response;
                });
            },
            detail : function (conditions) {
                return $http.post("hostingField/detail", conditions).then(function (response) {
                    $log.debug("HostingField 상세 : ", response);
                    return response;
                });
            },
            removes : function (conditions) {
                return $http.post("hostingField/remove", conditions).then(function (response) {
                    $log.debug("HostingField 삭제 결과 : ", response);
                    return response;
                });
            }
        }
    }
    ]);
src/main/webapp/scripts/components/ispField/ispField.service.js
@@ -9,10 +9,34 @@
    app.factory("IspField", ['$http', '$log', function ($http, $log) {
        return {
            find : function (conditions) {
                return $http.post("IspField/find", conditions).then(function (response) {
                return $http.post("ispField/find", conditions).then(function (response) {
                    $log.debug("ISP 필드 목록 데이터 : ", response);
                    return response;
                });
            },
            add : function (conditions) {
                return $http.post("ispField/add", conditions).then(function (response) {
                    $log.debug("IspField 생성 결과 : ", response);
                    return response;
                });
            },
            modify : function (conditions) {
                return $http.post("ispField/modify", conditions).then(function (response) {
                    $log.debug("IspField 수정 결과 : ", response);
                    return response;
                });
            },
            detail : function (conditions) {
                return $http.post("ispField/detail", conditions).then(function (response) {
                    $log.debug("IspField 상세 : ", response);
                    return response;
                });
            },
            removes : function (conditions) {
                return $http.post("ispField/remove", conditions).then(function (response) {
                    $log.debug("IspField 삭제 결과 : ", response);
                    return response;
                });
            }
        }
    }
src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
@@ -34,31 +34,31 @@
            
            //부서 관리
            departmentFind : function (conditions) {
                return $http.post("departmentManage/find", conditions).then(function (response) {
                return $http.post("department/find", conditions).then(function (response) {
                    $log.debug("부서 목록 : ", response);
                    return response;
                });
            },
            departmentDetail : function (conditions) {
                return $http.post("departmentManage/detail", conditions).then(function (response) {
                return $http.post("department/detail", conditions).then(function (response) {
                    $log.debug("부서 상세 : ", response);
                    return response;
                });
            },
            departmentAdd : function (conditions) {
                return $http.post("departmentManage/add", conditions).then(function (response) {
                return $http.post("department/add", conditions).then(function (response) {
                    $log.debug("부서 생성 결과 : ", response);
                    return response;
                });
            },
            departmentModify : function (conditions) {
                return $http.post("departmentManage/modify", conditions).then(function (response) {
                return $http.post("department/modify", conditions).then(function (response) {
                    $log.debug("부서 수정 결과 : ", response);
                    return response;
                });
            },
            departmentRemove : function (conditions) {
                return $http.post("departmentManage/remove", conditions).then(function (response) {
                return $http.post("department/remove", conditions).then(function (response) {
                    $log.debug("부서 삭제 결과 : ", response);
                    return response;
                });
@@ -77,6 +77,18 @@
                    return response;
                });
            },
            userDepartmentModify : function (conditions) {
                return $http.post("userWorkspace/modifyDepartment", conditions).then(function (response) {
                    $log.debug("사용자의 부서 수정 결과 : ", response);
                    return response;
                });
            },
            userDepartmentDetail : function (conditions) {
                return $http.post("userWorkspace/detailDepartment", conditions).then(function (response) {
                    $log.debug("사용자의 부서 상세보기 결과 : ", response);
                    return response;
                });
            },
            modify : function (conditions) {
                return $http.post("userWorkspace/modify", conditions).then(function (response) {
                    $log.debug("참여 상태 수정 결과 : ", response);
src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -18,6 +18,7 @@
                var Project = $injector.get("Project");
                var Workflow = $injector.get("Workflow");
                var Issue = $injector.get("Issue");
                var UserWorkspace = $injector.get("UserWorkspace");
                var $log = $injector.get("$log");
                var SweetAlert = $injector.get("SweetAlert");
@@ -26,6 +27,7 @@
                $scope.fn.getProjectList = getProjectList;  //  프로젝트 목록 정보를 조회한다.
                $scope.fn.getIssueList = getIssueList;  //  일감 목록 정보를 조회한다.
                $scope.fn.getWorkflowList = getWorkflowList;    //  워크플로우 목록 정보를 조회한다.
                $scope.fn.getDepartmentList = getDepartmentList;    //  부서 목록 정보를 조회한다.
                function getUserList(query, excludeList, page, callBack) {
                    var conditions = {
@@ -109,6 +111,49 @@
                    return deferred.promise;
                }
                function getDepartmentList(query, excludeList, page, callBack) {
                    var conditions = {
                        departmentName : query,
                        userId : (function () {
                            var userId = "";
                            if ($rootScope.isDefined($scope.vm.form)) {
                                angular.forEach($scope.vm.form.users, function (user) {
                                    userId = user.id;
                                });
                            }
                            return userId;
                        })(),
                        excludeIds : (function () { //어떤 역할?
                            var excludeIds = [];
                            angular.forEach(excludeList, function (exclude) {
                                excludeIds.push(exclude.id);
                            });
                            return excludeIds;
                        })()
                    };
                    var deferred = $q.defer();
                    UserWorkspace.find($resourceProvider.getContent(         //  페이징 업데이트가 필요한 컴포넌트 일경우, page 업데이트가 있을 경우 기본 10개씩 가져오고 아닐경우 25개씩 가져온다.
                        conditions, $resourceProvider.getPageContent($rootScope.isDefined(page) ? page : 0, $rootScope.isDefined(page) ? 10 : 25))).then(function (result) {
                        if (result.data.message.status === "success") {
                            if ($rootScope.isDefined(callBack)) {
                                callBack(result);
                            }
                            deferred.resolve(result.data.data);
                        }
                        else {
                            SweetAlert.swal($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullDepartmentList"), result.data.message.message, "error"); // "부서 목록 조회 실패"
                        }
                    });
                    return deferred.promise;
                }
                function getWorkflowList(query, excludeList, page, callBack) {
                    var conditions = {
                        name : query,
src/main/webapp/scripts/main.js
@@ -227,11 +227,12 @@
        'workspaceUserLevelController' : 'app/workspace/workspaceUserLevelConfig.controller',  //  사용자 관리 컨트롤러
        'workspaceLevelAddController' : 'app/workspace/workspaceLevelAdd.controller',  //  사용자 등급 추가 컨트롤러
        'levelModifyController' : 'app/workspace/levelModify.controller',  //  사용자 등급 수정 컨트롤러
        'departmentModifyController' : 'app/workspace/departmentModify.controller',  //  사용자 등급 수정 컨트롤러
        'departmentModifyController' : 'app/workspace/departmentModify.controller',  //  부서 수정 컨트롤러
        'workspaceDepartmentAddController' : 'app/workspace/workspaceDepartmentAdd.controller',  //  부서 추가 컨트롤러
        'workspaceDepartmentConfigController' : 'app/workspace/workspaceDepartmentConfig.controller',  //  사용자 부서 관리 컨트롤러
        'workspaceService' : 'components/workspace/workspace.service',  //  업무 공간에 관련된 통신을 담당한다.
        'paymentService' : 'components/payment/payment.service',    //  결재에 관련된 통신을 담당한다.
        'workspaceDepartmentModifyController' : 'app/workspace/workspaceDepartmentModify.controller',  //  사용자 부서 수정 컨트롤러
        /*  사용자 */
        'userRoute' : 'app/user/user',  //  사용자에 관련된 route 정보
@@ -339,11 +340,15 @@
        'ispFieldRoute' : 'app/ispField/ispField',   // ISP route 정보
        'ispFieldService' : 'components/ispField/ispField.service',  // ISP 관련된 통신 담당
        'ispFieldListController' : 'app/ispField/ispFieldList.controller', // ISP 목록 컨트롤러
        'ispFieldAddController' : 'app/ispField/ispFieldAdd.controller', // ISP 생성 컨트롤러
        'ispFieldModifyController' : 'app/ispField/ispFieldModify.controller', // ISP 수정 컨트롤러
        /* 호스팅 */
        'hostingFieldRoute' : 'app/hostingField/hostingField',   // 호스팅 route 정보
        'hostingFieldService' : 'components/HostingField/hostingField.service',  // 호스팅 관련된 통신 담당
        'hostingFieldListController' : 'app/hostingField/hostingFieldList.controller', // 호스팅 목록 컨트롤러
        'hostingFieldAddController' : 'app/hostingField/hostingFieldAdd.controller', // 호스팅 생성 컨트롤러
        'hostingFieldModifyController' : 'app/hostingField/hostingFieldModify.controller', // 호스팅 수정 컨트롤러
    },
    shim : {
        'jquery-ui' : {
src/main/webapp/views/companyField/companyFieldAdd.html
@@ -27,7 +27,7 @@
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                <small translate="companyField.enterSpecialCharacters">업체 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <!--<div class="row">
                <div class="col-md-3">
@@ -132,12 +132,14 @@
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                    <div ng-show="companyFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
@@ -155,7 +157,9 @@
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                    <div ng-show="companyFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
src/main/webapp/views/hostingField/hostingFieldAdd.html
New file
@@ -0,0 +1,137 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>호스팅 등록</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="hostingFieldAddForm">
            <div class="form-group">
                <label for="hostingFieldAddForm1">
                    <span translate="hostingField.name">호스팅명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldAddForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.enterSpecialCharacters">호스팅 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div class="form-group">
                <label for="hostingFieldAddForm10">
                    <span translate="hostingField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldAddForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldAddForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <div ng-show="hostingFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="hostingFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldAddForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldAddForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(hostingFieldAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldAddForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/hostingField/hostingFieldList.html
@@ -13,20 +13,20 @@
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                            <form name="hostingFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                                <div class="row">
                                    <div class="col-lg-3">
                                        <div class="form-group">
                                            <label for="customFieldListForm1"><span translate="hostingField.name">사용자 정의 필드 명</span></label>
                                            <label for="hostingFieldListForm1"><span translate="hostingField.name">ISP 이름</span></label>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   id="hostingFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                                   ng-model="vm.search.name" placeholder="{{'hostingField.pleaseEnterHostingFieldName' | translate}}">
                                        </div>
                                    </div>
@@ -66,8 +66,8 @@
                        </div>
                        <div class="col-5 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                            <form class="form-inline justify-content-sm-end pull-right" method="post"
                                  action="/customField/downloadExcel"
                                  name="customFieldListForm">
                                  action="/hostingField/downloadExcel"
                                  name="hostingFieldListForm">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
@@ -76,7 +76,7 @@
                                    </button>
                                    <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                         x-placement="bottom-start">
                                        <a class="dropdown-item cursor" form-submit="customFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" form-submit="hostingFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
src/main/webapp/views/hostingField/hostingFieldModify.html
New file
@@ -0,0 +1,134 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>호스팅 수정</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="hostingFieldModifyForm">
            <div class="form-group">
                <label for="hostingFieldModifyForm1">
                    <span translate="hostingField.name">호스팅명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
            <div class="form-group">
                <label for="hostingFieldModifyForm10">
                    <span translate="hostingField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       disabled
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldModifyForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldModifyForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(hostingFieldModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/ispField/ispFieldAdd.html
New file
@@ -0,0 +1,137 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>ISP 등록</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="ispFieldAddForm">
            <div class="form-group">
                <label for="ispFieldAddForm1">
                    <span translate="ispField.name">ISP명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="ispFieldAddForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="ispField.enterSpecialCharacters">ISP 이름에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div class="form-group">
                <label for="ispFieldAddForm10">
                    <span translate="ispField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="ispFieldAddForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm9" class="issue-label">
                        <span translate="ispField.manager">담당자</span>
                    </label>
                    <input id="ispFieldAddForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm7" class="issue-label">
                        <span translate="ispField.tel">전화번호</span>
                    </label>
                    <input id="ispFieldAddForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <div ng-show="ispFieldAddForm.tel.$error.pattern" class="help-block form-text text-danger"
                         translate="companyField.invalidTelFormat">전화번호 형식이 맞지 않습니다. xxx-xxx-xxxx 형식으로 입력하세요.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm6" class="issue-label">
                        <span translate="ispField.email">이메일</span>
                    </label>
                    <input id="ispFieldAddForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <div ng-show="ispFieldAddForm.email.$error.pattern" class="help-block form-text text-danger"
                         translate="users.invalidEmailFormat">이메일 형식이 맞지 않습니다.
                    </div>
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="ispFieldAddForm8" class="issue-label">
                        <span translate="ispField.desc">비고</span>
                    </label>
                    <input id="ispFieldAddForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(ispFieldAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(ispFieldAddForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/ispField/ispFieldList.html
@@ -13,20 +13,20 @@
                <div class="row">
                    <div class="col-sm-12">
                        <div class="searchdiv">
                            <form name="customFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                            <form name="ispFieldListForm" role="form" ng-enter="fn.getPageList(0)">
                                <div class="row">
                                    <div class="col-lg-3">
                                        <div class="form-group">
                                            <label for="customFieldListForm1"><span translate="ispField.name">사용자 정의 필드 명</span></label>
                                            <label for="ispFieldListForm1"><span translate="ispField.name">사용자 정의 필드 명</span></label>
                                            <input type="text"
                                                   name="name"
                                                   id="customFieldListForm1"
                                                   id="ispFieldListForm1"
                                                   autocomplete="off"
                                                   maxlength="15"
                                                   kr-input
                                                   owl-auto-focus
                                                   class="form-control"
                                                   ng-model="vm.search.name" placeholder="{{'customField.pleaseEnterUserDefinedFieldName' | translate}}">
                                                   ng-model="vm.search.name" placeholder="{{'ispField.pleaseEnterIspFieldName' | translate}}">
                                        </div>
                                    </div>
@@ -66,8 +66,8 @@
                        </div>
                        <div class="col-5 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_CUSTOME_FIELD')">
                            <form class="form-inline justify-content-sm-end pull-right" method="post"
                                  action="/customField/downloadExcel"
                                  name="customFieldListForm">
                                  action="/ispField/downloadExcel"
                                  name="ispFieldListForm">
                                <input type="hidden" name="conditions">
                                <div class="btn-group">
                                    <button aria-expanded="false" aria-haspopup="true"
@@ -76,7 +76,7 @@
                                    </button>
                                    <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
                                         x-placement="bottom-start">
                                        <a class="dropdown-item cursor" form-submit="customFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" form-submit="ispFieldListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel">엑셀 다운로드</span></a>
                                        <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete">삭제</span></a>
                                    </div>
                                </div>
src/main/webapp/views/ispField/ispFieldModify.html
New file
@@ -0,0 +1,135 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>ISP 수정</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="hostingFieldModifyForm">
            <div class="form-group">
                <label for="hostingFieldModifyForm1">
                    <span translate="hostingField.name">ISP명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.name"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
            <div class="form-group">
                <label for="hostingFieldModifyForm10">
                    <span translate="ispField.code">코드</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="hostingFieldModifyForm10"
                       name="code"
                       type="text"
                       class="form-control"
                       disabled
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.code"
                       ng-maxlength="100"
                       maxlength="100"
                       required>
                <small translate="hostingField.invalidCodeFormat">코드명에는 특수 문자를 입력 할수 없습니다.</small>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm9" class="issue-label">
                        <span translate="hostingField.manager">담당자</span>
                    </label>
                    <input id="hostingFieldModifyForm9"
                           name="manager"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                           autocomplete="off"
                           ng-model="vm.form.manager"
                           ng-maxlength="100"
                           maxlength="100"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm7" class="issue-label">
                        <span translate="hostingField.tel">전화번호</span>
                    </label>
                    <input id="hostingFieldModifyForm7"
                           name="tel"
                           type="text"
                           class="form-control"
                           kr-input
                           input-regex="[^0-9]"
                           autocomplete="off"
                           ng-model="vm.form.tel"
                           maxlength="20"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm6" class="issue-label">
                        <span translate="hostingField.email">이메일</span>
                    </label>
                    <input id="hostingFieldModifyForm6"
                           name="email"
                           type="email"
                           class="form-control"
                           autocomplete="off"
                           maxLength="50"
                           ng-model="vm.form.email"
                           kr-input
                           ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
                    >
                    <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
                </div>
            </div>
            <div>
                <div class="form-group">
                    <label for="hostingFieldModifyForm8" class="issue-label">
                        <span translate="hostingField.desc">비고</span>
                    </label>
                    <input id="hostingFieldModifyForm8"
                           name="memo"
                           type="text"
                           class="form-control"
                           kr-input
                           autocomplete="off"
                           ng-model="vm.form.memo"
                           ng-maxlength="200"
                           maxlength="200"
                    >
                </div>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(hostingFieldModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(hostingFieldModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/workspace/departmentModify.html
New file
@@ -0,0 +1,56 @@
<div class="formModal">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>부서명 수정</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
        </button>
    </div>
    <div class="modal-body">
        <form role="form" name="departmentModifyForm">
            <div class="form-group">
                <label for="departmentModifyForm1">
                    <span translate="common.departmentName">부서명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="departmentModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.departmentName"
                       ng-maxlength="200"
                       maxlength="200"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
            <div class="form-group">
                <label>
                    <span translate="manageDepartment.departmentEx">부서 설명</span>
                </label>
                <summernote
                        class="summernote"
                        lang="ko-KR"
                        config="vm.options"
                        ng-model="vm.form.departmentDescription"
                        target=".note-editable"></summernote>
            </div>
        </form>
    </div>
    <div class="modal-footer buttons-on-right">
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(departmentModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(departmentModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
src/main/webapp/views/workspace/workspaceDepartmentConfig.html
@@ -45,13 +45,13 @@
                        </div>
                    </div>
                    <div class="col-sm-6 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_WORKSPACE')">
                        <form class="form-inline justify-content-sm-end pull-right ng-pristine ng-valid" method="post" action="/departmentManage/downloadExcel" name="departmentManageListForm">
                        <form class="form-inline justify-content-sm-end pull-right ng-pristine ng-valid" method="post" action="/department/downloadExcel" name="departmentListForm">
                            <input type="hidden" name="conditions" autocomplete="off">
                            <div class="btn-group">
                                <button aria-expanded="false" aria-haspopup="true" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" type="button"><span translate="common.addFunction" class="ng-scope">추가기능</span>
                                </button>
                                <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu" x-placement="bottom-start">
                                    <a class="dropdown-item cursor ng-isolate-scope" form-submit="departmentManageListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel" class="ng-scope">엑셀 다운로드</span></a>
                                    <a class="dropdown-item cursor ng-isolate-scope" form-submit="departmentListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel" class="ng-scope">엑셀 다운로드</span></a>
                                    <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete" class="ng-scope">삭제</span></a>
                                </div>
                            </div>
src/main/webapp/views/workspace/workspaceDepartmentModify.html
@@ -1,7 +1,7 @@
<div class="formModal">
<div class="formModal" xmlns:cursor="http://www.w3.org/1999/xhtml">
    <div class="modal-header faded smaller">
        <div class="modal-title">
            <strong>부서명 수정</strong>
            <strong>부서 수정</strong>
        </div>
        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
            <span aria-hidden="true"> &times;</span>
@@ -9,37 +9,24 @@
    </div>
    <div class="modal-body">
        <form role="form" name="departmentModifyForm">
        <form role="form" name="departmentsModifyForm">
            <div class="form-group">
                <label for="departmentModifyForm1">
                    <span translate="common.departmentName">부서명</span>
                    <code class="highlighter-rouge">*</code>
                </label>
                <input id="departmentModifyForm1"
                       name="name"
                       type="text"
                       class="form-control"
                       autofocus
                       kr-input
                       input-regex="[^a-zA-Z0-9 가-힣ㄱ-ㅎㅏ-ㅣ\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                       autocomplete="off"
                       ng-model="vm.form.departmentName"
                       ng-maxlength="200"
                       maxlength="200"
                       required>
                <!--<small translate="notice.enterSpecialCharacters">제목에는 특수 문자를 입력할 수 없습니다.</small>-->
            </div>
                <label><span translate="common.departmentName">부서명</span> </label>
                <js-autocomplete-multi data-input-name="departments"
                                       selected-model="vm.form.departments"
                                       search="vm.departmentName"
                                       source="fn.getDepartments(vm.departmentName, vm.form.departments)"
                                       input-disabled="false"> <!--concat 체크 필요-->
                                       <!--translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
                                       extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100, autoResize : true }"-->
                </js-autocomplete-multi>
            <div class="form-group">
                <label>
                    <span translate="manageDepartment.departmentEx">부서 설명</span>
                </label>
                <summernote
                        class="summernote"
                        lang="ko-KR"
                        config="vm.options"
                        ng-model="vm.form.departmentDescription"
                        target=".note-editable"></summernote>
                <div class="select3-selection__choicediv mt-10">
                    <span class="select3-selection__choice" ng-repeat="department in vm.form.departments">
                        <span>{{department.name}}</span> <!--부서 이름 출력-->
                        <span class="select3-selection__choice__remove" ng-click="fn.removeDepartments($index)">×</span>
                    </span>
                </div>
            </div>
        </form>
    </div>
@@ -48,9 +35,9 @@
        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">취소</span></button>
        <button type="button" class="btn btn-md btn-primary bold"
                js-short-cut
                js-short-cut-action="(fn.formCheck(departmentModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(departmentModifyForm.$invalid)"
                js-short-cut-action="(fn.formCheck(departmentsModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
                ng-disabled="fn.formCheck(departmentsModifyForm.$invalid)"
                ng-click="fn.formSubmit()"><span translate="common.save">저장</span>
        </button>
    </div>
</div>
</div>