홈페이지 게시판 순서변경
This commit is contained in:
54
sql/MU_CTI_LOG_DDL.sql
Normal file
54
sql/MU_CTI_LOG_DDL.sql
Normal file
@@ -0,0 +1,54 @@
|
||||
-- ============================================
|
||||
-- CTI 통화 로그 테이블 (MariaDB)
|
||||
-- ============================================
|
||||
|
||||
-- CTI 통화 로그 메인 테이블
|
||||
CREATE TABLE IF NOT EXISTS MU_CTI_LOG (
|
||||
MU_CTI_LOG_ID VARCHAR(20) NOT NULL COMMENT 'CTI 로그 ID (PK)',
|
||||
RECORD_NO VARCHAR(50) NULL COMMENT 'CTI 레코드 번호',
|
||||
CID VARCHAR(20) NULL COMMENT '발신자 전화번호',
|
||||
FULLDNIS VARCHAR(20) NULL COMMENT '매장 수신번호 (ARS 대표번호)',
|
||||
BOUND VARCHAR(10) NULL COMMENT '통화방향 (IN/OUT)',
|
||||
MENU_NO VARCHAR(10) NULL COMMENT 'ARS 메뉴 번호',
|
||||
STATE_TYPE VARCHAR(20) NULL COMMENT '상태유형 (start/ringout/link/callback/lms/local)',
|
||||
CTI_STEP VARCHAR(5) NULL COMMENT '통화단계 (1=수신, 2=ring, 3=link, 4=linkend, 5=bend, 98=callback)',
|
||||
LOGINCID VARCHAR(20) NULL COMMENT '상담원 전화번호',
|
||||
C_TYPE1 VARCHAR(20) NULL COMMENT '구분2 (초진/재진)',
|
||||
C_TYPE2 VARCHAR(20) NULL COMMENT '구분3 (상담/상담후예약/회차예약)',
|
||||
CRM_MB_PID VARCHAR(20) NULL COMMENT 'CRM 회원 PID',
|
||||
STORE_PID VARCHAR(20) NULL COMMENT '매장 PID',
|
||||
INCALL_SEL VARCHAR(500) NULL COMMENT 'In Call 선택값 (파이프 구분)',
|
||||
CALL_BACK_CHK CHAR(1) NULL DEFAULT 'N' COMMENT '콜백 확인 여부 (Y/N)',
|
||||
USE_YN CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '사용여부',
|
||||
CUD_FLAG CHAR(1) NULL DEFAULT 'C' COMMENT 'CUD 플래그',
|
||||
REG_ID VARCHAR(20) NULL COMMENT '등록자 ID',
|
||||
REG_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
|
||||
MOD_ID VARCHAR(20) NULL COMMENT '수정자 ID',
|
||||
MOD_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
|
||||
PRIMARY KEY (MU_CTI_LOG_ID)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CTI 통화 로그';
|
||||
|
||||
-- 인덱스
|
||||
CREATE INDEX IDX_MU_CTI_LOG_RECORD_NO ON MU_CTI_LOG (RECORD_NO);
|
||||
CREATE INDEX IDX_MU_CTI_LOG_REG_DATE ON MU_CTI_LOG (REG_DATE);
|
||||
CREATE INDEX IDX_MU_CTI_LOG_CID ON MU_CTI_LOG (CID);
|
||||
CREATE INDEX IDX_MU_CTI_LOG_FULLDNIS ON MU_CTI_LOG (FULLDNIS);
|
||||
CREATE INDEX IDX_MU_CTI_LOG_STORE_PID ON MU_CTI_LOG (STORE_PID);
|
||||
|
||||
|
||||
-- CTI 통화 메모 테이블
|
||||
CREATE TABLE IF NOT EXISTS MU_CTI_TEXT (
|
||||
MU_CTI_TEXT_ID VARCHAR(20) NOT NULL COMMENT 'CTI 메모 ID (PK)',
|
||||
RECORD_NO VARCHAR(50) NULL COMMENT 'CTI 레코드 번호',
|
||||
CALL_MSG TEXT NULL COMMENT '통화 메모 내용',
|
||||
USE_YN CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '사용여부',
|
||||
CUD_FLAG CHAR(1) NULL DEFAULT 'C' COMMENT 'CUD 플래그',
|
||||
REG_ID VARCHAR(20) NULL COMMENT '등록자 ID',
|
||||
REG_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
|
||||
MOD_ID VARCHAR(20) NULL COMMENT '수정자 ID',
|
||||
MOD_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
|
||||
PRIMARY KEY (MU_CTI_TEXT_ID)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CTI 통화 메모';
|
||||
|
||||
-- 인덱스
|
||||
CREATE INDEX IDX_MU_CTI_TEXT_RECORD_NO ON MU_CTI_TEXT (RECORD_NO);
|
||||
@@ -442,6 +442,76 @@ public class ContentsBbsController extends ManagerDraftAction {
|
||||
return HttpUtil.makeHashToJsonModelAndView(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 출력순서 일괄 업데이트
|
||||
*
|
||||
* @param paramMap
|
||||
* @param session
|
||||
* @param request
|
||||
* @param response
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/contentsBbs/updateOrdNo.do")
|
||||
public ModelAndView updateOrdNo(@RequestBody HashMap<String, Object> paramMap, HttpSession session,
|
||||
HttpServletRequest request, HttpServletResponse response) {
|
||||
log.debug("ContentsBbsController updateOrdNo START");
|
||||
|
||||
HashMap<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
StringBuffer errorMsg = new StringBuffer();
|
||||
|
||||
try {
|
||||
if (!webCheckLogin(session)) {
|
||||
return null;
|
||||
} else {
|
||||
paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId")));
|
||||
paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId")));
|
||||
map = contentsBbsService.updateContentsBbsOrdNo(paramMap);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
errorMsg.append(e);
|
||||
} finally {
|
||||
if (Constants.OK == map.get("msgCode")) {
|
||||
|
||||
} else {
|
||||
map.put("msgCode", Constants.FAIL);
|
||||
map.put("success", false);
|
||||
if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
|
||||
map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
HashMap<String, Object> visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request);
|
||||
HashMap<String, Object> insertMap = new HashMap<String, Object>();
|
||||
|
||||
insertMap.put("url", "/contentsBbs/updateOrdNo.do");
|
||||
insertMap.put("func", "updateOrdNo");
|
||||
insertMap.put("funcName", "출력순서 변경");
|
||||
insertMap.put("service", "contentsBbsService");
|
||||
insertMap.put("serviceName", "출력순서 변경");
|
||||
insertMap.put("requestValue", String.valueOf(paramMap));
|
||||
insertMap.put("responseValue", String.valueOf(map));
|
||||
insertMap.put("tId", map.get("tId"));
|
||||
if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null)
|
||||
|| String.valueOf(errorMsg).length() == 0) {
|
||||
insertMap.put("resultCode", "SUCCESS");
|
||||
} else {
|
||||
insertMap.put("resultCode", "ERROR");
|
||||
}
|
||||
insertMap.put("resultMsg", String.valueOf(errorMsg));
|
||||
insertMap.put("muMemberId", paramMap.get("loginMemberId"));
|
||||
|
||||
webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
log.debug("ContentsBbsController updateOrdNo END");
|
||||
return HttpUtil.makeHashToJsonModelAndView(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 시술 정보 리스트 조회 (option)
|
||||
* 시술등록 팝업
|
||||
|
||||
@@ -6,14 +6,24 @@ import java.util.HashMap;
|
||||
|
||||
public interface ContentsBbsService {
|
||||
public HashMap<String, Object> selectListWebTreatmentPetitIntro(HashMap<String, Object> paramMap) throws Exception;
|
||||
|
||||
public HashMap<String, Object> getContentsBbsList(HashMap<String, Object> paramMap) throws Exception;
|
||||
|
||||
public HashMap<String, Object> getContentsBbs(HashMap<String, Object> paramMap) throws Exception;
|
||||
|
||||
public HashMap<String, Object> insertWebTreatmentPetitIntro(HashMap<String, Object> paramMap) throws Exception;
|
||||
public HashMap<String, Object> putContentsBbs(HashMap<String, Object> paramMap, MultipartFile file, MultipartFile content_file) throws Exception;
|
||||
|
||||
public HashMap<String, Object> putContentsBbs(HashMap<String, Object> paramMap, MultipartFile file,
|
||||
MultipartFile content_file) throws Exception;
|
||||
|
||||
public HashMap<String, Object> moveContentsBbs(HashMap<String, Object> paramMap) throws Exception;
|
||||
public HashMap<String, Object> modContentsBbs(HashMap<String, Object> paramMap, MultipartFile file, MultipartFile content_file) throws Exception;
|
||||
|
||||
public HashMap<String, Object> modContentsBbs(HashMap<String, Object> paramMap, MultipartFile file,
|
||||
MultipartFile content_file) throws Exception;
|
||||
|
||||
public HashMap<String, Object> delContentsBbs(HashMap<String, Object> paramMap) throws Exception;
|
||||
|
||||
public HashMap<String, Object> selectListTreatmentOption(HashMap<String, Object> paramMap) throws Exception;
|
||||
|
||||
public HashMap<String, Object> updateContentsBbsOrdNo(HashMap<String, Object> paramMap) throws Exception;
|
||||
}
|
||||
|
||||
@@ -930,4 +930,86 @@ public class ContentsBbsServiceImpl implements ContentsBbsService {
|
||||
log.debug("WebTreatmentPetitServiceImpl selectListTreatmentOption END");
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 출력순서 일괄 업데이트
|
||||
*
|
||||
* @param paramMap
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW)
|
||||
public HashMap<String, Object> updateContentsBbsOrdNo(
|
||||
HashMap<String, Object> paramMap) throws Exception {
|
||||
log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo START");
|
||||
|
||||
HashMap<String, Object> map = new HashMap<String, Object>();
|
||||
|
||||
try {
|
||||
boolean check = true;
|
||||
|
||||
if (true == check) {
|
||||
// 사용자 확인
|
||||
List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
|
||||
int userListMapSize = userListMap.size();
|
||||
|
||||
if (1 == userListMapSize) {
|
||||
paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
|
||||
} else {
|
||||
check = false;
|
||||
map.put("msgCode", Constants.FAIL);
|
||||
map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
if (true == check) {
|
||||
// 권한 조회
|
||||
HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
|
||||
authCheckParamMap.put("menuClass", paramMap.get("menuClass"));
|
||||
authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId"));
|
||||
List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO
|
||||
.selectAuthMenuRelation(authCheckParamMap);
|
||||
int authMenuRelationlistMapSize = authMenuRelationlistMap.size();
|
||||
|
||||
if (1 == authMenuRelationlistMapSize) {
|
||||
if (("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) {
|
||||
|
||||
} else {
|
||||
check = false;
|
||||
map.put("msgCode", Constants.FAIL);
|
||||
map.put("msgDesc", "수정 권한 정보가 없습니다.");
|
||||
}
|
||||
} else {
|
||||
check = false;
|
||||
map.put("msgCode", Constants.FAIL);
|
||||
map.put("msgDesc", "권한 정보가 없습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
if (true == check) {
|
||||
List<Map<String, Object>> orderList = (List<Map<String, Object>>) paramMap.get("orderList");
|
||||
int updCnt = 0;
|
||||
for (Map<String, Object> item : orderList) {
|
||||
HashMap<String, Object> updateParam = new HashMap<String, Object>();
|
||||
updateParam.put("categoryDivCd", paramMap.get("categoryDivCd"));
|
||||
updateParam.put("categoryNo", item.get("categoryNo"));
|
||||
updateParam.put("postNo", item.get("postNo"));
|
||||
updateParam.put("ordNo", item.get("ordNo"));
|
||||
updateParam.put("modId", paramMap.get("loginMemberId"));
|
||||
cmmnDAO.update("ContentsBbsSql.updateContentsBbsOrdNo", updateParam);
|
||||
updCnt++;
|
||||
}
|
||||
map.put("msgCode", Constants.OK);
|
||||
map.put("msgDesc", updCnt + "건 순서가 변경되었습니다.");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
}
|
||||
|
||||
log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo END");
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
,HC.CATEGORY_NO
|
||||
,HCB.THUMBNAIL_BOTTOM_TXT
|
||||
,HCB.HASHTAG
|
||||
,HCB.ORD_NO
|
||||
,DATE_FORMAT(HCB.REG_DATE, '%Y-%m-%d') as REG_DT
|
||||
,MM.NAME as REG_NM
|
||||
,DATE_FORMAT(HCB.EVENT_START_DT, '%Y-%m-%d') as START_DT
|
||||
@@ -65,7 +66,7 @@
|
||||
ORDER BY ${webTreatmentPetitSort}
|
||||
</when>
|
||||
<otherwise>
|
||||
ORDER BY CATEGORY_NO, POST_NO ASC
|
||||
ORDER BY HCB.ORD_NO DESC
|
||||
</otherwise>
|
||||
</choose>
|
||||
LIMIT 18446744073709551615
|
||||
@@ -315,4 +316,16 @@
|
||||
AND HC.CATEGORY_DIV_CD = #{categoryDivCd}
|
||||
ORDER BY HC.CATEGORY_NO ASC
|
||||
</select>
|
||||
|
||||
<update id="updateContentsBbsOrdNo" parameterType="hashmap">
|
||||
/** ContentsBbsSql.updateContentsBbsOrdNo **/
|
||||
UPDATE HP_CONTENTS_BBS
|
||||
SET ORD_NO = #{ordNo}
|
||||
,MOD_ID = #{modId}
|
||||
,MOD_DATE = NOW()
|
||||
WHERE USE_YN = 'Y'
|
||||
AND CATEGORY_DIV_CD = #{categoryDivCd}
|
||||
AND CATEGORY_NO = #{categoryNo}
|
||||
AND POST_NO = #{postNo}
|
||||
</update>
|
||||
</mapper>
|
||||
@@ -391,6 +391,58 @@ function fn_deleteWebTreatmentPetit() {
|
||||
});
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* 출력순서 저장
|
||||
****************************************************************************/
|
||||
function fn_saveOrdNo() {
|
||||
if ("Y" != updateUseYn) {
|
||||
modalEvent.warning("", "수정 권한이 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
let orderList = [];
|
||||
let totalRows = webTreatmentPetitGridOptions.api.getDisplayedRowCount();
|
||||
|
||||
for (let i = 0; i < totalRows; i++) {
|
||||
let rowNode = webTreatmentPetitGridOptions.api.getDisplayedRowAtIndex(i);
|
||||
orderList.push({
|
||||
categoryNo: rowNode.data.categoryNo,
|
||||
postNo: rowNode.data.postNo,
|
||||
ordNo: totalRows - i // 상단이 큰 값 (DESC 정렬)
|
||||
});
|
||||
}
|
||||
|
||||
modalEvent.info("순서저장", "변경된 출력순서를 저장하시겠습니까?", function () {
|
||||
let data = {
|
||||
menuClass: menuClass,
|
||||
categoryDivCd: categoryDivCd,
|
||||
orderList: orderList
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url: encodeURI('/contentsBbs/updateOrdNo.do'),
|
||||
data: JSON.stringify(data),
|
||||
dataType: "json",
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
type: 'POST',
|
||||
async: true,
|
||||
success: function (data) {
|
||||
if ('0' == data.msgCode) {
|
||||
modalEvent.success("순서저장 성공", data.msgDesc, function () {
|
||||
$("#btnSaveOrdNo").prop("disabled", true).css("opacity", "0.5");
|
||||
fn_selectListWebTreatmentPetitJson();
|
||||
});
|
||||
} else {
|
||||
modalEvent.danger("순서저장 오류", data.msgDesc);
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
modalEvent.danger("순서저장 오류", "순서 저장 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* 검색 엔터 이벤트
|
||||
****************************************************************************/
|
||||
@@ -504,7 +556,7 @@ function fn_updateWebTreatmentPetitIntro(postNo, categoryNo) {
|
||||
|
||||
|
||||
let webTreatmentPetitColumnDefs = [
|
||||
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, headerCheckboxSelection: true, checkboxSelection: true },
|
||||
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, rowDrag: true, headerCheckboxSelection: true, checkboxSelection: true },
|
||||
{ field: "rowNum", headerName: "번호", minWidth: 60, maxWidth: 60, sortable: false, cellStyle: { textAlign: 'center' } },
|
||||
{ field: "categoryNm", headerName: "카테고리", minWidth: 120, maxWidth: 130, cellStyle: { textAlign: 'center' } },
|
||||
{ field: "title", headerName: "제목", minWidth: 150, cellStyle: { cursor: 'pointer', color: '#3985EA' } },
|
||||
@@ -517,7 +569,7 @@ let webTreatmentPetitColumnDefs = [
|
||||
console.log('Current categoryDivCd:', categoryDivCd);
|
||||
if (categoryDivCd === '02' || categoryDivCd === '04') {
|
||||
webTreatmentPetitColumnDefs = [
|
||||
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, headerCheckboxSelection: true, checkboxSelection: true },
|
||||
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, rowDrag: true, headerCheckboxSelection: true, checkboxSelection: true },
|
||||
{ field: "rowNum", headerName: "번호", minWidth: 60, maxWidth: 60, sortable: false, cellStyle: { textAlign: 'center' } },
|
||||
{ field: "categoryNm", headerName: "카테고리", minWidth: 120, maxWidth: 130, cellStyle: { textAlign: 'center' } },
|
||||
{ field: "title", headerName: "제목", minWidth: 150, cellStyle: { cursor: 'pointer', color: '#3985EA' } },
|
||||
@@ -533,6 +585,8 @@ if (categoryDivCd === '02' || categoryDivCd === '04') {
|
||||
// let the grid know which columns and what data to use
|
||||
let webTreatmentPetitGridOptions = {
|
||||
suppressRowTransform: true,
|
||||
rowDragManaged: true,
|
||||
animateRows: true,
|
||||
columnDefs: webTreatmentPetitColumnDefs,
|
||||
defaultColDef: { // 리스트 기본 설정
|
||||
flex: 1,
|
||||
@@ -562,6 +616,10 @@ let webTreatmentPetitGridOptions = {
|
||||
fn_updateWebTreatmentPetitIntro(cell.data.postNo, cell.data.categoryNo);
|
||||
}
|
||||
},
|
||||
onRowDragEnd: function (event) {
|
||||
// 드래그 완료 시 순서저장 버튼 활성화
|
||||
$("#btnSaveOrdNo").prop("disabled", false).css("opacity", "1");
|
||||
},
|
||||
onSelectionChanged: function (treatmentpetit) { //체크박스 선택
|
||||
delList = treatmentpetit.api.getSelectedRows();
|
||||
console.log(delList);
|
||||
@@ -679,6 +737,11 @@ function fn_pageTreatmentPetit() {
|
||||
fn_deleteWebTreatmentPetit();
|
||||
});
|
||||
|
||||
// 순서저장 버튼
|
||||
$("#btnSaveOrdNo").click(function () {
|
||||
fn_saveOrdNo();
|
||||
});
|
||||
|
||||
// 기간 선택 콤보 이벤트
|
||||
const target = $("#webTreatmentPetitSearchDateType").siblings("ul.select_option_list");
|
||||
target.find("li.option_list_item").click(function () {
|
||||
|
||||
@@ -73,6 +73,10 @@
|
||||
</div>
|
||||
|
||||
<div class="right_btn_box">
|
||||
<button id="btnSaveOrdNo" class="treatmentpetit_btn" disabled
|
||||
style="opacity: 0.5; margin-right: 5px;">
|
||||
<img src="/image/web/notice_btn_icon.svg" alt="순서저장">순서저장
|
||||
</button>
|
||||
<button id="btnInsertWebTreatmentPetit" class="treatmentpetit_btn">
|
||||
<img src="/image/web/notice_btn_icon.svg" alt="등록">등록
|
||||
</button>
|
||||
@@ -98,7 +102,7 @@
|
||||
</th:block>
|
||||
<th:block layout:fragment="layout_script">
|
||||
<script src="/js/web/ag-grid-community-29.3.5.min.js"></script>
|
||||
<script src="/js/web/contentsBbs/ContentsBbsSelectList.js?v=3"></script>
|
||||
<script src="/js/web/contentsBbs/ContentsBbsSelectList.js?v=4"></script>
|
||||
</th:block>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user