提交 fbfbd8f0 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 62208212
......@@ -34,3 +34,8 @@ export function getMaterialList() {
export function ruleQuery(data: { experiment_id: string; filters: string }) {
return httpRequest.post('/api/resource/v1/backend/experiment-itinerary/itinerary-query', data)
}
// 获取指定群组的成员数量
export function getGroupMemberCount(params: { group_id: string }) {
return httpRequest.get('/api/resource/v1/backend/experiment-itinerary/group-member-count', { params })
}
......@@ -114,62 +114,138 @@ async function handleCalculate() {
<template>
<el-dialog :title="title" append-to-body width="800px" class="rule-template">
<slot :model="form">
<slot name="header">
<el-form ref="formRef" :model="form" label-suffix=":">
<el-form ref="formRef" :model="form" label-suffix=":">
<slot name="header">
<el-row justify="space-between">
<slot name="header-form-prepend" :model="form"></slot>
<el-form-item label="组件名称">{{ node.data.name }}</el-form-item>
<el-form-item label="组件答案"><slot name="header-answer" :model="form" /></el-form-item>
<slot name="header-form-append" :model="form"></slot>
</el-row>
</el-form>
</slot>
<el-tabs v-if="step" v-model="stepActive" stretch type="border-card">
<el-tab-pane label="STEP 1:计算初始化数据量" :name="0">
<slot name="step1">
<!-- 触发条件 -->
<el-row justify="center" style="padding: 40px 0">
<el-form label-suffix=":" label-width="160px">
<el-form-item label="用户总数">
<span class="rule-num">{{ form.user_total }}</span>
</el-form-item>
<el-form-item label="满足答案的用户总数" v-if="node.data.type === 1">
<span class="rule-num">{{ expectedUserTotalText }}</span>
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-form-item>
<el-form-item label="上一节点用户总数" v-else>
<div>
<p class="rule-num">
正确:{{ prevNodeRule.correct_operation_user_total || prevNodeRule.expected_user_total }}
</slot>
<el-tabs v-if="step" v-model="stepActive" stretch type="border-card">
<el-tab-pane label="STEP 1:计算初始化数据量" :name="0">
<slot name="step1">
<!-- 触发条件 -->
<el-row justify="center" style="padding: 40px 0">
<el-form label-suffix=":" label-width="160px">
<el-form-item label="用户总数">
<span class="rule-num">{{ form.user_total }}</span>
</el-form-item>
<slot name="step1-append"></slot>
<el-form-item label="满足答案的用户总数" v-if="node.data.type === 1">
<span class="rule-num">{{ expectedUserTotalText }}</span>
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-form-item>
<el-form-item label="上一节点用户总数" v-else>
<div>
<p class="rule-num">
正确:{{ prevNodeRule.correct_operation_user_total || prevNodeRule.expected_user_total }}
</p>
<p class="rule-num">错误:{{ prevNodeRule.correct_operation_user_total || 0 }}</p>
</div>
<!-- <el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button> -->
</el-form-item>
</el-form>
</el-row>
</slot>
</el-tab-pane>
<el-tab-pane label="STEP 2:配置生成规则" :name="1">
<slot name="step2">
<!-- 触发条件 -->
<template v-if="node.data.type === 1">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>满足答案的用户总数:{{ expectedUserTotalText }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<p class="rule-num">错误:{{ prevNodeRule.correct_operation_user_total || 0 }}</p>
<el-form-item>
<el-radio-group v-model="form.correct_operation_type">
<el-radio :label="1">全部数据</el-radio>
<el-radio :label="2">部分数据</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.correct_operation_type === 2">
<el-form-item label="选取规则">
<el-radio-group v-model="form.correct_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选取方式">
<el-radio-group v-model="form.correct_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入">
<template v-if="form.correct_operation_method === 1">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number
v-model="form.correct_operation_method_value"
:controls="false"
:max="form.expected_user_total"
v-else />
</el-form-item>
</template>
</div>
<!-- <el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button> -->
</el-form-item>
</el-form>
</el-row>
</slot>
</el-tab-pane>
<el-tab-pane label="STEP 2:配置生成规则" :name="1">
<slot name="step2">
<!-- 触发条件 -->
<template v-if="node.data.type === 1">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>满足答案的用户总数:{{ expectedUserTotalText }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item>
<el-radio-group v-model="form.correct_operation_type">
<el-radio :label="1">全部数据</el-radio>
<el-radio :label="2">部分数据</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.correct_operation_type === 2">
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,根据实际操作结果选取数据数量:
</p>
<el-form-item>
<el-radio-group v-model="form.error_operation_type">
<el-radio :label="1">全部数据</el-radio>
<el-radio :label="2">部分数据</el-radio>
<el-radio :label="3">不选取</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.error_operation_type === 2">
<el-form-item label="选取规则">
<el-radio-group v-model="form.error_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选取方式">
<el-radio-group v-model="form.error_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入">
<template v-if="form.error_operation_method === 1">
<el-input-number v-model="form.error_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number
v-model="form.error_operation_method_value"
:controls="false"
:max="form.expected_user_total"
v-else />
</el-form-item>
</template>
</div>
</section>
</template>
<!-- 营销动作 -->
<template v-if="node.data.type === 2">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
<slot name="step-header-append"></slot>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="选取规则">
<el-radio-group v-model="form.correct_operation_rule">
<el-radio :label="1">随机</el-radio>
......@@ -181,32 +257,33 @@ async function handleCalculate() {
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入">
<template v-if="form.correct_operation_method === 1">
<template v-if="form.correct_operation_method === 1">
<el-form-item label="成功">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number
v-model="form.correct_operation_method_value"
:controls="false"
:max="form.expected_user_total"
v-else />
</el-form-item>
</template>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,根据实际操作结果选取数据数量:
</p>
<el-form-item>
<el-radio-group v-model="form.error_operation_type">
<el-radio :label="1">全部数据</el-radio>
<el-radio :label="2">部分数据</el-radio>
<el-radio :label="3">不选取</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.error_operation_type === 2">
</el-form-item>
<el-form-item label="失败">
<el-input-number
v-model="form.correct_operation_method_fail_value"
:controls="false"
:max="100" />
&nbsp;%
</el-form-item>
</template>
<template v-else>
<el-form-item label="成功">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" />
</el-form-item>
<el-form-item label="失败">
<el-input-number v-model="form.correct_operation_method_fail_value" :controls="false" />
</el-form-item>
</template>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="选取规则">
<el-radio-group v-model="form.error_operation_rule">
<el-radio :label="1">随机</el-radio>
......@@ -218,228 +295,163 @@ async function handleCalculate() {
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入">
<template v-if="form.error_operation_method === 1">
<template v-if="form.error_operation_method === 1">
<el-form-item label="成功">
<el-input-number v-model="form.error_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number
v-model="form.error_operation_method_value"
:controls="false"
:max="form.expected_user_total"
v-else />
</el-form-item>
</template>
</div>
</section>
</template>
<!-- 营销动作 -->
<template v-if="node.data.type === 2">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>满足答案的用户总数:{{ expectedUserTotalText }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="选取规则">
<el-radio-group v-model="form.correct_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选取方式">
<el-radio-group v-model="form.correct_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.correct_operation_method === 1">
<el-form-item label="成功">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</el-form-item>
<el-form-item label="失败">
<el-input-number
v-model="form.correct_operation_method_fail_value"
:controls="false"
:max="100" />
&nbsp;%
</el-form-item>
</template>
<template v-else>
<el-form-item label="成功">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" />
</el-form-item>
<el-form-item label="失败">
<el-input-number v-model="form.correct_operation_method_fail_value" :controls="false" />
</el-form-item>
</template>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="选取规则">
<el-radio-group v-model="form.error_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选取方式">
<el-radio-group v-model="form.error_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="form.error_operation_method === 1">
<el-form-item label="成功">
<el-input-number v-model="form.error_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</el-form-item>
<el-form-item label="失败">
<el-input-number v-model="form.error_operation_method_fail_value" :controls="false" :max="100" />
&nbsp;%
</el-form-item>
</template>
<template v-else>
<el-form-item label="成功">
<el-input-number v-model="form.error_operation_method_value" :controls="false" />
</el-form-item>
<el-form-item label="失败">
<el-input-number v-model="form.error_operation_method_fail_value" :controls="false" />
</el-form-item>
</template>
</div>
</section>
</template>
</el-form-item>
<el-form-item label="失败">
<el-input-number
v-model="form.error_operation_method_fail_value"
:controls="false"
:max="100" />
&nbsp;%
</el-form-item>
</template>
<template v-else>
<el-form-item label="成功">
<el-input-number v-model="form.error_operation_method_value" :controls="false" />
</el-form-item>
<el-form-item label="失败">
<el-input-number v-model="form.error_operation_method_fail_value" :controls="false" />
</el-form-item>
</template>
</div>
</section>
</template>
<!-- 条件判断 -->
<template v-if="node.data.type === 3">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p v-if="node.data.type === 1">满足答案的用户总数:{{ expectedUserTotalText }}</p>
<p v-else>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
</section>
</template>
</slot>
</el-tab-pane>
<el-tab-pane label="STEP 3:预期数据量计算" :name="2">
<slot name="step3">
<!-- 触发条件 -->
<template v-if="node.data.type === 1">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>满足答案的用户总数:{{ expectedUserTotalText }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<p class="rule-num">{{ correctUserTotalText }}</p>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,根据实际操作结果选取数据数量:
</p>
<p class="rule-num">{{ errorUserTotalText }}</p>
</div>
</section>
</template>
<!-- 条件判断 -->
<template v-if="node.data.type === 3">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p v-if="node.data.type === 1">满足答案的用户总数:{{ expectedUserTotalText }}</p>
<p v-else>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
</header>
<slot name="step-body-after"></slot>
<slot name="step2-body">
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
</section>
</slot>
</template>
</slot>
</el-tab-pane>
<el-tab-pane label="STEP 3:预期数据量计算" :name="2">
<slot name="step3">
<!-- 触发条件 -->
<template v-if="node.data.type === 1">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>满足答案的用户总数:{{ expectedUserTotalText }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<p class="rule-num is-center">{{ correctUserTotalText }}</p>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,根据实际操作结果选取数据数量:
</p>
<p class="rule-num is-center">{{ errorUserTotalText }}</p>
</div>
</section>
</template>
<!-- 营销动作 -->
<template v-if="node.data.type === 2">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="成功"></el-form-item>
<el-form-item label="失败"> </el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="成功"> </el-form-item>
<el-form-item label="失败"> </el-form-item>
</div>
</section>
<el-row justify="center" style="margin-top: 20px">
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-row>
</template>
<!-- 营销动作 -->
<template v-if="node.data.type === 2">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
<slot name="step-header-append"></slot>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="成功"></el-form-item>
<el-form-item label="失败"> </el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="成功"> </el-form-item>
<el-form-item label="失败"> </el-form-item>
</div>
</section>
<el-row justify="center" style="margin-top: 20px">
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-row>
</template>
<!-- 条件判断 -->
<template v-if="node.data.type === 3">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
</header>
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">{{ form.expected_user_total }}</el-form-item>
<el-form-item label="不满足判断条件数据">
{{ Math.max(prevNodeExpectedTotal - (form.expected_user_total || 0), 0) }}
</el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
</section>
<el-row justify="center" style="margin-top: 20px">
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-row>
</template>
</slot>
</el-tab-pane>
</el-tabs>
<!-- 条件判断 -->
<template v-if="node.data.type === 3">
<header class="rule-result-header">
<p>用户总数:{{ form.user_total }}</p>
<p>上一节点用户总数:{{ prevNodeExpectedTotal }}</p>
</header>
<slot name="step-body-after"></slot>
<slot name="step3-body">
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">{{ form.expected_user_total }}</el-form-item>
<el-form-item label="不满足判断条件数据">
{{ Math.max(prevNodeExpectedTotal - (form.expected_user_total || 0), 0) }}
</el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,选取数据数量:
</p>
<el-form-item label="满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
<el-form-item label="不满足判断条件数据">
<el-radio :model-value="1" :label="1">根据实际判断结果计算</el-radio>
</el-form-item>
</div>
</section>
</slot>
<el-row justify="center" style="margin-top: 20px">
<el-button type="primary" :loading="isCalculating" @click="handleCalculate">计算</el-button>
</el-row>
</template>
</slot>
</el-tab-pane>
</el-tabs>
</el-form>
</slot>
<template #footer>
<el-row justify="center" v-if="step">
......@@ -481,7 +493,6 @@ async function handleCalculate() {
font-size: 20px;
font-weight: bold;
color: var(--main-color);
text-align: center;
}
.rule-result-header {
padding: 10px 0;
......@@ -509,6 +520,9 @@ async function handleCalculate() {
margin-right: 5px;
}
}
.is-center {
text-align: center;
}
.is-success {
color: #81b337;
}
......
<script setup lang="ts">
import { useMetaEvent } from '../../../composables/useAllData'
const props = defineProps<{ node: any }>()
const config = computed(() => {
return props.node.data.teacher || {}
})
const { getMetaEvent } = useMetaEvent()
const metaEvent = computed(() => getMetaEvent(config.value?.event_id))
const datalist = ref<any>([])
watchEffect(() => {
datalist.value =
metaEvent.value?.attributes.map(item => {
return { ...item, form: { mode: 1 } }
}) || []
})
</script>
<template>
<el-dialog title="配置事件属性规则" append-to-body width="1000px" class="generate-event">
<el-form label-suffix=":">
<el-row>
<el-col :span="12">
<el-form-item label="事件英文名称">{{ metaEvent?.english_name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="事件名称">{{ metaEvent?.name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="所属连接">{{ metaEvent?.connection_name }}</el-form-item>
</el-col>
<el-col :span="12"><el-form-item label="状态">生效</el-form-item></el-col>
</el-row>
</el-form>
<el-table border :data="datalist">
<el-table-column label="属性英文名" prop="english_name" align="center"></el-table-column>
<el-table-column label="属性名称" prop="name" align="center"></el-table-column>
<el-table-column label="字段类型" prop="type_name" align="center"></el-table-column>
<el-table-column label="字段格式" prop="format" align="center"></el-table-column>
<el-table-column label="属性生成规则" align="center" width="400">
<template #default="{ row }">
<el-radio-group v-model="row.form.mode">
<el-radio :label="1">随机值</el-radio>
<el-radio :label="2">固定值</el-radio>
<el-radio :label="3">历史随机值</el-radio>
</el-radio-group>
<!-- 字符串 -->
<template v-if="row.type === '1'">
<!-- 随机值 -->
<template v-if="row.form.mode === 1">
<el-radio-group>
<el-radio :label="1">来自于系统数据</el-radio>
<el-radio :label="4">完全随机</el-radio>
</el-radio-group>
</template>
<!-- 固定值 -->
<template v-if="row.form.mode === 2">
<el-input />
</template>
</template>
<!-- 整数 -->
<template v-if="row.type === '2'"></template>
<!-- 日期 -->
<template v-if="row.type === '4'">
<el-radio-group>
<el-radio :label="1">完全随机(不早于当前时间)</el-radio>
<el-radio :label="2">
时间区间<el-date-picker value-format="YYYY-MM-DD" />
<el-date-picker value-format="YYYY-MM-DD" />
</el-radio>
<el-radio :label="3">当前时间前<el-input-number :controls="false" /></el-radio>
<el-radio :label="4">当前时间后<el-input-number :controls="false" /></el-radio>
</el-radio-group>
</template>
</template>
</el-table-column>
</el-table>
<template #footer>
<el-row justify="center">
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
<el-button type="primary" auto-insert-space>保存</el-button>
</el-row>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import RuleTemplate from '../../RuleTemplate.vue'
import { useMetaEvent } from '../../../composables/useAllData'
import { SuccessFilled, CircleCloseFilled } from '@element-plus/icons-vue'
import Generate from './Generate.vue'
const { getMetaEvent } = useMetaEvent()
......@@ -11,12 +13,153 @@ const config = computed(() => {
})
const metaEvent = computed(() => getMetaEvent(config.value?.event_id))
function paramsParse(data: any) {
return { event_id: data.event_id }
}
const radio = ref('1')
const form = reactive({
correct_operation_rule: 1,
correct_operation_method: 1,
correct_operation_method_value: undefined,
correct_operation_method_fail_value: undefined,
correct_operation_min: undefined,
correct_operation_max: undefined,
error_operation_rule: 1,
error_operation_method: 1,
error_operation_method_value: undefined,
error_operation_method_fail_value: undefined,
error_operation_min: undefined,
error_operation_max: undefined
})
const generateVisible = ref(false)
function handleConfig() {
generateVisible.value = true
}
</script>
<template>
<RuleTemplate :node="node" step>
<RuleTemplate :node="node" step :paramsParse="paramsParse" v-bind="$attrs">
<template #header-answer>
<span class="is-answer">{{ metaEvent?.name }}</span>
</template>
<template #step-body-after>
<el-row justify="center" style="margin-bottom: 20px">
<el-radio-group v-model="radio" size="large">
<el-radio-button label="1">判断事件数据</el-radio-button>
<el-radio-button label="2">生成事件数据</el-radio-button>
</el-radio-group>
</el-row>
</template>
<template #step2-body v-if="radio === '2'">
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,生成数据数量:
</p>
<el-form-item label="生成规则">
<el-radio-group v-model="form.correct_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="生成方式">
<el-radio-group v-model="form.correct_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入分支条件数值"></el-form-item>
<el-form-item label="是">
<template v-if="form.correct_operation_method === 1">
<el-input-number v-model="form.correct_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number v-model="form.correct_operation_method_value" :controls="false" v-else />
</el-form-item>
<el-form-item label="否">
<template v-if="form.correct_operation_method === 1">
<el-input-number v-model="form.correct_operation_method_fail_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number v-model="form.correct_operation_method_fail_value" :controls="false" v-else />
</el-form-item>
<el-form-item label="请输入每个用户生成事件数据的取值范围">
Min
<el-input-number v-model="form.correct_operation_min" :controls="false" />
Max
<el-input-number v-model="form.correct_operation_max" :controls="false" />
</el-form-item>
<el-row justify="center">
<el-button type="primary" plain @click="handleConfig">配置事件属性值规则</el-button>
</el-row>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,根据实际操作结果生成数据数量:
</p>
<el-form-item label="生成规则">
<el-radio-group v-model="form.error_operation_rule">
<el-radio :label="1">随机</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="生成方式">
<el-radio-group v-model="form.error_operation_method">
<el-radio :label="1">百分比</el-radio>
<el-radio :label="2">数值</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="请输入分支条件数值"></el-form-item>
<el-form-item label="是">
<template v-if="form.error_operation_method === 1">
<el-input-number v-model="form.error_operation_method_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number v-model="form.error_operation_method_value" :controls="false" v-else />
</el-form-item>
<el-form-item label="否">
<template v-if="form.error_operation_method === 1">
<el-input-number v-model="form.error_operation_method_fail_value" :controls="false" :max="100" />
&nbsp;%
</template>
<el-input-number v-model="form.error_operation_method_fail_value" :controls="false" v-else />
</el-form-item>
<el-form-item label="请输入每个用户生成事件数据的取值范围">
Min
<el-input-number v-model="form.error_operation_min" :controls="false" />
Max
<el-input-number v-model="form.error_operation_max" :controls="false" />
</el-form-item>
<el-row justify="center">
<el-button type="primary" plain @click="handleConfig">配置事件属性值规则</el-button>
</el-row>
</div>
</section>
</template>
<template #step3-body v-if="radio === '2'">
<section class="rule-result-body">
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-success"><SuccessFilled /></el-icon>操作正确,生成数据数量:
</p>
<el-form-item label="满足判断条件数据"><span class="rule-num">3000</span></el-form-item>
<el-form-item label="不满足判断条件数据"><span class="rule-num">3000</span></el-form-item>
</div>
<el-divider direction="vertical" style="height: auto" />
<div class="rule-result-col">
<p class="rule-result-tips">
<el-icon class="is-error"><CircleCloseFilled /></el-icon>操作错误,生成数据数量:
</p>
<el-form-item label="满足判断条件数据"><span class="rule-num">3000</span></el-form-item>
<el-form-item label="不满足判断条件数据"><span class="rule-num">3000</span></el-form-item>
</div>
</section>
</template>
</RuleTemplate>
<Generate :node="node" v-model="generateVisible" v-if="generateVisible"></Generate>
</template>
......@@ -13,7 +13,7 @@ const config = computed(() => {
const group = computed(() => getGroup(config.value.group_id))
function paramsParse(data: any) {
return data.rules
return { group_id: data.group_id }
}
</script>
......
<script setup lang="ts">
import { CirclePlusFilled, RemoveFilled } from '@element-plus/icons-vue'
// import { CirclePlusFilled, RemoveFilled } from '@element-plus/icons-vue'
import ConfigTemplate from '../../ConfigTemplate.vue'
import { stringOperatorList } from '@/utils/dictionary'
// import { stringOperatorList } from '@/utils/dictionary'
import { useTag } from '../../../composables/useAllData'
const props = defineProps<{ node: any }>()
......@@ -9,7 +9,9 @@ const props = defineProps<{ node: any }>()
const role = inject('role') as string
const form = reactive({
rules: [{ tag_id: '', operate: '', value: '' }]
tag_ids: [],
tag_names: ''
// rules: [{ tag_id: '', operate: '', value: '' }]
})
watchEffect(() => {
Object.assign(form, props.node.data[role])
......@@ -17,18 +19,32 @@ watchEffect(() => {
const { tagList } = useTag()
function addRule() {
form.rules.push({ tag_id: '', operate: '=', value: '' })
}
watchEffect(() => {
form.tag_names = form.tag_ids
.map((id: string) => {
return tagList.value.find(item => item.id === id)?.name
})
.join('、')
})
// function addRule() {
// form.rules.push({ tag_id: '', operate: '=', value: '' })
// }
function removeRule(index: number) {
form.rules.splice(index, 1)
}
// function removeRule(index: number) {
// form.rules.splice(index, 1)
// }
</script>
<template>
<ConfigTemplate :model="form" :node="node">
<el-form-item v-for="(rule, index) in form.rules" :key="index">
<el-form-item>
标签&nbsp;等于&nbsp;
<el-select v-model="form.tag_ids" placeholder="请选择标签" multiple style="width: 400px">
<el-option :key="item.id" v-for="item in tagList" :value="item.id" :label="item.name"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item v-for="(rule, index) in form.rules" :key="index" >
<el-row align="middle">
<el-select v-model="rule.tag_id" placeholder="请选择标签" style="width: 120px">
<el-option :key="item.id" v-for="item in tagList" :value="item.id" :label="item.name"></el-option>
......@@ -38,8 +54,7 @@ function removeRule(index: number) {
v-for="item in stringOperatorList"
:key="item.value"
:value="item.value"
:label="item.label"
></el-option>
:label="item.label"></el-option>
</el-select>
<el-input v-model="rule.value" placeholder="请输入标签值" style="width: 180px"></el-input>
<el-icon style="margin-left: 10px" size="20" color="#cf5b78" @click="removeRule(index)" v-if="index !== 0">
......@@ -50,11 +65,10 @@ function removeRule(index: number) {
size="20"
color="#cf5b78"
@click="addRule"
v-if="index === form.rules.length - 1"
>
v-if="index === form.rules.length - 1">
<CirclePlusFilled />
</el-icon>
</el-row>
</el-form-item>
</el-form-item> -->
</ConfigTemplate>
</template>
<script setup lang="ts">
import ConfigViewTemplate from '../../ConfigViewTemplate.vue'
import { stringOperatorList } from '@/utils/dictionary'
import { useTag } from '../../../composables/useAllData'
// import { stringOperatorList } from '@/utils/dictionary'
// import { useTag } from '../../../composables/useAllData'
const role = inject('role') as string
defineProps<{ node: any }>()
const { tagList } = useTag()
// const { tagList } = useTag()
</script>
<template>
<ConfigViewTemplate :node="node">
<div>
<el-form-item :label="role === 'student' ? '我的答案' : '学生答案'" style="margin-bottom: 0"></el-form-item>
<el-form-item v-for="item in node.data.student?.rules" style="margin-left: 30px; margin-bottom: 0px">
<el-form-item>{{ node.data.student?.tag_names }}</el-form-item>
<!-- <el-form-item v-for="item in node.data.student?.rules" style="margin-left: 30px; margin-bottom: 0px">
{{ tagList.find((c: any) => c.id === item.tag_id)?.name }}
{{ stringOperatorList.find(c => c.value === item.operate)?.label }}
{{ item.value }}
</el-form-item>
</el-form-item> -->
</div>
<div>
<el-form-item label="正确答案" style="margin-bottom: 0"></el-form-item>
<el-form-item v-for="item in node.data.teacher?.rules" style="margin-left: 30px; margin-bottom: 0px">
<el-form-item>{{ node.data.teacher?.tag_names }}</el-form-item>
<!-- <el-form-item v-for="item in node.data.teacher?.rules" style="margin-left: 30px; margin-bottom: 0px">
{{ tagList.find((c: any) => c.id === item.tag_id)?.name }}
{{ stringOperatorList.find(c => c.value === item.operate)?.label }}
{{ item.value }}
</el-form-item>
</el-form-item> -->
</div>
</ConfigViewTemplate>
</template>
<script setup lang="ts">
import RuleTemplate from '../../RuleTemplate.vue'
import { useTag } from '../../../composables/useAllData'
// import { useTag } from '../../../composables/useAllData'
const props = defineProps<{ node: any }>()
const { getTag } = useTag()
// const { getTag } = useTag()
const config = computed(() => {
return props.node.data.teacher || {}
})
function paramsParse(data: any) {
return data.rules
return { tag_ids: data.tag_ids }
}
</script>
<template>
<RuleTemplate :node="node" step :paramsParse="paramsParse">
<template #header-answer>
<p v-for="(item, index) in config.rules" :key="index">
<span>标签</span>&nbsp;&nbsp;<span class="is-operate">等于</span>&nbsp;&nbsp;
<span class="is-answer">{{ config.tag_names }}</span>
<!-- <p v-for="(item, index) in config.rules" :key="index">
<span>{{ getTag(item.tag_id)?.name }}</span>
<span class="is-operate">&nbsp;&nbsp;{{ item.operate }}&nbsp;&nbsp;</span>
<span class="is-answer">{{ item.value }}</span>
&nbsp;&nbsp;&nbsp;&nbsp;
</p>
</p> -->
</template>
</RuleTemplate>
</template>
<script setup lang="ts">
import RuleTemplate from '../../RuleTemplate.vue'
import { useGroup } from '../../../composables/useAllData'
import { getGroupMemberCount } from '@/api/flow'
const props = defineProps<{ node: any }>()
......@@ -12,6 +13,15 @@ const config = computed(() => {
const group = computed(() => getGroup(config.value.group_id))
const groupCount = ref()
function fetchInfo() {
getGroupMemberCount({ group_id: config.value.group_id }).then(res => {
groupCount.value = res.data.count
})
}
onMounted(fetchInfo)
function paramsParse(data: any) {
return { group_id: data.group_id }
}
......@@ -22,5 +32,13 @@ function paramsParse(data: any) {
<template #header-answer>
<span class="is-answer">{{ group?.name }}</span>
</template>
<template #step1-append>
<el-form-item label="当前群组用户人数">
<span class="rule-num">{{ groupCount }}</span>
</el-form-item>
</template>
<template #step-header-append>
<p>当前群组用户人数:{{ groupCount }}</p>
</template>
</RuleTemplate>
</template>
<script setup lang="ts">
import RuleTemplate from '../../RuleTemplate.vue'
import { useGroup } from '../../../composables/useAllData'
import { getGroupMemberCount } from '@/api/flow'
const props = defineProps<{ node: any }>()
......@@ -12,6 +13,15 @@ const config = computed(() => {
const group = computed(() => getGroup(config.value.group_id))
const groupCount = ref()
function fetchInfo() {
getGroupMemberCount({ group_id: config.value.group_id }).then(res => {
groupCount.value = res.data.count
})
}
onMounted(fetchInfo)
function paramsParse(data: any) {
return { group_id: data.group_id }
}
......@@ -22,5 +32,13 @@ function paramsParse(data: any) {
<template #header-answer>
<span class="is-answer">{{ group?.name }}</span>
</template>
<template #step1-append>
<el-form-item label="当前群组用户人数">
<span class="rule-num">{{ groupCount }}</span>
</el-form-item>
</template>
<template #step-header-append>
<p>当前群组用户人数:{{ groupCount }}</p>
</template>
</RuleTemplate>
</template>
<script setup lang="ts">
import ConfigTemplate from '../../ConfigTemplate.vue'
import { useGroup } from '../../../composables/useAllData'
const props = defineProps<{ node: any }>()
const role = inject('role') as string
const form = reactive({
id: ''
})
watchEffect(() => {
Object.assign(form, props.node.data[role])
})
const { groupList } = useGroup()
</script>
<template>
<ConfigTemplate :model="form" :node="node">
<el-form-item>
<el-select style="width: 100%" v-model="form.id" placeholder="请选择需要监控的群组">
<el-option :key="item.id" v-for="item in groupList" :value="item.id" :label="item.name"></el-option>
</el-select>
<span style="font-size: 12px; text-align: right; color: #ccc"> 您选择的群组中,新加入的用户将会触发该旅程 </span>
</el-form-item>
</ConfigTemplate>
</template>
<script setup lang="ts">
import ConfigViewTemplate from '../../ConfigViewTemplate.vue'
defineProps<{ node: any }>()
</script>
<template>
<ConfigViewTemplate :node="node">
<el-form-item label="学生答案"> </el-form-item>
<el-form-item label="正确答案"> </el-form-item>
</ConfigViewTemplate>
</template>
<!-- 钉钉 -->
<script setup lang="ts">
import NodeTemplate from '../../NodeTemplate.vue'
import Icon from '@/components/ConnectionIcon.vue'
const Config = defineAsyncComponent(() => import('./Config.vue'))
const ConfigView = defineAsyncComponent(() => import('./ConfigView.vue'))
const Rule = defineAsyncComponent(() => import('./Rule.vue'))
const props = defineProps<{ node: any }>()
const action = inject('action') as string
const role = inject('role') as string
const templateType = inject('templateType') as string
// 是否置灰
const isGray = computed(() => {
return templateType === '2' && role === 'student' && action === 'edit' && !props.node.data[role]
})
// 设置
const settingVisible = ref(false)
</script>
<template>
<NodeTemplate :node="node" @setting="settingVisible = true">
<div class="node-item">
<Icon class="circle" name="circle" :color="isGray ? '#9a9a9a' : '#4C5AB3'" w="60" h="60"></Icon>
<Icon class="icon" name="14" color="#fff" w="24" h="24"></Icon>
</div>
</NodeTemplate>
<!-- 配置 -->
<Config v-model="settingVisible" :node="node" v-if="settingVisible && action === 'edit'" />
<!-- 查看配置 -->
<ConfigView v-model="settingVisible" :node="node" v-if="settingVisible && action === 'view'" />
<!-- 数据生成规则 -->
<Rule v-model="settingVisible" :node="node" v-if="settingVisible && action === 'rule'" />
</template>
<script setup lang="ts">
import RuleTemplate from '../../RuleTemplate.vue'
defineProps<{ node: any }>()
</script>
<template>
<RuleTemplate :node="node" step>
<template #header-answer>答案</template>
<template #header-form-append>
<el-form-item label="事件">
<el-select>
<el-option value="关注公众号"></el-option>
</el-select>
</el-form-item>
</template>
</RuleTemplate>
</template>
......@@ -15,7 +15,8 @@ interface MetaEventType {
name: string
english_name: string
pinyin: string
event_attrs: AttrType[]
connection_name: string
attributes: AttrType[]
}
// 标签类型
......
......@@ -59,7 +59,7 @@ httpRequest.interceptors.response.use(
// // 未授权
// router.push('/401')
} else {
ElMessage.error(message)
ElMessage.error(message || error.message)
console.error(`${status}: ${message}`)
}
} else {
......
......@@ -26,11 +26,11 @@ export default defineConfig(({ mode }) => ({
cert: fs.readFileSync(path.join(__dirname, './https/ezijing.com.pem'))
},
proxy: {
'/api/resource': {
target: 'http://com-resource-admin-test.ezijing.com/',
changeOrigin: true,
rewrite: path => path.replace(/^\/api\/resource/, '')
},
// '/api/resource': {
// target: 'http://com-resource-admin-test.ezijing.com/',
// changeOrigin: true,
// rewrite: path => path.replace(/^\/api\/resource/, '')
// },
'/api': 'https://saas-dml.ezijing.com'
}
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论