Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729

This commit is contained in:
dev
2025-08-04 19:40:08 +09:00
42 changed files with 1704 additions and 2122 deletions

View File

@ -4,12 +4,12 @@
:data="chkGridData"
:columns="chkGridColumns"
:options="chkGridOptions"
@mousedown="onMousedown"
@click="startEditing"
@editingFinish="editingFinish"
@dblclick="dblClick"
@mouseover="mouseoverEvent"
@mouseout="mouseoutEvent"
@mousedown="onMousedown"
@focusChange="focusChangeEvt"
/>
</template>
@ -251,11 +251,9 @@ export default {
this.gridInstance.invoke('check', rowData.rowKey, instance);
},
setSelectionRange(rowKey) {
// console.log("------------------DEBUG-------setSelectionRange:", rowKey);
const rowDatas = this.gridInstance.invoke('getData');
rowDatas.forEach(item => {
if (item.rowKey == rowKey) {
// console.log("------------------DEBUG-------setSelectionRange---item:", item);
this.gridInstance.invoke(
'addRowClassName',
item.rowKey,
@ -271,11 +269,14 @@ export default {
});
},
onMousedown(evt) {
// console.log("------------------DEBUG-------onMousedown:", evt);
this.focusChangeEvt(evt);
this.handleSelectedRow(evt);
},
focusChangeEvt(e) {
// console.log("------------------DEBUG-------focusChangeEvt:", e);
if(e.rowKey === 0) {
this.handleSelectedRow(e);
}
},
handleSelectedRow(e) {
// console.log('focusChangeEvt1...')
if (this.preventFocusChangeEvent(e)) {
// console.log('prevent focusChangeEvt')
@ -283,7 +284,7 @@ export default {
}
// console.log('focusChangeEvt2...')
// cell 선택시 row 선택 method
if (e.rowKey >= 0) {
if (e.rowKey > -1) {
this.$emit(
'getRowsData',
this.gridInstance.invoke('getRow', e.rowKey),
@ -296,7 +297,6 @@ export default {
this.sendSelectedRowData(e.rowKey);
},
startEditing(e) {
// console.log("------------------DEBUG-------startEditing:", e);
// console.log('startEditing1...')
if (this.preventFocusChangeEvent(e)) {
// console.log('prevent startEditing')
@ -323,7 +323,6 @@ export default {
}
},
async editingFinish(e) {
// console.log('------------------DEBUG-------editingFinish:', e);
// console.log("Editing END E::", e);
// editor 간 이동시 수정되는 문제 수정
// e.rowEditingFg: grid의 한 row를 한번에 수정할 시 각각의 cell 마다 click 이벤트가 발생하지 않아 this.editorStartKey값이 제대로 입력 되지 않는 경우를 대비하여 만든 Fg
@ -685,7 +684,6 @@ export default {
? this.gridInstance.invoke('getFocusedCell').rowKey
: eventRowKey;
var rowData = this.gridInstance.invoke('getRow', rowKey);
// console.log('------------------DEBUG-------sendSelectedRowData:', {eventRowKey, rowKey});
this.$emit('sendSelectedRowStatInfo', rowData);
}
},

View File

@ -9,7 +9,7 @@
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<div class="datepicker-container">
<div :class="['datepicker-container', customClass]" >
<v-text-field
id="startpicker"
ref="startpicker"
@ -79,6 +79,10 @@ export default {
require: false,
default: 8,
},
customClass: {
type: String,
require: false,
},
},
data() {
return {

View File

@ -1,21 +1,8 @@
<template>
<div class="d-flex flex-column justify-center align-center">
<!--<v-btn icon tile :ripple="false" @click="btnActionsFnc('addLeftToRight')">
<v-icon>mdi-chevron-right</v-icon>
</v-btn> -->
<a-button @click="btnActionsFnc('addLeftToRight')" type="primary" ghost icon="right" >
<div class="d-flex flex-row justify-center align-center" style="gap: 12px">
<a-button @click="btnActionsFnc('removeRightToLeft')" type="primary" ghost :icon="icons.remove" >
</a-button>
<!--<v-btn
icon
tile
:ripple="false"
class="mt-2"
@click="btnActionsFnc('removeRightToLeft')"
>
<v-icon>mdi-chevron-left</v-icon>
</v-btn> -->
<a-button class="mt-2" @click="btnActionsFnc('removeRightToLeft')" type="primary" ghost icon="left">
<a-button @click="btnActionsFnc('addLeftToRight')" type="primary" ghost :icon="icons.add">
</a-button>
</div>
</template>
@ -38,8 +25,18 @@ export default {
type: Function,
required: true,
},
directionBtn: {
type: String,
default: "horizontally" //horizontally, vertically.
}
},
computed: {
icons() {
return this.directionBtn === "vertically"
? { remove: "up", add: "down" }
: { remove: "left", add: "right" };
},
},
computed: {},
data() {
return {};
},

View File

@ -45,7 +45,7 @@ export default {
size: {
type: String,
require: false,
default: "default", // small, middle, large
default: "default", // small, default, large
}
},
data() {

View File

@ -44,8 +44,7 @@
<v-card-title>
<span class="custom-title-4">비밀번호 {{ isPassword }}</span>
</v-card-title>
<v-divider></v-divider>
<v-card-text>
<v-card-text class="pb-4">
<v-col>
<label for="" class="search-box-label">
{{ isPassword }} 비밀번호를 입력하세요
@ -73,11 +72,10 @@
></v-text-field>
</v-col>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-card-actions class="pb-4">
<v-spacer></v-spacer>
<!-- <v-btn color="primary" dark @click="setUpdate()">확인</v-btn> -->
<div>
<div class="pr-3">
<a-button @click="close()" class="btn-default">삭제</a-button>
<a-button type="primary" @click="setUpdate()" class="v-btn-add-text">
확인

View File

@ -58,7 +58,7 @@
<div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
@ -66,41 +66,66 @@
dataKey="searchElecContKind"
:sendParam="{ commGrpCd: 'EM_CONT', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
:label="'전압구분'"
dataKey="searchVoltKind"
:sendParam="{ commGrpCd: 'EM_VOLT_KIND', useFg: '1' }"
:customClass="'select-large'"
:addAll="true"
/>
</v-col>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
:label="'전압구분'"
dataKey="searchOptKind"
:sendParam="{ commGrpCd: 'EM_VOLT_OPT', useFg: '1' }"
:customClass="'select-large'"
:addAll="true"
/>
</v-col>
<v-col cols="3" class="text-right">
<v-btn
<div style="height: 25px"></div>
<!-- <v-btn
v-if="!searchParam.isMulti"
:ripple="false"
@click="search()"
>검색</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
icon="search"
:ripple="false"
@click="search"
style="height: 40px"
>
<v-btn
검색
</a-button>
<!-- <v-btn
v-if="!searchParam.isMulti"
:ripple="false"
@click="initVal()"
>초기화</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
:ripple="false"
@click="initVal"
style="height: 40px"
>
초기화
</a-button>
</v-col>
</v-row>
</div>
@ -310,7 +335,11 @@ export default {
},
// 공정/설비 트리 그리드 세팅
gridInit() {
const myOptions = {};
const myOptions = {
header: {
height: 38,
},
};
this.setModalGridOption({
modalKey: this.myModalKey,
gridKey: this.gridName,
@ -606,11 +635,11 @@ const myColumns = [
{ header: '전력계약 ID', name: 'eleclContId', hidden: true},
{ header: '전력계약 명', name: 'eleclContNm', hidden: true},
{ header: '전력계약구분CD', name: 'elecContKind', hidden: true},
{ header: '전력계약구분', name: 'elecContKindNm', align: 'center'},
{ header: '전력계약구분', name: 'elecContKindNm', align: 'left'},
{ header: '전압구분CD', name: 'voltKind', hidden: true },
{ header: '전압구분', name: 'voltKindNm', align: 'center' },
{ header: '전압구분', name: 'voltKindNm', align: 'left' },
{ header: '옵션CD', name: 'optKind', hidden: true },
{ header: '옵션', name: 'optKindNm', align: 'center' },
{ header: '옵션', name: 'optKindNm', align: 'left' },
{
header: '기본요금(원/kW)',
name: 'baseChrg',
@ -620,7 +649,7 @@ const myColumns = [
},
},
{ header: '시간대CD', name: 'peakKind', hidden: true },
{ header: '시간대', name: 'peakKindNm', align: 'center' },
{ header: '시간대', name: 'peakKindNm', align: 'left' },
{
header: '여름철(6~8월)',
name: 'unitPrcSum',

View File

@ -16,54 +16,52 @@
</template></v-text-field>
</v-col>
<v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-card style="height: 100%">
<v-dialog ref="popModal" v-model="dialog" width="800" scrollable>
<v-card style="height: 90vh;">
<v-card-title class="px-5 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">설비 선택</span>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title>
<div class="pa-2 pt-0">
<v-card class="searchFilter">
<v-row align="end">
<v-col :cols="3.5">
<!-- 설비그룹 -->
<component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" :disabled="eqpmGrpDisabled"
@update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<!-- FAB -->
<component :is="'SelectBoxMulti'" :propsValue="selectValue02"
:itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true"
:disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<v-row>
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label">
<v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
설비명
</label>
</v-col>
<v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template
v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
<!-- <v-card class="searchFilter">
</v-card> -->
<v-row align="end" class="searchFilter">
<v-col :cols="3.5">
<!-- 설비그룹 -->
<component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" :disabled="eqpmGrpDisabled"
@update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<!-- FAB -->
<component :is="'SelectBoxMulti'" :propsValue="selectValue02"
:itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true"
:disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<v-row>
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label">
<v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
설비명
</label>
</v-col>
<v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template
v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field>
</v-col>
</template></v-text-field>
</v-col>
</v-row>
</v-col>
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
</v-row>
</v-card>
</v-row>
</v-col>
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
</v-row>
<!-- <v-row align="center" no-gutters style="margin-top: 14px;">
<v-col :cols="1">
@ -77,14 +75,20 @@
:hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
</v-col>
</v-row> -->
<!-- <v-row>
<v-col :col="12">
</v-col>
</v-row> -->
</div>
<div class="px-5" style="height:429px;">
<div ref="modalGridParent" class="w100 h100">
<v-card-text class="px-2 w100">
<div ref="modalGridParent" style="height: 450px;" class="h100 w100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null"
:dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop" :gridName="gridName"
:parentPrgmId="parentPrgmId" @getRowsData="getRowData" />
</div>
</div>
</v-card-text>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>

View File

@ -280,52 +280,41 @@ export default {
modalKey: this.myModalKey,
gridKey: this.grid_01,
modalDataKey: this.modalDataKey,
value: [{ header: '위치정보', name: 'eccNm' }],
value: [
{
align: 'center',
width: 30,
minWidth: 60,
formatter: (props) => {
return `<span class="custom-radio"><span class="radio-mark"></span></span>`;
}
},
{ header: '위치정보', name: 'eccNm' }
],
});
},
async getGridData() {
// this.loadGrid = false;
this.loadGrid = false;
// const res = await this.postApiReturn({
// apiKey: 'selectEccBaseInfo',
// resKey: 'eccBaseInfoData',
// sendParam: {
// blocId: this.myBindingData.blocId,
// eqpmYn: '0',
// search: this.searchWord,
// },
// });
const res = await this.postApiReturn({
apiKey: 'selectEccBaseInfo',
resKey: 'eccBaseInfoData',
sendParam: {
blocId: this.myBindingData.blocId,
eqpmYn: '0',
search: this.searchWord,
},
});
// const setTreeData = await this.setTree({
// gridKey: this.gridNameTree,
// treeKey: 'ECC_ID',
// value: res.map(item => ({
// ...item,
// eccNm: item.eccNm,
// })),
// });
//mockdata eccNm
let res = [
{ ECC_ID: 'ECC001', eccNm: '서울 본사', iconShow: false, align: 'center' },
{ ECC_ID: 'ECC002', eccNm: '부산 지사', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC003', eccNm: '대구 센터', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC004', eccNm: '광주 사무소' , useIcon: false, align: 'center'},
{ ECC_ID: 'ECC005', eccNm: '인천 물류창고' , useIcon: false, align: 'center'},
];
const setTreeData = {
ROOT: res.map(item => ({
const setTreeData = await this.setTree({
gridKey: this.gridNameTree,
treeKey: 'ECC_ID',
value: res.map(item => ({
...item,
eccNm: item.eccNm,
}))
};
})),
});
// console.log(res);
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.grid_01,

View File

@ -273,9 +273,9 @@ export default {
});
},
async created() {
// await this.setSelectValueList01();
// await this.setSelectValueList02();
// await this.setSelectValueList03();
await this.setSelectValueList01();
await this.setSelectValueList02();
await this.setSelectValueList03();
this.init();
// if(this.searchParam.isMulti == true){
// this.setPageData({
@ -487,40 +487,40 @@ export default {
eqpmId: this.selectValue03,
searchWord: this.searchWord,
};
let res = [
{
eqpmGrpNm: "냉각 시스템",
eqpmGrpId: "GRP001",
eqpmId: "EQ001",
eqpmNm: "냉각기 A",
tagId: "TAG001-001",
tagNm: "냉각 온도 센서",
rowStat: "I",
},
{
eqpmGrpNm: "전력 시스템",
eqpmGrpId: "GRP002",
eqpmId: "EQ002",
eqpmNm: "변압기 B",
tagId: "TAG002-002",
tagNm: "전류 센서",
rowStat: "U",
},
{
eqpmGrpNm: "공기압 시스템",
eqpmGrpId: "GRP003",
eqpmId: "EQ003",
eqpmNm: "압축기 C",
tagId: "TAG003-003",
tagNm: "압력 센서",
rowStat: "D",
},
];
// res = await this.postApiReturn({
// apiKey: "selectTagAndEqpmList",
// resKey: "tagTrndDatas",
// sendParam: searchParam,
// });
// let res = [
// {
// eqpmGrpNm: "냉각 시스템",
// eqpmGrpId: "GRP001",
// eqpmId: "EQ001",
// eqpmNm: "냉각기 A",
// tagId: "TAG001-001",
// tagNm: "냉각 온도 센서",
// rowStat: "I",
// },
// {
// eqpmGrpNm: "전력 시스템",
// eqpmGrpId: "GRP002",
// eqpmId: "EQ002",
// eqpmNm: "변압기 B",
// tagId: "TAG002-002",
// tagNm: "전류 센서",
// rowStat: "U",
// },
// {
// eqpmGrpNm: "공기압 시스템",
// eqpmGrpId: "GRP003",
// eqpmId: "EQ003",
// eqpmNm: "압축기 C",
// tagId: "TAG003-003",
// tagNm: "압력 센서",
// rowStat: "D",
// },
// ];
let res = await this.postApiReturn({
apiKey: "selectTagAndEqpmList",
resKey: "tagTrndDatas",
sendParam: searchParam,
});
let newRes = [];
if (this.searchParam["tagList"].length > 0) {
newRes = res.filter((item) => {