이행 대상자 정보 등록/수정 로직 개선: 행위별 소유자/행위자 매핑 처리 추가 및 중복 소유자/행위자 제거 logic 적용

dev
박성영 2 months ago
parent 89dd9be7cd
commit ffbe0fc87b

@ -98,6 +98,36 @@ public interface CrdnImpltTaskMapper {
*/
List<CrdnImpltTrprInfoVO> selectActrInfoList(CrdnImpltTaskVO vo);
/**
* : OWNR_ID ACT_INFO_ID ID(OWNR_INFO_ID) .
* @param ownrId ID
* @param actInfoId ID
* @param crdnYr
* @param crdnNo
* @return ID
*/
String selectOwnrInfoIdByOwnrIdAndActInfoId(@Param("ownrId") String ownrId, @Param("actInfoId") String actInfoId, @Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo);
/**
* : OWNR_ID ACT_INFO_ID ID(ACTR_INFO_ID) .
* @param ownrId ID
* @param actInfoId ID
* @param crdnYr
* @param crdnNo
* @return ID
*/
String selectActrInfoIdByOwnrIdAndActInfoId(@Param("ownrId") String ownrId, @Param("actInfoId") String actInfoId, @Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo);
// ==================== 이행정보 전용 행위 조회 메서드 ====================
/**
* : / . (pstnInfoId )
* @param crdnYr
* @param crdnNo
* @return
*/
List<go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO> selectActInfoListForImplt(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo);
// ==================== 시퀀스 관련 메서드 ====================
/**

@ -5,6 +5,7 @@ import egovframework.constant.TuiGridColorConstants;
import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import egovframework.util.StringUtil;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnImpltTaskMapper;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnLevyPrvntcMapper;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnRegistAndViewMapper;
@ -113,17 +114,63 @@ public class CrdnImpltTaskServiceImpl extends EgovAbstractServiceImpl implements
// 이행정보 등록
int result = crdnImpltTaskMapper.insertImpltInfo(vo);
// 이행 대상자 정보 등록
// 중요한 로직 주석: 단속건의 모든 행위를 조회하여 각 행위별로 이행 대상자 정보를 저장
if (vo.getImpltTrprInfoList() != null && !vo.getImpltTrprInfoList().isEmpty()) {
for (CrdnImpltTrprInfoVO trprInfo : vo.getImpltTrprInfoList()) {
String trprInfoId = crdnImpltTaskMapper.selectNextImpltTrprInfoId();
trprInfo.setImpltTrprInfoId(trprInfoId);
trprInfo.setImpltInfoId(impltInfoId);
trprInfo.setSggCd(vo.getSggCd());
trprInfo.setRgtr(SessionUtil.getUserId());
trprInfo.setDelYn("N");
crdnImpltTaskMapper.insertImpltTrprInfo(trprInfo);
// 단속건의 모든 행위 정보 조회 (pstnInfoId 조건 없음)
List<CrdnActInfoVO> actInfoList = crdnImpltTaskMapper.selectActInfoListForImplt(vo.getCrdnYr(), vo.getCrdnNo());
if (actInfoList == null || actInfoList.isEmpty()) {
log.warn("행위 정보가 없습니다. 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
} else {
// 각 소유자/행위자에 대해 모든 행위별로 저장
for (CrdnImpltTrprInfoVO trprInfo : vo.getImpltTrprInfoList()) {
for (CrdnActInfoVO actInfo : actInfoList) {
// 중요한 로직: OWNR_ID로 실제 OWNR_INFO_ID 또는 ACTR_INFO_ID 조회
String actualInfoId = null;
if ("1".equals(trprInfo.getImpltTrprSeCd())) {
// 소유자인 경우
actualInfoId = crdnImpltTaskMapper.selectOwnrInfoIdByOwnrIdAndActInfoId(
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), vo.getCrdnYr(), vo.getCrdnNo());
} else if ("2".equals(trprInfo.getImpltTrprSeCd())) {
// 행위자인 경우
actualInfoId = crdnImpltTaskMapper.selectActrInfoIdByOwnrIdAndActInfoId(
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), vo.getCrdnYr(), vo.getCrdnNo());
}
if (actualInfoId == null) {
log.warn("실제 ID를 찾을 수 없습니다. OWNR_ID: {}, ACT_INFO_ID: {}, 구분: {}",
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), trprInfo.getImpltTrprSeCd());
continue;
}
String trprInfoId = crdnImpltTaskMapper.selectNextImpltTrprInfoId();
CrdnImpltTrprInfoVO newTrprInfo = new CrdnImpltTrprInfoVO();
newTrprInfo.setImpltTrprInfoId(trprInfoId);
newTrprInfo.setImpltInfoId(impltInfoId);
newTrprInfo.setSggCd(vo.getSggCd());
newTrprInfo.setRgtr(SessionUtil.getUserId());
newTrprInfo.setDelYn("N");
// 실제 조회한 ID 설정
newTrprInfo.setOwnrActrInfoId(actualInfoId);
newTrprInfo.setImpltTrprSeCd(trprInfo.getImpltTrprSeCd());
newTrprInfo.setImpltTrprFlnm(trprInfo.getImpltTrprFlnm());
newTrprInfo.setImpltTrprZip(trprInfo.getImpltTrprZip());
newTrprInfo.setImpltTrprAddr(trprInfo.getImpltTrprAddr());
newTrprInfo.setImpltTrprDaddr(trprInfo.getImpltTrprDaddr());
// 행위 정보 설정
newTrprInfo.setActNo(String.valueOf(actInfo.getActNo()));
newTrprInfo.setActTypeCd(actInfo.getActTypeCd());
newTrprInfo.setLotnoMno(trprInfo.getLotnoMno());
newTrprInfo.setLotnoSno(trprInfo.getLotnoSno());
crdnImpltTaskMapper.insertImpltTrprInfo(newTrprInfo);
}
}
log.debug("이행 대상자 정보 등록 완료: 소유자/행위자 {}명 * 행위 {}건 = 총 {}건",
vo.getImpltTrprInfoList().size(), actInfoList.size(),
vo.getImpltTrprInfoList().size() * actInfoList.size());
}
}
@ -165,17 +212,62 @@ public class CrdnImpltTaskServiceImpl extends EgovAbstractServiceImpl implements
// 기존 이행 대상자 정보 삭제
crdnImpltTaskMapper.deleteImpltTrprInfoByImpltInfoId(vo.getImpltInfoId());
// 새로운 이행 대상자 정보 등록
// 중요한 로직 주석: 단속건의 모든 행위를 조회하여 각 행위별로 이행 대상자 정보를 저장
if (vo.getImpltTrprInfoList() != null && !vo.getImpltTrprInfoList().isEmpty()) {
for (CrdnImpltTrprInfoVO trprInfo : vo.getImpltTrprInfoList()) {
String trprInfoId = crdnImpltTaskMapper.selectNextImpltTrprInfoId();
trprInfo.setImpltTrprInfoId(trprInfoId);
trprInfo.setImpltInfoId(vo.getImpltInfoId());
trprInfo.setSggCd(vo.getSggCd());
trprInfo.setRgtr(SessionUtil.getUserId());
trprInfo.setDelYn("N");
crdnImpltTaskMapper.insertImpltTrprInfo(trprInfo);
// 단속건의 모든 행위 정보 조회 (pstnInfoId 조건 없음)
List<CrdnActInfoVO> actInfoList = crdnImpltTaskMapper.selectActInfoListForImplt(vo.getCrdnYr(), vo.getCrdnNo());
if (actInfoList == null || actInfoList.isEmpty()) {
throw new MessageException(String.format("행위 정보가 없습니다. 단속연도: %s, 단속번호: %s", vo.getCrdnYr(), vo.getCrdnNo()));
} else {
// 각 소유자/행위자에 대해 모든 행위별로 저장
for (CrdnImpltTrprInfoVO trprInfo : vo.getImpltTrprInfoList()) {
for (CrdnActInfoVO actInfo : actInfoList) {
// 중요한 로직: OWNR_ID로 실제 OWNR_INFO_ID 또는 ACTR_INFO_ID 조회
String actualInfoId = null;
if ("1".equals(trprInfo.getImpltTrprSeCd())) {
// 소유자인 경우
actualInfoId = crdnImpltTaskMapper.selectOwnrInfoIdByOwnrIdAndActInfoId(
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), vo.getCrdnYr(), vo.getCrdnNo());
} else if ("2".equals(trprInfo.getImpltTrprSeCd())) {
// 행위자인 경우
actualInfoId = crdnImpltTaskMapper.selectActrInfoIdByOwnrIdAndActInfoId(
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), vo.getCrdnYr(), vo.getCrdnNo());
}
if (actualInfoId == null) {
throw new MessageException(String.format("실제 ID를 찾을 수 없습니다. OWNR_ID: %s, ACT_INFO_ID: %s, 구분: %s",
trprInfo.getOwnrActrInfoId(), actInfo.getActInfoId(), trprInfo.getImpltTrprSeCd()));
}
String trprInfoId = crdnImpltTaskMapper.selectNextImpltTrprInfoId();
CrdnImpltTrprInfoVO newTrprInfo = new CrdnImpltTrprInfoVO();
newTrprInfo.setImpltTrprInfoId(trprInfoId);
newTrprInfo.setImpltInfoId(vo.getImpltInfoId());
newTrprInfo.setSggCd(vo.getSggCd());
newTrprInfo.setRgtr(SessionUtil.getUserId());
newTrprInfo.setDelYn("N");
// 실제 조회한 ID 설정
newTrprInfo.setOwnrActrInfoId(actualInfoId);
newTrprInfo.setImpltTrprSeCd(trprInfo.getImpltTrprSeCd());
newTrprInfo.setImpltTrprFlnm(trprInfo.getImpltTrprFlnm());
newTrprInfo.setImpltTrprZip(trprInfo.getImpltTrprZip());
newTrprInfo.setImpltTrprAddr(trprInfo.getImpltTrprAddr());
newTrprInfo.setImpltTrprDaddr(trprInfo.getImpltTrprDaddr());
// 행위 정보 설정
newTrprInfo.setActNo(String.valueOf(actInfo.getActNo()));
newTrprInfo.setActTypeCd(actInfo.getActTypeCd());
newTrprInfo.setLotnoMno(trprInfo.getLotnoMno());
newTrprInfo.setLotnoSno(trprInfo.getLotnoSno());
crdnImpltTaskMapper.insertImpltTrprInfo(newTrprInfo);
}
}
log.debug("이행 대상자 정보 수정 완료: 소유자/행위자 {}명 * 행위 {}건 = 총 {}건",
vo.getImpltTrprInfoList().size(), actInfoList.size(),
vo.getImpltTrprInfoList().size() * actInfoList.size());
}
}
@ -279,33 +371,6 @@ public class CrdnImpltTaskServiceImpl extends EgovAbstractServiceImpl implements
list.sort(Comparator.comparing(CrdnImpltTrprInfoVO::getActNo)
.thenComparing(CrdnImpltTrprInfoVO::getImpltTrprSeCd)
.thenComparing(CrdnImpltTrprInfoVO::getImpltTrprFlnm));
// 중요로직: 행위 번호(actNo)의 홀/짝에 따라 그리드 행에 CSS 클래스를 적용
for (CrdnImpltTrprInfoVO item : list) {
try {
if (item.getActNo() != null && !item.getActNo().isEmpty()) {
// actNo를 정수로 변환
int actNo = Integer.parseInt(item.getActNo());
// TUI Grid _attributes 설정
Map<String, Object> attributes = new HashMap<>();
Map<String, Object> className = new HashMap<>();
List<String> rowClass = new ArrayList<>();
if (actNo % 2 == 0) {
rowClass.add(TuiGridColorConstants.ROW_COLOR_RED);
} else {
rowClass.add(TuiGridColorConstants.ROW_COLOR_BLUE);
}
className.put("row", rowClass);
attributes.put("className", className);
item.set_attributes(attributes);
}
} catch (NumberFormatException e) {
// actNo가 숫자가 아닌 경우 로그를 남기거나 무시
log.warn("actNo is not a valid integer: {}", item.getActNo());
}
}
return list;
}

@ -195,10 +195,11 @@
<!-- ==================== 소유자/행위자 정보 조회 쿼리 ==================== -->
<!-- 소유자 정보 목록 조회 (체크박스 선택용) -->
<!-- 중요한 로직 주석: OWNR_ID 기준으로 GROUP BY하여 중복 제거된 소유자 목록을 조회 (OWNR_INFO_ID는 제외) -->
<select id="selectOwnrInfoList" parameterType="CrdnImpltTaskVO"
resultType="CrdnImpltTrprInfoVO">
SELECT
oi.OWNR_INFO_ID as ownrActrInfoId,
o.OWNR_ID as ownrActrInfoId,
o.FLNM as impltTrprFlnm,
o.ADDR as impltTrprAddr,
o.DADDR as impltTrprDaddr,
@ -207,31 +208,31 @@
o.LOTNO_SNO,
'1' as impltTrprSeCd,
impltTrprSe.CD_NM as impltTrprSeCdNm,
CASE WHEN (SELECT COUNT(*) FROM tb_implt_trpr_info
WHERE OWNR_ACTR_INFO_ID = oi.OWNR_INFO_ID
AND IMPLT_TRPR_SE_CD = '1'
AND ACT_NO = aio.ACT_NO
AND IMPLT_INFO_ID = #{impltInfoId}
CASE WHEN (SELECT COUNT(*) FROM tb_implt_trpr_info iti
INNER JOIN tb_ownr_info oi2 ON oi2.OWNR_INFO_ID = iti.OWNR_ACTR_INFO_ID
WHERE oi2.OWNR_ID = o.OWNR_ID
AND iti.IMPLT_TRPR_SE_CD = '1'
AND iti.IMPLT_INFO_ID = #{impltInfoId}
) > 0 THEN true ELSE false END as selected,
aio.ACT_NO,
aio.ACT_TYPE_CD,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
'' as ACT_NO,
'' as ACT_TYPE_CD,
'' AS ACT_TYPE_CD_NM,
ECL_DECRYPT(o.RRNO) as RRNO
FROM tb_act_info aio
inner JOIN tb_ownr_info oi ON aio.CRDN_YR = oi.CRDN_YR AND aio.CRDN_NO = oi.CRDN_NO AND oi.DEL_YN = 'N'
FROM tb_ownr_info oi
INNER JOIN tb_ownr o ON o.OWNR_ID = oi.OWNR_ID
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = '1'
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = aio.ACT_TYPE_CD
WHERE aio.CRDN_YR = #{crdnYr}
AND aio.CRDN_NO = #{crdnNo}
AND aio.DEL_YN = 'N'
WHERE oi.CRDN_YR = #{crdnYr}
AND oi.CRDN_NO = #{crdnNo}
AND oi.DEL_YN = 'N'
GROUP BY o.OWNR_ID, o.FLNM, o.ADDR, o.DADDR, o.ZIP, o.LOTNO_MNO, o.LOTNO_SNO, impltTrprSe.CD_NM, o.RRNO
</select>
<!-- 행위자 정보 목록 조회 (체크박스 선택용) -->
<!-- 중요한 로직 주석: OWNR_ID 기준으로 GROUP BY하여 중복 제거된 행위자 목록을 조회 (ACTR_INFO_ID는 제외) -->
<select id="selectActrInfoList" parameterType="CrdnImpltTaskVO"
resultType="CrdnImpltTrprInfoVO">
SELECT
ai.ACTR_INFO_ID as ownrActrInfoId,
o.OWNR_ID as ownrActrInfoId,
o.FLNM as impltTrprFlnm,
o.ADDR as impltTrprAddr,
o.DADDR as impltTrprDaddr,
@ -240,24 +241,92 @@
o.LOTNO_SNO,
'2' as impltTrprSeCd,
impltTrprSe.CD_NM as impltTrprSeCdNm,
CASE WHEN (SELECT COUNT(*) FROM tb_implt_trpr_info
WHERE OWNR_ACTR_INFO_ID = ai.ACTR_INFO_ID
AND IMPLT_TRPR_SE_CD = '2'
AND ACT_NO = aio.ACT_NO
AND IMPLT_INFO_ID = #{impltInfoId}
CASE WHEN (SELECT COUNT(*) FROM tb_implt_trpr_info iti
INNER JOIN tb_actr_info ai2 ON ai2.ACTR_INFO_ID = iti.OWNR_ACTR_INFO_ID
WHERE ai2.OWNR_ID = o.OWNR_ID
AND iti.IMPLT_TRPR_SE_CD = '2'
AND iti.IMPLT_INFO_ID = #{impltInfoId}
) > 0 THEN true ELSE false END as selected,
aio.ACT_NO,
aio.ACT_TYPE_CD,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
'' as ACT_NO,
'' as ACT_TYPE_CD,
'' AS ACT_TYPE_CD_NM,
ECL_DECRYPT(o.RRNO) as RRNO
FROM tb_act_info aio
INNER JOIN tb_actr_info ai ON ai.ACT_INFO_ID = aio.ACT_INFO_ID AND ai.DEL_YN = 'N'
FROM tb_actr_info ai
INNER JOIN tb_ownr o ON o.OWNR_ID = ai.OWNR_ID
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = '2'
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = aio.ACT_TYPE_CD
WHERE aio.CRDN_YR = #{crdnYr}
AND aio.CRDN_NO = #{crdnNo}
AND aio.DEL_YN = 'N'
WHERE ai.CRDN_YR = #{crdnYr}
AND ai.CRDN_NO = #{crdnNo}
AND ai.DEL_YN = 'N'
GROUP BY o.OWNR_ID, o.FLNM, o.ADDR, o.DADDR, o.ZIP, o.LOTNO_MNO, o.LOTNO_SNO, impltTrprSe.CD_NM, o.RRNO
</select>
<!-- 중요한 로직: OWNR_ID와 ACT_INFO_ID로 소유자정보ID(OWNR_INFO_ID) 조회 -->
<!-- tb_ownr_info는 PSTN_INFO_ID를 가지고 있고, tb_act_info를 통해 연결됨 -->
<select id="selectOwnrInfoIdByOwnrIdAndActInfoId" resultType="string">
/* CrdnImpltTaskMapper.selectOwnrInfoIdByOwnrIdAndActInfoId : OWNR_ID와 ACT_INFO_ID로 OWNR_INFO_ID 조회 */
SELECT oi.OWNR_INFO_ID
FROM tb_ownr_info oi
INNER JOIN tb_act_info ai ON ai.PSTN_INFO_ID = oi.PSTN_INFO_ID
WHERE oi.OWNR_ID = #{ownrId}
AND ai.ACT_INFO_ID = #{actInfoId}
AND oi.CRDN_YR = #{crdnYr}
AND oi.CRDN_NO = #{crdnNo}
AND oi.DEL_YN = 'N'
AND ai.DEL_YN = 'N'
LIMIT 1
</select>
<!-- 중요한 로직: OWNR_ID와 ACT_INFO_ID로 행위자정보ID(ACTR_INFO_ID) 조회 -->
<select id="selectActrInfoIdByOwnrIdAndActInfoId" resultType="string">
/* CrdnImpltTaskMapper.selectActrInfoIdByOwnrIdAndActInfoId : OWNR_ID와 ACT_INFO_ID로 ACTR_INFO_ID 조회 */
SELECT ACTR_INFO_ID
FROM tb_actr_info
WHERE OWNR_ID = #{ownrId}
AND ACT_INFO_ID = #{actInfoId}
AND CRDN_YR = #{crdnYr}
AND CRDN_NO = #{crdnNo}
AND DEL_YN = 'N'
LIMIT 1
</select>
<!-- ==================== 이행정보 전용 행위 조회 쿼리 ==================== -->
<!-- 중요한 로직 주석: 이행정보 등록/수정 시 단속건의 모든 행위 정보를 조회 (pstnInfoId 조건 제외) -->
<select id="selectActInfoListForImplt" parameterType="map" resultType="CrdnActInfoVO">
/* CrdnImpltTaskMapper.selectActInfoListForImplt : 이행정보용 행위 정보 목록 조회 (pstnInfoId 조건 없음) */
SELECT
a.ACT_INFO_ID,
a.SGG_CD,
a.CRDN_YR,
a.CRDN_NO,
a.PSTN_INFO_ID,
a.ACT_BGNG_YMD,
a.ACT_TYPE_CD,
a.ACT_NO,
a.VLTN_LWRG_CD_1,
a.VLTN_LWRG_CD_2,
a.STRCT_IDX_CD,
a.USG_IDX_CD,
a.HGT,
a.WDTH,
a.VRTC,
a.AREA,
a.RMRK,
a.ACTN_LAST_YMD,
a.ACTN_WHOL_AREA,
a.ACTN_PRCS_STTS_CD,
a.REG_DT,
a.RGTR,
a.MDFCN_DT,
a.MDFR,
a.DEL_YN,
a.DEL_DT,
a.DLTR
FROM tb_act_info a
WHERE a.DEL_YN = 'N'
AND a.CRDN_YR = #{crdnYr}
AND a.CRDN_NO = #{crdnNo}
ORDER BY a.ACT_BGNG_YMD ASC, a.REG_DT ASC, a.ACT_INFO_ID ASC
</select>
<!-- ==================== 시퀀스 관련 쿼리 ==================== -->

@ -168,8 +168,6 @@
getGridColumns: function() {
var self = this;
return [
{header: '행위번호', name: 'actNo', align: 'center', width: 60},
{header: '행위구분', name: 'actTypeCdNm', align: 'center', width: 120},
{header: '소유자, 행위자 구분', name: 'impltTrprSeCdNm', align: 'center', width: 120},
{header: '성명', name: 'impltTrprFlnm', align: 'center', width: 120},
{header: '우편번호', name: 'impltTrprZip', align: 'center', width: 80},
@ -184,7 +182,6 @@
{header: '지번 본번', name: 'lotnoMno', align: 'right', width: 90, hidden: true},
{header: '지번 부번', name: 'lotnoSno', align: 'right', width: 90, hidden: true},
{ header: '소유자 행위자 정보 ID', name: 'ownrActrInfoId', align: 'center', width: 120, hidden: true },
{ header: '이행 대상자 정보 ID', name: 'impltTrprInfoId', align: 'center', width: 120, hidden: true },
{ header: '체크박스여부', name: 'selected', align: 'center', width: 120, hidden: true },
{ header: '주민번호', name: 'rrno', align: 'center', width: 120, hidden: true },
];
@ -256,7 +253,9 @@
self.instance.disableRowCheck(row.rowKey);
}
}else{
self.instance.check(row.rowKey);
if (row.selected ) {
self.instance.check(row.rowKey);
}
}
});
@ -429,11 +428,6 @@
return;
}
// 행위별로 최소 1명 이상 선택되었는지 검증
if (!this.validateActNoSelection(selectedTrprInfoList)) {
return;
}
// 이행 대상자 정보를 formData에 추가
for (var i = 0; i < selectedTrprInfoList.length; i++) {
var trprInfo = selectedTrprInfoList[i];
@ -506,8 +500,6 @@
impltTrprZip: rowData.impltTrprZip,
impltTrprAddr: rowData.impltTrprAddr,
impltTrprDaddr: rowData.impltTrprDaddr,
actNo: rowData.actNo,
actTypeCd: rowData.actTypeCd,
lotnoMno: rowData.lotnoMno,
lotnoSno: rowData.lotnoSno
};
@ -545,48 +537,6 @@
return true;
},
/**
* 행위별 선택 검증
* 중요한 로직 주석: 각 행위번호별로 최소 1명 이상의 이행 대상자가 선택되었는지 검증합니다.
* @param {Array} selectedTrprInfoList - 선택된 이행 대상자 정보 배열
* @returns {boolean} 검증 성공 여부
*/
validateActNoSelection: function(selectedTrprInfoList) {
// 전체 그리드 데이터에서 고유한 행위번호 목록 추출
var allData = this.grid.instance.getData();
var actNoSet = new Set();
for (var i = 0; i < allData.length; i++) {
if (allData[i].actNo) {
actNoSet.add(allData[i].actNo);
}
}
// 선택된 데이터에서 행위번호별 개수 집계
var selectedActNoMap = {};
for (var i = 0; i < selectedTrprInfoList.length; i++) {
var actNo = selectedTrprInfoList[i].actNo;
if (actNo) {
selectedActNoMap[actNo] = (selectedActNoMap[actNo] || 0) + 1;
}
}
// 각 행위번호별로 최소 1명 이상 선택되었는지 확인
var missingActNos = [];
actNoSet.forEach(function(actNo) {
if (!selectedActNoMap[actNo] || selectedActNoMap[actNo] === 0) {
missingActNos.push(actNo);
}
});
// 선택되지 않은 행위번호가 있으면 경고
if (missingActNos.length > 0) {
alert('행위번호 ' + missingActNos.join(', ') + '번의 이행 대상자를 최소 1명 이상 선택해주세요.');
return false;
}
return true;
},
};

Loading…
Cancel
Save