mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
feat(FE-443,444): create exportProductionResultToExcel method
This commit is contained in:
@@ -1,145 +1,12 @@
|
||||
import { sleep } from '@/lib/helper';
|
||||
import * as XLSX from 'xlsx';
|
||||
import toast from 'react-hot-toast';
|
||||
import { formatDate } from '@/lib/helper';
|
||||
import { isResponseSuccess } from '@/lib/api-helper';
|
||||
import { BaseApiService } from '@/services/api/base';
|
||||
import { httpClientFetcher } from '@/services/http/client';
|
||||
import { httpClient, httpClientFetcher } from '@/services/http/client';
|
||||
import { BaseApiResponse } from '@/types/api/api-general';
|
||||
import { ProductionResult } from '@/types/api/report/production-result';
|
||||
|
||||
// TODO: delete this dummy data
|
||||
const PRODUCTION_RESULT_DUMMY_DATA: BaseApiResponse<ProductionResult[]> = {
|
||||
code: 200,
|
||||
status: 'success',
|
||||
message: 'Get Laporan Hasil Produksi successfully',
|
||||
meta: {
|
||||
page: 1,
|
||||
limit: 1,
|
||||
total_pages: 2,
|
||||
total_results: 2,
|
||||
},
|
||||
data: [
|
||||
{
|
||||
created_user: {
|
||||
id: 1,
|
||||
id_user: 1001,
|
||||
email: 'user@example.com',
|
||||
name: 'John Doe',
|
||||
},
|
||||
project_flock: {
|
||||
id: 1,
|
||||
name: 'PROJECT',
|
||||
category: 'LAYING',
|
||||
kandang: {
|
||||
id: 1,
|
||||
name: 'Cikaum',
|
||||
},
|
||||
},
|
||||
created_at: '2025-01-01T08:00:00Z',
|
||||
updated_at: '2025-01-02T10:30:00Z',
|
||||
|
||||
woa: 25,
|
||||
|
||||
bw: 62.5,
|
||||
std_bw: 60,
|
||||
uniformity: 88,
|
||||
std_uniformity: '90% up',
|
||||
|
||||
dep_kum: 3.2,
|
||||
dep_std: 2.5,
|
||||
|
||||
butiran_utuh: 850,
|
||||
butiran_putih: 50,
|
||||
butiran_retak: 70,
|
||||
butiran_pecah: 30,
|
||||
butiran_jumlah: 1000,
|
||||
total_butir: 1000,
|
||||
|
||||
kg_utuh: 52.3,
|
||||
kg_putih: 3.1,
|
||||
kg_retak: 4.2,
|
||||
kg_pecah: 1.9,
|
||||
kg_jumlah: 61.5,
|
||||
total_kg: 61.5,
|
||||
|
||||
persen_utuh: 85,
|
||||
persen_putih: 5,
|
||||
persen_retak: 7,
|
||||
persen_pecah: 3,
|
||||
|
||||
hd: 92,
|
||||
hd_std: 90,
|
||||
fi: 115,
|
||||
fi_std: 667,
|
||||
em: 85,
|
||||
em_std: 83,
|
||||
ew: 62,
|
||||
ew_std: 60,
|
||||
fcr: 2.1,
|
||||
fcr_std: 2.0,
|
||||
hh: 96,
|
||||
hh_std: 95,
|
||||
},
|
||||
{
|
||||
created_user: {
|
||||
id: 1,
|
||||
id_user: 1001,
|
||||
email: 'user@example.com',
|
||||
name: 'John Doe',
|
||||
},
|
||||
project_flock: {
|
||||
id: 1,
|
||||
name: 'PROJECT',
|
||||
category: 'LAYING',
|
||||
kandang: {
|
||||
id: 1,
|
||||
name: 'Cikaum',
|
||||
},
|
||||
},
|
||||
created_at: '2025-01-01T08:00:00Z',
|
||||
updated_at: '2025-01-02T10:30:00Z',
|
||||
|
||||
woa: 25,
|
||||
|
||||
bw: 62.5,
|
||||
std_bw: 60,
|
||||
uniformity: 88,
|
||||
std_uniformity: '90% up',
|
||||
|
||||
dep_kum: 3.2,
|
||||
dep_std: 2.5,
|
||||
|
||||
butiran_utuh: 850,
|
||||
butiran_putih: 50,
|
||||
butiran_retak: 70,
|
||||
butiran_pecah: 30,
|
||||
butiran_jumlah: 1000,
|
||||
total_butir: 1000,
|
||||
|
||||
kg_utuh: 52.3,
|
||||
kg_putih: 3.1,
|
||||
kg_retak: 4.2,
|
||||
kg_pecah: 1.9,
|
||||
kg_jumlah: 61.5,
|
||||
total_kg: 61.5,
|
||||
|
||||
persen_utuh: 85,
|
||||
persen_putih: 5,
|
||||
persen_retak: 7,
|
||||
persen_pecah: 3,
|
||||
|
||||
hd: 92,
|
||||
hd_std: 90,
|
||||
fi: 115,
|
||||
fi_std: 110,
|
||||
em: 85,
|
||||
em_std: 83,
|
||||
ew: 62,
|
||||
ew_std: 60,
|
||||
fcr: 2.1,
|
||||
fcr_std: 2.0,
|
||||
hh: 96,
|
||||
hh_std: 95,
|
||||
},
|
||||
],
|
||||
};
|
||||
import { BaseProjectFlockKandang } from '@/types/api/production/project-flock-kandang';
|
||||
|
||||
export class ProductionResultReportApiService extends BaseApiService<
|
||||
ProductionResult,
|
||||
@@ -153,14 +20,117 @@ export class ProductionResultReportApiService extends BaseApiService<
|
||||
async getAllProductionResultFetcher(
|
||||
endpoint: string
|
||||
): Promise<BaseApiResponse<ProductionResult[]>> {
|
||||
// return await httpClientFetcher<BaseApiResponse<ProductionResult[]>>(
|
||||
// endpoint
|
||||
// );
|
||||
return await httpClientFetcher<BaseApiResponse<ProductionResult[]>>(
|
||||
endpoint
|
||||
);
|
||||
}
|
||||
|
||||
await sleep(1000);
|
||||
async exportProductionResultToExcel(
|
||||
projectFlockKandangs: BaseProjectFlockKandang[] | null
|
||||
) {
|
||||
try {
|
||||
const mappedProductionResults: {
|
||||
projectFlockKandang: BaseProjectFlockKandang;
|
||||
productionResult: ProductionResult[] | null;
|
||||
}[] = [];
|
||||
|
||||
return PRODUCTION_RESULT_DUMMY_DATA;
|
||||
projectFlockKandangs?.forEach(async (projectFlockKandang) => {
|
||||
const getProductionResultPath = `${this.basePath}/${projectFlockKandang.id}?page=1&limit=99999999`;
|
||||
const getProductionResultRes = await httpClient<
|
||||
BaseApiResponse<ProductionResult[]>
|
||||
>(getProductionResultPath);
|
||||
|
||||
mappedProductionResults.push({
|
||||
projectFlockKandang,
|
||||
productionResult: isResponseSuccess(getProductionResultRes)
|
||||
? getProductionResultRes.data
|
||||
: null,
|
||||
});
|
||||
});
|
||||
|
||||
const rows = mappedProductionResults;
|
||||
if (!rows || rows.length === 0) {
|
||||
toast.error('Tidak ada data untuk diexport.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Group by Project Flock Kandang Name
|
||||
const groupedData: Record<
|
||||
string,
|
||||
Record<string, string | number | undefined>[]
|
||||
> = {};
|
||||
|
||||
rows.forEach((row) => {
|
||||
const kandangName = row.projectFlockKandang.kandang.name || 'Unknown';
|
||||
if (!groupedData[kandangName]) {
|
||||
groupedData[kandangName] = [];
|
||||
}
|
||||
|
||||
row.productionResult?.forEach((productionResult) => {
|
||||
groupedData[kandangName].push({
|
||||
woa: productionResult.woa,
|
||||
bw: productionResult.bw,
|
||||
std_bw: productionResult.std_bw,
|
||||
uniformity: productionResult.uniformity,
|
||||
std_uniformity: productionResult.std_uniformity,
|
||||
dep_kum: productionResult.dep_kum,
|
||||
dep_std: productionResult.dep_std,
|
||||
butiran_utuh: productionResult.butiran_utuh,
|
||||
butiran_putih: productionResult.butiran_putih,
|
||||
butiran_retak: productionResult.butiran_retak,
|
||||
butiran_pecah: productionResult.butiran_pecah,
|
||||
butiran_jumlah: productionResult.butiran_jumlah,
|
||||
total_butir: productionResult.total_butir,
|
||||
kg_utuh: productionResult.kg_utuh,
|
||||
kg_putih: productionResult.kg_putih,
|
||||
kg_retak: productionResult.kg_retak,
|
||||
kg_pecah: productionResult.kg_pecah,
|
||||
kg_jumlah: productionResult.kg_jumlah,
|
||||
total_kg: productionResult.total_kg,
|
||||
persen_utuh: productionResult.persen_utuh,
|
||||
persen_putih: productionResult.persen_putih,
|
||||
persen_retak: productionResult.persen_retak,
|
||||
persen_pecah: productionResult.persen_pecah,
|
||||
hd: productionResult.hd,
|
||||
hd_std: productionResult.hd_std,
|
||||
fi: productionResult.fi,
|
||||
fi_std: productionResult.fi_std,
|
||||
em: productionResult.em,
|
||||
em_std: productionResult.em_std,
|
||||
ew: productionResult.ew,
|
||||
ew_std: productionResult.ew_std,
|
||||
fcr: productionResult.fcr,
|
||||
fcr_std: productionResult.fcr_std,
|
||||
hh: productionResult.hh,
|
||||
hh_std: productionResult.hh_std,
|
||||
project_flock_name: productionResult.project_flock.name,
|
||||
project_flock_category: productionResult.project_flock.category,
|
||||
kandang_name: productionResult.project_flock.kandang.name,
|
||||
created_at: formatDate(productionResult.created_at, 'YYYY-MM-DD'),
|
||||
updated_at: formatDate(productionResult.updated_at, 'YYYY-MM-DD'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const wb = XLSX.utils.book_new();
|
||||
|
||||
Object.keys(groupedData).forEach((sheetName) => {
|
||||
const ws = XLSX.utils.json_to_sheet(groupedData[sheetName]);
|
||||
// Sheet names cannot exceed 31 chars
|
||||
const safeSheetName = sheetName.substring(0, 31);
|
||||
XLSX.utils.book_append_sheet(wb, ws, safeSheetName);
|
||||
});
|
||||
|
||||
const productionResultExcelFileName = `laporan-hasil-produksi-${formatDate(Date.now(), 'YYYY-MM-DD')}-${rows[0].projectFlockKandang.project_flock.flock_name}.xlsx`;
|
||||
|
||||
XLSX.writeFile(wb, productionResultExcelFileName);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
toast.error('Gagal melakukan export laporan hasil produksi! Coba lagi.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const ProductionResultReportApi = new ProductionResultReportApiService();
|
||||
export const ProductionResultReportApi = new ProductionResultReportApiService(
|
||||
'/reports/production-result'
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user