OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2021-11-18 729564acfd97630060acdd77694da87cc1c67979
이슈관리 추가 완료 *DB날리고 실행
21개 파일 추가됨
9개 파일 변경됨
1409 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/domain/Issue.java 69 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/IssueCompany.java 105 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/IssueHosting.java 105 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/IssueIsp.java 105 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/IssueCompanyMapper.java 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/IssueHostingMapper.java 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/IssueIspMapper.java 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/IssueCompanyRepository.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/IssueHostingRepository.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/IssueIspRepository.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueCompanyService.java 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueHostingService.java 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueIspService.java 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueCompanyServiceImpl.java 70 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueHostingServiceImpl.java 72 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueIspServiceImpl.java 69 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 119 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueCompanyVo.java 63 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueHostingVo.java 63 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueIspVo.java 63 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 76 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java 39 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IssueForm.java 54 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_11__Alter_Table.sql 51 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_1__Initial_Setup.sql 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issueCompany-template.xml 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issueHosting-template.xml 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issueIsp-template.xml 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAdd.controller.js 72 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/Issue.java
@@ -46,18 +46,6 @@
    @JoinColumn(name = "severity_id")
    private Severity severity;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private CompanyField companyField;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "hosting_id")
    private HostingField hostingFieldId;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "isp_id")
    private IspField ispFieldId;
    @OneToOne(mappedBy = "issue", cascade = {CascadeType.ALL}, orphanRemoval = true)
    private IssueRisk issueRisk;
@@ -87,6 +75,15 @@
    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
    private Set<IssueCustomFieldValue> issueCustomFieldValues = new HashSet<>();
    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
    private Set<IssueCompany> issueCompanies = new HashSet<>();
    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
    private Set<IssueIsp> issueIsps = new HashSet<>();
    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
    private Set<IssueHosting> issueHostings = new HashSet<>();
    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
    private Set<IssueVersion> issueVersions = new HashSet<>();
@@ -177,30 +174,6 @@
        this.severity = severity;
    }
    public CompanyField getCompanyField() {
        return companyField;
    }
    public void setCompanyField(CompanyField companyField) {
        this.companyField = companyField;
    }
    public HostingField getHostingFieldId() {
        return hostingFieldId;
    }
    public void setHostingFieldId(HostingField hostingFieldId) {
        this.hostingFieldId = hostingFieldId;
    }
    public IspField getIspFieldId() {
        return ispFieldId;
    }
    public void setIspFieldId(IspField ispFieldId) {
        this.ispFieldId = ispFieldId;
    }
    public IssueRisk getIssueRisk() {
        return issueRisk;
    }
@@ -273,6 +246,30 @@
        this.issueCustomFieldValues = issueCustomFieldValues;
    }
    public Set<IssueCompany> getIssueCompanies() {
        return issueCompanies;
    }
    public void setIssueCompanies(Set<IssueCompany> issueCompanies) {
        this.issueCompanies = issueCompanies;
    }
    public Set<IssueIsp> getIssueIspFields() {
        return issueIsps;
    }
    public void setIssueIspFields(Set<IssueIsp> issueIsps) {
        this.issueIsps = issueIsps;
    }
    public Set<IssueHosting> getIssueHostingFields() {
        return issueHostings;
    }
    public void setIssueHostingFields(Set<IssueHosting> issueHostings) {
        this.issueHostings = issueHostings;
    }
    public String getStartDate() {
        return startDate;
    }
src/main/java/kr/wisestone/owl/domain/IssueCompany.java
New file
@@ -0,0 +1,105 @@
package kr.wisestone.owl.domain;
import javax.persistence.*;
import java.io.Serializable;
/**
 * Created by wisestone on 2018-03-07.
 */
@Entity
public class IssueCompany extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "issue_id")
    private Issue issue;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private CompanyField companyField;
    public IssueCompany(){}
    public IssueCompany(Issue issue, CompanyField companyField, String name, String manager, String tel, String email, String memo){
        this.issue = issue;
        this.companyField = companyField;
        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 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 Issue getIssue() {
        return issue;
    }
    public void setIssue(Issue issue) {
        this.issue = issue;
    }
    public CompanyField getCompanyField() {
        return companyField;
    }
    public void setCompanyField(CompanyField companyField) {
        this.companyField = companyField;
    }
}
src/main/java/kr/wisestone/owl/domain/IssueHosting.java
New file
@@ -0,0 +1,105 @@
package kr.wisestone.owl.domain;
import javax.persistence.*;
import java.io.Serializable;
/**
 * Created by wisestone on 2018-03-07.
 */
@Entity
public class IssueHosting extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "issue_id")
    private Issue issue;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "hosting_id")
    private HostingField hostingField;
    public IssueHosting(){}
    public IssueHosting(Issue issue, HostingField hostingField, String name, String manager, String tel, String email, String memo){
        this.issue = issue;
        this.hostingField = hostingField;
        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 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 Issue getIssue() {
        return issue;
    }
    public void setIssue(Issue issue) {
        this.issue = issue;
    }
    public HostingField getHostingField() {
        return hostingField;
    }
    public void setHostingField(HostingField hostingField) {
        this.hostingField = hostingField;
    }
}
src/main/java/kr/wisestone/owl/domain/IssueIsp.java
New file
@@ -0,0 +1,105 @@
package kr.wisestone.owl.domain;
import javax.persistence.*;
import java.io.Serializable;
/**
 * Created by wisestone on 2018-03-07.
 */
@Entity
public class IssueIsp extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "issue_id")
    private Issue issue;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "isp_id")
    private IspField ispField;
    public IssueIsp(){}
    public IssueIsp(Issue issue, IspField ispField, String name, String manager, String tel, String email, String memo){
        this.issue = issue;
        this.ispField = ispField;
        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 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 Issue getIssue() {
        return issue;
    }
    public void setIssue(Issue issue) {
        this.issue = issue;
    }
    public IspField getIspField() {
        return ispField;
    }
    public void setIspField(IspField ispField) {
        this.ispField = ispField;
    }
}
src/main/java/kr/wisestone/owl/mapper/IssueCompanyMapper.java
New file
@@ -0,0 +1,16 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.IssueCondition;
import kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-06-07.
 */
@Repository
public interface IssueCompanyMapper {
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/mapper/IssueHostingMapper.java
New file
@@ -0,0 +1,16 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.IssueCondition;
import kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-06-07.
 */
@Repository
public interface IssueHostingMapper {
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/mapper/IssueIspMapper.java
New file
@@ -0,0 +1,16 @@
package kr.wisestone.owl.mapper;
import kr.wisestone.owl.web.condition.IssueCondition;
import kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
 * Created by wisestone on 2018-06-07.
 */
@Repository
public interface IssueIspMapper {
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/repository/IssueCompanyRepository.java
New file
@@ -0,0 +1,12 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.IssueCompany;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface IssueCompanyRepository extends JpaRepository<IssueCompany, Long> {
    List<IssueCompany> findByIssueId(@Param("issueId") Long issueId);
}
src/main/java/kr/wisestone/owl/repository/IssueHostingRepository.java
New file
@@ -0,0 +1,12 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.IssueHosting;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface IssueHostingRepository extends JpaRepository<IssueHosting, Long> {
    List<IssueHosting> findByIssueId(@Param("issueId") Long issueId);
}
src/main/java/kr/wisestone/owl/repository/IssueIspRepository.java
New file
@@ -0,0 +1,12 @@
package kr.wisestone.owl.repository;
import kr.wisestone.owl.domain.IssueIsp;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface IssueIspRepository extends JpaRepository<IssueIsp, Long> {
    List<IssueIsp> findByIssueId(@Param("issueId") Long issueId);
}
src/main/java/kr/wisestone/owl/service/IssueCompanyService.java
New file
@@ -0,0 +1,15 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.Issue;
import kr.wisestone.owl.domain.IssueCompany;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Map;
public interface IssueCompanyService extends AbstractService<IssueCompany, Long, JpaRepository<IssueCompany, Long>>{
    void modifyIssueCompanyField(Issue issue, List<Map<String, Object>> issueCompanyField);
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/service/IssueHostingService.java
New file
@@ -0,0 +1,15 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.Issue;
import kr.wisestone.owl.domain.IssueHosting;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Map;
public interface IssueHostingService extends AbstractService<IssueHosting, Long, JpaRepository<IssueHosting, Long>>{
    void modifyIssueHostingField(Issue issue, List<Map<String, Object>> issueHostingField);
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/service/IssueIspService.java
New file
@@ -0,0 +1,15 @@
package kr.wisestone.owl.service;
import kr.wisestone.owl.domain.Issue;
import kr.wisestone.owl.domain.IssueIsp;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Map;
public interface IssueIspService extends AbstractService<IssueIsp, Long, JpaRepository<IssueIsp, Long>>{
    void modifyIssueIspField(Issue issue, List<Map<String, Object>> issueIspField);
    List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition);
}
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -169,7 +169,6 @@
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.COMPANYFIELD_NOT_EXIST));
        }
        CompanyField companyField = this.findOne(id);
        if (companyField == null) {
src/main/java/kr/wisestone/owl/service/impl/IssueCompanyServiceImpl.java
New file
@@ -0,0 +1,70 @@
package kr.wisestone.owl.service.impl;
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.mapper.IssueCompanyMapper;
import kr.wisestone.owl.repository.IssueCompanyRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Service
public class IssueCompanyServiceImpl extends AbstractServiceImpl<IssueCompany, Long, JpaRepository<IssueCompany, Long>> implements IssueCompanyService {
    private static final Logger log = LoggerFactory.getLogger(IssueCompanyServiceImpl.class);
    @Autowired
    private IssueCompanyRepository issueCompanyRepository;
    @Autowired
    private CompanyFieldService companyFieldService;
    @Autowired
    private IssueCompanyMapper issueCompanyMapper;
    @Override
    protected JpaRepository<IssueCompany, Long> getRepository() {
        return this.issueCompanyRepository;
    }
    //  이슈에서 사용되는 업체 값을 업데이트한다.
    @Override
    @Transactional
    public void modifyIssueCompanyField(Issue issue, List<Map<String, Object>> issueCompanyFields) {
        if (issue != null) {
            if (issueCompanyFields != null && issueCompanyFields.size() > 0) {
                Map<String, Object> param = issueCompanyFields.get(0);
                if (param != null) {
                    IssueCompany newIssueCompany = ConvertUtil.convertMapToClass(param, IssueCompany.class);
                    newIssueCompany.setIssue(issue);
                    CompanyField companyField = this.companyFieldService.getCompany(MapUtil.getLong(param, "companyId"));
                    newIssueCompany.setCompanyField(companyField);
                    Set<IssueCompany> issueCompanies = issue.getIssueCompanies();
                    if (issueCompanies != null && issueCompanies.size() > 0) {
                        IssueCompany oldIssueCompany = issueCompanies.iterator().next();
                        ConvertUtil.copyProperties(newIssueCompany, oldIssueCompany);
                    }
                    this.issueCompanyRepository.saveAndFlush(newIssueCompany);
                }
            }
        }
    }
    @Override
    @Transactional(readOnly = true)
    public List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition) {
        return this.issueCompanyMapper.findInIssueIds(issueCondition);
    }
}
src/main/java/kr/wisestone/owl/service/impl/IssueHostingServiceImpl.java
New file
@@ -0,0 +1,72 @@
package kr.wisestone.owl.service.impl;
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.mapper.HostingFieldMapper;
import kr.wisestone.owl.mapper.IssueHostingMapper;
import kr.wisestone.owl.repository.IssueHostingRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Service
public class IssueHostingServiceImpl extends AbstractServiceImpl<IssueHosting, Long, JpaRepository<IssueHosting, Long>> implements IssueHostingService {
    private static final Logger log = LoggerFactory.getLogger(IssueHostingServiceImpl.class);
    @Autowired
    private IssueHostingRepository issueHostingRepository;
    @Autowired
    private HostingFieldService hostingFieldService;
    @Autowired
    private IssueHostingMapper issueHostingMapper;
    @Override
    protected JpaRepository<IssueHosting, Long> getRepository() {
        return this.issueHostingRepository;
    }
    //  이슈에서 사용되는 업체 값을 업데이트한다.
    @Override
    @Transactional
    public void modifyIssueHostingField(Issue issue, List<Map<String, Object>> issueIspFields) {
        if (issue != null) {
            if (issueIspFields != null && issueIspFields.size() > 0) {
                Map<String, Object> param = issueIspFields.get(0);
                if (param != null) {
                    IssueHosting newIssueHosting = ConvertUtil.convertMapToClass(param, IssueHosting.class);
                    newIssueHosting.setIssue(issue);
                    HostingField hostingField = this.hostingFieldService.getHosting(MapUtil.getLong(param, "hostingId"));
                    newIssueHosting.setHostingField(hostingField);
                    Set<IssueHosting> issueHostings = issue.getIssueHostingFields();
                    if (issueHostings != null && issueHostings.size() > 0) {
                        IssueHosting oldIssueHosting = issueHostings.iterator().next();
                        ConvertUtil.copyProperties(newIssueHosting, oldIssueHosting);
                    }
                    this.issueHostingRepository.saveAndFlush(newIssueHosting);
                }
            }
        }
    }
    @Override
    @Transactional(readOnly = true)
    public List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition) {
        return issueHostingMapper.findInIssueIds(issueCondition);
    }
}
src/main/java/kr/wisestone/owl/service/impl/IssueIspServiceImpl.java
New file
@@ -0,0 +1,69 @@
package kr.wisestone.owl.service.impl;
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.mapper.IssueIspMapper;
import kr.wisestone.owl.repository.IssueIspRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.util.MapUtil;
import kr.wisestone.owl.web.condition.IssueCondition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Service
public class IssueIspServiceImpl extends AbstractServiceImpl<IssueIsp, Long, JpaRepository<IssueIsp, Long>> implements IssueIspService {
    private static final Logger log = LoggerFactory.getLogger(IssueIspServiceImpl.class);
    @Autowired
    private IssueIspRepository issueIspRepository;
    @Autowired
    private IspFieldService ispFieldService;
    @Autowired
    private IssueIspMapper issueIspMapper;
    @Override
    protected JpaRepository<IssueIsp, Long> getRepository() {
        return this.issueIspRepository;
    }
    //  이슈에서 사용되는 업체 값을 업데이트한다.
    @Override
    @Transactional
    public void modifyIssueIspField(Issue issue, List<Map<String, Object>> issueIspFields) {
        if (issue != null) {
            if (issueIspFields != null && issueIspFields.size() > 0) {
                Map<String, Object> param = issueIspFields.get(0);
                if (param != null) {
                    IssueIsp newIssueIsp = ConvertUtil.convertMapToClass(param, IssueIsp.class);
                    newIssueIsp.setIssue(issue);
                    IspField ispField = this.ispFieldService.getIsp(MapUtil.getLong(param, "ispId"));
                    newIssueIsp.setIspField(ispField);
                    Set<IssueIsp> issueIsps = issue.getIssueIspFields();
                    if (issueIsps != null && issueIsps.size() > 0) {
                        IssueIsp oldIssueIsp = issueIsps.iterator().next();
                        ConvertUtil.copyProperties(newIssueIsp, oldIssueIsp);
                    }
                    this.issueIspRepository.saveAndFlush(newIssueIsp);
                }
            }
        }
    }
    @Override
    @Transactional(readOnly = true)
    public List<Map<String, Object>> findInIssueIds(IssueCondition issueCondition) {
        return this.issueIspMapper.findInIssueIds(issueCondition);
    }
}
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -44,7 +44,6 @@
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.locks.Condition;
@Service
public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService {
@@ -89,6 +88,15 @@
    @Autowired
    private IssueCustomFieldValueService issueCustomFieldValueService;
    @Autowired
    private IssueCompanyService issueCompanyService;
    @Autowired
    private IssueIspService issueIspService;
    @Autowired
    private IssueHostingService issueHostingService;
    @Autowired
    private IssueUserService issueUserService;
@@ -197,22 +205,6 @@
        issue.setPriority(priority);
        issue.setSeverity(severity);
        //  업체 필드 유효성 체크
        if(issueForm.getCompanyId() != null){
            CompanyField companyField = this.companyFieldService.getCompany(issueForm.getCompanyId());
            issue.setCompanyField(companyField);
        }
        //  ISP 필드 유효성 체크
        if(issueForm.getIspId() != null) {
            IspField ispField = this.ispFieldService.getIsp(issueForm.getIspId());
            issue.setIspFieldId(ispField);
        }
        //  HOSTING 필드 유효성 체크
        if (issueForm.getHostingId() != null){
            HostingField hostingField = this.hostingFieldService.getHosting(issueForm.getHostingId());
            issue.setHostingFieldId(hostingField);
        }
        issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project));    //  각 프로젝트의 고유 이슈 번호 생성
        this.issueRepository.saveAndFlush(issue);
@@ -241,6 +233,12 @@
        this.reservationIssueEmail(issue.getId(), EmailType.ISSUE_ADD);
        //  사용자 시스템 기능 사용 정보 수집
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_ADD));
        //  업체 정보 저장
        this.issueCompanyService.modifyIssueCompanyField(issue, issueForm.getIssueCompanyFields());
        //  ISP 정보 저장
        this.issueIspService.modifyIssueIspField(issue, issueForm.getIssueIspFields());
        //  HOSTING 정보 저장
        this.issueHostingService.modifyIssueHostingField(issue, issueForm.getIssueHostingFields());
        return issue;
    }
@@ -345,6 +343,9 @@
        issueMap.put("customFields", customFields);
        issueMap.put("description", issue.getDescription());
        //업체,ISP,HOSTING 추가
        StringBuilder attachedFileBuilder = new StringBuilder();
@@ -454,7 +455,7 @@
    @Override
    @Transactional(readOnly = true)
    public List<IssueVo> findChartIssue(Map<String, Object> resJsonData,
                                   IssueCondition issueCondition, Pageable pageable) {
                                        IssueCondition issueCondition, Pageable pageable) {
        //  검색 조건을 만든다
        if (!this.makeIssueSearchCondition(issueCondition,Lists.newArrayList("01", "02", "03"), pageable)) {
@@ -564,9 +565,16 @@
        //  사용자 정의 필드 정보 추가
        this.setIssueCustomFieldValue(issueVos, issueCondition);
        //  업체 정보 추가
        //this.setIssueCompanyField(issueVos, issueCondition);
        //  ISP 정보 추가
        //this.setIssueIspField(issueVos, issueCondition);
        //  HOSTING 정보 추가
        //this.setIssueHostingField(issueVos, issueCondition);
    }
        //  검색 조건을 만든다
    //  검색 조건을 만든다
    private boolean makeIssueSearchCondition(IssueCondition condition, List<String> projectStatues, Pageable pageable) {
        if (pageable != null) {
            condition.setPage(pageable.getPageNumber() * pageable.getPageSize());
@@ -792,9 +800,6 @@
                    issueVo.setIssueStatusVo(ConvertUtil.copyProperties(issue.getIssueStatus(), IssueStatusVo.class));
                    issueVo.setPriorityVo(ConvertUtil.copyProperties(issue.getPriority(), PriorityVo.class));
                    issueVo.setSeverityVo(ConvertUtil.copyProperties(issue.getSeverity(), SeverityVo.class));
                    issueVo.setCompanyFieldVo(ConvertUtil.copyProperties(issue.getCompanyField(), CompanyFieldVo.class));
                    issueVo.setIspFieldVo(ConvertUtil.copyProperties(issue.getIspFieldId(), IspFieldVo.class));
                    issueVo.setHostingFieldVo(ConvertUtil.copyProperties(issue.getHostingFieldId(), HostingFieldVo.class));
                    this.setRegister(issue, issueVo);   //  등록자 정보 셋팅
                    //this.setIssueUser(issue, issueVo);  //  담당자 정보 셋팅
@@ -836,9 +841,6 @@
        issueVo.setIssueStatusVo(issueStatusVo);
        issueVo.setPriorityVo(ConvertUtil.copyProperties(issue.getPriority(), PriorityVo.class));
        issueVo.setSeverityVo(ConvertUtil.copyProperties(issue.getSeverity(), SeverityVo.class));
        issueVo.setCompanyFieldVo(ConvertUtil.copyProperties(issue.getCompanyField(), CompanyFieldVo.class));
        issueVo.setIspFieldVo(ConvertUtil.copyProperties(issue.getIspFieldId(), IspFieldVo.class));
        issueVo.setHostingFieldVo(ConvertUtil.copyProperties(issue.getHostingFieldId(), HostingFieldVo.class));
        this.setRegister(issue, issueVo);   //  등록자 정보 셋팅
        //this.setIssueUser(issue, issueVo);  //  담당자 정보 셋팅
        this.setIssueDepartment(issue, issueVo);  //  담당부서 정보 셋팅
@@ -1612,6 +1614,69 @@
        }
    }
    //  업체 정보 추가
    private void setIssueCompanyField(List<IssueVo> issueVos, IssueCondition issueCondition) {
        //  이슈에서 저장한 업체 값을 조회한다.
        List<Map<String, Object>> issueCompanyFields = this.issueCompanyService.findInIssueIds(issueCondition);
        for (IssueVo issueVo : issueVos) {
            for (Map<String, Object> issueCompanyField : issueCompanyFields) {
                if (issueVo.getId().equals(MapUtil.getLong(issueCompanyField, "issueId"))) {
                    IssueCompanyVo issueCompanyVo = new IssueCompanyVo();
                    issueCompanyVo.setName(MapUtil.getString(issueCompanyField, "companyName"));
                    issueCompanyVo.setManager(MapUtil.getString(issueCompanyField, "companyManager"));
                    issueCompanyVo.setTel(MapUtil.getString(issueCompanyField, "companyTel"));
                    issueCompanyVo.setEmail(MapUtil.getString(issueCompanyField, "companyEmail"));
                    issueCompanyVo.setMemo(MapUtil.getString(issueCompanyField, "companyMemo"));
                    issueVo.addIssueCompanyFieldVo(issueCompanyVo);
                }
            }
        }
    }
    //  Isp 정보 추가
    private void setIssueIspField(List<IssueVo> issueVos, IssueCondition issueCondition) {
        //  이슈에서 저장한 ISP 값을 조회한다.
        /*List<Map<String, Object>> issueIspFields = this.issueIspFieldService.findInIssueIds(issueCondition);*/
        /*for (IssueVo issueVo : issueVos) {
            for (Map<String, Object> issueIspField : issueIspFields) {
                if (issueVo.getId().equals(MapUtil.getLong(issueIspField, "issueId"))) {
                    IssueIspFieldVo issueIspFieldVo = new IssueIspFieldVo();
                    issueIspFieldVo.setName(MapUtil.getString(issueIspField, "name"));
                    issueIspFieldVo.setManager(MapUtil.getString(issueIspField, "manager"));
                    issueIspFieldVo.setTel(MapUtil.getString(issueIspField, "tel"));
                    issueIspFieldVo.setEmail(MapUtil.getString(issueIspField, "email"));
                    issueIspFieldVo.setMemo(MapUtil.getString(issueIspField, "memo"));
                    issueVo.addIssueIspFieldVo(issueIspFieldVo);
                }
            }
        }*/
    }
    // Hosting 정보 추가
    private void setIssueHostingField(List<IssueVo> issueVos, IssueCondition issueCondition) {
        //  이슈에서 저장한 Hosting 값을 조회한다.
        List<Map<String, Object>> issueHostingFields = this.issueHostingService.findInIssueIds(issueCondition);
        for (IssueVo issueVo : issueVos) {
            for (Map<String, Object> issueHostingField : issueHostingFields) {
                if (issueVo.getId().equals(MapUtil.getLong(issueHostingField, "issueId"))) {
                    IssueHostingVo issueHostingVo = new IssueHostingVo();
                    issueHostingVo.setName(MapUtil.getString(issueHostingField, "name"));
                    issueHostingVo.setManager(MapUtil.getString(issueHostingField, "manager"));
                    issueHostingVo.setTel(MapUtil.getString(issueHostingField, "tel"));
                    issueHostingVo.setEmail(MapUtil.getString(issueHostingField, "email"));
                    issueHostingVo.setMemo(MapUtil.getString(issueHostingField, "memo"));
                    issueVo.addIssueHostingFieldVo(issueHostingVo);
                }
            }
        }
    }
    //  연관일감 정보 추가
    private void setRelationIssue(IssueVo issueVo, Long issueId) {
        List<IssueVo> relationIssues = this.issueRelationService.findRelationIssue(issueId);
@@ -1665,6 +1730,8 @@
                        result.put("customField_" + issueCustomFieldValueVo.getCustomFieldVo().getId().toString(), useValue + ", " + issueCustomFieldValueVo.getUseValue());
                    }
                }
                //업체, ISP, 호스팅 추가
                results.add(result);
            } catch (Exception e) {
@@ -1830,6 +1897,8 @@
            this.bulkInsertIssueCustomFieldValue(issueForms, issueTypeCustomFieldMaps);
            //  3.628 - 3.445
            // 업체,ISP,호스팅 추가
            /*serviceStart.stop();
            log.debug("2차 저장 시간 : " + serviceStart.getTime());*/
src/main/java/kr/wisestone/owl/vo/IssueCompanyVo.java
New file
@@ -0,0 +1,63 @@
package kr.wisestone.owl.vo;
/**
 * Created by wisestone on 2018-06-01.
 */
public class IssueCompanyVo extends BaseVo{
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public IssueCompanyVo(){}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    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/IssueHostingVo.java
New file
@@ -0,0 +1,63 @@
package kr.wisestone.owl.vo;
/**
 * Created by wisestone on 2018-06-01.
 */
public class IssueHostingVo extends BaseVo{
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public IssueHostingVo(){}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    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/IssueIspVo.java
New file
@@ -0,0 +1,63 @@
package kr.wisestone.owl.vo;
/**
 * Created by wisestone on 2018-06-01.
 */
public class IssueIspVo extends BaseVo{
    private Long id;
    private String name;
    private String manager;
    private String tel;
    private String email;
    private String memo;
    public IssueIspVo(){}
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    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/IssueVo.java
@@ -1,6 +1,7 @@
package kr.wisestone.owl.vo;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;
@@ -35,9 +36,6 @@
    private PriorityVo priorityVo;  //  이슈 상세에서 사용
    private SeverityVo severityVo;  //  이슈 상세에서 사용
    private UserVo registerVo;  //  이슈 상세에서 사용
    private CompanyFieldVo companyFieldVo; //  이슈 상세에서 사용
    private IspFieldVo ispFieldVo; //  이슈 상세에서 사용
    private HostingFieldVo hostingFieldVo; //  이슈 상세에서 사용
    private Boolean modifyPermissionCheck = Boolean.FALSE;
    private List<UserVo> userVos = Lists.newArrayList();
    private List<DepartmentVo> departmentVos = Lists.newArrayList(); //담당부서 추가
@@ -52,9 +50,11 @@
    private Long attachedFileCount;
    private Long issueCommentCount;
    private String modifyByName;    //  변경자 정보 - 이슈 변경 정보 상세 확인에서 사용
    private String byName;    //  변경자 정보 - 이슈 변경 정보 상세 확인에서 사용
    private WorkflowStatusVo workflowStatusVo;
    private Long parentIssueId;     // 상위 일감
    private List<IssueCompanyVo> issueCompanyVos = Lists.newArrayList();
    private List<IssueIspVo> issueIspVos = Lists.newArrayList();
    private List<IssueHostingVo> issueHostingVos = Lists.newArrayList();
    public IssueVo(){}
@@ -314,6 +314,42 @@
        this.issueCustomFieldValueVos.add(issueCustomFieldValueVo);
    }
    public List<IssueCompanyVo> getIssueCompanyFieldVos() {
        return issueCompanyVos;
    }
    public void setIssueCompanyFieldVos(List<IssueCompanyVo> issueCompanyVos) {
        this.issueCompanyVos = issueCompanyVos;
    }
    public void addIssueCompanyFieldVo(IssueCompanyVo issueCompanyVo) {
        this.issueCompanyVos.add(issueCompanyVo);
    }
    public List<IssueIspVo> getIssueIspFieldVos() {
        return issueIspVos;
    }
    public void setIssueIspFieldVos(List<IssueIspVo> issueIspVos) {
        this.issueIspVos = issueIspVos;
    }
    public void addIssueIspFieldVo(IssueIspVo issueIspVo) {
        this.issueIspVos.add(issueIspVo);
    }
    public List<IssueHostingVo> getIssueHostingFieldVos() {
        return issueHostingVos;
    }
    public void setIssueHostingFieldVos(List<IssueHostingVo> issueHostingVos) {
        this.issueHostingVos = issueHostingVos;
    }
    public void addIssueHostingFieldVo(IssueHostingVo issueHostingVo) {
        this.issueHostingVos.add(issueHostingVo);
    }
    public Long getAttachedFileCount() {
        return attachedFileCount;
    }
@@ -338,30 +374,6 @@
        this.registerVo = registerVo;
    }
    public CompanyFieldVo getCompanyFieldVo() {
        return companyFieldVo;
    }
    public void setCompanyFieldVo(CompanyFieldVo companyFieldVo) {
        this.companyFieldVo = companyFieldVo;
    }
    public IspFieldVo getIspFieldVo() {
        return ispFieldVo;
    }
    public void setIspFieldVo(IspFieldVo ispFieldVo) {
        this.ispFieldVo = ispFieldVo;
    }
    public HostingFieldVo getHostingFieldVo() {
        return hostingFieldVo;
    }
    public void setHostingFieldVo(HostingFieldVo hostingFieldVo) {
        this.hostingFieldVo = hostingFieldVo;
    }
    public List<IssueHistoryVo> getIssueHistoryVos() {
        return issueHistoryVos;
    }
@@ -376,14 +388,6 @@
    public void setModifyByName(String modifyByName) {
        this.modifyByName = modifyByName;
    }
    public String getByName() {
        return byName;
    }
    public void setByName(String byName) {
        this.byName = byName;
    }
    public void setWorkflowStatusVo(WorkflowStatusVo workflowStatusVo) {
src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
@@ -44,6 +44,9 @@
    private List<Long> registerIds = Lists.newArrayList();
    private List<String> issueIds = Lists.newArrayList();   //  이슈 목록 검색에서 사용자 정의 필드로 1차 검색한 결과를 담을때 사용
    private List<Map<String, Object>> issueCustomFields = Lists.newArrayList();
    private List<Map<String, Object>> issueCompanyField = Lists.newArrayList();
    private List<Map<String, Object>> issueIspField = Lists.newArrayList();
    private List<Map<String, Object>> issueHostingField = Lists.newArrayList();
    private List<Long> statusIds = Lists.newArrayList();
    private List<Long> excludeIds = Lists.newArrayList();
@@ -84,6 +87,18 @@
        if (MapUtil.getObject(conditions, "issueCustomFields") != null) {
            condition.setIssueCustomFields((List)MapUtil.getObject(conditions, "issueCustomFields"));
        }
        if (MapUtil.getObject(conditions, "issueCompanyField") != null) {
            condition.setIssueCompanyField((List)MapUtil.getObject(conditions, "issueCompanyField"));
        }
        if (MapUtil.getObject(conditions, "issueIspField") != null) {
            condition.setIssueIspField((List)MapUtil.getObject(conditions, "issueIspField"));
        }
        if (MapUtil.getObject(conditions, "issueHostingField") != null) {
            condition.setIssueHostingField((List)MapUtil.getObject(conditions, "issueHostingField"));
        }
        if (StringUtils.hasText(MapUtil.getString(conditions, "beginRegisterDate"))) {
@@ -355,6 +370,30 @@
        this.issueCustomFields = issueCustomFields;
    }
    public List<Map<String, Object>> getIssueCompanyField() {
        return issueCompanyField;
    }
    public void setIssueCompanyField(List<Map<String, Object>> issueCompanyField) {
        this.issueCompanyField = issueCompanyField;
    }
    public List<Map<String, Object>> getIssueIspField() {
        return issueIspField;
    }
    public void setIssueIspField(List<Map<String, Object>> issueIspField) {
        this.issueIspField = issueIspField;
    }
    public List<Map<String, Object>> getIssueHostingField() {
        return issueHostingField;
    }
    public void setIssueHostingField(List<Map<String, Object>> issueHostingField) {
        this.issueHostingField = issueHostingField;
    }
    public List<String> getIssueIds() {
        return issueIds;
    }
src/main/java/kr/wisestone/owl/web/form/IssueForm.java
@@ -37,9 +37,9 @@
    private List<Long> removeIds = Lists.newArrayList();
    private List<Long> ids = Lists.newArrayList();  //  이슈 다중 상태 변경에서 사용
    private String comment; //  이슈 상태 변경에서 변경 사유를 입력할 때 사용
    private Long companyId;    //업체필드
    private Long ispId;    //ISP필드
    private Long hostingId;    //호스팅필드
    private List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
    private List<Map<String, Object>> issueIspFields = Lists.newArrayList();
    private List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
    private Long parentIssueId; // 상위 이슈
    public IssueForm() {
@@ -98,18 +98,18 @@
        }
        //  업체 필드 정보
        if (MapUtil.getLongs(params, "companyFieldId") != null){
            form.setCompanyId(MapUtil.getLong(params, "companyFieldId"));
        if (MapUtil.getObject(params, "issueCompanyFields") != null){
            form.setIssueCompanyFields((List)MapUtil.getObject(params, "issueCompanyFields"));
        }
        //  ISP 필드 정보
        if (MapUtil.getLongs(params, "ispFieldId") != null){
            form.setIspId(MapUtil.getLong(params, "ispFieldId"));
        if (MapUtil.getObject(params, "issueIspFields") != null){
            form.setIssueIspFields((List)MapUtil.getObject(params, "issueIspFields"));
        }
        //  HOSTING 필드 정보
        if (MapUtil.getLongs(params, "hostingFieldId") != null){
            form.setHostingId(MapUtil.getLong(params, "hostingFieldId"));
        if (MapUtil.getObject(params, "issueHostingFields") != null){
            form.setIssueHostingFields((List)MapUtil.getObject(params, "issueHostingFields"));
        }
        return form;
    }
@@ -290,28 +290,40 @@
        this.comment = comment;
    }
    public Long getCompanyId() {
        return companyId;
    public List<Map<String, Object>> getIssueCompanyFields() {
        return issueCompanyFields;
    }
    public void setCompanyId(Long companyId) {
        this.companyId = companyId;
    public void setIssueCompanyFields(List<Map<String, Object>> issueCompanyFields) {
        this.issueCompanyFields = issueCompanyFields;
    }
    public Long getIspId() {
        return ispId;
    public void addissueCompanyField(Map<String, Object> issueCompanyFields) {
        this.issueCompanyFields.add(issueCompanyFields);
    }
    public void setIspId(Long ispId) {
        this.ispId = ispId;
    public List<Map<String, Object>> getIssueIspFields() {
        return issueIspFields;
    }
    public Long getHostingId() {
        return hostingId;
    public void setIssueIspFields(List<Map<String, Object>> issueIspFields) {
        this.issueIspFields = issueIspFields;
    }
    public void setHostingId(Long hostingId) {
        this.hostingId = hostingId;
    public void addIssueIspField(Map<String, Object> issueIspFields) {
        this.issueIspFields.add(issueIspFields);
    }
    public List<Map<String, Object>> getIssueHostingFields() {
        return issueHostingFields;
    }
    public void setIssueHostingFields(List<Map<String, Object>> issueHostingFields) {
        this.issueHostingFields = issueHostingFields;
    }
    public void addIssueHostingField(Map<String, Object> issueHostingFields) {
        this.issueHostingFields.add(issueHostingFields);
    }
    public Long getParentIssueId() {
src/main/resources/migration/V1_11__Alter_Table.sql
@@ -129,3 +129,54 @@
-- 상위 이슈
ALTER TABLE `issue` ADD COLUMN  `parent_issue_id` BIGINT(11) NULL;
CREATE TABLE `issue_company` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `issue_id` bigint(20) NOT NULL,
    `company_id` bigint(20) DEFAULT NULL,
    `name` VARCHAR(50) NULL,
    `manager` VARCHAR(50) NULL,
    `tel` VARCHAR (50) NULL,
    `email` VARCHAR (255) NULL,
    `memo` VARCHAR(255) NULL,
    `register_id` bigint(20) NOT NULL COMMENT 'register_id',
    `register_date` timestamp NULL DEFAULT NULL COMMENT 'register_date',
    `modify_id` bigint(20) NOT NULL COMMENT 'modify_id',
    `modify_date` timestamp NULL DEFAULT NULL COMMENT 'modify_date',
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `companyIdIndex` (`company_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `issue_hosting` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `issue_id` bigint(20) NOT NULL,
    `hosting_id` bigint(20) DEFAULT NULL,
    `name` VARCHAR(50) NULL,
    `manager` VARCHAR(50) NULL,
    `tel` VARCHAR (50) NULL,
    `email` VARCHAR (255) NULL,
    `memo` VARCHAR(255) NULL,
    `register_id` bigint(20) NOT NULL COMMENT 'register_id',
    `register_date` timestamp NULL DEFAULT NULL COMMENT 'register_date',
    `modify_id` bigint(20) NOT NULL COMMENT 'modify_id',
    `modify_date` timestamp NULL DEFAULT NULL COMMENT 'modify_date',
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `hostingIdIndex` (`hosting_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `issue_isp` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `issue_id` bigint(20) NOT NULL,
    `isp_id` bigint(20) DEFAULT NULL,
    `name` VARCHAR(50) NULL,
    `manager` VARCHAR(50) NULL,
    `tel` VARCHAR (50) NULL,
    `email` VARCHAR (255) NULL,
    `memo` VARCHAR(255) NULL,
    `register_id` bigint(20) NOT NULL COMMENT 'register_id',
    `register_date` timestamp NULL DEFAULT NULL COMMENT 'register_date',
    `modify_id` bigint(20) NOT NULL COMMENT 'modify_id',
    `modify_date` timestamp NULL DEFAULT NULL COMMENT 'modify_date',
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `ispIdIndex` (`isp_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
src/main/resources/migration/V1_1__Initial_Setup.sql
@@ -80,9 +80,6 @@
    `project_id` bigint(20) DEFAULT NULL,
    `priority_id` bigint(20) DEFAULT NULL,
    `severity_id` bigint(20) DEFAULT NULL,
    `company_id` bigint(20) DEFAULT NULL,
    `hosting_id` bigint(20) DEFAULT NULL,
    `isp_id` bigint(20) DEFAULT NULL,
    `title` varchar(300) DEFAULT NULL,
    `description` mediumtext COMMENT 'description',
    `reverse_index` bigint(20) DEFAULT NULL,
src/main/resources/mybatis/query-template/issueCompany-template.xml
New file
@@ -0,0 +1,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.IssueCompanyMapper">
    <select id="findInIssueIds" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
        SELECT
        ic.issue_id as issueId,
        ic.company_id as companyId,
        ic.name as companyName,
        ic.manager as companyManager,
        ic.tel as companyTel,
        ic.email as companyEmail,
        ic.memo as companyMemo
        FROM issue_company ic
        WHERE 1=1
        <choose>
            <when test="issueIds.size != 0">
                AND ic.issue_id IN
                <foreach collection="issueIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
    </select>
</mapper>
src/main/resources/mybatis/query-template/issueHosting-template.xml
New file
@@ -0,0 +1,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.IssueHostingMapper">
    <select id="findInIssueIds" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
        SELECT
        ih.issue_id as issueId,
        ih.hosting_id as hostingId,
        ih.name as hostingName,
        ih.manager as hostingManager,
        ih.tel as hostingTel,
        ih.email as hostingEmail,
        ih.memo as hostingMemo
        FROM issue_hosting ih
        WHERE 1=1
        <choose>
            <when test="issueIds.size != 0">
                AND ih.issue_id IN
                <foreach collection="issueIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
    </select>
</mapper>
src/main/resources/mybatis/query-template/issueIsp-template.xml
New file
@@ -0,0 +1,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.wisestone.owl.mapper.IssueIspMapper">
    <select id="findInIssueIds" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
        SELECT
        ii.issue_id as issueId,
        ii.isp_id as ispId,
        ii.name as ispName,
        ii.manager as ispManager,
        ii.tel as ispTel,
        ii.email as ispEmail,
        ii.memo as ispMemo
        FROM issue_isp ii
        WHERE 1=1
        <choose>
            <when test="issueIds.size != 0">
                AND ii.issue_id IN
                <foreach collection="issueIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
    </select>
</mapper>
src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -340,6 +340,7 @@
                // 업체정보 결과 값 Event 처리(set)
                $scope.$on("companyFieldEvent", function (event, result) {
                    $scope.vm.companyId = result[0].id;
                    $scope.vm.companyManager = result[0].manager;
                    $scope.vm.companyTel = result[0].tel;
                    $scope.vm.companyEmail = result[0].email;
@@ -349,6 +350,7 @@
                // ISP정보 결과 값 Event 처리(set)
                $scope.$on("ispFieldEvent", function (event, result) {
                    $scope.vm.ispId = result[0].id;
                    $scope.vm.ispCode = result[0].code;
                    $scope.vm.ispManager = result[0].manager;
                    $scope.vm.ispTel = result[0].tel;
@@ -358,6 +360,7 @@
                // 호스팅정보 결과 값 Event 처리(set)
                $scope.$on("hostingFieldEvent", function (event, result) {
                    $scope.vm.hostingId = result[0].id;
                    $scope.vm.hostingCode = result[0].code;
                    $scope.vm.hostingManager = result[0].manager;
                    $scope.vm.hostingTel = result[0].tel;
@@ -457,74 +460,35 @@
                        startCompleteDateRange : $scope.vm.form.startCompleteDateRange,
                        detectingDateRange : $scope.vm.form.detectingDateRange,
                        companyFields : (function () {
                        issueCompanyFields : (function () {
                            var companyFields = [];
                            angular.forEach($scope.vm.form.companyFields, function (companyField) {
                                var useValues = [];
                                if (angular.isArray(companyField.useValues)) {
                                    angular.forEach(companyField.useValues, function (useValue) {
                                        useValues.push(useValue.value);
                                    });
                                }
                                else {
                                    useValues.push(companyField.useValues);
                                }
                                //  useValues 를 배열로 변환한다.
                                var temp = angular.copy(companyField);
                                temp.useValues = useValues;
                                companyFields.push(temp);
                            });
                            var  companyField = $scope.vm.form.companyFields[0];
                            companyField.companyId = companyField.id;
                            companyField.id = null;
                            companyFields.push(companyField);
                            return companyFields;
                        })(),
                        ispFields : (function () {
                        issueIspFields : (function () {
                            var ispFields = [];
                            angular.forEach($scope.vm.form.ispFields, function (ispField) {
                                var useValues = [];
                                if (angular.isArray(ispField.useValues)) {
                                    angular.forEach(ispField.useValues, function (useValue) {
                                        useValues.push(useValue.value);
                                    });
                                }
                                else {
                                    useValues.push(ispField.useValues);
                                }
                                //  useValues 를 배열로 변환한다.
                                var temp = angular.copy(ispField);
                                temp.useValues = useValues;
                                ispFields.push(temp);
                            });
                            var  ispField = $scope.vm.form.ispFields[0];
                            ispField.ispId = ispField.id;
                            ispField.id = null;
                            ispFields.push(ispField);
                            return ispFields;
                        })(),
                        hostingFields : (function () {
                        issueHostingFields : (function () {
                            var hostingFields = [];
                            angular.forEach($scope.vm.form.hostingFields, function (hostingField) {
                                var useValues = [];
                                if (angular.isArray(hostingField.useValues)) {
                                    angular.forEach(hostingField.useValues, function (useValue) {
                                        useValues.push(useValue.value);
                                    });
                                }
                                else {
                                    useValues.push(hostingField.useValues);
                                }
                                //  useValues 를 배열로 변환한다.
                                var temp = angular.copy(hostingField);
                                temp.useValues = useValues;
                                hostingFields.push(temp);
                            });
                            var  hostingField = $scope.vm.form.hostingFields[0];
                            hostingField.hostingId = hostingField.id;
                            hostingField.id = null;
                            hostingFields.push(hostingField);
                            return hostingFields;
                        })(),