You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/views/portraitModel/components/rfmAnalysis.vue

1285 lines
57 KiB
Vue

<template>
<div class="content">
<div class="import" @click="knowledgeFlag = !knowledgeFlag">
<img src="@/assets/images/导入.png" alt="" />
<span>任务知识导入</span>
</div>
<div v-html="knowledge" v-if="knowledgeFlag"></div>
<div v-if="!knowledgeFlag">
<div class="caseBack">
<div class="title">
<img src="@/assets/images/caseIcon.png" alt="" />
<span>案例背景</span>
</div>
<span style="line-height: 25px; font-size: 14px">
现有以下原始数据需要采用RFM分析方法对客户进行分类
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="fileTable1"
style="width: 650px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户ID" align="center" prop="userId">
</el-table-column>
<el-table-column label="用户名称" align="center" prop="userName">
</el-table-column>
<el-table-column label="消费时间" align="center" prop="time">
</el-table-column>
<el-table-column label="消费金额" align="center" prop="amount">
</el-table-column>
</el-table>
2 years ago
<div class="download" @click="downloadData"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第一步确定近一段时间的时间间隔</span>
</div>
<span style="line-height: 25px; font-size: 14px">
计划分析最近30天的用户假设现在是2025.05.30需要对数据进行筛选筛选出统计样本
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="fileTable1"
style="width: 650px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户ID" align="center" prop="userId">
</el-table-column>
<el-table-column label="用户名称" align="center" prop="userName">
</el-table-column>
<el-table-column label="消费时间" align="center" prop="time">
</el-table-column>
<el-table-column label="消费金额" align="center" prop="amount">
</el-table-column>
<el-table-column label="操作" align="center" prop="opr">
<template #default="scope">
<el-select
v-model="scope.row.params"
placeholder="请选择"
style="width: 100px"
>
<el-option :label="'剔除'" :value="'剔除'" />
<el-option :label="'纳入'" :value="'纳入'" />
</el-select>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step1Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第二步计算每个用户的RFM值</span>
</div>
<span style="line-height: 25px; font-size: 14px">
以用户为统计对象计算出每个用户的RFM这3个指标
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step2Data"
style="width: 650px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户ID" align="center" prop="userId">
</el-table-column>
<el-table-column label="用户名称" align="center" prop="userName">
</el-table-column>
<el-table-column label="最近一次消费时间间隔R" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params1"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="消费频率F" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params2"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="消费金额M" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params3"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step2Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第三步制定RFM评分规则</span>
</div>
<span style="line-height: 25px; font-size: 14px">
最近一次消费时间间隔R上一次消费离得越近也就是R的值越小用户价值越高<br />
消费频率F购买频率越高也就是F值越大用户价值越高<br />
消费金额M消费金额越高也就是M值越大用户价值越高<br />
具体实际业务中如何定义打分的范围要根据具体的业务来灵活定没有统一的标准将RFM3个指标分别按价值从小到大分为1-5如下表所示
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step3Data"
style="width: 650px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="按价值打分" align="center" prop="data1">
</el-table-column>
<el-table-column
label="最近一次消费时间间隔(R)"
align="center"
prop="data2"
>
</el-table-column>
<el-table-column label="消费频率(F)" align="center" prop="data3">
</el-table-column>
<el-table-column label="消费金额(M)" align="center" prop="data4">
</el-table-column>
</el-table>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第四步给RFM按价值打分</span>
</div>
<span style="line-height: 25px; font-size: 14px">
按照第二步统计的数值结合第三步的评估规则对用户RFM值进行评分
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step4Data"
style="width: 980px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column
label="用户ID"
align="center"
prop="data1"
width="70"
>
</el-table-column>
<el-table-column label="用户名称" align="center" prop="data2">
</el-table-column>
<el-table-column
label="最近一次消费时间间隔R"
align="center"
prop="data3"
width="150"
>
</el-table-column>
<el-table-column label="消费频率F" align="center" prop="data4">
</el-table-column>
<el-table-column label="消费金额M" align="center" prop="data5">
</el-table-column>
<el-table-column label="R值打分" align="center" prop="data4">
<template #default="scope">
<el-input
v-model="scope.row.params1"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="F值打分" align="center" prop="data4">
<template #default="scope">
<el-input
v-model="scope.row.params2"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="M值打分" align="center" prop="data4">
<template #default="scope">
<el-input
v-model="scope.row.params3"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step4Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第五步计算所有用户RFM打分值的平均数</span>
</div>
<span style="line-height: 25px; font-size: 14px">
按照第四步给各个用户RFM的打分值分别计算各自的平均数小数点后保留两位小数
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step5Data"
style="width: 680px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="" align="center" prop="title" />
<el-table-column label="R值打分" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params1"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="F值打分" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params2"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
<el-table-column label="M值打分" align="center">
<template #default="scope">
<el-input
v-model="scope.row.params3"
placeholder="请输入"
style="width: 100px"
>
</el-input>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step5Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第六步计算所有用户RFM打分值与平均数的高低情况</span>
</div>
<span style="line-height: 25px; font-size: 14px">
判断每个用户的价值值RFM3个值是高于平均值还是低于平均值如果一行里的R值打分大于平均值就在R值高低列里记录为否则记录为
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step6Data"
2 years ago
:span-method="tableSpanMethod"
style="width: 980px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户ID" align="center" prop="data1" />
<el-table-column label="用户名称" align="center" prop="data2" />
<el-table-column label="R值打分" align="center" prop="data3">
</el-table-column>
<el-table-column label="F值打分" align="center" prop="data4">
</el-table-column>
<el-table-column label="M值打分" align="center" prop="data5">
</el-table-column>
<el-table-column label="R值高低" align="center" width="130">
<template #default="scope">
2 years ago
<!-- <el-input
v-model="scope.row.params1"
placeholder="请输入"
style="width: 100px"
2 years ago
v-if="scope.$index != 3"
>
2 years ago
</el-input> -->
<el-select
v-model="scope.row.params1"
placeholder="请选择"
style="width: 100px"
v-if="scope.$index != 3"
>
<el-option :label="'高'" :value="'高'" />
<el-option :label="'低'" :value="'低'" />
</el-select>
</template>
</el-table-column>
<el-table-column label="F值高低" align="center" width="130">
<template #default="scope">
2 years ago
<!-- <el-input
v-model="scope.row.params2"
placeholder="请输入"
style="width: 100px"
2 years ago
v-if="scope.$index != 3"
>
2 years ago
</el-input> -->
<el-select
v-model="scope.row.params2"
placeholder="请选择"
style="width: 100px"
v-if="scope.$index != 3"
>
<el-option :label="'高'" :value="'高'" />
<el-option :label="'低'" :value="'低'" />
</el-select>
</template>
</el-table-column>
<el-table-column label="M值高低" align="center" width="130">
<template #default="scope">
2 years ago
<!-- <el-input
v-model="scope.row.params3"
placeholder="请输入"
style="width: 100px"
2 years ago
v-if="scope.$index != 3"
>
2 years ago
</el-input> -->
<el-select
v-model="scope.row.params3"
placeholder="请选择"
style="width: 100px"
v-if="scope.$index != 3"
>
<el-option :label="'高'" :value="'高'" />
<el-option :label="'低'" :value="'低'" />
</el-select>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step6Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第七步用户分类</span>
</div>
<span style="line-height: 25px; font-size: 14px">
按照用户分类表格里定义的规则进行比较就可以得出用户属于哪种类
</span>
<div style="text-align: center; width: 800px">
<p>用户分类规则</p>
<el-table
:data="rulesTable"
style="width: 800px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户分类" align="center" prop="data1" />
<el-table-column
label="最近一次消费时间间隔R"
align="center"
prop="data2"
width="220"
/>
<el-table-column
label="消费频率F"
align="center"
prop="data3"
/>
<el-table-column
label="消费金额M"
align="center"
prop="data4"
/>
</el-table>
</div>
<div style="margin-top: 10px; display: flex">
<el-table
2 years ago
:data="step7Data"
style="width: 980px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="用户ID" align="center" prop="data1" />
<el-table-column label="用户名称" align="center" prop="data2" />
2 years ago
<el-table-column label="R值高低" align="center" prop="data3">
</el-table-column>
2 years ago
<el-table-column label="F值高低" align="center" prop="data4">
</el-table-column>
2 years ago
<el-table-column label="M值高低" align="center" prop="data5">
</el-table-column>
2 years ago
<el-table-column label="用户分类" align="center" width="200">
<template #default="scope">
2 years ago
<el-select
v-model="scope.row.params"
placeholder="请选择"
style="width: 170px"
>
2 years ago
<el-option
:label="item.label"
:value="item.value"
v-for="item in classifyList"
:key="item.value"
/>
</el-select>
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step7Submit"></div>
</div>
</div>
<div class="line"></div>
<div class="caseBack">
<div class="title">
<img src="@/assets/images/步骤.png" alt="" />
<span>第八步精细化运营</span>
</div>
<span style="line-height: 25px; font-size: 14px">
对用户分类以后要做什么呢那就是针对每类用户如何制定运营策略这个具体公司业务不同方法也不一样这里举例说明前4类用户
</span>
<div class="customerType">
<img src="@/assets/images/icon001.png" alt="" />
<span>重要价值用户RFM三个值都很高要提供VIP服务</span>
</div>
<div class="customerType">
<img src="@/assets/images/icon002.png" alt="" />
<span
>重要发展用户消费频率低但是其他两个值很高就要想办法提高他的消费频率</span
>
</div>
<div class="customerType">
<img src="@/assets/images/icon003.png" alt="" />
<span
>重要保持用户最近消费距离现在时间较远也就是F值低但是消费频次和消费金额高这种用户是一段时间没来的忠实客户应该主动和他保持联系提高复购率</span
>
</div>
<div class="customerType">
<img src="@/assets/images/icon004.png" alt="" />
<span
>重要挽留客户最近消费时间距离现在较远消费频率低但消费金额高这种用户即将流失要主动联系用户调查清楚哪里出了问题并想办法挽回</span
>
</div>
</div>
</div>
</div>
</template>
<script setup>
2 years ago
import * as portraitModel from "@/api/portraitModel";
import { downBlobFile } from "@/utils/index.js";
2 years ago
import { onBeforeUnmount, onMounted } from "vue";
2 years ago
const { proxy } = getCurrentInstance();
2 years ago
const errorNum = ref(0); //总错误次数
const stepError1 = ref(0);
const stepError2 = ref(0);
const step3Error = ref(0);
const step4Error = ref(0);
const step5Error = ref(0);
const step6Error = ref(0);
const step7Error = ref(0);
//判断每一步是否提交
const step1AnswerFlag = ref(false);
const step2AnswerFlag = ref(false);
const step4AnswerFlag = ref(false);
const step5AnswerFlag = ref(false);
const step6AnswerFlag = ref(false);
const step7AnswerFlag = ref(false);
const knowledgeFlag = ref(false);
const knowledge = ref(
'<p style="text-align: start;"><strong>1.什么是RFM分析方法</strong></p><p style="text-align: start;"><img src="https://pic1.zhimg.com/80/v2-706d62e4bc20f677b4dca950b09d05e8_720w.webp" alt="" data-href="" style="width: 690px;height: auto;"></p><p style="text-align: start;">RFM是3个指标的缩写最近一次消费时间间隔Recency消费频率Frequency消费金额Monetary通过这3个指标对用户分类</p><p style="text-align: start;">这里举个例子来说明这3个指标是什么意思</p><p style="text-align: start;">比如我有一家店铺小明是这家店铺的用户现在是这个月的30号</p><p style="text-align: start;">1最近1次消费时间间隔R是指用户最近一次消费距离现在多长时间了</p><p style="text-align: start;">小明最近1次在这就店铺买东西是这个月25号上一次消费距离现在过去了5天所以小明的最近1次消费时间间隔是5天</p><p style="text-align: start;">2消费频率F是指用户一段时间内消费了多少次</p><p style="text-align: start;">比如一段时间定义是最近30天发现小明最近30天在店铺消费了3次</p><p style="text-align: start;">3消费金额M是指用户一段时间内的消费金额</p><p style="text-align: start;">比如一段时间是最近30天发现小明最近30天总共在店铺消费了1000元</p><p style="text-align: start;">这3个指标业务不同定义也不同要根据业务来灵活定义</p><p style="text-align: start;">最近一次消费时间间隔R上一次消费离得越近也就是R的值越小用户价值越高</p><p style="text-align: start;">消费频率F购买频率越高也就是F的值越大用户价值越高</p><p style="text-align: start;">消费金额M消费金额越高也就是M的值越大用户价值越高</p><p style="text-align: start;">我们把这3个指标按价值从低到高排序并把这3个指标作为XYZ坐标轴就可以把空间分为8部分这样就可以把用户分为下图的8类</p><p style="text-align: start;"><img src="https://pic4.zhimg.com/80/v2-81a7b7fcf8e7eac1fec021df9b588ba7_720w.webp" alt="" data-href="" style="width: 690px;height: auto;"></p><p style="text-align: start;"><br></p><p style="text-align: start;">我们把这个图里对应的RFM这3个值对应的价值是高还是低对应到下面这张表里就得到了用户分类的规则</p><p style="text-align: start;"><img src="https://pic2.zhimg.com/80/v2-56b745a6b404767a24a07b0d9ba7f469_720w.webp" alt="" data-href="" style="width: 690px;height: auto;"></p><p style="text-align: start;"><br></p><p style="text-align: start;"><strong>2.RFM分析方法有什么用</strong></p><p style="text-align: start;">小明的店铺某个月收入大幅下跌他赶快分析数据发行原来几个重要的用户被竞争对手挖走了而这几个用户贡献了店铺80%的收入</p><p style="text-align: start;">出现这个问题是因为小明没有对用户分类对全部用户采取的都是一样的运营决策怎么对用户分类识别出有价值的用户呢</p><p style="text-align: start;">这时候就可以用RFM分析方法把用户分为8类这样就可以对不同价值用户使用不同的营销决策把公司有限的资源发挥最大的效果这就是我们常常听到的精细化运营比如第1类是重要价值用户这类用户最近一次消费较近消费频率也搞消费金额也搞要提供vip服务</p><p style="text-align: start;"><img src="https://pic1.zhimg.com/80/v2-1388ee45f2b119b250a63b8b90ee1d4c_720w.webp" alt="" data-href="" style="width: 690px;height: auto;"></p><p style="text-align: start;">我们日常生活中接触到的会员服务就是这方面的经典案例根据企鹅智库2017中国会员经济数据报告数据显示用户对信用卡酒店航空公司的会员体系最满意</p><p s
);
const fileTable1 = ref([
{
userId: "1",
userName: "小明",
time: "2024.04.28",
amount: "800",
},
{
userId: "2",
userName: "小红",
time: "2024.05.03",
amount: "300",
},
{
userId: "1",
userName: "小明",
time: "2024.05.06",
amount: "3000",
},
{
userId: "1",
userName: "小明",
time: "2024.05.26",
amount: "2000",
},
{
userId: "2",
userName: "小红",
time: "2024.05.27",
amount: "300",
},
{
userId: "2",
userName: "小红",
time: "2024.05.28",
amount: "400",
},
{
userId: "3",
userName: "小李",
time: "2024.05.29",
amount: "500",
},
]);
const step2Data = ref([
{
userId: "1",
userName: "小明",
},
{ userId: "2", userName: "小红" },
{ userId: "3", userName: "小李" },
]);
const step3Data = ref([
{
data1: "1",
data2: "20天以上",
data3: "2次以内",
data4: "1000元以内",
},
{
data1: "2",
data2: "10-20天",
data3: "2-6次",
data4: "1000-1500元",
},
{
data1: "3",
data2: "5-10天",
data3: "6-8次",
data4: "1500-3000元",
},
{
data1: "4",
data2: "3-5天",
data3: "10-20次",
data4: "3000-5000元",
},
{
data1: "5",
data2: "3天以内",
data3: "20次以上",
data4: "5000元以上",
},
]);
const step4Data = ref([
{
data1: "1",
data2: "小明",
data3: "4",
data4: "2",
data5: "5000",
},
{
data1: "2",
data2: "小红",
data3: "2",
data4: "3",
data5: "1000",
},
{
data1: "3",
data2: "小李",
data3: "1",
data4: "1",
data5: "500",
},
]);
const step5Data = ref([
{
title: "平均值",
},
]);
const step6Data = ref([
{
data1: "1",
data2: "小明",
data3: "4",
data4: "2",
data5: "4",
},
{
data1: "2",
data2: "小红",
data3: "5",
data4: "2",
data5: "2",
},
{
data1: "3",
data2: "小李",
data3: "5",
data4: "1",
data5: "1",
},
2 years ago
{
data1: "平均值",
data2: "",
data3: "5",
data4: "1",
data5: "1",
},
]);
2 years ago
const step7Data = ref([
{
data1: "1",
data2: "小明",
data3: "",
data4: "",
data5: "",
},
{
data1: "2",
data2: "小红",
data3: "",
data4: "",
data5: "",
},
{
data1: "3",
data2: "小李",
data3: "",
data4: "",
data5: "",
},
]);
const rulesTable = ref([
{
data1: "1.重要价值用户",
data2: "高",
data3: "高",
data4: "高",
},
{
data1: "2.重要发展用户",
data2: "高",
data3: "低",
data4: "高",
},
{
data1: "3.重要保持用户",
data2: "低",
data3: "高",
data4: "高",
},
{
data1: "4.重要挽留用户",
data2: "低",
data3: "低",
data4: "高",
},
{
data1: "5.一般价值用户",
data2: "高",
data3: "高",
data4: "低",
},
{
data1: "6.一般发展用户",
data2: "高",
data3: "低",
data4: "低",
},
{
data1: "7.一般保持用户",
data2: "低",
data3: "高",
data4: "低",
},
{
data1: "6.一般挽留用户",
data2: "低",
data3: "低",
data4: "低",
},
]);
2 years ago
const classifyList = ref([
{
value: "重要价值用户",
label: "1.重要价值用户",
},
{
value: "重要发展用户",
label: "2.重要发展用户",
},
{
value: "重要保持用户",
label: "3.重要保持用户",
},
{
value: "重要挽留用户",
label: "4.重要挽留用户",
},
{
value: "一般价值用户",
label: "5.一般价值用户",
},
{
value: "一般发展用户",
label: "6.一般发展用户",
},
{
value: "一般保持用户",
label: "7.一般保持用户",
},
{
value: "一般挽留用户",
label: "8.一般挽留用户",
},
]);
onBeforeUnmount(() => {
saveData();
});
onMounted(() => {
getData();
});
2 years ago
const downloadData = () => {
portraitModel
.downloadDataByRFM({})
2 years ago
.then((res) => {
// console.log(res,'--');
const blob = new Blob([res], { type: "application/vnd.ms-excel" });
downBlobFile(`案例数据-RFM分析`, blob);
})
.catch((error) => {});
2 years ago
};
const step1Submit = () => {
2 years ago
// errorNum.value = 0;
stepError1.value = 0;
2 years ago
for (let i in fileTable1.value) {
// console.log(fileTable1.value[i]);
if (!fileTable1.value[i].params) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
if (i == 0) {
if (fileTable1.value[0].params && fileTable1.value[0].params == "纳入") {
2 years ago
stepError1.value++;
2 years ago
}
// console.log(fileTable1.value[0].params);
} else {
if (fileTable1.value[i].params && fileTable1.value[i].params == "剔除") {
2 years ago
stepError1.value++;
2 years ago
}
}
}
proxy.$modal.msgSuccess("提交成功");
2 years ago
console.log(stepError1.value, "错误次数");
step1AnswerFlag.value = true;
2 years ago
};
const step2Submit = () => {
2 years ago
stepError2.value = 0;
2 years ago
for (let i in step2Data.value) {
// console.log(fileTable1.value[i]);
if (!step2Data.value[i].params1) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
2 years ago
// let stepError2 = 0;
2 years ago
console.log(555);
if (step2Data.value[0].params1 && step2Data.value[0].params1 !== "4") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[0].params2 && step2Data.value[0].params2 !== "2") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[0].params3 && step2Data.value[0].params3 !== "5000") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[1].params1 && step2Data.value[1].params1 !== "2") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[1].params2 && step2Data.value[1].params2 !== "3") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[1].params3 && step2Data.value[1].params3 !== "1000") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[2].params1 && step2Data.value[2].params1 !== "1") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[2].params2 && step2Data.value[2].params2 !== "1") {
2 years ago
stepError2.value++;
2 years ago
}
if (step2Data.value[2].params3 && step2Data.value[2].params3 !== "500") {
2 years ago
stepError2.value++;
2 years ago
}
2 years ago
console.log(stepError2.value, "错误数");
2 years ago
proxy.$modal.msgSuccess("提交成功");
2 years ago
step2AnswerFlag.value = true;
2 years ago
//将所填值同步到第四步表格
step4Data.value[0].data3 = step2Data.value[0].params1;
step4Data.value[0].data4 = step2Data.value[0].params2;
step4Data.value[0].data5 = step2Data.value[0].params3;
step4Data.value[1].data3 = step2Data.value[1].params1;
step4Data.value[1].data4 = step2Data.value[1].params2;
step4Data.value[1].data5 = step2Data.value[1].params3;
step4Data.value[2].data3 = step2Data.value[2].params1;
step4Data.value[2].data4 = step2Data.value[2].params2;
step4Data.value[2].data5 = step2Data.value[2].params3;
};
const step4Submit = () => {
// console.log(6454546);
2 years ago
step4Error.value = 0;
2 years ago
for (let i in step4Data.value) {
if (!step4Data.value[i].params1) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
2 years ago
// let step4Error = 0;
2 years ago
if (step4Data.value[0].params1 && step4Data.value[0].params1 !== "4") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[0].params2 && step4Data.value[0].params2 !== "2") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[0].params3 && step4Data.value[0].params3 !== "4") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[1].params1 && step4Data.value[1].params1 !== "5") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[1].params2 && step4Data.value[1].params2 !== "2") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[1].params3 && step4Data.value[1].params3 !== "2") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[2].params1 && step4Data.value[2].params1 !== "5") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[2].params2 && step4Data.value[2].params2 !== "1") {
2 years ago
step4Error.value++;
2 years ago
}
if (step4Data.value[2].params3 && step4Data.value[2].params3 !== "1") {
2 years ago
step4Error.value++;
2 years ago
}
2 years ago
console.log(step4Error.value, "错误数");
2 years ago
proxy.$modal.msgSuccess("提交成功");
2 years ago
step4AnswerFlag.value = true;
2 years ago
//将所填值同步到第六步表格
step6Data.value[0].data3 = step4Data.value[0].params1;
step6Data.value[0].data4 = step4Data.value[0].params2;
step6Data.value[0].data5 = step4Data.value[0].params3;
step6Data.value[1].data3 = step4Data.value[1].params1;
step6Data.value[1].data4 = step4Data.value[1].params2;
step6Data.value[1].data5 = step4Data.value[1].params3;
step6Data.value[2].data3 = step4Data.value[2].params1;
step6Data.value[2].data4 = step4Data.value[2].params2;
step6Data.value[2].data5 = step4Data.value[2].params3;
};
const step5Submit = () => {
// console.log(6333);
2 years ago
step5Error.value = 0;
2 years ago
for (let i in step5Data.value) {
if (!step5Data.value[i].params1) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
2 years ago
// let step5Error = 0;
2 years ago
if (step5Data.value[0].params1 && step5Data.value[0].params1 !== "4.67") {
2 years ago
step5Error.value++;
2 years ago
}
if (step5Data.value[0].params2 && step5Data.value[0].params2 !== "1.67") {
2 years ago
step5Error.value++;
2 years ago
}
if (step5Data.value[0].params3 && step5Data.value[0].params3 !== "2.33") {
2 years ago
step5Error.value++;
2 years ago
}
2 years ago
console.log(step5Error.value, "错误数");
2 years ago
proxy.$modal.msgSuccess("提交成功");
2 years ago
step5AnswerFlag.value = true;
2 years ago
//将所填值同步到第六步表格
step6Data.value[3].data3 = step5Data.value[0].params1;
step6Data.value[3].data4 = step5Data.value[0].params2;
step6Data.value[3].data5 = step5Data.value[0].params3;
};
2 years ago
const step6Submit = () => {
// console.log(555);
step6Error.value = 0;
for (let i in step6Data.value.slice(0, step6Data.value.length - 1)) {
if (
!step6Data.value[i].params1 ||
!step6Data.value[i].params2 ||
!step6Data.value[i].params3
) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
// let step6Error = 0;
if (step6Data.value[0].params1 && step6Data.value[0].params1 !== "低") {
step6Error.value++;
}
if (step6Data.value[0].params2 && step6Data.value[0].params2 !== "高") {
step6Error.value++;
}
if (step6Data.value[0].params3 && step6Data.value[0].params3 !== "高") {
step6Error.value++;
}
if (step6Data.value[1].params1 && step6Data.value[1].params1 !== "高") {
step6Error.value++;
}
if (step6Data.value[1].params2 && step6Data.value[1].params2 !== "高") {
step6Error.value++;
}
if (step6Data.value[1].params3 && step6Data.value[1].params3 !== "高") {
step6Error.value++;
}
if (step6Data.value[2].params1 && step6Data.value[2].params1 !== "高") {
step6Error.value++;
}
if (step6Data.value[2].params2 && step6Data.value[2].params2 !== "低") {
step6Error.value++;
}
if (step6Data.value[2].params3 && step6Data.value[2].params3 !== "低") {
step6Error.value++;
}
console.log(step6Error.value, "错误数");
proxy.$modal.msgSuccess("提交成功");
step6AnswerFlag.value = true;
//将所填值同步到第六步表格
step7Data.value[0].data3 = step6Data.value[0].params1;
step7Data.value[0].data4 = step6Data.value[0].params2;
step7Data.value[0].data5 = step6Data.value[0].params3;
step7Data.value[1].data3 = step6Data.value[1].params1;
step7Data.value[1].data4 = step6Data.value[1].params2;
step7Data.value[1].data5 = step6Data.value[1].params3;
step7Data.value[2].data3 = step6Data.value[2].params1;
step7Data.value[2].data4 = step6Data.value[2].params2;
step7Data.value[2].data5 = step6Data.value[2].params3;
};
const step7Submit = () => {
// console.log(111);
step7Error.value = 0;
for (let i in step7Data.value) {
if (!step7Data.value[i].params) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
// let step7Error = 0;
if (
step7Data.value[0].params &&
step7Data.value[0].params !== "重要保持用户"
) {
step7Error.value++;
}
if (
step7Data.value[1].params &&
step7Data.value[1].params !== "重要价值用户"
) {
step7Error.value++;
}
if (
step7Data.value[2].params &&
step7Data.value[2].params !== "一般发展用户"
) {
step7Error.value++;
}
console.log(step7Error.value, "错误数");
proxy.$modal.msgSuccess("提交成功");
step7AnswerFlag.value = true;
};
2 years ago
const submitData = () => {
2 years ago
if (
!step1AnswerFlag.value ||
!step2AnswerFlag.value ||
!step4AnswerFlag.value ||
!step5AnswerFlag.value ||
!step6AnswerFlag.value ||
!step7AnswerFlag.value
) {
proxy.$modal.msgError("请先完成所有步骤!");
return;
}
errorNum.value =
stepError1.value +
stepError2.value +
step4Error.value +
step5Error.value +
step6Error.value +
step7Error.value;
console.log(errorNum.value, "总错误次数");
portraitModel
.submit({
userId: 492,
taskName: "RFM分析",
numberOfErrors: errorNum.value,
})
.then((res) => {
proxy.$modal.msgSuccess("提交成功");
})
.catch((error) => {});
};
const saveData = () => {
const params = {
stepFiveA: fileTable1.value[0].params,
stepFiveB: fileTable1.value[1].params,
stepFiveC: fileTable1.value[2].params,
stepFiveD: fileTable1.value[3].params,
stepSixA: fileTable1.value[4].params,
stepSixB: fileTable1.value[5].params,
stepSixC: fileTable1.value[6].params,
stepSixD: step2Data.value[0].params1,
stepSevenA: step2Data.value[0].params2,
stepSevenB: step2Data.value[0].params3,
stepSevenC: step2Data.value[1].params1,
stepSevenD: step2Data.value[1].params2,
stepEightA: step2Data.value[1].params3,
stepEightB: step2Data.value[2].params1,
stepEightC: step2Data.value[2].params2,
stepEightD: step2Data.value[2].params3,
stepNineA: step4Data.value[0].params1,
stepNineB: step4Data.value[0].params2,
stepNineC: step4Data.value[0].params3,
stepNineD: step4Data.value[1].params1,
stepTenA: step4Data.value[1].params2,
stepTenB: step4Data.value[1].params3,
stepTenC: step4Data.value[2].params1,
stepTenD: step4Data.value[2].params2,
stepElevenA: step4Data.value[2].params3,
stepOneA: step5Data.value[0].params1,
stepOneB: step5Data.value[0].params2,
stepOneC: step5Data.value[0].params3,
stepOneD: step6Data.value[0].params1,
stepTwoA: step6Data.value[0].params2,
stepTwoB: step6Data.value[0].params3,
stepTwoC: step6Data.value[1].params1,
stepThreeA: step6Data.value[1].params2,
stepThreeB: step6Data.value[1].params3,
stepThreeC: step6Data.value[2].params1,
stepThreeD: step6Data.value[2].params2,
stepFourA: step6Data.value[2].params3,
stepFourB: step7Data.value[0].params,
stepFourC: step7Data.value[1].params,
stepFourD: step7Data.value[2].params,
};
portraitModel
.saveData({
userId: 492,
module: "RFM分析",
...params,
})
.then((res) => {})
.catch((error) => {});
};
const getData = () => {
portraitModel
.getData({
userId: 492,
module: "RFM分析",
})
.then((res) => {
fileTable1.value[0].params = res.data.stepFiveA;
fileTable1.value[1].params = res.data.stepFiveB;
fileTable1.value[2].params = res.data.stepFiveC;
fileTable1.value[3].params = res.data.stepFiveD;
fileTable1.value[4].params = res.data.stepSixA;
fileTable1.value[5].params = res.data.stepSixB;
fileTable1.value[6].params = res.data.stepSixC;
step2Data.value[0].params1 = res.data.stepSixD;
step2Data.value[0].params2 = res.data.stepSevenA;
step2Data.value[0].params3 = res.data.stepSevenB;
step2Data.value[1].params1 = res.data.stepSevenC;
step2Data.value[1].params2 = res.data.stepSevenD;
step2Data.value[1].params3 = res.data.stepEightA;
step2Data.value[2].params1 = res.data.stepEightB;
step2Data.value[2].params2 = res.data.stepEightC;
step2Data.value[2].params3 = res.data.stepEightD;
step4Data.value[0].params1 = res.data.stepNineA;
step4Data.value[0].params2 = res.data.stepNineB;
step4Data.value[0].params3 = res.data.stepNineC;
step4Data.value[1].params1 = res.data.stepNineD;
step4Data.value[1].params2 = res.data.stepTenA;
step4Data.value[1].params3 = res.data.stepTenB;
step4Data.value[2].params1 = res.data.stepTenC;
step4Data.value[2].params2 = res.data.stepTenD;
step4Data.value[2].params3 = res.data.stepElevenA;
step5Data.value[0].params1 = res.data.stepOneA;
step5Data.value[0].params2 = res.data.stepOneB;
step5Data.value[0].params3 = res.data.stepOneC;
step6Data.value[0].params1 = res.data.stepOneD;
step6Data.value[0].params2 = res.data.stepTwoA;
step6Data.value[0].params3 = res.data.stepTwoB;
step6Data.value[1].params1 = res.data.stepTwoC;
step6Data.value[1].params2 = res.data.stepThreeA;
step6Data.value[1].params3 = res.data.stepThreeB;
step6Data.value[2].params1 = res.data.stepThreeC;
step6Data.value[2].params2 = res.data.stepThreeD;
step6Data.value[2].params3 = res.data.stepFourA;
step7Data.value[0].params = res.data.stepFourB;
step7Data.value[1].params = res.data.stepFourC;
step7Data.value[2].params = res.data.stepFourD;
})
.catch((error) => {});
2 years ago
};
defineExpose({
submitData,
// practicalTraining,
});
const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (rowIndex === 3) {
if (columnIndex === 0) {
return [1, 2];
} else if (columnIndex === 1) {
return [0, 0];
}
}
};
</script>
<style scoped lang="scss">
.content {
width: 100%;
background: rgba(0, 29, 64, 0.5);
border: 1px solid #0452c6;
padding: 10px;
// opacity: 0.5;
.import {
display: flex;
font-size: 15px;
font-weight: bold;
width: 180px;
height: 56px;
background-image: url("@/assets/images/01.png");
background-size: 180px 56px;
text-align: center;
align-items: center;
line-height: 56px;
cursor: pointer;
img {
margin-left: 20px;
margin-right: 15px;
}
}
.caseBack {
.title {
font-weight: bold;
margin-top: 10px;
display: flex;
align-items: center;
span {
margin-left: 10px;
}
}
.download {
cursor: pointer;
margin-left: 20px;
color: #000;
padding-left: 10px;
font-size: 14px;
text-align: center;
line-height: 31px;
width: 89px;
height: 31px;
background: url("@/assets/images/downloadIcon.png");
}
.submit {
cursor: pointer;
margin-left: 20px;
color: #000;
padding-left: 10px;
font-size: 14px;
text-align: center;
line-height: 31px;
width: 99px;
height: 31px;
background: url("@/assets/images/提交任务.png");
}
.customerType {
padding-left: 10px;
display: flex;
align-items: center;
width: 945px;
height: 26px;
background: #003b75;
border-radius: 10px;
border: 1px solid #0052a3;
font-size: 12px;
margin-top: 10px;
img {
margin-right: 10px;
}
}
}
.line {
width: 1400px;
height: 1px;
border: 1px solid #0452c6;
opacity: 0.5;
margin-top: 20px;
margin-bottom: 20px;
}
}
::v-deep .el-table tr {
background-color: #002652 !important;
color: #fff;
}
</style>