FPSMS-frontend
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 

195 строки
5.5 KiB

  1. import dayjs, { ConfigType, Dayjs } from "dayjs";
  2. import { Uom } from "../api/settings/uom";
  3. import {
  4. ListIterateeCustom,
  5. every,
  6. isArray,
  7. isNaN,
  8. isNull,
  9. isUndefined,
  10. take,
  11. } from "lodash";
  12. import { Box, BoxProps } from "@mui/material";
  13. export const manhourFormatter = new Intl.NumberFormat("en-HK", {
  14. minimumFractionDigits: 2,
  15. maximumFractionDigits: 2,
  16. });
  17. export const moneyFormatter = new Intl.NumberFormat("en-HK", {
  18. style: "currency",
  19. currency: "HKD",
  20. });
  21. export const decimalFormatter = new Intl.NumberFormat("en-HK", {
  22. minimumFractionDigits: 2,
  23. maximumFractionDigits: 5,
  24. });
  25. export const integerFormatter = new Intl.NumberFormat("en-HK", {});
  26. export const INPUT_DATE_FORMAT = "YYYY-MM-DD";
  27. export const OUTPUT_DATE_FORMAT = "YYYY-MM-DD";
  28. export const INPUT_TIME_FORMAT = "HH:mm:ss";
  29. export const OUTPUT_TIME_FORMAT = "HH:mm:ss";
  30. export const arrayToDayjs = (arr: ConfigType | (number | undefined)[], showTime: boolean = false) => {
  31. const isValidNumber = (
  32. item: ListIterateeCustom<number | undefined, boolean>,
  33. ): boolean => typeof item === "number" && !isNaN(item) && isFinite(item);
  34. let tempArr = arr;
  35. if (isArray(arr) && every(arr, isValidNumber) && arr.length >= 3) {
  36. // [year, month, day]
  37. // tempArr = take(arr, 3);
  38. tempArr = `${arr[0]?.toString().padStart(4, "0")}-${arr[1]?.toString().padStart(2, "0")}-${arr[2]?.toString().padStart(2, "0")}`;
  39. if (showTime) {
  40. // [year, month, day, hour, minute, second]
  41. tempArr += ` ${
  42. arr[3]?.toString().padStart(2, "0")}:${
  43. arr[4]?.toString().padStart(2, "0")}:${
  44. (arr[5] ?? 0)?.toString().padStart(2, "0")}`;
  45. }
  46. }
  47. return dayjs(tempArr as ConfigType);
  48. };
  49. export const arrayToDateString = (arr: ConfigType | (number | undefined)[], format: "input"|"output" = "output") => {
  50. if (format == "output") {
  51. return arrayToDayjs(arr).format(OUTPUT_DATE_FORMAT);
  52. }
  53. else {
  54. return arrayToDayjs(arr).format(INPUT_DATE_FORMAT);
  55. }
  56. };
  57. export const arrayToDateTimeString = (arr: ConfigType | (number | undefined)[]) => {
  58. return arrayToDayjs(arr, true).format(`${OUTPUT_DATE_FORMAT} ${OUTPUT_TIME_FORMAT}`);
  59. };
  60. export const dateStringToDayjs = (date: string) => {
  61. // Format: YYYY/MM/DD
  62. return dayjs(date, OUTPUT_DATE_FORMAT);
  63. };
  64. export const dateTimeStringToDayjs = (dateTime: string) => {
  65. // Format: YYYY/MM/DD HH:mm:ss
  66. return dayjs(dateTime, `${OUTPUT_DATE_FORMAT} ${OUTPUT_TIME_FORMAT}`);
  67. };
  68. export const dayjsToDateString = (date: Dayjs, format: "input"|"output" = "output") => {
  69. if (format == "output") {
  70. return date.format(OUTPUT_DATE_FORMAT);
  71. } else {
  72. return date.format(INPUT_DATE_FORMAT);
  73. }
  74. };
  75. export const dayjsToDateTimeString = (date: Dayjs, format: "input"|"output" = "input") => {
  76. if (format == "input") {
  77. return date.format(`${INPUT_DATE_FORMAT}T${INPUT_TIME_FORMAT}`);
  78. }
  79. else {
  80. return date.format(`${OUTPUT_DATE_FORMAT}T${OUTPUT_TIME_FORMAT}`);
  81. }
  82. };
  83. export const dayjsToArray = (date: Dayjs) => {
  84. return [
  85. date.year(),
  86. date.month() + 1, // Months are 0-based in Day.js, so add 1
  87. date.date(),
  88. date.hour(), // (24-hour format)
  89. date.minute(),
  90. date.second(),
  91. ];
  92. };
  93. export const outputDateStringToInputDateString = (date: string) => {
  94. return dayjsToDateTimeString(dateStringToDayjs(date))
  95. }
  96. export const stockInLineStatusMap: { [status: string]: number } = {
  97. draft: 0,
  98. pending: 1,
  99. qc: 2,
  100. determine1: 3,
  101. determine2: 4,
  102. determine3: 5,
  103. receiving: 6,
  104. received: 7,
  105. completed: 8,
  106. rejected: 9,
  107. };
  108. export const stockOutLineStatusMap: { [status: string]: number } = {
  109. draft: 0,
  110. pending: 1, // waiting for qc
  111. determine1: 2, // waiting for qc
  112. "lot-change": 3, // waiting for qc
  113. // after qc = completed
  114. completed: 4,
  115. rejected: 5,
  116. };
  117. export const pickOrderStatusMap: { [status: string]: number } = {
  118. pending: 1,
  119. consolidated: 2,
  120. released: 3,
  121. completed: 4,
  122. };
  123. export const calculateWeight = (qty: number, uom: Uom) => {
  124. return qty * (uom.unit2Qty || 1) * (uom.unit3Qty || 1) * (uom.unit4Qty || 1);
  125. };
  126. export const returnWeightUnit = (uom: Uom) => {
  127. return uom.unit4 || uom.unit3 || uom.unit2 || uom.unit1;
  128. };
  129. /**
  130. * Formats departure time to HH:mm format
  131. * Handles array format [hours, minutes] from API and string formats
  132. */
  133. export const formatDepartureTime = (time: string | number[] | String | Number | null | undefined): string => {
  134. if (!time) return "-";
  135. // Handle array format [hours, minutes] from API
  136. if (Array.isArray(time) && time.length >= 2) {
  137. const hours = time[0];
  138. const minutes = time[1];
  139. if (typeof hours === 'number' && typeof minutes === 'number' &&
  140. hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59) {
  141. return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`;
  142. }
  143. }
  144. const timeStr = String(time).trim();
  145. if (!timeStr || timeStr === "-") return "-";
  146. // If already in HH:mm format, return as is
  147. if (/^\d{1,2}:\d{2}$/.test(timeStr)) {
  148. const [hours, minutes] = timeStr.split(":");
  149. return `${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}`;
  150. }
  151. return timeStr;
  152. };
  153. /**
  154. * Normalizes store ID to display format (2F or 4F)
  155. */
  156. export const normalizeStoreId = (storeId: string | number | String | Number | null | undefined): string => {
  157. if (!storeId) return "-";
  158. const storeIdStr = typeof storeId === 'string' || storeId instanceof String
  159. ? String(storeId)
  160. : String(storeId);
  161. if (storeIdStr === "2" || storeIdStr === "2F") return "2F";
  162. if (storeIdStr === "4" || storeIdStr === "4F") return "4F";
  163. return storeIdStr;
  164. };