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 @@
-
+
-
-
+
+
-
-
+
+
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 @@
-
-
단가/제품 정보
+
+
제품/시술 정보
+
+
+
용량/출력 정보
+