TaskFlowchart.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import type { ITaskData } from "../../api/task";
  2. import Mermaid from "../general/Mermaid";
  3. interface IWidget {
  4. tasks?: ITaskData[];
  5. }
  6. const TaskFlowchart = ({ tasks }: IWidget) => {
  7. let mermaidText = "flowchart LR\n";
  8. //节点样式
  9. const color = [
  10. {
  11. status: "pending",
  12. fill: "#fafafa",
  13. stroke: "#d9d9d9",
  14. color: "#000000d9",
  15. },
  16. {
  17. status: "published",
  18. fill: "#fff7e6",
  19. stroke: "#ffd591",
  20. color: "#d46b08",
  21. },
  22. { status: "running", fill: "#e6f7ff", stroke: "#91d5ff", color: "#1890ff" },
  23. { status: "done", fill: "#f6ffed", stroke: "#b7eb8f", color: "#52c41a" },
  24. {
  25. status: "restarted",
  26. fill: "r#fff2f0",
  27. stroke: "#ffccc7",
  28. color: "#ff4d4f",
  29. },
  30. {
  31. status: "requested_restart",
  32. fill: "#fffbe6",
  33. stroke: "#ffe58f",
  34. color: "#faad14",
  35. },
  36. { status: "closed", fill: "yellow", stroke: "#333", color: "#333" },
  37. { status: "canceled", fill: "gray", stroke: "#333", color: "#333" },
  38. { status: "expired", fill: "brown", stroke: "#333", color: "#333" },
  39. ];
  40. color.forEach((value) => {
  41. mermaidText += `classDef ${value.status} fill:${value.fill},stroke:${value.stroke},color:${value.color},stroke-width:1px;\n`;
  42. });
  43. const relationLine = new Map<string, number>();
  44. tasks?.forEach((task: ITaskData, _index: number, array: ITaskData[]) => {
  45. //输出节点
  46. mermaidText += `${task.id}[${task.title}]:::${task.status};\n`;
  47. //输出带有子任务的节点
  48. const children = array.filter(
  49. (value: ITaskData, _index: number, _array: ITaskData[]) => {
  50. return value.parent_id === task.id;
  51. }
  52. );
  53. if (children.length > 0) {
  54. mermaidText += `subgraph ${task.id} ["${task.title}"]\n`;
  55. mermaidText += `${children.map((task) => task.id).join(`;\n`)}`;
  56. mermaidText += ";\nend\n";
  57. }
  58. //关系线
  59. task.pre_task?.map((item) =>
  60. relationLine.set(`${item.id} --> ${task.id};\n`, 0)
  61. );
  62. task.next_task?.map((item) =>
  63. relationLine.set(`${task.id} --> ${item.id};\n`, 0)
  64. );
  65. });
  66. Array.from(relationLine.keys()).forEach((value) => {
  67. mermaidText += value;
  68. });
  69. console.debug(mermaidText);
  70. return (
  71. <div>
  72. <Mermaid text={mermaidText} />
  73. </div>
  74. );
  75. };
  76. export default TaskFlowchart;