단속의 이행이력 팝업 및 버튼 추가

dev
박성영 2 months ago
parent 1dce933717
commit b94a38b359

@ -0,0 +1,93 @@
package go.kr.project.crdn.crndRegistAndView.main.controller;
import egovframework.constant.TilesConstants;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnImpltTaskHistoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* packageName : go.kr.project.crdn.crndRegistAndView.main.controller
* fileName : CrdnImpltTaskHistoryController
* author :
* date : 2025-01-28
* description :
* :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-01-28
*/
@Controller
@RequestMapping("/crdn/crndRegistAndView/crdnImpltTaskHistory")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "이행정보 이력 조회", description = "이행정보 이력 조회 관련 API")
public class CrdnImpltTaskHistoryController {
private final CrdnImpltTaskHistoryService crdnImpltTaskHistoryService;
/**
* .
*
* @param crdnYr
* @param crdnNo
* @return
*/
@GetMapping("/impltTaskHistoryPopup.do")
@Operation(summary = "이행정보 이력 팝업", description = "이행정보 이력 팝업 화면을 제공합니다.")
public ModelAndView impltTaskHistoryPopup(
@Parameter(description = "단속 연도") @RequestParam String crdnYr,
@Parameter(description = "단속 번호") @RequestParam String crdnNo) {
log.debug("이행정보 이력 팝업 요청 - 단속연도: {}, 단속번호: {}", crdnYr, crdnNo);
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/main/crdnImpltTaskHistory/impltTaskHistoryPopup" + TilesConstants.POPUP);
// 기본 파라미터 설정
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
CrdnImpltTaskVO paramVO = new CrdnImpltTaskVO();
paramVO.setCrdnYr(crdnYr);
paramVO.setCrdnNo(crdnNo);
// 단속 기본 정보 조회 (이력이 없어도 주소 정보를 표시하기 위해)
CrdnImpltTaskVO crdnBasicInfo = crdnImpltTaskHistoryService.selectCrdnBasicInfo(paramVO);
mav.addObject("crdnBasicInfo", crdnBasicInfo);
// 이행정보 이력 목록 조회 (코드 테이블 기준으로 LEFT OUTER JOIN하여 모든 구분 표시)
// 중요로직: 쿼리에서 이미 모든 이행업무구분 코드를 포함하여 반환하므로, 데이터가 없는 경우 impltInfoId가 NULL
List<CrdnImpltTaskVO> impltInfoHistoryList = crdnImpltTaskHistoryService.selectImpltInfoHistoryList(paramVO);
mav.addObject("impltInfoHistoryList", impltInfoHistoryList);
// 각 이행정보별로 대상자 목록을 조회하여 Map에 저장
Map<String, List<CrdnImpltTrprInfoVO>> impltTrprInfoMap = new HashMap<>();
for (CrdnImpltTaskVO impltInfo : impltInfoHistoryList) {
// impltInfoId가 null이면 데이터가 없는 것이므로 스킵
if (impltInfo.getImpltInfoId() != null) {
CrdnImpltTrprInfoVO trprParam = new CrdnImpltTrprInfoVO();
trprParam.setSchImpltInfoId(impltInfo.getImpltInfoId());
List<CrdnImpltTrprInfoVO> trprList = crdnImpltTaskHistoryService.selectImpltTrprInfoHistoryList(trprParam);
impltTrprInfoMap.put(impltInfo.getImpltInfoId(), trprList);
}
}
mav.addObject("impltTrprInfoMap", impltTrprInfoMap);
return mav;
}
}

@ -0,0 +1,19 @@
package go.kr.project.crdn.crndRegistAndView.main.mapper;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface CrdnImpltTaskHistoryMapper {
CrdnImpltTaskVO selectCrdnBasicInfo(CrdnImpltTaskVO vo);
List<CrdnImpltTaskVO> selectImpltInfoHistoryList(CrdnImpltTaskVO vo);
List<CrdnImpltTrprInfoVO> selectImpltTrprInfoHistoryList(CrdnImpltTrprInfoVO vo);
}

@ -105,6 +105,9 @@ public class CrdnImpltTrprInfoVO {
private String lotnoMno;
private String lotnoSno;
// ==================== 추가 필드 (검색) ====================
private String schImpltInfoId;
// ==================== TUI 그리드용 속성 ====================
/**
* TUI Grid (: , )

@ -0,0 +1,45 @@
package go.kr.project.crdn.crndRegistAndView.main.service;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import java.util.List;
/**
* packageName : go.kr.project.crdn.crndRegistAndView.main.service
* fileName : CrdnImpltTaskHistoryService
* author :
* date : 2025-01-28
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-01-28
*/
public interface CrdnImpltTaskHistoryService {
/**
* .
*
* @param vo (, )
* @return
*/
CrdnImpltTaskVO selectCrdnBasicInfo(CrdnImpltTaskVO vo);
/**
* .
*
* @param vo (, )
* @return
*/
List<CrdnImpltTaskVO> selectImpltInfoHistoryList(CrdnImpltTaskVO vo);
/**
* .
*
* @param vo (ID)
* @return
*/
List<CrdnImpltTrprInfoVO> selectImpltTrprInfoHistoryList(CrdnImpltTrprInfoVO vo);
}

@ -0,0 +1,67 @@
package go.kr.project.crdn.crndRegistAndView.main.service.impl;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnImpltTaskHistoryMapper;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnImpltTaskHistoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : go.kr.project.crdn.crndRegistAndView.main.service.impl
* fileName : CrdnImpltTaskHistoryServiceImpl
* author :
* date : 2025-01-28
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-01-28
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class CrdnImpltTaskHistoryServiceImpl implements CrdnImpltTaskHistoryService {
private final CrdnImpltTaskHistoryMapper mapper;
/**
* .
*
* @param vo (, )
* @return
*/
@Override
public CrdnImpltTaskVO selectCrdnBasicInfo(CrdnImpltTaskVO vo) {
log.debug("단속 기본 정보 조회 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
return mapper.selectCrdnBasicInfo(vo);
}
/**
* .
*
* @param vo (, )
* @return
*/
@Override
public List<CrdnImpltTaskVO> selectImpltInfoHistoryList(CrdnImpltTaskVO vo) {
log.debug("이행정보 이력 목록 조회 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
return mapper.selectImpltInfoHistoryList(vo);
}
/**
* .
*
* @param vo (ID)
* @return
*/
@Override
public List<CrdnImpltTrprInfoVO> selectImpltTrprInfoHistoryList(CrdnImpltTrprInfoVO vo) {
log.debug("이행 대상자 정보 목록 조회 - 이행정보ID: {}", vo.getSchImpltInfoId());
return mapper.selectImpltTrprInfoHistoryList(vo);
}
}

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnImpltTaskHistoryMapper">
<!-- ==================== 이행정보(TB_IMPLT_INFO) 히스토리 관련 쿼리 ==================== -->
<!-- ==================== 단속 기본 정보 조회 쿼리 ==================== -->
<select id="selectCrdnBasicInfo" parameterType="CrdnImpltTaskVO" resultType="CrdnImpltTaskVO">
/* CrdnImpltTaskHistoryMapper.selectCrdnBasicInfo : 단속 기본 정보 및 위치 정보 조회 */
SELECT
c.CRDN_YR,
c.CRDN_NO,
c.DSCL_YMD,
c.EXMNR,
c.RGN_SE_CD,
rgnSeCd.CD_NM as RGN_SE_CD_NM,
c.SGG_CD,
sggCd.CD_NM as SGG_CD_NM,
p.STDG_EMD_CD,
stdgEmdCd.CD_NM as STDG_EMD_CD_NM,
p.LOTNO_ADDR,
p.LOTNO_MNO,
p.LOTNO_SNO
FROM tb_crdn c
INNER JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
LEFT JOIN tb_cd_detail rgnSeCd ON rgnSeCd.CD_GROUP_ID = 'RGN_SE_CD' AND rgnSeCd.CD_ID = c.RGN_SE_CD
LEFT JOIN tb_cd_detail sggCd ON sggCd.CD_GROUP_ID = 'SGG_CD' AND sggCd.CD_ID = c.SGG_CD
LEFT JOIN tb_cd_detail stdgEmdCd ON stdgEmdCd.CD_GROUP_ID = 'STDG_EMD_CD' AND stdgEmdCd.CD_ID = p.STDG_EMD_CD
WHERE c.CRDN_YR = #{crdnYr}
AND c.CRDN_NO = #{crdnNo}
AND c.DEL_YN = 'N'
</select>
<!-- 중요로직: 코드 테이블을 메인으로 LEFT OUTER JOIN하여 모든 이행업무구분 코드를 항상 표시 -->
<select id="selectImpltInfoHistoryList" parameterType="CrdnImpltTaskVO" resultType="CrdnImpltTaskVO">
/* CrdnImpltTaskHistoryMapper.selectImpltInfoHistoryList : 이행정보 이력 목록 조회 (전체 구분 표시) */
SELECT
impltTaskSe.CD_ID as IMPLT_TASK_SE_CD,
impltTaskSe.CD_NM as IMPLT_TASK_SE_CD_NM,
ii.IMPLT_INFO_ID,
ii.SGG_CD,
ii.CRDN_YR,
ii.CRDN_NO,
ii.IMPLT_BGNG_YMD,
ii.IMPLT_END_YMD,
ii.REG_DT,
ii.RGTR,
ii.MDFCN_DT,
ii.MDFR,
ii.DEL_YN,
ii.DEL_DT,
ii.DLTR,
-- 간격일 계산 (MariaDB DATEDIFF 함수 사용)
CASE
WHEN ii.IMPLT_BGNG_YMD IS NOT NULL AND ii.IMPLT_END_YMD IS NOT NULL
THEN DATEDIFF(STR_TO_DATE(ii.IMPLT_END_YMD, '%Y%m%d'), STR_TO_DATE(ii.IMPLT_BGNG_YMD, '%Y%m%d'))
ELSE 0
END as impltDaysCnt,
sggCd.CD_NM as sggCdNm
FROM tb_cd_detail impltTaskSe
LEFT OUTER JOIN TB_IMPLT_INFO ii ON ii.IMPLT_TASK_SE_CD = impltTaskSe.CD_ID
AND ii.CRDN_YR = #{crdnYr}
AND ii.CRDN_NO = #{crdnNo}
AND ii.DEL_YN = 'N'
LEFT JOIN tb_cd_detail sggCd ON sggCd.CD_GROUP_ID = 'SGG_CD' AND sggCd.CD_ID = ii.SGG_CD
WHERE impltTaskSe.CD_GROUP_ID = 'IMPLT_TASK_SE_CD'
ORDER BY impltTaskSe.SORT_ORDR ASC
</select>
<!-- ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 쿼리 ==================== -->
<select id="selectImpltTrprInfoHistoryList" parameterType="CrdnImpltTrprInfoVO" resultType="CrdnImpltTrprInfoVO">
/* LevyMapper.selectImpltTrprInfoList : 이행 대상자 정보 목록 조회 */
SELECT
iti.IMPLT_TRPR_INFO_ID AS IMPLT_TRPR_INFO_ID,
iti.SGG_CD,
iti.IMPLT_INFO_ID,
iti.IMPLT_TRPR_FLNM,
iti.IMPLT_TRPR_ADDR,
iti.IMPLT_TRPR_DADDR,
iti.IMPLT_TRPR_ZIP,
iti.IMPLT_TRPR_SE_CD,
MIN(iti.OWNR_ACTR_INFO_ID) as OWNR_ACTR_INFO_ID,
-- 코드성 데이터 조인 (코드명)
impltTrprSe.CD_NM as IMPLT_TRPR_SE_CD_NM,
sggCd.CD_NM as SGG_CD_NM
FROM TB_IMPLT_TRPR_INFO iti
/* 중요로직: 메인 데이터 삭제 시 이행대상자가 조회되지 않도록 INNER JOIN 적용 */
INNER JOIN TB_IMPLT_INFO ii ON iti.IMPLT_INFO_ID = ii.IMPLT_INFO_ID AND ii.DEL_YN = 'N'
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
INNER JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
INNER JOIN tb_act_info act ON act.CRDN_YR = c.CRDN_YR AND act.CRDN_NO = c.CRDN_NO AND act.DEL_YN = 'N' AND act.ACTN_PRCS_STTS_CD != '3'
-- 코드성 데이터 조인
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = iti.IMPLT_TRPR_SE_CD
LEFT JOIN tb_cd_detail sggCd ON sggCd.CD_GROUP_ID = 'SGG_CD' AND sggCd.CD_ID = iti.SGG_CD
WHERE iti.IMPLT_INFO_ID = #{schImpltInfoId}
AND iti.DEL_YN = 'N'
group by iti.SGG_CD, iti.IMPLT_INFO_ID, iti.IMPLT_TRPR_FLNM, iti.IMPLT_TRPR_ADDR, iti.IMPLT_TRPR_DADDR, iti.IMPLT_TRPR_ZIP, iti.IMPLT_TRPR_SE_CD
ORDER BY iti.IMPLT_TRPR_SE_CD, iti.IMPLT_TRPR_FLNM
</select>
</mapper>

@ -0,0 +1,178 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
<!-- 이행정보 이력 팝업 -->
<div class="popup_wrap">
<div class="popup_inner">
<div class="popup_tit">
<h2 class="tit" id="popupTitle">
이행정보 이력
</h2>
<a href="#" class="pop-x-btn modalclose" id="btnCloseTop"></a>
</div>
<div class="popup_con">
<div class="cash_tables">
<table>
<colgroup>
<col style="width: 120px;" />
<col style="width: 120px;" />
<col style="width: 150px;" />
<col />
</colgroup>
<thead>
<tr>
<th>단속 연도</th>
<th>단속 번호</th>
<th>법정동</th>
<th>위치 주소</th>
</tr>
</thead>
<tbody>
<tr>
<td>${crdnYr}</td>
<td>${crdnNo}</td>
<c:choose>
<c:when test="${not empty crdnBasicInfo}">
<td>${crdnBasicInfo.stdgEmdCdNm}</td>
<td class="text-left">
${crdnBasicInfo.lotnoAddr}
<c:if test="${not empty crdnBasicInfo.lotnoMno}">
${crdnBasicInfo.lotnoMno}
<c:if test="${not empty crdnBasicInfo.lotnoSno}">
-${crdnBasicInfo.lotnoSno}
</c:if>
</c:if>
</td>
</c:when>
<c:otherwise>
<td>-</td>
<td>-</td>
</c:otherwise>
</c:choose>
</tr>
</tbody>
</table>
</div>
<!-- 이행정보 이력 목록 -->
<!-- 중요로직: 쿼리에서 LEFT OUTER JOIN으로 모든 이행업무구분 코드를 가져오므로, impltInfoId가 null이면 "등록된 내용없습니다" 표시 -->
<div class="history-list">
<c:forEach var="impltInfo" items="${impltInfoHistoryList}" varStatus="status">
<div class="history-item">
<!-- 이행정보 제목 -->
<h3>
${status.index + 1}. ${impltInfo.impltTaskSeCdNm}
</h3>
<c:choose>
<c:when test="${empty impltInfo.impltInfoId}">
<!-- 등록된 이행정보가 없는 경우 -->
<div class="history-empty-message">
등록된 내용없습니다.
</div>
</c:when>
<c:otherwise>
<!-- 이행정보 상세 -->
<div class="history-detail">
<table class="detail-table">
<tr>
<th>이행 시작일</th>
<td>${dateUtil:formatDateString(impltInfo.impltBgngYmd)}</td>
<th>이행 종료일</th>
<td>${dateUtil:formatDateString(impltInfo.impltEndYmd)}</td>
</tr>
</table>
</div>
<!-- 이행 대상자 목록 -->
<div class="target-person-list">
<h4>
▶ 이행 대상자 목록
</h4>
<c:set var="trprList" value="${impltTrprInfoMap[impltInfo.impltInfoId]}" />
<c:choose>
<c:when test="${empty trprList}">
<div class="target-person-empty">
등록된 이행 대상자가 없습니다.
</div>
</c:when>
<c:otherwise>
<ul>
<c:forEach var="trpr" items="${trprList}" varStatus="trprStatus">
<li class="target-person-item">
<strong>${trprStatus.index + 1}. ${trpr.impltTrprFlnm}</strong>
<span class="target-person-type">(${trpr.impltTrprSeCdNm})</span>
<div class="target-person-detail">
<span>주소: ${trpr.impltTrprZip} ${trpr.impltTrprAddr} ${trpr.impltTrprDaddr}</span>
</div>
</li>
</c:forEach>
</ul>
</c:otherwise>
</c:choose>
</div>
</c:otherwise>
</c:choose>
</div>
</c:forEach>
</div>
</div>
<!-- 팝업 버튼 -->
<div class="popup_foot">
<button type="button" class="newbtns bg2 modalclose" id="btnClose">닫기</button>
</div>
</div>
</div>
<script type="text/javascript">
/**
* 이행정보 이력 팝업 스크립트
* 중요한 로직 주석: 이행정보 이력을 조회하여 표시하는 팝업
*/
(function(window, $) {
'use strict';
var ImpltTaskHistoryPopup = {
/**
* 이벤트 초기화
*/
eventBindEvents: function() {
var self = this;
// 닫기 버튼 이벤트 바인딩
$('.modalclose').on('click', function(e) {
e.preventDefault();
self.cancel();
});
},
/**
* 팝업 취소 처리
* 중요한 로직 주석: 팝업창을 닫는 기능을 제공합니다.
*/
cancel: function() {
window.close();
},
/**
* 초기화
*/
init: function() {
// 이벤트 핸들러 설정
this.eventBindEvents();
}
};
// 초기화 실행
$(document).ready(function() {
ImpltTaskHistoryPopup.init();
});
})(window, jQuery);
</script>

@ -363,6 +363,15 @@
return e.value;
}
},
{
header: '이행정보 이력',
name: 'impltTaskHistoryBtn',
width: 120,
align: 'center',
formatter: function(value) {
return '<span class="btn_unlock badge success" style="cursor:pointer;">이행이력</span>';
}
},
{ header: '처분사전 일자', name: 'dspsBfhdBgngYmd', align: 'center', width: 120,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
@ -478,6 +487,13 @@
if (ev.rowKey !== undefined && ev.rowKey !== null) {
CrdnRegistAndViewList.selectedRow = self.instance.getRow(ev.rowKey);
}
if (ev.columnName === 'impltTaskHistoryBtn') {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
CrdnRegistAndViewList.openImpltTaskHistoryPopup(rowData.crdnYr, rowData.crdnNo);
}
}
});
// 행 더블클릭 이벤트 - detailView 페이지를 새 탭으로 열기
@ -574,6 +590,19 @@
});
},
/**
* 이행정보 이력 팝업을 엽니다.
*
* @param crdnYr 단속 연도
* @param crdnNo 단속 번호
*/
openImpltTaskHistoryPopup: function(crdnYr, crdnNo) {
var url = '<c:url value="/crdn/crndRegistAndView/crdnImpltTaskHistory/impltTaskHistoryPopup.do"/>?crdnYr=' +
encodeURIComponent(crdnYr) + '&crdnNo=' +
encodeURIComponent(crdnNo);
openPopup(url, 1000, 800, 'impltTaskHistoryPopup');
},
/**
* 조치처리상태를 확인하고 미조치(코드 1)인 경우에만 콜백 함수를 실행합니다.
* 중요로직: 팝업 호출 전 미조치(코드 1) 여부를 확인하는 공통 함수
@ -602,10 +631,6 @@
} else {
alert('조치처리상태 확인에 실패했습니다.');
}
},
error: function( xhr, status, error ) {
console.error( error );
alert('조치처리상태 확인 중 오류가 발생했습니다.');
}
});
},

@ -301,4 +301,96 @@
.tab-content.active {
display: block;
}
/* 이행정보 이력 팝업 스타일 */
.history-list {
margin-top: 20px;
}
.history-item {
margin-bottom: 30px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
background-color: #f9f9f9;
}
.history-item h3 {
margin: 0 0 15px 0;
padding-bottom: 10px;
border-bottom: 2px solid #4a90e2;
color: #333;
}
.history-empty-message {
padding: 20px;
text-align: center;
color: #999;
font-style: italic;
background-color: #fafafa;
border-radius: 3px;
}
.history-detail {
margin-bottom: 15px;
}
.detail-table {
width: 100%;
border-collapse: collapse;
}
.detail-table th {
width: 150px;
padding: 8px;
background-color: #f0f0f0;
border: 1px solid #ddd;
text-align: left;
}
.detail-table td {
padding: 8px;
border: 1px solid #ddd;
}
.target-person-list h4 {
margin: 15px 0 10px 0;
color: #555;
font-size: 14px;
font-weight: bold;
}
.target-person-empty {
padding: 10px 20px;
color: #999;
font-style: italic;
}
.target-person-list ul {
list-style: none;
padding: 0;
margin: 0;
}
.target-person-item {
padding: 10px 20px;
border-left: 3px solid #4a90e2;
margin-bottom: 8px;
background-color: #fff;
}
.target-person-type {
color: #666;
margin-left: 10px;
}
.target-person-detail {
margin-top: 5px;
color: #666;
font-size: 13px;
}
.text-left {
text-align: left;
}
Loading…
Cancel
Save