2023-11-16 12:47 청소년 강사 배정 수정

This commit is contained in:
myname 2023-11-16 12:47:42 +09:00
parent 4ddbeb511b
commit f65fe4ca05
9 changed files with 252 additions and 8 deletions

View File

@ -18,6 +18,8 @@ import kcc.com.cmm.service.FileVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.com.utl.user.service.CheckLoginUtil;
import kcc.let.utl.fcc.service.EgovCryptoUtil;
import kcc.ve.adv.tngr.stngInfo.service.VEAStngService;
import kcc.ve.adv.tngr.stngInfo.service.VEAStngVO;
import kcc.ve.cmm.VeConstants;
import kcc.ve.instr.tngrVisitEdu.asgnmInfo.service.VEAsgnmMIXService;
import kcc.ve.instr.tngrVisitEdu.asgnmInfo.service.VEEduChasiInstrAsgnmService;
@ -80,6 +82,10 @@ public class CommonWebController {
@Resource(name = "vEEduChasiInstrAsgnmService")
private VEEduChasiInstrAsgnmService vEEduChasiInstrAsgnmService;
//강의설정
@Resource(name = "vEAStngService")
private VEAStngService vEAStngService;
@RequestMapping("/popup/searchBeforeContent.do")
public String searchBeforeContentPopup(@ModelAttribute("vEEduAplctVO") VEEduAplctVO vEEduAplctVO, ModelMap model, HttpServletRequest request) throws Exception{
@ -1303,6 +1309,7 @@ public class CommonWebController {
//VEEduAplctVO tChasiInfo = vEEduAplctVOList.get(i);
String s_eduHopeDt = p_tChasiInfo.getEduHopeDt(); //교육희망일자
String s_eduSlctCd = p_tChasiInfo.getEduSlctCd(); //온라인 10, 오프라인 20
//String s_addr = tChasiInfo.getAddr(); //지역명
System.out.println(s_eduHopeDt);
@ -1330,6 +1337,9 @@ public class CommonWebController {
vEInstrAssiEduAplctVOList = vEAutoAsgnmMIXService.selectInstrMntAsgnmtChasiList(vEAutoAsgnmVO);
//step2-2.희망 지역 강사 검색()
//오프라인, 온라인 구분해서 희망 지역 체크가 필요하다.
//오프라인의 경우 ()
//온라인인 경우 (해당 강사의 zoom 가능 여부 체크)
for (int j=0;j<vEInstrAssiEduAplctVOList.size();j++) {
s_user_id = s_user_id + ",'" + vEInstrAssiEduAplctVOList.get(j).getUserId()+"'";
@ -1340,7 +1350,14 @@ public class CommonWebController {
System.out.println("===////step2-2.희망 지역 강사 검색(필)===");
vEAutoAsgnmVO.setUserIds(s_user_id);
if("10".equals(s_eduSlctCd)) { //온라인인 경우
vEInstrAssiEduAplctVOList = vEAutoAsgnmMIXService.selectInstrHopeAreaZoomList(vEAutoAsgnmVO);
}else {//오프라인인 경우
vEInstrAssiEduAplctVOList = vEAutoAsgnmMIXService.selectInstrHopeAreaList(vEAutoAsgnmVO);
}
}else {
System.out.println("===X없음===");
}
@ -1354,8 +1371,48 @@ public class CommonWebController {
//step3-2.연강가능여부(같은날 연강은 연강강사가 우선 배정)
//step3-3.패널티(패널티 없는 사람이 우선순위 높게)
/*
* 하기 테이블을 left outer 조인하고, 우선 순위에 적용해서 배정(order by)
* 패널티 1순위
* 연강 2순위
* 거주지 3순위
*/
//패널티 사용
/*
* 패널티 적용여부 확인
*
* 안사용하면 skip
* 사용하는 경우
*
* 하기 테이블 조인하고, 우선 조건으로 패널티 적용(order by )
*
* */
VEAStngVO vEAStngVO = new VEAStngVO();
vEAStngVO.setAsgnmCd("10");
vEAStngVO = vEAStngService.selectDetail_VEAIAC(vEAStngVO);
String s_pnltyQuery = "";
if ("Y".equals(vEAStngVO.getUseYn())) {
s_pnltyQuery = " LEFT OUTER JOIN "
+ " ( "
+ " SELECT a.user_id AS userId "
+ " , count(*) AS pnltyCnt "
+ " FROM ve_edu_pnlty a "
+ " GROUP BY a.user_id "
+ " )bbb "
+ " ON "
+ " ( "
+ " aaa.user_id = bbb.userId "
+ " ) ";
}
//step3-4.월별시수대비할당이적은자 우선()
String s_orderByQuery = " aaa.instrSumChasi*10000/(aaa.asgnmTm+1) asc ";
s_user_id = "'aaa'";
for (int j=0;j<vEInstrAssiEduAplctVOList.size();j++) {
s_user_id = s_user_id + ",'" + vEInstrAssiEduAplctVOList.get(j).getUserId()+"'";
@ -1366,10 +1423,71 @@ public class CommonWebController {
System.out.println("===//step3-4.월별시수대비할당이적은자 우선(필)===");
vEAutoAsgnmVO.setUserIds(s_user_id);
//패널티 쿼리 적용
if (!"".equals(s_pnltyQuery)) {
vEAutoAsgnmVO.setPnltyQuery(s_pnltyQuery);
s_orderByQuery = " NVL(bbb.pnltyCnt,0) asc, " + s_orderByQuery;
}else {
vEAutoAsgnmVO.setPnltyQuery("");
}
//기본 정렬 쿼리 - 월별시수대비할당이적은자
vEAutoAsgnmVO.setOrderByQuery(" ORDER BY "+s_orderByQuery);
vEInstrAssiEduAplctVOList = vEAutoAsgnmMIXService.selectInstrPriorityList(vEAutoAsgnmVO);
}else {
System.out.println("===X없음===");
}
/*
SELECT a.user_id AS userId
, count(*) AS pnltyCnt
FROM ve_edu_pnlty a
GROUP BY a.user_id
*/
/*
* 연강 적용여부 확인
*
* 안사용하면 skip
* 사용하는 경우
*
*1.해당 차시의 연강여부 확인
**3.1-2연강이 아니면 해당 조건 skip
*
*2.1-1연강이면 연강이 가능한 강사를 우선 배정
* 연강 가능 강사중 연강 차시에 기존 배정이 있으면 해당 강사 배정
*
* 없으면 연강 강사중에 배정
*
* 결과 테이블 만들어서 조인하고, 우선 조건으로 연강 적용(order by )
*
*/
/*
* 거주지 강사 우선
*
* 거주지 적용여부 확인
*
* 안사용하면 skip
* 사용하는 경우
*
* 1.거주지로 해당 차시 지역 비교 하여 맞는 강사 검색
* 없으면 skip
*
* 2.해당 강사 본인 배정 비율 확인해서 넘으면 제거
* 없으면 skip
*
* 결과 테이블 만들어서 조인하고, 우선 조건으로 연강 적용(order by )
*
*/
}

View File

@ -13,6 +13,8 @@ public interface VEAutoAsgnmMIXService {
//step2-2.희망 지역 강사 검색()
List<VEAutoAsgnmVO> selectInstrHopeAreaList(VEAutoAsgnmVO paramVO) throws Exception;
//step2-2.희망 지역-온리인으로 zoom여부 확인 강사 검색()
List<VEAutoAsgnmVO> selectInstrHopeAreaZoomList(VEAutoAsgnmVO paramVO) throws Exception;
//step3-1.월별시수대비할당이적은자 우선()
List<VEAutoAsgnmVO> selectInstrPriorityList(VEAutoAsgnmVO paramVO) throws Exception;

View File

@ -73,6 +73,43 @@ public class VEAutoAsgnmVO extends ComDefaultVO implements Serializable {
private String mIscSum; //받은 시간
private String pnltyQuery; //배정을 위한 패널티 쿼리
private String rsdncQuery; //배정을 위한 거주지 우선 쿼리
private String cntnsQuery; //배정을 위한 연강 쿼리
private String orderByQuery; //배정을 위한 우선 순위 order by 쿼리
public String getPnltyQuery() {
return pnltyQuery;
}
public void setPnltyQuery(String pnltyQuery) {
this.pnltyQuery = pnltyQuery;
}
public String getRsdncQuery() {
return rsdncQuery;
}
public void setRsdncQuery(String rsdncQuery) {
this.rsdncQuery = rsdncQuery;
}
public String getCntnsQuery() {
return cntnsQuery;
}
public void setCntnsQuery(String cntnsQuery) {
this.cntnsQuery = cntnsQuery;
}
public String getOrderByQuery() {
return orderByQuery;
}
public void setOrderByQuery(String orderByQuery) {
this.orderByQuery = orderByQuery;
}
public String getEduHopeMnt() {
return eduHopeMnt;

View File

@ -28,6 +28,12 @@ public class VEAutoAsgnmMIXDAO extends EgovAbstractDAO {
return tlist;
}
public List<VEAutoAsgnmVO> selectInstrHopeAreaZoomList(VEAutoAsgnmVO paramVO) {
@SuppressWarnings("unchecked")
List<VEAutoAsgnmVO> tlist = (List<VEAutoAsgnmVO>) list("VEAutoAsgnmDAO.selectInstrHopeAreaZoomList", paramVO);
return tlist;
}
public List<VEAutoAsgnmVO> selectInstrPriorityList(VEAutoAsgnmVO paramVO) {
@SuppressWarnings("unchecked")
List<VEAutoAsgnmVO> tlist = (List<VEAutoAsgnmVO>) list("VEAutoAsgnmDAO.selectInstrPriorityList", paramVO);

View File

@ -33,6 +33,11 @@ public class VEAutoAsgnmMIXServiceImpl implements VEAutoAsgnmMIXService {
return vEAutoAsgnmMIXDAO.selectInstrHopeAreaList(paramVO);
}
@Override
public List<VEAutoAsgnmVO> selectInstrHopeAreaZoomList(VEAutoAsgnmVO paramVO) throws Exception{
return vEAutoAsgnmMIXDAO.selectInstrHopeAreaZoomList(paramVO);
}
@Override
public List<VEAutoAsgnmVO> selectInstrPriorityList(VEAutoAsgnmVO paramVO) throws Exception{
return vEAutoAsgnmMIXDAO.selectInstrPriorityList(paramVO);

View File

@ -570,6 +570,51 @@
GROUP BY aaaaa.userId
</select>
<!-- //step2-2.희망 지역 온라인은 zoom 여부 확읻ㄴ 강사 검색(필) L page -->
<select id="VEAutoAsgnmDAO.selectInstrHopeAreaZoomList" parameterClass="VEAutoAsgnmVO" resultClass="VEAutoAsgnmVO" remapResults="true">
/* VEAutoAsgnmDAO.selectInstrHopeAreaZoomList */
/* 교육가능한(위촉상태) 청소년 강사의 줌 가능 여부 확인 */
SELECT a.instr_div AS instrDiv,
a.user_id AS userId,
a.rsdne AS rsdne,
a.hope_edu_fld AS hopeEduFld,
b.zoom_yn AS zoomYn
FROM ( SELECT COUNT(1) OVER() AS totCnt ,
a0.instr_div AS instrDiv ,
a0.user_id AS userId ,
a0.instr_detail_ord AS instrDetailOrd
FROM ve_instr b0 ,
ve_instr_detail a0
WHERE 1 =1
AND a0.sbmt_yn='Y'
AND a0.use_yn = 'Y'
AND a0.user_id IN ($userIds$)
GROUP BY a0.instr_div ,
a0.user_id ,
a0.instr_detail_ord
)
a00 ,
ve_instr_detail a
, ve_lctr_stng b
WHERE 1 =1
AND a00.instrDiv =a.instr_div
AND a00.userId =a.user_id
AND a00.instrDetailOrd=a.instr_detail_ord
AND
(
a.qlfct_end_yn = 'N' OR a.qlfct_end_yn IS NULL
)
AND a.instr_div='10'
AND a.user_id=b.user_id
AND b.use_yn='Y'
AND NVL(b.zoom_yn,'N')='Y'
</select>
<!-- //step3-1.월별시수대비할당이적은자 우선(필) L page -->
<select id="VEAutoAsgnmDAO.selectInstrPriorityList" parameterClass="VEAutoAsgnmVO" resultClass="VEAutoAsgnmVO" remapResults="true">
/* VEAutoAsgnmDAO.selectInstrPriorityList */
@ -636,7 +681,18 @@
WHERE aa.yr=#yr#
AND aa.user_id IN ($userIds$)
)aaa
/* 패널티 적용시 쿼리 추가됨 - 시작 */
$pnltyQuery$
/* 패널티 적용시 쿼리 추가됨 - 끝 */
WHERE 1=1
/*
ORDER BY aaa.instrSumChasi*10000/(aaa.asgnmTm+1) asc
*/
$orderByQuery$
</select>
<!-- //월별 교육시간 배정 정보 L page -->

View File

@ -2441,6 +2441,7 @@
SELECT b.edu_aplct_ord AS eduAplctOrd
, b.edu_chasi_ord AS eduChasiOrd
, b.edu_hope_dt AS eduHopeDt
, a.EDU_SLCT_CD AS eduSlctCd /* 온라인 10, 오프라인 20 */
from ve_edu_aplct a
, ve_edu_chasi b
, (

View File

@ -926,7 +926,7 @@
<!-- 강사 디테일 정보 L page -->
<select id="VEInstrMixDAO.selectPagingDetailList4Asgnm" parameterClass="VEInstrDetailVO" resultClass="VEInstrDetailVO">
/* VEInstrMixDAO.selectPagingDetailList4Asgnm */
/* VEInstrMixDAO.selectPagingDetailList4Asgnm 현재 강사들의 일별 가능 수 파악 */
SELECT totCnt
, sum(decode(workWeekCnt,5,1,0)) AS day5cnt
, sum(decode(workWeekCnt,4,1,0)) AS day4cnt

View File

@ -116,7 +116,27 @@
<!-- 강사 월별 시수 관리 데이터 -->
<select id="VEAAsgnmStngMixDAO.selectList_VEAIMT_2" parameterClass="VEAStngVO" resultClass="int">
/* VEAAsgnmStngMixDAO.selectList_VEAIMT_2 */
/* VEAAsgnmStngMixDAO.selectList_VEAIMT_2 신청회차나 년도에 관계없이 실재 해당 년월의 배정가능한 차시를 계산한다. */
SELECT
sum(b.chasi) AS chasi
FROM
ve_edu_aplct a
, ve_edu_chasi b
WHERE 1=1
AND a.edu_aplct_ord =b.edu_aplct_ord
AND NVL(a.USE_YN, 'Y') <![CDATA[ <> ]]> 'N'
AND a.LCTR_DIV_CD = '10'
AND a.aprvl_cd = '60'
AND substring(b.edu_hope_dt,1,7)=#mnt#
GROUP BY substring(b.edu_hope_dt,1,7)
</select>
<!-- 강사 월별 시수 관리 데이터 -->
<select id="VEAAsgnmStngMixDAO.selectList_VEAIMT_2_bak" parameterClass="VEAStngVO" resultClass="int">
/* VEAAsgnmStngMixDAO.selectList_VEAIMT_2_bak 신청회차나 년도에 관계없이 실재 해당 년월의 배정가능한 차시를 계산한다. */
SELECT
/*
@ -137,7 +157,6 @@
GROUP BY substring(b.edu_hope_dt,1,7)
</select>
<!-- 강사별 월별 시수 관리 대상 강사 리스트 -->
<select id="VEAAsgnmStngMixDAO.selectList_VEAIIMT_1" parameterClass="VEAStngVO" resultClass="VEAStngVO">
/* VEAAsgnmStngMixDAO.selectList_VEAIIMT_1 */