diff --git a/src/main/java/com/madeu/crm/settings/medicalcategory/dto/MedicalCategoryDTO.java b/src/main/java/com/madeu/crm/settings/medicalcategory/dto/MedicalCategoryDTO.java index cb028cc..b6c179b 100644 --- a/src/main/java/com/madeu/crm/settings/medicalcategory/dto/MedicalCategoryDTO.java +++ b/src/main/java/com/madeu/crm/settings/medicalcategory/dto/MedicalCategoryDTO.java @@ -42,6 +42,9 @@ public class MedicalCategoryDTO { // 단가 private Double kindCost; + // 할인가 + private Double dcCost; + // 제품설명 private String kindMsg1; diff --git a/src/main/resources/mappers/crm/settings/medicalcategory/MedicalCategoryMapper.xml b/src/main/resources/mappers/crm/settings/medicalcategory/MedicalCategoryMapper.xml index 2f97af4..65c3ad9 100644 --- a/src/main/resources/mappers/crm/settings/medicalcategory/MedicalCategoryMapper.xml +++ b/src/main/resources/mappers/crm/settings/medicalcategory/MedicalCategoryMapper.xml @@ -16,6 +16,7 @@ a.divi_sort, a.cust_list_pid, a.kind_cost, + a.dc_cost, a.kind_msg1, a.kind_msg2, a.kind_unit, @@ -60,6 +61,7 @@ a.divi_sort, a.cust_list_pid, a.kind_cost, + a.dc_cost, a.kind_msg1, a.kind_msg2, a.kind_unit, @@ -102,6 +104,7 @@ divi_sort, cust_list_pid, kind_cost, + dc_cost, kind_msg1, kind_msg2, kind_unit, @@ -130,6 +133,7 @@ IFNULL(#{diviSort}, 0), IFNULL(#{custListPid}, 0), IFNULL(#{kindCost}, 0), + IFNULL(#{dcCost}, 0), IFNULL(#{kindMsg1}, ''), IFNULL(#{kindMsg2}, ''), IFNULL(#{kindUnit}, ''), @@ -184,6 +188,9 @@ kind_cost = #{kindCost}, + + dc_cost = #{dcCost}, + kind_msg1 = #{kindMsg1}, diff --git a/src/main/resources/static/js/web/settings/medicalcategory/medicalCategoryList.js b/src/main/resources/static/js/web/settings/medicalcategory/medicalCategoryList.js index c98f3c5..9faa144 100644 --- a/src/main/resources/static/js/web/settings/medicalcategory/medicalCategoryList.js +++ b/src/main/resources/static/js/web/settings/medicalcategory/medicalCategoryList.js @@ -1,7 +1,7 @@ /** * 통합 진료유형 관리 (medicalCategoryList.js) * - medical_divi_list 테이블 기반 - * - Depth 1(진료과목 select) → Depth 2/3/4 (Tabulator 그리드) + * - Depth 1(진료과목 select) → Depth 2/3/4/5 (Tabulator 그리드) */ $(document).ready(function () { let globalTreeData = []; @@ -9,6 +9,7 @@ $(document).ready(function () { let table2 = null; let table3 = null; let table4 = null; + let table5 = null; let tableOverview = null; let overviewInitialized = false; @@ -139,29 +140,45 @@ $(document).ready(function () { { title: "명칭", field: "divi_name", formatter: categoryNameFormatter, tooltip: true }, { title: "순서", field: "divi_sort", width: 38, hozAlign: "center", cssClass: "col-sm" }, { title: "하위", width: 50, hozAlign: "center", headerSort: false, formatter: function (c) { return addDescendantFormatter(c, 2); }, cellClick: function (e, cell) { e.stopPropagation(); var d = cell.getRow().getData(); addChildCategory(d.pid, 3, d.divi_name); } } - ] + ], + placeholder: "진료유형을 선택하세요." })); - // Depth 3 Grid - 순번, 명칭, 거래처, 담당자(연락처), 단가, 순서, 하위 + // Depth 3 Grid (제품) - 순번, 명칭, 거래처, 담당자(연락처), 단가, 순서, 하위 table3 = new Tabulator("#gridDepth3", Object.assign({}, commonOpts, { columns: [ { title: "순번", formatter: "rownum", width: 38, hozAlign: "center", headerSort: false, cssClass: "col-sm" }, { title: "명칭", field: "divi_name", formatter: categoryNameFormatter, tooltip: true }, - { title: "거래처", field: "cust_name", width: 90, hozAlign: "center", tooltip: true }, - { title: "담당자(연락처)", field: "cust_contact", width: 110, hozAlign: "center", tooltip: true }, - { title: "단가", field: "kind_cost", width: 80, hozAlign: "right", formatter: costFormatter }, + // { title: "거래처", field: "cust_name", width: 90, hozAlign: "center", tooltip: true }, + // { title: "담당자(연락처)", field: "cust_contact", width: 110, hozAlign: "center", tooltip: true }, + // { title: "단가", field: "kind_cost", width: 80, hozAlign: "right", formatter: costFormatter }, { title: "순서", field: "divi_sort", width: 38, hozAlign: "center", cssClass: "col-sm" }, { title: "하위", width: 50, hozAlign: "center", headerSort: false, formatter: function (c) { return addDescendantFormatter(c, 3); }, cellClick: function (e, cell) { e.stopPropagation(); var d = cell.getRow().getData(); addChildCategory(d.pid, 4, d.divi_name); } } - ] + ], + placeholder: "진료유형을 선택하세요." })); - // Depth 4 Grid - 순번, 명칭, 순서 (하위 없음) + // Depth 4 Grid (용량/출력) - 순번, 명칭, 단가, 할인가, 순서, 하위 table4 = new Tabulator("#gridDepth4", Object.assign({}, commonOpts, { + columns: [ + { title: "순번", formatter: "rownum", width: 38, hozAlign: "center", headerSort: false, cssClass: "col-sm" }, + { title: "명칭", field: "divi_name", formatter: categoryNameFormatter, tooltip: true }, + { title: "단가", field: "kind_cost", width: 80, hozAlign: "right", formatter: costFormatter }, + { title: "할인가", field: "dc_cost", width: 80, hozAlign: "right", formatter: costFormatter }, + { title: "순서", field: "divi_sort", width: 38, hozAlign: "center", cssClass: "col-sm" }, + { title: "하위", width: 50, hozAlign: "center", headerSort: false, formatter: function (c) { return addDescendantFormatter(c, 4); }, cellClick: function (e, cell) { e.stopPropagation(); var d = cell.getRow().getData(); addChildCategory(d.pid, 5, d.divi_name); } } + ], + placeholder: "제품/시술을 선택하세요." + })); + + // Depth 5 Grid (부위) - 순번, 명칭, 순서 (최하위, 하위 없음) + table5 = new Tabulator("#gridDepth5", Object.assign({}, commonOpts, { columns: [ { title: "순번", formatter: "rownum", width: 38, hozAlign: "center", headerSort: false, cssClass: "col-sm" }, { title: "명칭", field: "divi_name", formatter: categoryNameFormatter, tooltip: true }, { title: "순서", field: "divi_sort", width: 38, hozAlign: "center", cssClass: "col-sm" } - ] + ], + placeholder: "용량을 선택하세요." })); // Shift+Click 범위 선택을 위한 마지막 클릭 행 추적 @@ -200,6 +217,7 @@ $(document).ready(function () { table2.on("rowClick", function (e, row) { handleRowClick(e, row, table2, 2); }); table3.on("rowClick", function (e, row) { handleRowClick(e, row, table3, 3); }); table4.on("rowClick", function (e, row) { handleRowClick(e, row, table4, 4); }); + table5.on("rowClick", function (e, row) { handleRowClick(e, row, table5, 5); }); function onCellDblClick(e, cell) { @@ -210,10 +228,12 @@ $(document).ready(function () { table2.on("cellDblClick", onCellDblClick); table3.on("cellDblClick", onCellDblClick); table4.on("cellDblClick", onCellDblClick); + table5.on("cellDblClick", onCellDblClick); table2.on("rowContext", onRowContextMenu); table3.on("rowContext", onRowContextMenu); table4.on("rowContext", onRowContextMenu); + table5.on("rowContext", onRowContextMenu); window.loadData(); } @@ -277,15 +297,30 @@ $(document).ready(function () { } }); table4.setData([]); + table5.setData([]); $("#btnArea3").html(''); $("#btnArea4").empty(); + $("#btnArea5").empty(); } else if (depth === 3) { table4.setData(children).then(function () { if (currentState && currentState.depth4) { table4.selectRow(currentState.depth4); + let selectedRows = table4.getSelectedRows(); + if (selectedRows && selectedRows.length > 0) { + clickRow(selectedRows[0], 4, currentState); + } } }); + table5.setData([]); $("#btnArea4").html(''); + $("#btnArea5").empty(); + } else if (depth === 4) { + table5.setData(children).then(function () { + if (currentState && currentState.depth5) { + table5.selectRow(currentState.depth5); + } + }); + $("#btnArea5").html(''); } } @@ -312,10 +347,12 @@ $(document).ready(function () { let selected2 = table2.getSelectedData()[0]; let selected3 = table3.getSelectedData()[0]; let selected4 = table4.getSelectedData()[0]; + let selected5 = table5.getSelectedData()[0]; if (selected2) currentState.depth2 = selected2.pid; if (selected3) currentState.depth3 = selected3.pid; if (selected4) currentState.depth4 = selected4.pid; + if (selected5) currentState.depth5 = selected5.pid; } $.ajax({ @@ -370,9 +407,11 @@ $(document).ready(function () { table2.setData([]); table3.setData([]); table4.setData([]); + table5.setData([]); $("#btnArea2").empty(); $("#btnArea3").empty(); $("#btnArea4").empty(); + $("#btnArea5").empty(); if (tableOverview) tableOverview.setData([]); return; @@ -460,9 +499,11 @@ $(document).ready(function () { table2.setData([]); table3.setData([]); table4.setData([]); + table5.setData([]); $("#btnArea2").empty(); $("#btnArea3").empty(); $("#btnArea4").empty(); + $("#btnArea5").empty(); return; } @@ -471,8 +512,10 @@ $(document).ready(function () { table3.setData([]); table4.setData([]); + table5.setData([]); $("#btnArea3").empty(); $("#btnArea4").empty(); + $("#btnArea5").empty(); if (node && node._children) { table2.setData(node._children).then(function () { diff --git a/src/main/resources/static/js/web/settings/medicalcategory/popup/medicalCategoryInfoPop.js b/src/main/resources/static/js/web/settings/medicalcategory/popup/medicalCategoryInfoPop.js index 3e5d4ba..8512259 100644 --- a/src/main/resources/static/js/web/settings/medicalcategory/popup/medicalCategoryInfoPop.js +++ b/src/main/resources/static/js/web/settings/medicalcategory/popup/medicalCategoryInfoPop.js @@ -14,8 +14,8 @@ $(document).ready(function () { bindEvents(); - // 뎁스3이면 거래처 목록을 로드한 뒤 폼 초기화를 진행 - if (diviDept === '3' || mode === 'edit') { + // 뎁스3 또는 4이면 거래처 목록을 로드한 뒤 폼 초기화를 진행 + if (diviDept === '3' || diviDept === '4' || mode === 'edit') { loadCustList().then(function () { initForm(); applyDepthUI(); @@ -35,6 +35,7 @@ $(document).ready(function () { $("#trNoTax1").hide(); } + // Depth 3: 제품/시술 정보 (거래처, 제품설명, 기타설명) if (currentDept == '3') { $("#productInfoTitle").show(); $("#productInfoTable").show(); @@ -42,6 +43,15 @@ $(document).ready(function () { $("#productInfoTitle").hide(); $("#productInfoTable").hide(); } + + // Depth 4: 용량/출력 정보 (단가, 할인가, 단위, 비율) + if (currentDept == '4') { + $("#volumeInfoTitle").show(); + $("#volumeInfoTable").show(); + } else { + $("#volumeInfoTitle").hide(); + $("#volumeInfoTable").hide(); + } } // 거래처 셀렉트 박스 세팅 @@ -68,9 +78,22 @@ $(document).ready(function () { }); } + // Depth별 타이틀 매핑 + var depthTitleMap = { + '1': '진료과목', + '2': '진료유형', + '3': '제품/시술', + '4': '용량/출력', + '5': '부위' + }; + + function getDepthTitle(dept) { + return depthTitleMap[dept] || '진료유형'; + } + function initForm() { if (mode === 'add') { - $("#popTitle").text((diviDept == '1' ? '최상위 ' : '') + '진료유형 신규 등록'); + $("#popTitle").text(getDepthTitle(diviDept) + ' 신규 등록'); $("#pid").val(''); $("#diviDept").val(diviDept); $("#diviParent").val(diviParent); @@ -81,7 +104,7 @@ $(document).ready(function () { $("#parentNameTxt").text(parentName); } } else if (mode === 'edit') { - $("#popTitle").text('진료유형 정보 수정'); + $("#popTitle").text(getDepthTitle(diviDept) + ' 정보 수정'); $("#pid").val(pid); $("#btn_delete").show(); loadDetail(pid); @@ -107,6 +130,7 @@ $(document).ready(function () { $("#custListPid").val(data.cust_list_pid); } $("#kindCost").val(data.kind_cost || 0); + $("#dcCost").val(data.dc_cost || 0); $("#kindUnit").val(data.kind_unit || ''); $("#kindUnitVol").val(data.kind_unit_vol || 0); $("#kindUnit2").val(data.kind_unit2 || ''); @@ -207,6 +231,7 @@ $(document).ready(function () { // 단가/제품 정보 custListPid: parseInt($("#custListPid").val() || "0", 10), kindCost: parseFloat($("#kindCost").val() || "0"), + dcCost: parseFloat($("#dcCost").val() || "0"), kindUnit: $("#kindUnit").val(), kindUnitVol: parseFloat($("#kindUnitVol").val() || "0"), kindUnit2: $("#kindUnit2").val(), diff --git a/src/main/resources/templates/web/settings/medicalcategory/medicalCategoryList.html b/src/main/resources/templates/web/settings/medicalcategory/medicalCategoryList.html index 9c9b6e1..14526c1 100644 --- a/src/main/resources/templates/web/settings/medicalcategory/medicalCategoryList.html +++ b/src/main/resources/templates/web/settings/medicalcategory/medicalCategoryList.html @@ -84,10 +84,10 @@ - +
- -
+ +
진료유형
@@ -95,8 +95,8 @@
- -
+ +
제품/시술
@@ -104,14 +104,23 @@
- -
+ +
- 부위 + 용량/출력
+ + +
+
+ 부위 +
+
+
+
diff --git a/src/main/resources/templates/web/settings/medicalcategory/popup/medicalCategoryInfoPop.html b/src/main/resources/templates/web/settings/medicalcategory/popup/medicalCategoryInfoPop.html index 24cabb6..3bc77aa 100644 --- a/src/main/resources/templates/web/settings/medicalcategory/popup/medicalCategoryInfoPop.html +++ b/src/main/resources/templates/web/settings/medicalcategory/popup/medicalCategoryInfoPop.html @@ -224,8 +224,8 @@ - -
단가/제품 정보
+ +
제품/시술 정보
@@ -241,10 +241,33 @@ + + + + + + + + + +
제품설명
기타설명
+ + +
용량/출력 정보
+ + + + + + + + + + - - - - - - - -
단가
할인가
단위 @@ -254,14 +277,6 @@
제품설명
기타설명
비율