feat(sgw): Implement Create or Update Banzone functionality with map integration

This commit is contained in:
Lê Tuấn Anh
2026-01-27 12:17:11 +07:00
parent c9aeca0ed9
commit a11e2c2991
46 changed files with 4660 additions and 39 deletions

View File

@@ -0,0 +1,69 @@
/**
* Fish rarity levels
*/
export enum FishRarity {
NORMAL = 1, // Phổ biến
VULNERABLE = 2, // Dễ bị tổn thương
NEAR_THREATENED = 3, // Gần bị đe dọa
ENDANGERED = 4, // Nguy cấp
CRITICALLY_ENDANGERED = 5, // Cực kỳ nguy cấp
EXTINCT_IN_WILD = 6, // Tuyệt chủng trong tự nhiên
EXTINCT = 7, // Tuyệt chủng
DATA_DEFICIENT = 8, // Thiếu dữ liệu
}
/**
* Get rarity label by ID
* @param id Rarity level ID
* @returns Rarity label in Vietnamese
*/
export function getRarityById(id: number): string {
switch (id) {
case FishRarity.NORMAL:
return 'Phổ biến';
case FishRarity.VULNERABLE:
return 'Dễ bị tổn thương';
case FishRarity.NEAR_THREATENED:
return 'Gần bị đe dọa';
case FishRarity.ENDANGERED:
return 'Nguy cấp';
case FishRarity.CRITICALLY_ENDANGERED:
return 'Cực kỳ nguy cấp';
case FishRarity.EXTINCT_IN_WILD:
return 'Tuyệt chủng trong tự nhiên';
case FishRarity.EXTINCT:
return 'Tuyệt chủng';
case FishRarity.DATA_DEFICIENT:
return 'Thiếu dữ liệu';
default:
return 'Không xác định';
}
}
/**
* Get rarity label in English
* @param id Rarity level ID
* @returns Rarity label in English
*/
export function getRarityByIdEn(id: number): string {
switch (id) {
case FishRarity.NORMAL:
return 'Common';
case FishRarity.VULNERABLE:
return 'Vulnerable';
case FishRarity.NEAR_THREATENED:
return 'Near Threatened';
case FishRarity.ENDANGERED:
return 'Endangered';
case FishRarity.CRITICALLY_ENDANGERED:
return 'Critically Endangered';
case FishRarity.EXTINCT_IN_WILD:
return 'Extinct in Wild';
case FishRarity.EXTINCT:
return 'Extinct';
case FishRarity.DATA_DEFICIENT:
return 'Data Deficient';
default:
return 'Unknown';
}
}

View File

@@ -0,0 +1,18 @@
export function flattenGroupNodes(
nodes: MasterModel.GroupNode[],
): MasterModel.GroupNode[] {
const result: MasterModel.GroupNode[] = [];
function traverse(node: MasterModel.GroupNode) {
const { children, ...nodeWithoutChildren } = node;
result.push(nodeWithoutChildren);
if (children && children.length > 0) {
children.forEach((child) => traverse(child));
}
}
nodes.forEach((node) => traverse(node));
return result;
}

View File

@@ -0,0 +1,25 @@
export const formatDate = (dateString: string | number | Date) => {
return new Date(dateString).toLocaleDateString('vi-VN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
});
};
/**
* Chuyển đổi unix time (string hoặc int) sang định dạng DD/MM/YY HH:mm:ss
* @param unixTime Unix time (giây hoặc mili giây, dạng string hoặc int)
* @returns Chuỗi thời gian định dạng DD/MM/YY HH:mm:ss
*/
export function formatUnixTime(unixTime: string | number): string {
let ts = typeof unixTime === 'string' ? parseInt(unixTime, 10) : unixTime;
if (ts < 1e12) ts *= 1000; // Nếu là giây, chuyển sang mili giây
const d = new Date(ts);
const pad = (n: number) => n.toString().padStart(2, '0');
return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d
.getFullYear()
.toString()
.slice(-2)} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(
d.getSeconds(),
)}`;
}