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/abcAnalysis.vue

796 lines
23 KiB
Vue

<template>
<div class="content">
<div class="import" @click="knowledgeFlag = !knowledgeFlag">
<img src="@/assets/images/导入.png" alt="" />
<span>任务知识导入</span>
</div>
<div v-if="knowledgeFlag">
<p>
2 years ago
帕累托分析法源于经典的二八法则意大利经济学家维尔弗雷多·帕累托于1906年提出了著名的关于意大利社会财务分配的研究结论20%的人口掌握了80%的社会财富这个结论对大多数国家的社会财富分配情况都成立因此帕累托法则又被称为80/20法则<br /><br />
帕累托分析的核心观点是在许多情况下大部分的问题效益或成本都来自于少数的要素换句话说少数关键要素占据了绝大多数的结果这一规律在许多领域都具有普适性例如<br /><br />
在企业中80%的利润可能来自于20%的产品或客户<br />
在销售中80%的销售额可能来自于20%的销售员或产品<br />
2 years ago
在质量控制中80%的缺陷可能来自于20%的原因或工序<br /><br />
ABC 分类法全称应为 ABC 分类库存控制法
又称帕累托分析法或巴雷托分析法柏拉图分析主次因分析法
ABC分析法ABC 管理法平常也称之为80 20规则
</p>
2 years ago
<img src="@/assets/images/u3323.png" alt="" /><br />
<img src="@/assets/images/u3324.png" alt="" />
</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">
现有以下某商店的交易原始数据需要采用帕累托分析方法对商品进行分类
</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="交易单号" align="center" prop="id">
</el-table-column>
<el-table-column label="商品名称" align="center" prop="name">
</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">
以商品为统计单元计算各类商品的销售额
</span>
<div style="margin-top: 10px; display: flex">
<el-table
:data="step1Data"
style="width: 450px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="商品名称" align="center" prop="name">
</el-table-column>
<el-table-column label="销售额" align="center" prop="amount">
<template #default="scope">
<el-input
v-model="scope.row.params"
placeholder="请输入"
style="width: 130px"
>
</el-input>
</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>第二步排序</span>
</div>
<span style="line-height: 25px; font-size: 14px">
以累计销售额为排序基准按照倒序进行排序
</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="商品名称" align="center" prop="name">
</el-table-column>
<el-table-column label="销售额" align="center" prop="amount">
</el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<div
style="
display: flex;
align-items: center;
justify-content: center;
"
>
<img
src="@/assets/images/上.png"
alt=""
style="margin-right: 10px; cursor: pointer"
@click="moveUp(scope.$index, scope.row)"
/>
<img
src="@/assets/images/下.png"
alt=""
style="cursor: pointer"
@click="moveDown(scope.$index, scope.row)"
/>
</div>
</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>第三步计算累计销售额占比</span>
</div>
<span style="line-height: 25px; font-size: 14px">
计算各个商品的销售额占比并以此通过累加计算累计销售额占比
</span>
2 years ago
<div style="margin-top: 10px; display: flex" v-if="step2AnswerFlag">
<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="销售额" align="center" prop="data2">
</el-table-column>
<el-table-column
label="销售额占比(%"
align="center"
prop="data3"
>
<template #default="scope">
<el-input
v-model="scope.row.params1"
placeholder="请输入"
style="width: 110px"
>
</el-input
>%
</template>
</el-table-column>
<el-table-column
label="累计销售额占比(%"
align="center"
prop="data4"
>
<template #default="scope">
<el-input
v-model="scope.row.params2"
placeholder="请输入"
style="width: 110px"
>
</el-input
>%
</template>
</el-table-column>
</el-table>
2 years ago
<div class="submit" @click="step3Submit"></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">
我们按照0-80%80%-90%90%-100%将商品分成ABC3个类别然后对于这3个类别的产品做区别管理以提高效益
</span>
<el-table
:show-header="false"
:data="typeData"
style="width: 580px; margin-top: 10px"
border
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column
label="用户ID"
align="center"
prop="data1"
width="160"
>
</el-table-column>
<el-table-column label="用户名称" align="center" prop="data2">
</el-table-column>
</el-table>
2 years ago
<div style="margin-top: 10px; display: flex" v-if="step3AnswerFlag">
<el-table
:data="step4Data"
style="width: 680px"
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="销售额" align="center" prop="data2">
</el-table-column>
<el-table-column
label="累计销售额占比(%"
align="center"
prop="data3"
>
</el-table-column>
<el-table-column label="划分商品类型" align="center" prop="data4">
<template #default="scope">
<el-select
v-model="scope.row.params"
placeholder="请选择"
style="width: 100px"
>
<el-option :label="'A类商品'" :value="'A类商品'" />
<el-option :label="'B类商品'" :value="'B类商品'" />
<el-option :label="'C类商品'" :value="'C类商品'" />
</el-select>
</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>第五步绘制帕累托图</span>
</div>
<span style="line-height: 25px; font-size: 14px">
以分析表的商品名称为X轴销售额为左侧Y轴累计销售额占比为右侧Y轴绘制帕累托图
</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>
<div class="submit">提交</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 class="customerType" style="width: 1115px">
<img src="@/assets/images/商品a.png" alt="" />
<span
>A类商品对公司销售额贡献最大这种商品备货周期短在保证安全库存的情况下应该小批量多批次按需储存尽可能降低库存总量减少仓储管理成本但如果控制不好库存很容易出现断货风险</span
>
</div>
<div class="customerType" style="width: 1115px">
<img src="@/assets/images/商品b.png" alt="" />
<span>B类商品销售额贡献次之这种商品备货周期可以适当延长</span>
</div>
<div class="customerType" style="width: 1115px">
<img src="@/assets/images/商品c.png" alt="" />
<span
>C类商品属于长尾商品备货周期更长最好是集中采购并适当增大库存量相应减少订货次数</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
const { proxy } = getCurrentInstance();
const knowledgeFlag = ref(false);
2 years ago
const errorNum = ref(0);
const step1Error = ref(0);
const step2Error = ref(0);
const step3Error = ref(0);
const step1AnswerFlag = ref(false);
const step2AnswerFlag = ref(false);
const step3AnswerFlag = ref(false);
const step1Data = ref([
{
name: "男士配饰",
amount: "2300",
},
{
name: "儿童服装",
amount: "2300",
},
{
name: "婴儿用品",
amount: "2300",
},
{
name: "床上用品",
amount: "2300",
},
]);
const fileTable1 = ref([
{
id: "20250101",
name: "男士配饰",
amount: "2300",
},
{
id: "20250102",
name: "儿童服装",
amount: "300",
},
{
id: "20250103",
name: "婴儿用品",
amount: "400",
},
{
id: "20250104",
name: "床上用品",
amount: "1200",
},
{
id: "20250105",
name: "男士配饰",
amount: "1800",
},
{
id: "20250106",
name: "婴儿用品",
amount: "300",
},
{
id: "20250107",
name: "男士配饰",
amount: "1800",
},
{
id: "20250108",
name: "儿童服装",
amount: "300",
},
{
id: "20250109",
name: "床上用品",
amount: "1200",
},
{
id: "20250110",
name: "婴儿用品",
amount: "400",
},
]);
const step2Data = ref([
{
name: "男士配饰",
2 years ago
amount: "",
},
2 years ago
{ name: "儿童服装", amount: "" },
{ name: "婴儿用品", amount: "" },
{ name: "床上用品", amount: "" },
]);
const step3Data = ref([
{
data1: "男士配饰",
data2: "5900",
},
{
data1: "床上用品",
data2: "2400",
},
{
data1: "婴儿用品",
data2: "1100",
},
{
data1: "儿童服装",
data2: "600",
},
]);
const step4Data = ref([
{
data1: "男士配饰",
data2: "5900",
data3: "59%",
data4: "2",
},
{
data1: "床上用品",
data2: "2400",
data3: "83%",
data4: "3",
},
{
data1: "婴儿用品",
data2: "1100",
data3: "94%",
data4: "1",
},
{
data1: "儿童服装",
data2: "600",
data3: "100%",
data4: "1",
},
]);
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",
},
]);
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: "低",
},
]);
const typeData = ref([
{
data1: "A类商品",
data2: "占总销售额的80%,需要重点关注",
},
{
data1: "B类商品",
data2: "占总销售额的10%,给予次要关注",
},
{
data1: "C类商品",
data2: "占总销售额的10%,给予一般关注",
},
]);
const moveUp = (index, row) => {
console.log("上移", index, row);
if (index > 0) {
const upDate = step2Data.value[index - 1];
step2Data.value.splice(index - 1, 1);
step2Data.value.splice(index, 0, upDate);
} else {
alert("已经是第一条,不可上移");
}
};
const moveDown = (index, row) => {
console.log("下移", index, row);
if (index + 1 === step2Data.value.length) {
alert("已经是最后一条,不可下移");
} else {
const downDate = step2Data.value[index + 1];
step2Data.value.splice(index + 1, 1);
step2Data.value.splice(index, 0, downDate);
}
};
2 years ago
const downloadData = () => {
// console.log(666);
portraitModel
2 years ago
.downloadDataByABC({})
2 years ago
.then((res) => {
// console.log(res,'--');
const blob = new Blob([res], { type: "application/vnd.ms-excel" });
downBlobFile(`案例数据-帕累托分析`, blob);
})
.catch((error) => {});
2 years ago
};
const step1Submit = () => {
step1Error.value = 0;
for (let i in step1Data.value) {
// console.log(fileTable1.value[i]);
if (!step1Data.value[i].params) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
if (step1Data.value[0].params && step1Data.value[0].params !== "5900") {
step1Error.value++;
}
if (step1Data.value[1].params && step1Data.value[1].params !== "600") {
step1Error.value++;
}
if (step1Data.value[2].params && step1Data.value[2].params !== "1100") {
step1Error.value++;
}
if (step1Data.value[3].params && step1Data.value[3].params !== "2400") {
step1Error.value++;
}
console.log(step1Error.value, "错误数");
proxy.$modal.msgSuccess("提交成功");
//将所填值同步到第二步表格
step2Data.value[0].amount = step1Data.value[0].params;
step2Data.value[1].amount = step1Data.value[1].params;
step2Data.value[2].amount = step1Data.value[2].params;
step2Data.value[3].amount = step1Data.value[3].params;
};
const step2Submit = () => {
step2Error.value = 0;
if (
Number(step2Data.value[0].amount) > Number(step2Data.value[1].amount) &&
Number(step2Data.value[1].amount) > Number(step2Data.value[2].amount) &&
Number(step2Data.value[2].amount) > Number(step2Data.value[3].amount)
) {
step2Error.value = 0;
} else {
step2Error.value = 1;
}
console.log("错误数", step2Error.value);
proxy.$modal.msgSuccess("提交成功");
step3Data.value[0].data2 = step2Data.value[0].amount;
step3Data.value[1].data2 = step2Data.value[1].amount;
step3Data.value[2].data2 = step2Data.value[2].amount;
step3Data.value[3].data2 = step2Data.value[3].amount;
step2AnswerFlag.value = true;
};
const step3Submit = () => {
step3Error.value = 0;
for (let i in step3Data.value) {
// console.log(fileTable1.value[i]);
if (!step3Data.value[i].params1 || !step3Data.value[i].params2) {
proxy.$modal.msgError("请先完成所有填空");
return;
}
}
if (step3Data.value[0].params1 && step3Data.value[0].params1 !== "59") {
step3Error.value++;
}
if (step3Data.value[0].params2 && step3Data.value[0].params2 !== "59") {
step3Error.value++;
}
if (step3Data.value[1].params1 && step3Data.value[1].params1 !== "24") {
step3Error.value++;
}
if (step3Data.value[1].params2 && step3Data.value[1].params2 !== "83") {
step3Error.value++;
}
if (step3Data.value[2].params1 && step3Data.value[2].params1 !== "11") {
step3Error.value++;
}
if (step3Data.value[2].params2 && step3Data.value[2].params2 !== "94") {
step3Error.value++;
}
if (step3Data.value[3].params1 && step3Data.value[3].params1 !== "6") {
step3Error.value++;
}
if (step3Data.value[3].params2 && step3Data.value[3].params2 !== "100") {
step3Error.value++;
}
console.log("错误数", step3Error.value);
proxy.$modal.msgSuccess("提交成功");
step4Data.value[0].data2 = step3Data.value[0].data2;
step4Data.value[1].data2 = step3Data.value[1].data2;
step4Data.value[2].data2 = step3Data.value[2].data2;
step4Data.value[3].data2 = step3Data.value[3].data2;
step4Data.value[0].data3 = step3Data.value[0].params2;
step4Data.value[1].data3 = step3Data.value[1].params2;
step4Data.value[2].data3 = step3Data.value[2].params2;
step4Data.value[3].data3 = step3Data.value[3].params2;
step3AnswerFlag.value = true;
};
const step4Submit = () => {
console.log('asd');
};
</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>