rtgk-screen-web/pages/screen/qualityBoard/index.js

1088 lines
28 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, {
useRef,
useEffect,
useState,
useCallback,
useMemo,
} from "react";
import { withRouter } from "next/router";
import moment from "moment";
// import { Liquid, DualAxes } from "@ant-design/plots";
import _ from "lodash";
import Chart from "../../../components/screen/Chart";
import * as echarts from "echarts";
import Footer from "../../../components/screen/Footer";
import Header from "../../../components/screen/Header";
import Row from "../../../components/screen/Row";
import Card from "../../../components/screen/Card";
import Table from "../../../components/screen/Table";
import TableProgress from "../../../components/screen/TableProgress";
import io from "../../../utils/socket.io.js";
const gutter = 20;
const bottom = 20;
const cardBg = "rgba(6, 36, 109, 0.2)";
const socketEmit = "timePerformanceGoodProduct";
const socketScreenType = "QualityDashBoardType";
// 调试方式: local 本地完整数据调试, server 接口调试, dev 开发期调试
const dataType = "server";
const getQueryVariable = (variable) => {
let query = window.location.search.substring(1);
let vars = query.split("&");
for (let i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return false;
};
const useSocket = ({ socketEmit, socketScreenType, dataType }) => {
const { config: { ioSocketUrl } = {} } = global;
const [pageData, setPageData] = useState({});
const socket = useRef();
const update = useCallback((data) => {
if (dataType === "local") data = localData;
console.log("data", data);
const { todayQuality } = data;
// 今日合格率
let todayPassRate = todayQuality.qualityRate;
// 今日是否合格
let todayIsPass = todayPassRate >= 0.7;
// 本月不良率TOP5
const { monthDefectRateTop5 = {} } = data;
let monthUnPass = [];
Object.keys(monthDefectRateTop5).forEach((name) => {
monthUnPass.push({ name, value: monthDefectRateTop5[name] });
});
// 合格率趋势
const { qualityTrend = [] } = data;
let passTrend = { category: [], data: [] };
try {
let category = [];
let proData = [[], []];
qualityTrend.forEach((item, dateIndex) => {
category.unshift(item.date);
["zhhgl", "ztl"].forEach((type, typeIndex) => {
Object.keys(item[type]).forEach((proName) => {
let value = item[type][proName];
if (!proData[typeIndex].find((i) => i.name === proName)) {
proData[typeIndex].push({ name: proName, data: [] });
}
let proIndex = proData[typeIndex].findIndex(
(i) => i.name === proName
);
proData[typeIndex][proIndex].data[
-1 * dateIndex + qualityTrend.length - 1
] = value;
});
});
});
// 折线图 所有值为0则消失过滤这条产品数据
proData[1] = proData[1].filter(({ data }) => {
let total = 0;
data.forEach(val => total += val);
return total > 0;
})
let typeData = [
{
key: "zhhgl",
name: "综合合格率",
data: proData[0],
},
{
key: "ztl",
name: "一次性合格率",
data: proData[1],
},
];
passTrend = { category, data: typeData };
} catch (e) {
console.log("qualityTrend error", e, qualityTrend);
}
// 近三天不良率
const { threeDayReject = [] } = data;
let unPassRate = threeDayReject;
// 任务提醒
const { taskRemind = [] } = data;
let taskReminder = taskRemind;
setPageData({
todayPassRate,
todayIsPass,
monthUnPass,
passTrend,
unPassRate,
taskReminder,
});
}, []);
const getData = useCallback(() => {
let workCenterCode = getQueryVariable("workCenterCode");
let date = getQueryVariable("date");
if (!workCenterCode) return;
let query = {
workCenterCode,
screenType: socketScreenType,
};
if (date) query.date = date;
console.log("fetch", socketEmit, { query });
if (dataType === "server") {
socket.current.emit(socketEmit, "channel", { query });
} else if (dataType === "local") {
update();
}
}, [update]);
useEffect(() => {
if (dataType === "dev") setPageData(devData);
if (dataType === "local") getData();
if (dataType === "server") {
socket.current = io.connect(ioSocketUrl, {transports:['websocket']});
socket.current.on("connect", function () {
console.log("msg页面连接成功");
getData();
});
socket.current.on(socketEmit, function (res) {
try {
res = JSON.parse(res);
} catch (e) {
console.log(e);
}
update(res.data);
});
}
}, [getData, update]);
return [pageData, getData];
};
function QualityBoard(props) {
const { config: { qualityBoard = {} } = {} } = global;
const { threeDayRejectTableNext = 4000, taskRemindTableNext = 4000} = qualityBoard;
const [pageData, getPageData] = useSocket({
socketEmit,
socketScreenType,
dataType,
});
// 今日合格率
const todayPassRateOpt = useMemo(
() => chartConfig("todayPassRateConfig").init(pageData),
[pageData]
);
// 今日是否合格
const todayIsPass = useMemo(() => !!pageData.todayIsPass, [pageData]);
// 本月不良率TOP5
const monthUnPassOpt = useMemo(
() => chartConfig("monthUnPassConfig").init(pageData),
[pageData]
);
// 合格率趋势
const passTrend = useMemo(
() => chartConfig("passTrendConfig").init(pageData),
[pageData]
);
// 近三天不良率
const unPassRateTableRef = useRef();
const unPassRateTableColumns = useMemo(
() => [
{
title: "日期",
code: "date",
render: (value) => (value && moment(value).format("MM-DD")) || "",
},
{ title: "产品名称", code: "materialName" },
{ title: "产品等级", code: "productLevel" },
{ title: "生产批次", code: "scpc" },
{ title: "产量", code: "cl" },
{ title: "检验批次", code: "jypc" },
{ title: "不良批次", code: "blpc" },
{
title: "不良率",
width: 176,
code: "bll",
render: (value) => {
if (isNaN(value)) return value;
if (parseFloat(value) === 0) return value;
return <TableProgress percent={value} rule={ 'strange' } />
},
},
],
[]
);
useEffect(() => {
const { unPassRate = [] } = pageData;
unPassRateTableRef.current.setData(unPassRate);
let getNextPage = () => setTimeout(() => {
unPassRateTableRef.current.nextPage();
timmer = getNextPage();
}, threeDayRejectTableNext);
let timmer = getNextPage();
return () => {
clearTimeout(timmer);
};
}, [pageData]);
// 任务提醒
const taskReminderTableRef = useRef();
// 8小时内含8小时数值显示绿色8小时以上数值显示橙色24小时以上数值显示红色。
const getColor = useCallback((ms = 0) => {
if (ms > 24 * 60 * 60) return "#FF005A";
if (ms > 8 * 60 * 60) return "#F5A623";
if (ms <= 8 * 60 * 60) return "#58BC17";
}, []);
const billstatusStyle = useCallback(
(ms) => {
return {
fontSize: "16px",
color: "#fff",
lineHeight: "28px",
padding: "0 8px",
display: "inline-block",
background: getColor(ms),
};
},
[getColor]
);
const taskReminderTableColumns = useMemo(
() => [
{
title: "任务状态",
code: "billstatus",
render: (value, config, rowData) => (
<span style={billstatusStyle(rowData.ms)}>{value}</span>
),
},
{ title: "任务名称", code: "templatename" },
{ title: "产品名称", code: "materialname" },
{ title: "产品等级", code: "materialdesc" },
{ title: "批次号", code: "workordercode" },
{ title: "工序", code: "processname" },
{
title: "任务产生时间",
code: "createtime",
render: (value) =>
(value && moment(value).format("YYYY-MM-DD HH:mm")) || "",
},
{
title: "持续时长",
code: "cxsc",
render: (value, config, rowData) => (
<span style={{ color: getColor(rowData.ms) }}>{value}</span>
),
},
],
[billstatusStyle, getColor]
);
useEffect(() => {
const { taskReminder = [] } = pageData;
taskReminderTableRef.current.setData(taskReminder);
let getNextPage = () => setTimeout(() => {
taskReminderTableRef.current.nextPage();
timmer = getNextPage();
}, taskRemindTableNext);
let timmer = getNextPage();
return () => {
clearTimeout(timmer);
};
}, [pageData]);
return (
<div className="screen-container">
<Header title={"质量看板"} />
<div className="screen-container-content">
<Row
style={{ height: `${470 + bottom}px` }}
bottom={bottom}
gutter={gutter}
>
<Row.Col style={{ width: `${470 + gutter}px` }} bottom={bottom}>
<Row bottom={bottom}>
<Row.Col span={24} style={{ height: `${220 + bottom}px` }}>
<Card
title="今日合格率"
titleSpace={true}
overVisible={true}
withBg={cardBg}
>
<div className="screen-container-hp">
<Row className="height-100" gutter={gutter} bottom={bottom}>
<Row.Col span={11} bottom={0}>
<Chart option={todayPassRateOpt} />
</Row.Col>
<Row.Col span={13} bottom={0}>
<div className="screen-container-hp-top">
<span>检验合格率</span>
</div>
<div className="screen-container-hp-bottom">
{todayIsPass ? "运行正常" : "运行异常"}
</div>
</Row.Col>
</Row>
</div>
</Card>
</Row.Col>
<Row.Col span={24} style={{ height: `${230}px` }} bottom={0}>
<Card title="本月不良率TOP5" titleSpace={true} withBg={cardBg}>
<Chart option={monthUnPassOpt} />
</Card>
</Row.Col>
</Row>
</Row.Col>
<Row.Col
style={{ width: `${1390 + bottom}px`, height: `${470 + gutter}px` }}
>
<Card title="合格率趋势" titleSpace={false} withBg={cardBg}>
<Chart option={passTrend} />
</Card>
</Row.Col>
</Row>
<Row style={{ height: `${404}px` }} gutter={gutter} bottom={0}>
<Row.Col span={12}>
<Card
title="近三天不良率"
titleSpace={true}
withBg={cardBg}
padding={gutter + "px"}
>
<Table
mainKey="gid"
ref={unPassRateTableRef}
columns={unPassRateTableColumns}
/>
</Card>
</Row.Col>
<Row.Col span={12}>
<Card
title="任务提醒"
titleSpace={true}
withBg={cardBg}
padding={gutter + "px"}
>
<Table
mainKey="gid"
autoNext={false}
pageFinished={getPageData}
ref={taskReminderTableRef}
columns={taskReminderTableColumns}
/>
</Card>
</Row.Col>
</Row>
</div>
<Footer />
<style jsx>{`
.screen-container {
height: 100vh;
min-height: 1080px;
min-width: 1920px;
overflow: hidden;
background: url("/img/bg.png") center center;
position: relative;
padding-top: 96px;
padding-bottom: 82px;
}
.screen-container-content {
height: 100%;
padding: 0 ${gutter}px;
}
.screen-container-hp {
height: 100%;
overflow: hidden;
}
.screen-container-hp-top {
height: 82px;
background: url(/img/img1.png);
background-repeat: no-repeat;
position: relative;
background-position: 0 10px;
}
.screen-container-hp-top span {
color: #00f7fb;
position: absolute;
font-size: 18px;
top: 25px;
left: 46px;
letter-spacing: 10px;
}
.screen-container-hp-bottom {
font-size: 32px;
line-height: 38px;
width: 188px;
color: #00f7fb;
text-align: center;
background-image: linear-gradient(
180deg,
rgba(0, 76, 167, 0.2) 0%,
rgba(36, 53, 184, 0.5) 100%
);
border: 1px solid #0064f1;
border-radius: 3px;
margin-top: 12px;
}
.screen-container-hp-bottom::before {
content: "";
display: block;
margin: -8px -10px 0 -10px;
height: 20px;
border-top: 1px solid #0064f1;
border-left: 1px solid #0064f1;
border-right: 1px solid #0064f1;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.screen-container-hp-bottom::after {
content: "";
display: block;
margin: 0 -10px -8px -10px;
height: 20px;
border-bottom: 1px solid #0064f1;
border-left: 1px solid #0064f1;
border-right: 1px solid #0064f1;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
}
`}</style>
</div>
);
}
const devData = {
// 今日合格率
todayPassRate: 0.855555,
// 今日是否合格
todayIsPass: true,
// 本月不良率TOP5
monthUnPass: [
{ value: 0.0909, name: "硫含量" },
{ value: 0.3564, name: "DIO" },
{ value: 0.1203, name: "粉体电阻率" },
{ value: 0.1253, name: "包装袋" },
{ value: 0.2005, name: "振实密度" },
],
// 合格率趋势
passTrend: {
category: ["08-01", "08-02", "08-03", "08-04", "08-05", "08-06", "08-07"],
data: [
{
name: "综合合格率",
data: [
{
name: "E60",
data: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
},
{
name: "E70",
data: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
},
{
name: "E80",
data: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
},
],
},
{
name: "一次性合格率",
data: [
{
name: "E60",
data: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
},
{
name: "E70",
data: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2],
},
{
name: "E80",
data: [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3],
},
],
},
],
},
// 近三天不良率
unPassRate: [
{
gid: "1",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "0.123", //不良率
},
{
gid: "2",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "无", //不良率
},
{
gid: "3",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "1", //不良率
},
{
gid: "4",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "1.000", //不良率
},
{
gid: "5",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "0", //不良率
},
],
// 任务提醒
taskReminder: [
{
gid: "1",
billstatus: "待检验", //任务状态
templatename: "测试工单批次生成质检任务", //任务名称
materialname: "L5车间成品", //产品名称
materialdesc: "E80A", //产品等级
workordercode: "HSR5A22082201", //批次号
processname: "粗磨", //工序
createtime: "2022-08-01 00:00:00", //任务产生时间
cxsc: "50分钟", //持续时长
ms: 1,
},
{
gid: "2",
billstatus: "待检验", //任务状态
templatename: "测试工单批次生成质检任务", //任务名称
materialname: "L5车间成品", //产品名称
materialdesc: "E80A", //产品等级
workordercode: "HSR5A22082201", //批次号
processname: "粗磨", //工序
createtime: "2022-08-01 00:00:00", //任务产生时间
cxsc: "50分钟", //持续时长
ms: 1000000,
},
],
};
const localData = {
todayQuality: {
qualityRate: 0.231,
},
monthDefectRateTop5: {
PH值: 0.3333,
粒度: 0.3333,
感应强度: 0.3333,
包装袋: 0.1203,
振实密度: 0.2005,
},
qualityTrend: [
{
date: "08-22",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-21",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-20",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-19",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-18",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-17",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
{
date: "08-16",
ztl: {
E60: 0.42,
E70: 0.32,
E80: 0.22,
},
zhhgl: {
E60: 0.12,
E70: 0.12,
E80: 0.12,
},
},
],
threeDayReject: [
{
gid: "1",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "0.123123123123", //不良率
},
{
gid: "2",
date: "2022-08-06", //日期
materialName: "磷酸铁锂", //产品名称
productLevel: "E80", //产品等级
scpc: 2, //生产批次
cl: 2, //产量
jypc: 2, //检验批次
blpc: 0, //不良批次
bll: "无", //不良率
},
{ gid: "3" },
{ gid: "4" },
{ gid: "5" },
{ gid: "6" },
{ gid: "7" },
{ gid: "8" },
{ gid: "9" },
],
taskRemind: [
{
gid: "1",
billstatus: "待检验", //任务状态
templatename: "测试工单批次生成质检任务", //任务名称
materialname: "L5车间成品", //产品名称
materialdesc: "E80A", //产品等级
workordercode: "HSR5A22082201", //批次号
processname: "粗磨", //工序
createtime: "2022-08-01 00:00:00", //任务产生时间
cxsc: "50分钟", //持续时长
ms: 1,
},
{
gid: "2",
billstatus: "待检验", //任务状态
templatename: "测试工单批次生成质检任务", //任务名称
materialname: "L5车间成品", //产品名称
materialdesc: "E80A", //产品等级
workordercode: "HSR5A22082201", //批次号
processname: "粗磨", //工序
createtime: "2022-08-01 00:00:00", //任务产生时间
cxsc: "50分钟", //持续时长
ms: 1000000,
},
{
gid: "3",
billstatus: "待检验", //任务状态
templatename: "测试工单批次生成质检任务", //任务名称
materialname: "L5车间成品", //产品名称
materialdesc: "E80A", //产品等级
workordercode: "HSR5A22082201", //批次号
processname: "粗磨", //工序
createtime: "2022-08-01 00:00:00", //任务产生时间
cxsc: "50分钟", //持续时长
ms: 30000,
},
{ gid: "4" },
{ gid: "5" },
{ gid: "6" },
{ gid: "7" },
{ gid: "8" },
{ gid: "9" },
],
};
// 今日合格率
const todayPassRateConfig = {
series: {
type: "liquidFill",
center: ["50%", "50%"],
radius: "75%",
data: [
{
value: 0.855,
itemStyle: {
opacity: 0.3,
},
},
0.855,
],
itemStyle: {},
label: {
position: ["50%", "30%"],
formatter: (opt) => `${parseFloat((opt.value * 100).toFixed(1))}%`,
fontSize: 28,
},
backgroundStyle: {
color: "none",
},
outline: {
show: true,
borderDistance: 2,
itemStyle: {
color: "none",
borderColor: "#f6202f",
borderWidth: 2,
},
},
},
};
let todayPassRateColors = {
red: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "hsl(356deg 92% 65%)",
},
{
offset: 1,
color: "hsl(356deg 92% 25%)",
},
]),
color: "#f6202f",
},
green: {
fill: "#92D050",
color: "#92D050",
},
orange: {
fill: "#FFC000",
color: "#FFC000",
},
};
todayPassRateConfig.init = (pageData) => {
let { todayPassRate = 0, todayIsPass } = pageData;
let opt = _.cloneDeep(todayPassRateConfig);
opt.series.data[0].value = todayPassRate;
opt.series.data[1] = todayPassRate;
let { orange, green } = todayPassRateColors;
let { fill, color } = todayIsPass ? green : orange;
opt.series.itemStyle.color = fill;
opt.series.label.color = color;
opt.series.outline.itemStyle.borderColor = color;
return opt;
};
// 本月不良率TOP5
const monthUnPassConfig = {
color: ["#4D7BF3", "#4FCCFF", "#6EE420", "#FFC760", "#FF005A"],
legend: {
orient: "vertical",
left: 10,
top: "middle",
itemGap: 16,
textStyle: {
rich: {
0: { opacity: 0.75 },
1: { opacity: 1 },
},
},
},
series: {
type: "pie",
radius: ["40%", "70%"],
center: ["65%", "45%"],
label: {
show: true,
textBorderColor: "transparent",
rich: {
0: { color: "#4D7BF3" },
1: { color: "#4FCCFF" },
2: { color: "#6EE420" },
3: { color: "#FFC760" },
4: { color: "#FF005A" },
},
},
labelLine: {
show: true,
},
data: [],
},
};
monthUnPassConfig.init = (pageData) => {
let { monthUnPass } = pageData;
if (!monthUnPass) return;
let opt = _.cloneDeep(monthUnPassConfig);
opt.series.data = monthUnPass;
opt.legend.formatter = (name) => {
let { value } = monthUnPass.find((i) => i.name === name);
return `{0|${name}}{1|${(value * 100).toFixed(2)}%}`;
};
opt.series.label.formatter = (data) => {
let { name, dataIndex } = data;
return `{${dataIndex}|${name}}`;
};
return opt;
};
// 合格率趋势
const passTrendConfig = {
grid: {
bottom: 40,
top: 80,
left: 70,
right: 70,
},
legend: {
right: 20,
top: 20,
},
barMaxWidth: 30,
xAxis: {
type: "category",
data: [],
axisTick: {
show: true,
alignWithLabel: true,
},
axisLine: {
lineStyle: {
color: "rgba(255,255,255,0.65)",
},
},
axisLabel: {
color: "rgba(255,255,255,0.85)",
},
},
yAxis: [
{
type: "value",
max: 1,
axisTick: {
show: true,
alignWithLabel: true,
},
axisLine: {
lineStyle: {
color: "rgba(255,255,255,0.65)",
},
},
axisLabel: {
color: "rgba(255,255,255,0.85)",
formatter: (value) => (value * 100).toFixed(0) + "%",
},
},
{
type: "value",
max: 1,
axisTick: {
show: true,
alignWithLabel: true,
},
axisLine: {
lineStyle: {
color: "rgba(255,255,255,0.65)",
},
},
axisLabel: {
color: "rgba(255,255,255,0.85)",
formatter: (value) => (value * 100).toFixed(0) + "%",
},
},
],
series: [],
};
const colors = [[new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(249, 203, 173)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(225, 193, 0)'
}, {
offset: 0.63, color: 'rgb(217, 199, 117)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.17, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(169, 209, 142)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(0, 176, 240)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(191, 144, 0)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(237, 125, 49)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(255, 153, 153)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(51, 102, 255)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(0, 255, 153)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}]), new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 1, color: 'rgb(255, 51, 253)'
}, {
offset: 0.26, color: 'rgb(183, 210, 236)'
}, {
offset: 0.16, color: 'rgb(183, 210, 236)'
}, {
offset: 0, color: 'rgb(208, 225, 242)'
}])], [
"#3366FF", "#00CCFF", "#FF6699", "#8497B0", "#C9C9C9",
"#FFD966","#8FAADC","#ED7D31","#FFFF00","#92D050"
],
]
passTrendConfig.init = (pageData) => {
let { passTrend } = pageData;
if (!passTrend) return;
let opt = _.cloneDeep(passTrendConfig);
let { category, data } = passTrend;
opt.xAxis.data = category;
opt.series = [];
data.forEach((item, yAxisIndex) => {
let type = yAxisIndex === 0 ? "bar" : "line";
let { name: typeName } = item;
item.data.forEach(({ name: proName, data }, index) => {
let name = `${proName} ${typeName}`;
opt.series.push({ name, yAxisIndex, type, data, color: colors[yAxisIndex][index] });
});
});
return opt;
};
let chartConfig = (() => {
let chartOpt = {
todayPassRateConfig,
monthUnPassConfig,
passTrendConfig,
};
let getOpt = (type) => chartOpt[type];
return getOpt;
})();
export default withRouter(QualityBoard);