tools.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { ref, unref } from 'vue';
  2. import XEUtils from 'xe-utils';
  3. import { ElMessage } from 'element-plus';
  4. import { weekColumns } from '/@/views/reportManage/dataCenter/utils/columns';
  5. import { weekMetricsEnum } from '/@/views/reportManage/dataCenter/utils/enum';
  6. export function buildChartOpt(option: any, metrics: any[]) {
  7. const tmp: any = {};
  8. const opt: any = {
  9. legend: { selected: {} },
  10. yAxis: [],
  11. series: [],
  12. };
  13. for (const info of metrics) {
  14. tmp[info.color] = info;
  15. }
  16. for (const info of option.series) {
  17. const color = info.itemStyle.color;
  18. const metricInfo = tmp[color];
  19. if (metricInfo) {
  20. opt.series.push({
  21. id: info.id,
  22. name: metricInfo.label,
  23. encode: { y: metricInfo.metric },
  24. });
  25. opt.yAxis.push({ id: info.id, name: metricInfo.label, show: true });
  26. } else {
  27. opt.yAxis.push({ id: info.id, show: false });
  28. }
  29. }
  30. for (const label of Object.keys(option.legend.selected)) {
  31. if (XEUtils.findIndexOf(metrics, (info) => info.label === label) === -1) {
  32. opt.legend.selected[label] = false;
  33. } else {
  34. opt.legend.selected[label] = true;
  35. }
  36. }
  37. //console.log(opt)
  38. return opt;
  39. }
  40. export function parseQueryParams(body: any) {
  41. const ret: any = {};
  42. for (const key in body) {
  43. const val = unref(body[key]);
  44. if (key === 'currentDate') {
  45. if (val.dailyStartDate && val.dailyTime) {
  46. ret['data_start_date'] = val.dailyStartDate;
  47. ret['data_end_date'] = val.dailyTime;
  48. }
  49. if (val.weekStartDate && val.weekEndDate) {
  50. ret['data_start_date'] = val.weekStartDate;
  51. ret['data_end_date'] = val.weekEndDate;
  52. }
  53. if (val.startDate && val.endDate) {
  54. ret['data_start_date'] = val.startDate;
  55. ret['data_end_date'] = val.endDate;
  56. }
  57. } else if (key === 'taskIds') {
  58. ret['task_ids'] = val; // 将 task_ids 直接赋给返回对象的属性
  59. } else {
  60. ret[key] = val;
  61. }
  62. }
  63. return ret;
  64. }
  65. export function monthlyQueryParams(body: any) {
  66. const date: any = {};
  67. for (const key in body) {
  68. const val = unref(body[key]);
  69. if (key === 'monthCurrentDate') {
  70. date['month_start_date'] = val.startDate;
  71. date['month_end_date'] = val.endDate;
  72. } else if (key === 'taskIds') {
  73. date['task_ids'] = val; // 将 task_ids 直接赋给返回对象的属性
  74. } else {
  75. date[key] = val;
  76. }
  77. }
  78. return date;
  79. }
  80. export function flattenColumns(columns) {
  81. let result = [];
  82. columns.forEach(column => {
  83. if (column.children && column.children.length > 0) {
  84. result = result.concat(flattenColumns(column.children));
  85. } else {
  86. result.push(column);
  87. }
  88. });
  89. return result;
  90. }
  91. export function validateNumericFields(fields: Record<string, any>, fieldsToValidate: string[]): boolean {
  92. const numericFields = ['sales_original', 'total_sales_current_monthly_original', 'ad_sales_original', 'ad_cost_original', 'money_by_amazon', 'money_by_other', 'refundRate'];
  93. const integerFields = ['impression', 'ad_click', 'ad_order', 'session', 'order', 'availableSalesDay', 'intransitInventory', 'overseasStorage'];
  94. for (const field of fieldsToValidate) {
  95. const value = fields[field];
  96. const flatWeekColumns = ref(flattenColumns(weekColumns.value));
  97. const column = flatWeekColumns.value.find(col => col.field === field);
  98. const title = column ? column.title : field;
  99. if (numericFields.includes(field)) {
  100. if (value === null || value === undefined || value === '') {
  101. ElMessage.warning(`${ title } 不能为空`);
  102. return false;
  103. }
  104. if (isNaN(Number(value))) {
  105. ElMessage.warning(`${ title } 必须为数字`);
  106. return false;
  107. }
  108. } else if (integerFields.includes(field)) {
  109. if (value === null || value === undefined || value === '') {
  110. ElMessage.warning(`${ title } 不能为空`);
  111. return false;
  112. }
  113. if (!Number.isInteger(Number(value)) || isNaN(Number(value))) {
  114. ElMessage.warning(`${ title } 必须为整数`);
  115. return false;
  116. }
  117. }
  118. }
  119. return true;
  120. }
  121. export function validateNumber(rule, value) {
  122. if (value !== '' && isNaN(value)) {
  123. const fieldName = rule.field; // 获取当前字段名称
  124. const flatWeekColumns = ref(flattenColumns(weekColumns.value));
  125. const column = flatWeekColumns.value.find(col => col.field === fieldName);
  126. const title = column ? column.title : field;
  127. if (title) {
  128. return new Error(`${title} 必须为数字`);
  129. } else {
  130. return new Error('输入值必须为数字'); // 如果无法找到对应的 label,使用通用错误信息
  131. }
  132. }
  133. return true; // 输入有效
  134. }