|
@@ -11,6 +11,8 @@
|
|
|
range-separator="-"
|
|
|
start-placeholder="起始时间"
|
|
|
end-placeholder="截止时间"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
size="small"
|
|
|
/>
|
|
|
</div>
|
|
@@ -19,35 +21,34 @@
|
|
|
<div class="text">选择统计维度:</div>
|
|
|
<div>
|
|
|
<el-radio-group v-model="radio" style="display: flex">
|
|
|
- <el-radio size="small" :value="3">天</el-radio>
|
|
|
- <el-radio size="small" :value="6">周</el-radio>
|
|
|
- <el-radio size="small" :value="9">月</el-radio>
|
|
|
- <el-radio size="small" :value="12">年</el-radio>
|
|
|
+ <el-radio size="small" :value="1">天</el-radio>
|
|
|
+ <el-radio size="small" :value="2">周</el-radio>
|
|
|
+ <el-radio size="small" :value="3">月</el-radio>
|
|
|
+ <el-radio size="small" :value="4">年</el-radio>
|
|
|
</el-radio-group>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="header">
|
|
|
<div class="text">选择统计维度:</div>
|
|
|
<el-tree
|
|
|
- ref="treeRef"
|
|
|
- :data="data"
|
|
|
+ ref="treeRef1"
|
|
|
+ :data="statLevelData"
|
|
|
show-checkbox
|
|
|
default-expand-all
|
|
|
- node-key="id"
|
|
|
- highlight-current
|
|
|
- :props="defaultProps"
|
|
|
+ :default-checked-keys="checkedKeys"
|
|
|
+ node-key="key"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="header" style="border-bottom: 0px">
|
|
|
<div class="text">选择统计指标:</div>
|
|
|
<el-tree
|
|
|
- ref="treeRef"
|
|
|
+ ref="treeRef2"
|
|
|
:data="data1"
|
|
|
show-checkbox
|
|
|
default-expand-all
|
|
|
- node-key="id"
|
|
|
+ :default-checked-keys="['合格率']"
|
|
|
+ node-key="key"
|
|
|
highlight-current
|
|
|
- :props="defaultProps"
|
|
|
/>
|
|
|
</div>
|
|
|
</el-scrollbar>
|
|
@@ -56,20 +57,38 @@
|
|
|
<div class="box">
|
|
|
<div class="boxheader">
|
|
|
<div>
|
|
|
- <el-button type="primary" class="btn">统计查询</el-button>
|
|
|
- <el-button class="btn">重置</el-button>
|
|
|
+ <el-button type="primary" class="btn" @click="getTableData"
|
|
|
+ >统计查询</el-button
|
|
|
+ >
|
|
|
+ <el-button class="btn" @click="reset">重置</el-button>
|
|
|
</div>
|
|
|
- <el-button class="btn">导出</el-button>
|
|
|
+ <el-button class="btn" @click="exportFnc">导出</el-button>
|
|
|
</div>
|
|
|
<div class="info">
|
|
|
<el-table
|
|
|
:data="tableData"
|
|
|
border
|
|
|
:style="{ height: maxHeight + 'px' }"
|
|
|
+ style="width: calc(100% - 50)"
|
|
|
>
|
|
|
- <el-table-column prop="date" label="Date" width="180" />
|
|
|
- <el-table-column prop="name" label="Name" width="180" />
|
|
|
- <el-table-column prop="address" label="Address" />
|
|
|
+ <el-table-column
|
|
|
+ v-if="queryIndexs.includes('productLine')"
|
|
|
+ prop="productLineName"
|
|
|
+ label="产线名称"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ v-if="queryIndexs.includes('prodict')"
|
|
|
+ prop="materialName"
|
|
|
+ label="产品名称"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ v-if="queryIndexs.includes('operation')"
|
|
|
+ prop="operationName"
|
|
|
+ label="工序名称"
|
|
|
+ />
|
|
|
+ <el-table-column prop="goodRate" label="良率" />
|
|
|
+ <el-table-column prop="badRate" label="不良率" />
|
|
|
+ <el-table-column prop="timeStr" label="日期" />
|
|
|
</el-table>
|
|
|
</div>
|
|
|
<div class="footer">
|
|
@@ -78,6 +97,9 @@
|
|
|
:page="currentOption.page"
|
|
|
:limit="currentOption.limit"
|
|
|
:pageSizes="currentOption.pageSizes"
|
|
|
+ v-model:page="currentOption.page"
|
|
|
+ v-model:limit="currentOption.limit"
|
|
|
+ @pagination="getTableData"
|
|
|
/>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -86,197 +108,121 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
-import * as echarts from "echarts";
|
|
|
+import { getData, getStatLevel, getExport } from "@/api/statistic";
|
|
|
import Pagination from "@/components/Pagination/index.vue";
|
|
|
-const value = ref("");
|
|
|
+import { downFile } from "@/utils/common";
|
|
|
+defineOptions({
|
|
|
+ name: "Dashboard",
|
|
|
+ inheritAttrs: false,
|
|
|
+});
|
|
|
+const exportFnc = async () => {
|
|
|
+ await getExport({
|
|
|
+ endTime: value1.value ? value1.value[1] : "",
|
|
|
+ startTime: value1.value ? value1.value[0] : "",
|
|
|
+ queryTypes: getValue(treeRef1.value.getCheckedNodes()),
|
|
|
+ queryIndex: getValue(treeRef2.value.getCheckedNodes()),
|
|
|
+ timeType: radio.value,
|
|
|
+ }).then((res) => downFile(res));
|
|
|
+};
|
|
|
+const treeRef1 = ref(null);
|
|
|
+const treeRef2 = ref(null);
|
|
|
const currentOption = ref({
|
|
|
total: 0,
|
|
|
- page: 0,
|
|
|
- limit: 12,
|
|
|
- pageSizes: [12],
|
|
|
+ page: 1,
|
|
|
+ limit: 10,
|
|
|
+ pageSizes: [10, 20],
|
|
|
});
|
|
|
-const data = [
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- label: "车间1",
|
|
|
- children: [
|
|
|
- {
|
|
|
- id: 4,
|
|
|
- label: "Level two 1-1",
|
|
|
- children: [
|
|
|
- {
|
|
|
- id: 9,
|
|
|
- label: "Level three 1-1-1",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 10,
|
|
|
- label: "Level three 1-1-2",
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- label: "Level one 2",
|
|
|
- children: [
|
|
|
- {
|
|
|
- id: 5,
|
|
|
- label: "Level two 2-1",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 6,
|
|
|
- label: "Level two 2-2",
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- label: "Level one 3",
|
|
|
- children: [
|
|
|
- {
|
|
|
- id: 7,
|
|
|
- label: "Level two 3-1",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 8,
|
|
|
- label: "Level two 3-2",
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
-];
|
|
|
const data1 = [
|
|
|
{
|
|
|
- id: 1,
|
|
|
- label: "车间1",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
+ value: "pass",
|
|
|
+ key: "合格率",
|
|
|
label: "合格率",
|
|
|
},
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- label: "PPM",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 4,
|
|
|
- label: "Cpk",
|
|
|
- },
|
|
|
];
|
|
|
const maxHeight = ref(null);
|
|
|
const maxWidth = ref(null);
|
|
|
|
|
|
const value1 = ref(null);
|
|
|
-const radio = ref(3);
|
|
|
-const tableData = [
|
|
|
- {
|
|
|
- date: "2016-05-03",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-02",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-04",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
- {
|
|
|
- date: "2016-05-01",
|
|
|
- name: "Tom",
|
|
|
- address: "No. 189, Grove St, Los Angeles",
|
|
|
- },
|
|
|
-];
|
|
|
+const radio = ref(1);
|
|
|
+const tableData = ref([]);
|
|
|
|
|
|
-defineOptions({
|
|
|
- name: "Dashboard",
|
|
|
- inheritAttrs: false,
|
|
|
-});
|
|
|
const setHeight = () => {
|
|
|
- maxHeight.value = document.querySelector(".info").clientHeight;
|
|
|
- maxWidth.value = document.querySelector(".info").clientWidth;
|
|
|
+ maxHeight.value = document.querySelector(".info").clientHeight - 30;
|
|
|
+ maxWidth.value = document.querySelector(".info").clientWidth - 120;
|
|
|
};
|
|
|
+const getCurrentMonthStartAndEndDates = () => {
|
|
|
+ // 获取当前日期
|
|
|
+ let now = new Date();
|
|
|
|
|
|
-onMounted(() => {
|
|
|
+ // 获取当前月份的第一天
|
|
|
+ let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
|
+
|
|
|
+ // 获取当前月份的最后一天
|
|
|
+ let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
|
|
|
+
|
|
|
+ // 格式化日期为'YYYY-MM-DD'格式
|
|
|
+ function formatDate(date) {
|
|
|
+ let year = date.getFullYear();
|
|
|
+ let month = String(date.getMonth() + 1).padStart(2, "0");
|
|
|
+ let day = String(date.getDate()).padStart(2, "0");
|
|
|
+ return `${year}-${month}-${day}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回包含开始和结束日期的数组
|
|
|
+ return [formatDate(startDate), formatDate(endDate)];
|
|
|
+};
|
|
|
+const getValue = (array) => {
|
|
|
+ let resarray = [];
|
|
|
+ for (let i = 0; i < array.length; i++) {
|
|
|
+ resarray.push(array[i].value);
|
|
|
+ }
|
|
|
+ return resarray;
|
|
|
+};
|
|
|
+const queryIndexs = ref([]);
|
|
|
+const getTableData = async () => {
|
|
|
+ queryIndexs.value = getValue(treeRef1.value.getCheckedNodes());
|
|
|
+ const { data } = await getData({
|
|
|
+ endTime: value1.value ? value1.value[1] : "",
|
|
|
+ startTime: value1.value ? value1.value[0] : "",
|
|
|
+ pageNo: currentOption.value.page,
|
|
|
+ pageSize: currentOption.value.limit,
|
|
|
+ queryTypes: getValue(treeRef1.value.getCheckedNodes()),
|
|
|
+ queryIndex: getValue(treeRef2.value.getCheckedNodes()),
|
|
|
+ timeType: radio.value,
|
|
|
+ });
|
|
|
+ tableData.value = data.records;
|
|
|
+ currentOption.value.total = data.totalCount;
|
|
|
+};
|
|
|
+const reset = () => {
|
|
|
+ value1.value = getCurrentMonthStartAndEndDates();
|
|
|
+ treeRef1.value.setCheckedKeys(checkedKeys.value, true, true);
|
|
|
+ treeRef2.value.setCheckedKeys([data1[0].key], true, true);
|
|
|
+ radio.value = 1;
|
|
|
+ currentOption.value.page = 1;
|
|
|
+ getTableData();
|
|
|
+};
|
|
|
+const statLevelData = ref([]);
|
|
|
+const getStatLevelData = async () => {
|
|
|
+ const { data } = await getStatLevel();
|
|
|
+ data.forEach((element) => {
|
|
|
+ element.label = element.key;
|
|
|
+ });
|
|
|
+ statLevelData.value = data;
|
|
|
+};
|
|
|
+const checkedKeys = computed(() => {
|
|
|
+ let array = [];
|
|
|
+ for (let i = 0; i < statLevelData.value.length; i++) {
|
|
|
+ array.push(statLevelData.value[i].key);
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+});
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ window.addEventListener("resize", setHeight);
|
|
|
+ value1.value = getCurrentMonthStartAndEndDates();
|
|
|
setHeight();
|
|
|
+ await getStatLevelData();
|
|
|
+ getTableData();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
@@ -291,8 +237,7 @@ onMounted(() => {
|
|
|
display: flex;
|
|
|
background-color: white;
|
|
|
.infobox {
|
|
|
- width: 200px;
|
|
|
-
|
|
|
+ width: 260px;
|
|
|
.header {
|
|
|
border-bottom: 2px solid #00000010;
|
|
|
padding: 20px;
|
|
@@ -302,7 +247,7 @@ onMounted(() => {
|
|
|
}
|
|
|
}
|
|
|
.databox {
|
|
|
- flex: 1;
|
|
|
+ width: calc(100% - 260px);
|
|
|
border-left: 2px solid #00000010;
|
|
|
.box {
|
|
|
height: 100%;
|