|
@@ -19,13 +19,14 @@
|
|
|
</el-form-item>
|
|
|
<el-form-item label="日期">
|
|
|
<el-date-picker
|
|
|
- v-model="queryForm.arr"
|
|
|
+ v-model="queryForm.timeArr"
|
|
|
type="daterange"
|
|
|
unlink-panels
|
|
|
range-separator="-"
|
|
|
start-placeholder="开始日期"
|
|
|
end-placeholder="结束日期"
|
|
|
value-format="YYYY-MM-DD"
|
|
|
+ @change="onQuery"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
@@ -52,11 +53,45 @@
|
|
|
<div class="bottom">
|
|
|
<div class="_box" style="margin-right: 20px">
|
|
|
<span class="t"> 新增 </span>
|
|
|
- <span class="val"> 20 </span>
|
|
|
+ <span class="val">
|
|
|
+ {{ allData.sourceData.incrementAmount }}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div class="_box">
|
|
|
+ <span class="t"> 存量 </span>
|
|
|
+ <span class="val"> {{ allData.sourceData.stockAmount }} </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class="item"
|
|
|
+ v-for="(item, index) in allData.sourceData.stockList"
|
|
|
+ :key="index"
|
|
|
+ v-if="
|
|
|
+ allData.sourceData.stockList &&
|
|
|
+ allData.sourceData.stockList.length > 0
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div class="top">
|
|
|
+ <div class="_title">
|
|
|
+ <div class="icon icon_one">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/portrait/iconm_kehd.png"
|
|
|
+ alt=""
|
|
|
+ class="img"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="name">{{ item.source }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bottom">
|
|
|
+ <div class="_box" style="margin-right: 20px">
|
|
|
+ <span class="t"> 新增 </span>
|
|
|
+ <span class="val"> {{ item.incrementAmount }} </span>
|
|
|
</div>
|
|
|
<div class="_box">
|
|
|
<span class="t"> 存量 </span>
|
|
|
- <span class="val"> 20 </span>
|
|
|
+ <span class="val"> {{ item.stockAmount }} </span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -81,11 +116,42 @@
|
|
|
<div class="bottom">
|
|
|
<div class="_box" style="margin-right: 20px">
|
|
|
<span class="t"> 询盘(单) </span>
|
|
|
- <span class="val"> 20 </span>
|
|
|
+ <span class="val"> {{ allData.typeData.saleAmount }} </span>
|
|
|
+ </div>
|
|
|
+ <div class="_box">
|
|
|
+ <span class="t"> 成交(单) </span>
|
|
|
+ <span class="val"> {{ allData.typeData.contractAmount }} </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class="item"
|
|
|
+ v-for="(item, index) in allData.typeData.saleList"
|
|
|
+ :key="index"
|
|
|
+ v-if="
|
|
|
+ allData.typeData.saleList && allData.typeData.saleList.length > 0
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div class="top">
|
|
|
+ <div class="_title">
|
|
|
+ <div class="icon icon_two">
|
|
|
+ <img
|
|
|
+ src="@/assets/images/portrait/iconm_kehd.png"
|
|
|
+ alt=""
|
|
|
+ class="img"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="name">{{ item.status }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bottom">
|
|
|
+ <div class="_box" style="margin-right: 20px">
|
|
|
+ <span class="t"> 询盘(单) </span>
|
|
|
+ <span class="val"> {{ item.saleAmount }} </span>
|
|
|
</div>
|
|
|
<div class="_box">
|
|
|
<span class="t"> 成交(单) </span>
|
|
|
- <span class="val"> 20 </span>
|
|
|
+ <span class="val"> {{ item.contractAmount }} </span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -105,8 +171,17 @@ import TitleInfo from "@/components/TitleInfo/index.vue";
|
|
|
const titleList = ["客户来源统计", "类型统计", "趋势分析"];
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
const loading = ref(false);
|
|
|
-const queryForm = reactive({});
|
|
|
+const queryForm = reactive({
|
|
|
+ countryId: "",
|
|
|
+ beginTime: "",
|
|
|
+ endTime: "",
|
|
|
+ timeArr: "",
|
|
|
+});
|
|
|
const countryData = ref([]);
|
|
|
+const allData = reactive({
|
|
|
+ sourceData: {},
|
|
|
+ typeData: {},
|
|
|
+});
|
|
|
//图表
|
|
|
const echartDom = ref(null);
|
|
|
let myChart = null;
|
|
@@ -116,7 +191,7 @@ const option = reactive({
|
|
|
trigger: "axis",
|
|
|
},
|
|
|
grid: {
|
|
|
- left: "0%",
|
|
|
+ left: "1%",
|
|
|
right: "2%",
|
|
|
bottom: "15%",
|
|
|
top: "30px",
|
|
@@ -234,20 +309,51 @@ const option = reactive({
|
|
|
],
|
|
|
},
|
|
|
});
|
|
|
+const getData = () => {
|
|
|
+ proxy.post("/saleQuotation/sourceStatistics", queryForm).then((res) => {
|
|
|
+ allData.sourceData = res;
|
|
|
+ });
|
|
|
+ proxy.post("/saleQuotation/typeStatistics", queryForm).then((res) => {
|
|
|
+ allData.typeData = res;
|
|
|
+ });
|
|
|
+ proxy.post("/saleQuotation/trendAnalysis", queryForm).then((res) => {
|
|
|
+ let listOne = res.contractStatisticsList.map((x) => x.count);
|
|
|
+ let listTwo = res.saleStatisticList.map((x) => x.count);
|
|
|
+ let listThree = res.sourceIncrementList.map((x) => x.count);
|
|
|
+ let listFour = res.sourceStockList.map((x) => x.count);
|
|
|
+ const months = res.contractStatisticsList.map((x) => x.month);
|
|
|
+ option.data.xAxis.data = months;
|
|
|
+ option.data.series[0].data = listFour;
|
|
|
+ option.data.series[1].data = listTwo;
|
|
|
+ option.data.series[2].data = listOne;
|
|
|
+ option.data.series[3].data = listThree;
|
|
|
+ myChart.setOption(option.data);
|
|
|
+ });
|
|
|
+};
|
|
|
const onQuery = () => {
|
|
|
- console.log(queryForm, "ad");
|
|
|
+ queryForm.beginTime = queryForm.timeArr[0];
|
|
|
+ queryForm.endTime = queryForm.timeArr[1];
|
|
|
+ getData();
|
|
|
};
|
|
|
-
|
|
|
const getCountryData = () => {
|
|
|
proxy.post("/areaInfo/list", { parentId: "0" }).then((res) => {
|
|
|
countryData.value = res;
|
|
|
queryForm.countryId = "China";
|
|
|
+ let endData = new Date();
|
|
|
+ let beginDate = new Date();
|
|
|
+ beginDate.setFullYear(endData.getFullYear() - 1);
|
|
|
+ queryForm.timeArr = [
|
|
|
+ proxy.parseTime(beginDate, "{y}-{m}-{d}"),
|
|
|
+ proxy.parseTime(endData, "{y}-{m}-{d}"),
|
|
|
+ ];
|
|
|
+ queryForm.beginTime = queryForm.timeArr[0];
|
|
|
+ queryForm.endTime = queryForm.timeArr[1];
|
|
|
+ getData();
|
|
|
});
|
|
|
};
|
|
|
getCountryData();
|
|
|
onMounted(() => {
|
|
|
myChart = echarts.init(echartDom.value);
|
|
|
- myChart.setOption(option.data);
|
|
|
window.addEventListener("resize", () => {
|
|
|
myChart.resize();
|
|
|
});
|
|
@@ -275,8 +381,11 @@ onMounted(() => {
|
|
|
.statistics {
|
|
|
display: flex;
|
|
|
margin-top: 10px;
|
|
|
+ // justify-content: space-around;
|
|
|
.item {
|
|
|
- // min-width: 250px;
|
|
|
+ margin: 0 20px;
|
|
|
+ min-width: 200px;
|
|
|
+ flex: 1;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
justify-content: space-around;
|