解决冲突
This commit is contained in:
commit
5a35e6fd1a
|
|
@ -52,7 +52,10 @@ export function getStructuralEvolutionAnalysisPost(time) {
|
|||
return http.get(`/groupEvolution/groupStructure/posts?date=${time}`)
|
||||
}
|
||||
|
||||
|
||||
// 2.6 群体结构演化分析的关系图
|
||||
export function getStructuralEvolutionAnalysisGraph(time) {
|
||||
return http.get(`/groupEvolution/groupStructure/relation?date=${time}`)
|
||||
}
|
||||
|
||||
// 3.群体成员演化分析
|
||||
// 3.1 获取时间线数据
|
||||
|
|
@ -80,6 +83,10 @@ export function getGroupMemberEvolutionAnalysisChart() {
|
|||
return http.get(`/groupEvolution/groupMember/rightChart`)
|
||||
}
|
||||
|
||||
//3.6 群体成员演化分析的关系图
|
||||
export function getGroupMemberEvolutionAnalysisGraph(time) {
|
||||
return http.get(`/groupEvolution/groupMember/relation?date=${time}`)
|
||||
}
|
||||
// 4.异常群体捕捉
|
||||
// 4.1获取时间轴
|
||||
export function getAbnormalGroupTimeLine() {
|
||||
|
|
@ -102,4 +109,3 @@ export function getAbnormalGroupBehaviorPosts(time) {
|
|||
export function getAbnormalGroupBehaviorDetail(time) {
|
||||
return http.get(`/groupEvolution/groupException/rightChart?date=${time}`)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ import {
|
|||
getGroupMemberChart,
|
||||
getGroupMemberEvolutionInfoByTime,
|
||||
getGroupMemberEvolutionAnalysisChart,
|
||||
getStructuralEvolutionAnalysisGraph,
|
||||
getGroupMemberEvolutionAnalysisGraph,
|
||||
|
||||
// 4.异常群体捕捉
|
||||
getAbnormalGroupTimeLine,
|
||||
|
|
@ -523,7 +525,7 @@ export const useGroupStructureStore = defineStore("groupStructure", {
|
|||
}
|
||||
return colorMap[parseInt(groupId)]
|
||||
}
|
||||
const res = await getRelationGraphByUtcTime(utcTime)
|
||||
const res = await getStructuralEvolutionAnalysisGraph(utcTime)
|
||||
if (res.code != 200) return
|
||||
const newSet = new Set()
|
||||
this.graph["links"] = res.data.links.map((link) => ({
|
||||
|
|
@ -546,6 +548,7 @@ export const useGroupStructureStore = defineStore("groupStructure", {
|
|||
type: node.groupId
|
||||
}
|
||||
})
|
||||
this.graph["newLinks"] = res.data?.newAddRelation ?? []
|
||||
},
|
||||
// 初始化群体结构演化分析的群体演化信息-中下-随时间轴变化
|
||||
async initializeStructuralPost(time = "2024-06-19T07:57:46Z") {
|
||||
|
|
@ -591,8 +594,6 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
|||
},
|
||||
async initializeGroupMemberChart() {
|
||||
const res = await getGroupMemberChart()
|
||||
// console.log("测试获取groupMemberChart:",res);
|
||||
|
||||
const xAxisData = res.data.xaxisData.map((item) => utcStringToHHMMSS(item))
|
||||
const yAxisRange = res.data.yaxisRange
|
||||
const themeColors = ["#2AB8FD", "#02D7DA", "#FFDA09", "#EB57B0"]
|
||||
|
|
@ -689,7 +690,9 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
|||
}
|
||||
return colorMap[parseInt(groupId)]
|
||||
}
|
||||
const res = await getRelationGraphByUtcTime(utcTime)
|
||||
const res = await getGroupMemberEvolutionAnalysisGraph(utcTime)
|
||||
console.log(res)
|
||||
|
||||
if (res.code != 200) return
|
||||
const newSet = new Set()
|
||||
this.graph["links"] = res.data.links.map((link) => ({
|
||||
|
|
@ -712,17 +715,17 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
|||
type: node.groupId
|
||||
}
|
||||
})
|
||||
console.log(this.graph);
|
||||
this.graph["newNodes"] = res.data?.newAddUser ?? []
|
||||
}
|
||||
},
|
||||
persist: true // 开启持久化
|
||||
})
|
||||
|
||||
// —— 时间门槛 ——
|
||||
const T0 = "2024-06-19T07:57:46Z"; // 默认渲染出全部节点
|
||||
const TA = "2024-06-19T08:57:55Z"; // A 组异常开始
|
||||
const TB = "2024-06-19T10:58:03Z"; // B 组异常开始
|
||||
const TC = "2024-06-19T12:58:04Z"; // C 组异常开始
|
||||
// —— 时间门槛 ——
|
||||
const T0 = "2024-06-19T07:57:46Z" // 默认渲染出全部节点
|
||||
const TA = "2024-06-19T08:57:55Z" // A 组异常开始
|
||||
const TB = "2024-06-19T10:58:03Z" // B 组异常开始
|
||||
const TC = "2024-06-19T12:58:04Z" // C 组异常开始
|
||||
|
||||
export const useAnomalousGroup = defineStore("anomalousGroup", {
|
||||
state: () => ({
|
||||
|
|
@ -868,37 +871,37 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
graphData: {
|
||||
nodes: [
|
||||
{ id: "G01_A", type: "0", isAnomaly: false, label: "G01" },
|
||||
{ id: "G02_A", type: "0", isAnomaly: true, label: "G02" },
|
||||
{ id: "G02_A", type: "0", isAnomaly: true, label: "G02" },
|
||||
{ id: "G03_A", type: "0", isAnomaly: false, label: "G03" },
|
||||
{ id: "G04_A", type: "0", isAnomaly: false, label: "G04" },
|
||||
{ id: "G05_A", type: "0", isAnomaly: false, label: "G05" },
|
||||
{ id: "G06_A", type: "0", isAnomaly: false, label: "G06" },
|
||||
{ id: "G07_A", type: "0", isAnomaly: true, label: "G07" },
|
||||
{ id: "G07_A", type: "0", isAnomaly: true, label: "G07" },
|
||||
{ id: "G08_A", type: "0", isAnomaly: false, label: "G08" },
|
||||
{ id: "G09_A", type: "0", isAnomaly: false, label: "G09" },
|
||||
{ id: "G10_A", type: "0", isAnomaly: false, label: "G10" },
|
||||
{ id: "G11_A", type: "0", isAnomaly: false, label: "G11" },
|
||||
{ id: "G12_A", type: "0", isAnomaly: false, label: "G12" },
|
||||
|
||||
|
||||
{ id: "G01_B", type: "1", isAnomaly: false, label: "G01" },
|
||||
{ id: "G02_B", type: "1", isAnomaly: false, label: "G02" },
|
||||
{ id: "G03_B", type: "1", isAnomaly: false, label: "G03" },
|
||||
{ id: "G04_B", type: "1", isAnomaly: true, label: "G04" },
|
||||
{ id: "G04_B", type: "1", isAnomaly: true, label: "G04" },
|
||||
{ id: "G05_B", type: "1", isAnomaly: false, label: "G05" },
|
||||
{ id: "G06_B", type: "1", isAnomaly: false, label: "G06" },
|
||||
{ id: "G07_B", type: "1", isAnomaly: false, label: "G07" },
|
||||
{ id: "G08_B", type: "1", isAnomaly: true, label: "G08" },
|
||||
{ id: "G08_B", type: "1", isAnomaly: true, label: "G08" },
|
||||
{ id: "G09_B", type: "1", isAnomaly: false, label: "G09" },
|
||||
{ id: "G10_B", type: "1", isAnomaly: false, label: "G10" },
|
||||
{ id: "G11_B", type: "1", isAnomaly: false, label: "G11" },
|
||||
{ id: "G12_B", type: "1", isAnomaly: false, label: "G12" },
|
||||
|
||||
|
||||
{ id: "G01_C", type: "6", isAnomaly: false, label: "G01" },
|
||||
{ id: "G02_C", type: "6", isAnomaly: false, label: "G02" },
|
||||
{ id: "G03_C", type: "6", isAnomaly: true, label: "G03" },
|
||||
{ id: "G03_C", type: "6", isAnomaly: true, label: "G03" },
|
||||
{ id: "G04_C", type: "6", isAnomaly: false, label: "G04" },
|
||||
{ id: "G05_C", type: "6", isAnomaly: false, label: "G05" },
|
||||
{ id: "G06_C", type: "6", isAnomaly: true, label: "G06" },
|
||||
{ id: "G06_C", type: "6", isAnomaly: true, label: "G06" },
|
||||
{ id: "G07_C", type: "6", isAnomaly: false, label: "G07" },
|
||||
{ id: "G08_C", type: "6", isAnomaly: false, label: "G08" },
|
||||
{ id: "G09_C", type: "6", isAnomaly: false, label: "G09" },
|
||||
|
|
@ -927,7 +930,7 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
{ source: "G07_A", target: "G10_A", type: "0" },
|
||||
{ source: "G07_A", target: "G01_A", type: "0" },
|
||||
{ source: "G07_A", target: "G04_A", type: "0" },
|
||||
|
||||
|
||||
/* —— 组内:B 环 —— */
|
||||
{ source: "G01_B", target: "G02_B", type: "1" },
|
||||
{ source: "G02_B", target: "G03_B", type: "1" },
|
||||
|
|
@ -948,7 +951,7 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
{ source: "G08_B", target: "G11_B", type: "1" },
|
||||
{ source: "G08_B", target: "G02_B", type: "1" },
|
||||
{ source: "G08_B", target: "G05_B", type: "1" },
|
||||
|
||||
|
||||
/* —— 组内:C 环 —— */
|
||||
{ source: "G01_C", target: "G02_C", type: "6" },
|
||||
{ source: "G02_C", target: "G03_C", type: "6" },
|
||||
|
|
@ -969,18 +972,18 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
{ source: "G06_C", target: "G09_C", type: "6" },
|
||||
{ source: "G06_C", target: "G12_C", type: "6" },
|
||||
{ source: "G06_C", target: "G03_C", type: "6" },
|
||||
|
||||
|
||||
/* —— 跨组连边 —— */
|
||||
{ source: "G02_A", target: "G04_B", type: "0" },
|
||||
{ source: "G07_A", target: "G08_B", type: "0" },
|
||||
{ source: "G01_A", target: "G05_B", type: "0" },
|
||||
{ source: "G05_A", target: "G10_B", type: "0" },
|
||||
|
||||
|
||||
{ source: "G04_B", target: "G03_C", type: "1" },
|
||||
{ source: "G08_B", target: "G06_C", type: "1" },
|
||||
{ source: "G02_B", target: "G09_C", type: "1" },
|
||||
{ source: "G11_B", target: "G01_C", type: "1" },
|
||||
|
||||
|
||||
{ source: "G03_C", target: "G02_A", type: "6" },
|
||||
{ source: "G06_C", target: "G07_A", type: "6" },
|
||||
{ source: "G04_C", target: "G09_A", type: "6" },
|
||||
|
|
@ -995,12 +998,12 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
}
|
||||
},
|
||||
graphAbnormalData: {
|
||||
groupA: ["G02_A", "G07_A"],
|
||||
groupB: ["G04_B", "G08_B"],
|
||||
groupC: ["G03_C", "G06_C"],
|
||||
abnormalNodesT1: ["G02_A", "G07_A"],
|
||||
abnormalNodesT2: ["G04_B", "G08_B"],
|
||||
abnormalNodesT3: ["G02_A", "G07_A", "G04_B", "G08_B", "G03_C", "G06_C"]
|
||||
groupA: ["G02_A", "G07_A"],
|
||||
groupB: ["G04_B", "G08_B"],
|
||||
groupC: ["G03_C", "G06_C"],
|
||||
abnormalNodesT1: ["G02_A", "G07_A"],
|
||||
abnormalNodesT2: ["G04_B", "G08_B"],
|
||||
abnormalNodesT3: ["G02_A", "G07_A", "G04_B", "G08_B", "G03_C", "G06_C"]
|
||||
}
|
||||
}),
|
||||
actions: {
|
||||
|
|
@ -1043,7 +1046,7 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
async initializeAbnormalGroupPosts(time = "2024-06-19T07:57:46Z") {
|
||||
const res = await getAbnormalGroupBehaviorPosts(time)
|
||||
if (res.code === 200) {
|
||||
this.posts = res.data.map((item => ({
|
||||
this.posts = res.data.map((item) => ({
|
||||
id: item.id,
|
||||
abnormalGroup: item.abnormalGroup,
|
||||
explanation: item.explanation,
|
||||
|
|
@ -1052,10 +1055,8 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
JS: parseFloat(item.js),
|
||||
CUSUM: parseFloat(item.cusum),
|
||||
KS: parseFloat(item.ks)
|
||||
})))
|
||||
|
||||
}))
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// 异常互动详情-右上
|
||||
|
|
@ -1067,16 +1068,16 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
},
|
||||
// 用于画中间组件的圆
|
||||
async initialGraphByUtcTime(utcIso) {
|
||||
this.currentUtc = utcIso;
|
||||
this.currentUtc = utcIso
|
||||
// 1) 复制 nodes 并上色
|
||||
const nodes = this.graphData.nodes.map(n => {
|
||||
const nodes = this.graphData.nodes.map((n) => {
|
||||
return {
|
||||
id: n.id,
|
||||
label: n.label,
|
||||
type: n.type, // 0=A, 1=B, 6=C(组件里 colorMap 已按这三个上色/分组)
|
||||
isAnomaly: n.isAnomaly
|
||||
};
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
this.graph["nodes"] = nodes
|
||||
|
||||
|
|
@ -1088,14 +1089,13 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
|||
}
|
||||
return colorMap[type]
|
||||
}
|
||||
|
||||
const links = this.graphData.links.map(l => ({
|
||||
|
||||
const links = this.graphData.links.map((l) => ({
|
||||
source: l.source,
|
||||
target: l.target,
|
||||
color: setColor(l.type),
|
||||
color: setColor(l.type)
|
||||
}))
|
||||
this.graph["links"] = links
|
||||
|
||||
}
|
||||
},
|
||||
persist: true // 开启持久化
|
||||
|
|
|
|||
|
|
@ -144,7 +144,67 @@ const runDiffForceLayout = (layoutConfig, layoutType, isAsync) => {
|
|||
}
|
||||
|
||||
const handleAnomalousGroup = () => {
|
||||
console.log(storeId)
|
||||
// 当前时间从 store 取;没有就用 T0
|
||||
const now = props.store.currentUtc
|
||||
const TA = "2024-06-19T08:57:55Z" // A
|
||||
const TB = "2024-06-19T10:58:03Z" // B
|
||||
const TC = "2024-06-19T12:58:04Z" // C
|
||||
// 组色(与你现有 colorMap 一致)
|
||||
const GROUP_ALPHA = 0.3
|
||||
const RED = "220,50,60"
|
||||
// 时间门控:达到阈值就把各组异常节点染红
|
||||
const shouldA = now >= TA
|
||||
const shouldB = now >= TB
|
||||
const shouldC = now >= TC
|
||||
if (shouldA) {
|
||||
graphVis.nodes = graphVis.nodes.map((n) => {
|
||||
if (props.store.graphAbnormalData.groupA.includes(n.id)) {
|
||||
n.fillColor = RED
|
||||
}
|
||||
return n
|
||||
})
|
||||
graphVis.addNodesInGroup(
|
||||
graphVis.nodes.filter((n) => props.store.graphAbnormalData.groupA.includes(n.id)),
|
||||
{
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
}
|
||||
)
|
||||
}
|
||||
if (shouldB) {
|
||||
graphVis.nodes = graphVis.nodes.map((n) => {
|
||||
if (props.store.graphAbnormalData.groupB.includes(n.id)) {
|
||||
n.fillColor = RED
|
||||
}
|
||||
return n
|
||||
})
|
||||
graphVis.addNodesInGroup(
|
||||
graphVis.nodes.filter((n) => props.store.graphAbnormalData.groupB.includes(n.id)),
|
||||
{
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
}
|
||||
)
|
||||
}
|
||||
if (shouldC) {
|
||||
graphVis.nodes = graphVis.nodes.map((n) => {
|
||||
if (props.store.graphAbnormalData.groupC.includes(n.id)) {
|
||||
n.fillColor = RED
|
||||
}
|
||||
return n
|
||||
})
|
||||
graphVis.addNodesInGroup(
|
||||
graphVis.nodes.filter((n) => props.store.graphAbnormalData.groupC.includes(n.id)),
|
||||
{
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
}
|
||||
)
|
||||
}
|
||||
graphVis.autoGroupLayout(graphVis.nodes)
|
||||
}
|
||||
|
||||
new Map([
|
||||
|
|
@ -191,91 +251,6 @@ const clusterAnalyze = () => {
|
|||
})
|
||||
})
|
||||
graphVis.autoGroupLayout(graphVis.nodes)
|
||||
|
||||
function handleGroupDiscoveryDiff() {
|
||||
console.log(storeId)
|
||||
}
|
||||
|
||||
function handleGroupStructureDiff() {
|
||||
console.log(storeId)
|
||||
}
|
||||
|
||||
function handleGroupMemberDiff() {
|
||||
console.log(storeId)
|
||||
}
|
||||
|
||||
function handleAnomalousGroup() {
|
||||
console.log(storeId)
|
||||
|
||||
// 当前时间从 store 取;没有就用 T0
|
||||
const now = (props.store.currentUtc);
|
||||
|
||||
const TA = "2024-06-19T08:57:55Z"; // A
|
||||
const TB = "2024-06-19T10:58:03Z"; // B
|
||||
const TC = "2024-06-19T12:58:04Z"; // C
|
||||
|
||||
// 组色(与你现有 colorMap 一致)
|
||||
const GROUP_ALPHA = 0.30;
|
||||
|
||||
const RED = "220,50,60";
|
||||
|
||||
// 时间门控:达到阈值就把各组异常节点染红
|
||||
const shouldA = now >= TA;
|
||||
const shouldB = now >= TB;
|
||||
const shouldC = now >= TC;
|
||||
|
||||
if(shouldA) {
|
||||
graphVis.nodes = graphVis.nodes.map(n => {
|
||||
if(props.store.graphAbnormalData.groupA.includes(n.id)) {
|
||||
n.fillColor = RED;
|
||||
}
|
||||
return n;
|
||||
})
|
||||
console.log(graphVis.nodes)
|
||||
graphVis.addNodesInGroup(graphVis.nodes.filter(n => props.store.graphAbnormalData.groupA.includes(n.id)), {
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
})
|
||||
|
||||
}
|
||||
if(shouldB) {
|
||||
graphVis.nodes = graphVis.nodes.map(n => {
|
||||
if(props.store.graphAbnormalData.groupB.includes(n.id)) {
|
||||
n.fillColor = RED;
|
||||
}
|
||||
return n;
|
||||
})
|
||||
graphVis.addNodesInGroup(graphVis.nodes.filter(n => props.store.graphAbnormalData.groupB.includes(n.id)), {
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
})
|
||||
|
||||
}
|
||||
if(shouldC) {
|
||||
graphVis.nodes = graphVis.nodes.map(n => {
|
||||
if(props.store.graphAbnormalData.groupC.includes(n.id)) {
|
||||
n.fillColor = RED;
|
||||
}
|
||||
return n;
|
||||
})
|
||||
graphVis.addNodesInGroup(graphVis.nodes.filter(n => props.store.graphAbnormalData.groupC.includes(n.id)), {
|
||||
shape: "circle",
|
||||
color: RED,
|
||||
alpha: GROUP_ALPHA
|
||||
})
|
||||
}
|
||||
graphVis.autoGroupLayout(graphVis.nodes);
|
||||
}
|
||||
|
||||
new Map([
|
||||
["groupDiscovery", () => handleGroupDiscoveryDiff()],
|
||||
["groupStructure", () => handleGroupStructureDiff()],
|
||||
["groupMember", () => handleGroupMemberDiff()],
|
||||
["anomalousGroup", () => handleAnomalousGroup()]
|
||||
]).get(storeId)?.()
|
||||
// graphVis.selectedEdge(graphVis.links[0])
|
||||
}
|
||||
|
||||
// 仅对“异常群体模块”生效:时间变化时强制重绘一次
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user