fix: anomali keluhan

This commit is contained in:
kur0nek-o 2024-04-18 10:22:43 +07:00
parent f000cf9db1
commit 13dce362c5
2 changed files with 285 additions and 49 deletions

View File

@ -18,7 +18,7 @@
/> />
</Filters> </Filters>
<Anomali_LAPPKU_LPT :data="data" :loading="loadingData" :filters="filters" /> <Anomali_LAPPKU_LPT :data="data" :loading="loadingData" :grouping="grouping" :filters="filters" />
<Anomali_LAPPKU_LPP :data="dataSecond" :filters="filters" /> <Anomali_LAPPKU_LPP :data="dataSecond" :filters="filters" />
</template> </template>
@ -43,6 +43,21 @@ const filters = ref({
up3: 0 up3: 0
}) })
const grouping = ref<any[]>([
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
])
const resetData = () => { const resetData = () => {
data.value = [] data.value = []
dataSecond.value = [] dataSecond.value = []
@ -53,6 +68,46 @@ const filterData = async (params: any) => {
const { ulp, uid, up3, jenisLaporan } = params const { ulp, uid, up3, jenisLaporan } = params
console.table('LAPPGU', jenisLaporan) console.table('LAPPGU', jenisLaporan)
var groupList: any[] = [
{
data: '',
caption: 'Semua Unit'
},
{
data: 'nama_uid',
caption: 'UID'
},
{
data: 'nama_up3',
caption: 'UP3'
}
]
if (uid?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'Semua Unit') {
groupList.splice(index, 1)
}
})
if (up3?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UID') {
groupList.splice(index, 1)
}
})
if (ulp?.id != 0) {
groupList.forEach((item, index) => {
if (item.caption == 'UP3') {
groupList.splice(index, 1)
}
})
}
}
}
grouping.value = groupList
const dateValue = params.periode.split(' s/d ') const dateValue = params.periode.split(' s/d ')
const query = { const query = {
dateFrom: dateValue[0] dateFrom: dateValue[0]

View File

@ -3,6 +3,7 @@
<h1 class="text-xl font-medium md:text-2xl text-dark">Laporan Pengaduan Total</h1> <h1 class="text-xl font-medium md:text-2xl text-dark">Laporan Pengaduan Total</h1>
</div> </div>
<DxDataGrid <DxDataGrid
@cell-click="onCellClicked"
ref="dataGridRef" ref="dataGridRef"
:data-source="data" :data-source="data"
v-if="loading == false" v-if="loading == false"
@ -20,7 +21,7 @@
column-resizing-mode="widget" column-resizing-mode="widget"
:word-wrap-enabled="true" :word-wrap-enabled="true"
> >
<DxGrouping expand-mode="rowClick" :auto-expand-all="false" /> <DxGrouping :auto-expand-all="false" />
<DxSelection mode="single" /> <DxSelection mode="single" />
<DxPaging :enabled="false" /> <DxPaging :enabled="false" />
<DxScrolling column-rendering-mode="virtual" mode="virtual" /> <DxScrolling column-rendering-mode="virtual" mode="virtual" />
@ -42,35 +43,15 @@
cell-template="formatText" cell-template="formatText"
/> />
<DxColumn <DxColumn
v-if="grouping.length > 0"
v-for="(group, index) in grouping"
:width="150"
alignment="center" alignment="center"
:min-width="170" :data-field="group.data"
data-type="text" :caption="group.caption"
data-field=""
caption="Semua Unit"
css-class="custom-table-column" css-class="custom-table-column"
:group-index="0" cell-template="formatText"
/> :group-index="index"
<DxColumn
alignment="center"
:min-width="170"
data-type="text"
data-field="id_uid"
caption="UID"
css-class="custom-table-column"
:group-index="1"
name="namaUID"
:calculate-group-value="(rowData: any) => rowData.nama_uid"
/>
<DxColumn
alignment="center"
:min-width="170"
data-type="text"
data-field="id_up3"
caption="UP3"
css-class="custom-table-column"
:group-index="1"
name="namaUID"
:calculate-group-value="(rowData: any) => rowData.nama_up3"
/> />
<DxColumn alignment="center" caption="Total WO" css-class="custom-table-column"> <DxColumn alignment="center" caption="Total WO" css-class="custom-table-column">
<DxColumn alignment="center" caption="CC 123" css-class="custom-table-column"> <DxColumn alignment="center" caption="CC 123" css-class="custom-table-column">
@ -275,12 +256,13 @@
</p> </p>
</template> </template>
<DxSummary> <DxSummary :calculate-custom-summary="calculateCustomSummary">
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="wo_cc123" column="wo_cc123"
summary-type="sum" name="wo_cc123"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -288,7 +270,8 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="wo_pln_mobile" column="wo_pln_mobile"
summary-type="sum" name="wo_pln_mobile"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -296,7 +279,8 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="wo_loket" column="wo_loket"
summary-type="sum" name="wo_loket"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -304,7 +288,8 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="wo_lainnya" column="wo_lainnya"
summary-type="sum" name="wo_lainnya"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -312,7 +297,8 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="wo_total" column="wo_total"
summary-type="sum" name="wo_total"
summary-type="custom"
css-class="!text-right" css-class="!text-right"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -320,24 +306,27 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="anomali_pln_mobile" column="anomali_pln_mobile"
summary-type="sum" summary-type="custom"
css-class="!text-right" name="anomali_pln_mobile"
css-class="!text-right cursor-pointer"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="anomali_cc123" column="anomali_cc123"
summary-type="sum" summary-type="custom"
css-class="!text-right" name="anomali_cc123"
css-class="!text-right cursor-pointer"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="total_anomali" column="total_anomali"
summary-type="sum" summary-type="custom"
css-class="!text-right" name="total_anomali"
css-class="!text-right cursor-pointer"
:customize-text="(e: any) => formatNumber(e.value)" :customize-text="(e: any) => formatNumber(e.value)"
/> />
@ -345,24 +334,27 @@
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="persen_anomali_pln_mobile" column="persen_anomali_pln_mobile"
summary-type="avg" summary-type="custom"
css-class="!text-right" css-class="!text-right"
name="persen_anomali_pln_mobile"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="persen_anomali_cc123" column="persen_anomali_cc123"
summary-type="avg" summary-type="custom"
css-class="!text-right" css-class="!text-right"
name="persen_anomali_cc123"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
<DxGroupItem <DxGroupItem
:show-in-group-footer="false" :show-in-group-footer="false"
:align-by-column="true" :align-by-column="true"
column="total_persen_anomali" column="total_persen_anomali"
summary-type="avg" summary-type="custom"
css-class="!text-right" css-class="!text-right"
name="total_persen_anomali"
:customize-text="(e: any) => formatPercentage(e.value)" :customize-text="(e: any) => formatPercentage(e.value)"
/> />
</DxSummary> </DxSummary>
@ -730,7 +722,7 @@
</div> </div>
</DetailDialog> </DetailDialog>
<BufferDialog v-if="loading" /> <BufferDialog v-if="loading || loadingSubData" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -764,6 +756,7 @@ import {
exportDetailToDOCX exportDetailToDOCX
} from '@/report/Anomali/Keluhan/Anomali_LAPPKU_LPT' } from '@/report/Anomali/Keluhan/Anomali_LAPPKU_LPT'
import BufferDialog from '@/components/Dialogs/BufferDialog.vue' import BufferDialog from '@/components/Dialogs/BufferDialog.vue'
import { getDataRowGroup } from '@/utils/helper'
const position = { of: '#data' } const position = { of: '#data' }
const showIndicator = ref(true) const showIndicator = ref(true)
@ -775,6 +768,10 @@ const props = defineProps({
loading: { loading: {
type: Boolean, type: Boolean,
default: false default: false
},
grouping: {
type: Array as () => any[],
default: []
} }
}) })
const filters = ref<any>(computed(() => props.filters)) const filters = ref<any>(computed(() => props.filters))
@ -789,6 +786,9 @@ const loadingSubData = ref(false)
const agreeToShowDialog = ref(false) const agreeToShowDialog = ref(false)
const mediaSelected = ref<any>(null) const mediaSelected = ref<any>(null)
const reportMeta = ref<any>(computed(() => props.filters)) const reportMeta = ref<any>(computed(() => props.filters))
const groupDialog = ref(false)
const groupData = ref<any>(null)
const groupIndex = ref(0)
const setParameterRequest = (media: any) => { const setParameterRequest = (media: any) => {
mediaSelected.value = media mediaSelected.value = media
@ -800,6 +800,27 @@ const setParameterRequest = (media: any) => {
} }
} }
const onCellClicked = (e: any) => {
if (e.rowType == 'group') {
groupDialog.value = true
groupIndex.value = e.row.groupIndex
if (e.column.dataField == 'anomali_pln_mobile') {
setParameterRequest('PLN Mobile')
} else if (e.column.dataField == 'anomali_cc123') {
setParameterRequest('Call PLN 123')
} else if (e.column.dataField == 'total_anomali') {
setParameterRequest('')
} else {
setParameterRequest(null)
}
groupData.value = getDataRowGroup(e.data)
showDetail()
} else {
groupDialog.value = false
}
}
const resetData = () => { const resetData = () => {
dataSub.value = [] dataSub.value = []
dataSubSelected.value = null dataSubSelected.value = null
@ -814,7 +835,37 @@ const getDetail = async () => {
const dateValue = periode.split(' s/d ') const dateValue = periode.split(' s/d ')
const selected = dataSelected.value const selected = dataSelected.value
const query = { let query = {
dateFrom: dateValue[0]
? dateValue[0].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10),
dateTo: dateValue[1]
? dateValue[1].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10),
idUlp: 0,
idUid: 0,
idUp3: 0,
namaRegional: '',
media: mediaSelected.value
}
if (groupDialog.value) {
if (props.grouping[groupIndex.value].data == 'nama_uid') {
query = {
...query,
idUid: groupData.value?.id_uid ? groupData.value?.id_uid : 0,
namaRegional: groupData.value?.nama_regional ? groupData.value?.nama_regional : ''
}
} else if (props.grouping[groupIndex.value].data == 'nama_up3') {
query = {
...query,
idUid: groupData.value?.id_uid ? groupData.value?.id_uid : 0,
idUp3: groupData.value?.id_up3 ? groupData.value?.id_up3 : 0,
namaRegional: groupData.value?.nama_regional ? groupData.value?.nama_regional : ''
}
}
} else {
query = {
dateFrom: dateValue[0] dateFrom: dateValue[0]
? dateValue[0].split('-').reverse().join('-') ? dateValue[0].split('-').reverse().join('-')
: new Date().toISOString().slice(0, 10), : new Date().toISOString().slice(0, 10),
@ -824,9 +875,10 @@ const getDetail = async () => {
idUlp: selected?.id_ulp ? selected?.id_ulp : 0, idUlp: selected?.id_ulp ? selected?.id_ulp : 0,
idUid: selected?.id_uid ? selected?.id_uid : 0, idUid: selected?.id_uid ? selected?.id_uid : 0,
idUp3: selected?.id_up3 ? selected?.id_up3 : 0, idUp3: selected?.id_up3 ? selected?.id_up3 : 0,
namaRegional: '', namaRegional: selected?.nama_regional ? selected?.nama_regional : '',
media: mediaSelected.value media: mediaSelected.value
} }
}
loadingSubData.value = true loadingSubData.value = true
await requestGraphQl( await requestGraphQl(
@ -862,6 +914,135 @@ const getDetail = async () => {
}) })
} }
let wo_cc123 = 0
let wo_pln_mobile = 0
let wo_loket = 0
let wo_lainnya = 0
let wo_total = 0
let anomali_pln_mobile = 0
let anomali_cc123 = 0
let total_anomali = 0
let persen_anomali_pln_mobile = 0
let persen_anomali_cc123 = 0
let total_persen_anomali = 0
const calculateCustomSummary = (options: any) => {
if (options.name === 'wo_cc123') {
if (options.summaryProcess === 'calculate') {
wo_cc123 += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = wo_cc123
}
}
if (options.name === 'wo_pln_mobile') {
if (options.summaryProcess === 'calculate') {
wo_pln_mobile += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = wo_pln_mobile
}
}
if (options.name === 'wo_loket') {
if (options.summaryProcess === 'calculate') {
wo_loket += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = wo_loket
}
}
if (options.name === 'wo_lainnya') {
if (options.summaryProcess === 'calculate') {
wo_lainnya += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = wo_lainnya
}
}
if (options.name === 'wo_total') {
if (options.summaryProcess === 'start') {
wo_cc123 = 0
wo_pln_mobile = 0
wo_loket = 0
wo_lainnya = 0
} else if (options.summaryProcess === 'calculate') {
wo_total = wo_cc123 + wo_pln_mobile + wo_loket + wo_lainnya
} else if (options.summaryProcess === 'finalize') {
options.totalValue = wo_cc123 + wo_pln_mobile + wo_loket + wo_lainnya
}
}
if (options.name === 'anomali_pln_mobile') {
if (options.summaryProcess === 'calculate') {
anomali_pln_mobile += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = anomali_pln_mobile
}
}
if (options.name === 'anomali_cc123') {
if (options.summaryProcess === 'calculate') {
anomali_cc123 += options.value
} else if (options.summaryProcess === 'finalize') {
options.totalValue = anomali_cc123
}
}
if (options.name === 'total_anomali') {
if (options.summaryProcess === 'start') {
anomali_pln_mobile = 0
anomali_cc123 = 0
} else if (options.summaryProcess === 'calculate') {
total_anomali = anomali_pln_mobile + anomali_cc123
} else if (options.summaryProcess === 'finalize') {
options.totalValue = anomali_pln_mobile + anomali_cc123
}
}
if (options.name === 'persen_anomali_pln_mobile') {
if (options.summaryProcess === 'start') {
anomali_pln_mobile = 0
wo_total = 0
} else if (options.summaryProcess === 'calculate') {
persen_anomali_pln_mobile =
!isFinite(anomali_pln_mobile / wo_total) || anomali_pln_mobile == 0
? 0
: (anomali_pln_mobile / wo_total) * 100
} else if (options.summaryProcess === 'finalize') {
options.totalValue =
!isFinite(anomali_pln_mobile / wo_total) || anomali_pln_mobile == 0
? 0
: (anomali_pln_mobile / wo_total) * 100
}
}
if (options.name === 'persen_anomali_cc123') {
if (options.summaryProcess === 'start') {
anomali_cc123 = 0
wo_total = 0
} else if (options.summaryProcess === 'calculate') {
persen_anomali_cc123 =
!isFinite(anomali_cc123 / wo_total) || anomali_cc123 == 0
? 0
: (anomali_cc123 / wo_total) * 100
} else if (options.summaryProcess === 'finalize') {
options.totalValue =
!isFinite(anomali_cc123 / wo_total) || anomali_cc123 == 0
? 0
: (anomali_cc123 / wo_total) * 100
}
}
if (options.name === 'total_persen_anomali') {
if (options.summaryProcess === 'start') {
persen_anomali_pln_mobile = 0
persen_anomali_cc123 = 0
} else if (options.summaryProcess === 'finalize') {
options.totalValue = persen_anomali_pln_mobile + persen_anomali_cc123
}
}
}
const onExporting = (e: any) => { const onExporting = (e: any) => {
if (e.format === 'pdf') { if (e.format === 'pdf') {
exportToPDF(reportMeta.value, data.value) exportToPDF(reportMeta.value, data.value)