Commit 127e9578 authored by 沈翠玲's avatar 沈翠玲

希迈对接接口

parent 196744fe
......@@ -105,9 +105,9 @@ const formatOptions = (data: any) => {
data: [],
};
option.series.push({ ...temp, name: '当月异常', data: [data.currentMonthNumber] });
option.series.push({ ...temp, name: '未关闭', data: [data.createIssueNumber] });
option.series.push({ ...temp, name: '超期', data: [data.beyondNumber] });
option.series.push({ ...temp, name: '当月异常', data: [data.totalCt] });
option.series.push({ ...temp, name: '未关闭', data: [data.unCloseCt] });
option.series.push({ ...temp, name: '超期', data: [data.expireUnClose] });
return option;
};
......@@ -141,48 +141,48 @@ const Main: React.FC<{ data: any; setting: ErrorDetailSetting }> = ({ data, sett
if (chartRef.current !== null) {
const chart = getInstanceByDom(chartRef.current);
chart?.off('click');
chart?.on('click', (params) => {
if (params.seriesName == '当月异常') {
setCriteria({
workshopName: setting.workshopName,
status: '2,3,5',
createdDateFrom: moment()
.date(1)
.hour(0)
.minute(0)
.second(0)
.millisecond(0)
.format('YYYY-MM-DD HH:mm'),
createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '未关闭') {
setCriteria({
workshopName: setting.workshopName,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
status: '2,3',
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '超期') {
setCriteria({
workshopName: setting.workshopName,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
status: '2,3',
gtErrorDays: setting.abnormalOverdueSetting.diffDayEquipment,
current: 1,
pageSize: 10,
});
}
setIsModalOpen(true);
});
// chart?.on('click', (params) => {
// if (params.seriesName == '当月异常') {
// setCriteria({
// workshopName: setting.workshopName,
// status: '2,3,5',
// createdDateFrom: moment()
// .date(1)
// .hour(0)
// .minute(0)
// .second(0)
// .millisecond(0)
// .format('YYYY-MM-DD HH:mm'),
// createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '未关闭') {
// setCriteria({
// workshopName: setting.workshopName,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// status: '2,3',
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '超期') {
// setCriteria({
// workshopName: setting.workshopName,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// status: '2,3',
// gtErrorDays: setting.abnormalOverdueSetting.diffDayEquipment,
// current: 1,
// pageSize: 10,
// });
// }
// setIsModalOpen(true);
// });
}
}, [setting]);
......
......@@ -32,32 +32,22 @@ const Abnormal: React.FC<{
<div className={styles.itemContainer}>
<ProductAbnormal data={abnormalProdData} setting={setting} />
</div>
<div className={styles.itemContainer}>
<QualityAbnormal data={abnormalQualityData} setting={setting} />
</div>
<div className={styles.itemContainer}>
<DeviceAbnormal data={abnormalDeviceData} setting={setting} />
</div>
<div className={styles.bottomContainer}>
<div className={styles.bottomItem}>
<p>设备正常数:</p>
<h2 onClick={() => openModal(1)}>{abnormalDeviceData.deviceNorNumber}</h2>
<h2 onClick={() => openModal(1)}>{abnormalDeviceData.equipCt}</h2>
</div>
<div className={styles.bottomItemRight} style={{ marginLeft: '10px' }}>
<p>设备异常数:</p>
<h2 onClick={() => openModal(2)}>{abnormalDeviceData.deviceEcpNumber}</h2>
<h2 onClick={() => openModal(2)}>{abnormalDeviceData.equipErrorCt}</h2>
</div>
</div>
<Modal
title={'设备台账'}
visible={isModalOpen}
footer={null}
width={'70%'}
onCancel={closeModal}
>
<DeviceCountTable values={criteria} />
</Modal>
<div className={styles.itemContainer}>
<QualityAbnormal data={abnormalQualityData} setting={setting} />
</div>
</>
);
};
......
......@@ -112,9 +112,9 @@ const formatOptions = (data: any) => {
data: [],
};
option.series.push({ ...temp, name: '当月异常', data: [data.currentMonthNumber] });
option.series.push({ ...temp, name: '未关闭', data: [data.createIssueNumber] });
option.series.push({ ...temp, name: '超期', data: [data.beyondNumber] });
option.series.push({ ...temp, name: '当月异常', data: [data.totalCt] });
option.series.push({ ...temp, name: '未关闭', data: [data.unCloseCt] });
option.series.push({ ...temp, name: '超期', data: [data.expireUnClose] });
return option;
};
......@@ -148,48 +148,48 @@ const Main: React.FC<{ data: any; setting: ErrorDetailSetting }> = ({ data, sett
if (chartRef.current !== null) {
const chart = getInstanceByDom(chartRef.current);
chart?.off('click');
chart?.on('click', (params) => {
if (params.seriesName == '当月异常') {
setCriteria({
workshopName: setting.workshopName,
status: '1,2,3,4',
createdDateFrom: moment()
.date(1)
.hour(0)
.minute(0)
.second(0)
.millisecond(0)
.format('YYYY-MM-DD HH:mm'),
createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '未关闭') {
setCriteria({
workshopName: setting.workshopName,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
status: '1,2,3',
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '超期') {
setCriteria({
workshopName: setting.workshopName,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
status: '1,2,3',
gtErrorDays: setting.abnormalOverdueSetting.diffDayProduction,
current: 1,
pageSize: 10,
});
}
setIsModalOpen(true);
});
// chart?.on('click', (params) => {
// if (params.seriesName == '当月异常') {
// setCriteria({
// workshopName: setting.workshopName,
// status: '1,2,3,4',
// createdDateFrom: moment()
// .date(1)
// .hour(0)
// .minute(0)
// .second(0)
// .millisecond(0)
// .format('YYYY-MM-DD HH:mm'),
// createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '未关闭') {
// setCriteria({
// workshopName: setting.workshopName,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
// status: '1,2,3',
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '超期') {
// setCriteria({
// workshopName: setting.workshopName,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment().format('YYYY-MM-DD HH:mm'),
// status: '1,2,3',
// gtErrorDays: setting.abnormalOverdueSetting.diffDayProduction,
// current: 1,
// pageSize: 10,
// });
// }
// setIsModalOpen(true);
// });
}
}, [setting]);
......
......@@ -11,6 +11,7 @@ type ErrorDetailSetting = KANBAN.ProductionComprehens.ErrorDetailSetting;
const formatOptions = (data: any) => {
const option = {
tooltip: {},
color: [
{
type: 'linear',
......@@ -71,16 +72,29 @@ const formatOptions = (data: any) => {
show: false,
},
grid: {
bottom: 10,
bottom: 20,
top: 20,
},
xAxis: {
type: 'value',
show: false,
type: 'category',
show: true,
axisLabel: {
color: '#fff',
fontSize: 16,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
}
},
yAxis: {
type: 'category',
type: 'value',
data: ['质量'],
splitLine: {
show: false
},
axisLabel: {
color: '#fff',
fontSize: 16,
......@@ -96,9 +110,10 @@ const formatOptions = (data: any) => {
};
const temp = {
type: 'bar',
type: 'line',
name: '',
barGap: 0,
smooth: true,
label: {
show: true,
position: 'right',
......@@ -106,10 +121,19 @@ const formatOptions = (data: any) => {
},
data: [],
};
option.series.push({ ...temp, name: '当月异常', data: [data.currentMonthNumber] });
option.series.push({ ...temp, name: '未关闭', data: [data.createIssueNumber] });
option.series.push({ ...temp, name: '超期', data: [data.beyondNumber] });
const now = moment();
// 存储最近七天日期的数组
const lastSevenDays = [];
for (let i = 0; i < 7; i++) {
lastSevenDays.push(moment(now).subtract(i, 'days').format('DD/MM'));
}
console.log('lastSevenDays', lastSevenDays)
option['xAxis']['data'] = lastSevenDays.reverse()
// option.series.push({ ...temp, name: '当月异常', data: [data.totalCt] });
// option.series.push({ ...temp, name: '未关闭', data: [data.unCloseCt] });
option.series.push({ ...temp, name: '设备故障总数', data: data.reverse()} );
return option;
};
......@@ -143,51 +167,51 @@ const Main: React.FC<{ data: any; setting: ErrorDetailSetting }> = ({ data, sett
if (chartRef.current !== null) {
const chart = getInstanceByDom(chartRef.current);
chart?.off('click');
chart?.on('click', (params) => {
if (params.seriesName == '当月异常') {
setCriteria({
werks: setting.werks,
fevor: setting.fevors,
status: '1,2,3',
createdDateFrom: moment()
.date(1)
.hour(0)
.minute(0)
.second(0)
.millisecond(0)
.format('YYYY-MM-DD HH:mm'),
createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '未关闭') {
setCriteria({
werks: setting.werks,
fevor: setting.fevors,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
status: '1,2',
current: 1,
pageSize: 10,
});
} else if (params.seriesName == '超期') {
setCriteria({
werks: setting.werks,
fevor: setting.fevors,
createdDateFrom: null,
createdDateTo: null,
//createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
//createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
status: '1,2',
gtErrorDays: setting.abnormalOverdueSetting.diffDayQuality,
current: 1,
pageSize: 10,
});
}
setIsModalOpen(true);
});
// chart?.on('click', (params) => {
// if (params.seriesName == '当月异常') {
// setCriteria({
// werks: setting.werks,
// fevor: setting.fevors,
// status: '1,2,3',
// createdDateFrom: moment()
// .date(1)
// .hour(0)
// .minute(0)
// .second(0)
// .millisecond(0)
// .format('YYYY-MM-DD HH:mm'),
// createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '未关闭') {
// setCriteria({
// werks: setting.werks,
// fevor: setting.fevors,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// status: '1,2',
// current: 1,
// pageSize: 10,
// });
// } else if (params.seriesName == '超期') {
// setCriteria({
// werks: setting.werks,
// fevor: setting.fevors,
// createdDateFrom: null,
// createdDateTo: null,
// //createdDateFrom: moment().date(1).hour(0).minute(0).second(0).millisecond(0).format('YYYY-MM-DD HH:mm'),
// //createdDateTo: moment(params.to).format('YYYY-MM-DD HH:mm'),
// status: '1,2',
// gtErrorDays: setting.abnormalOverdueSetting.diffDayQuality,
// current: 1,
// pageSize: 10,
// });
// }
// setIsModalOpen(true);
// });
}
}, [setting]);
......
......@@ -121,12 +121,8 @@ const Main: React.FC<{ data: MonthlyPlanProps; kanbanId: string | undefined }> =
<h2 onClick={(e) => clickNum(e, 2)}>{data.endOnTimeRatio}%</h2>
</div>
<div className={styles.centerTopItem} onClick={() => clickBg(3)}>
<p>入库准时</p>
<h2 onClick={(e) => clickNum(e, 3)}>{data.stockInOnTimeRatio}%</h2>
</div>
<div className={styles.centerTopItem} onClick={() => clickBg(4)}>
<p>周期准时</p>
<h2 onClick={(e) => clickNum(e, 4)}>{data.periodicAccordRatio}%</h2>
<p>产品合格</p>
<h2 onClick={(e) => clickNum(e, 3)}>{data.qualifiedRatio}%</h2>
</div>
<div className={styles.centerTopItem} style={{ marginRight: '0px' }}>
<p>历史月待完工</p>
......
......@@ -118,8 +118,8 @@ const formatOptions = (data: any) => {
};
option.series.push({ ...temp, name: '月计划', data: [data.monthPlanQuantity] });
option.series.push({ ...temp, name: '累计日计划', data: [data.accuDailyPlanQuantity] });
option.series.push({ ...temp, name: '实际完工', data: [data.actualFinishQuantity] });
option.series.push({ ...temp, name: '超期完工', data: [data.expireFinishQuantity] });
return option;
};
......
import PassTower from './passTower';
import PassSlice from './passSlice';
import styles from '../../index.less';
import { Modal } from 'antd';
import { useState } from 'react';
import PassingRateChart from './passingRateChart';
import { queryCountWeldingPassRateTrendChart } from '../../services/api';
import React, { useEffect, useRef, useState } from 'react';
import * as echarts from 'echarts/lib/echarts';
import type { ECharts } from 'echarts';
import { getInstanceByDom } from 'echarts';
const PassingRate: React.FC<{ data: any; kanbanId: string | undefined }> = ({ data, kanbanId }) => {
type ProcessOutProps = {
data: KANBAN.ProductionComprehens.ProcessYieldData[];
setting: any;
};
const formatOptions = (data: any) => {
const option = {
color: [
{
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 1,
color: '#011126', // 100% 处的颜色
},
{
offset: 0,
color: '#00ced3', // 0% 处的颜色
},
],
global: false, // 缺省为 false
},
{
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 1,
color: '#011126',
},
{
offset: 0,
color: '#3ba7cc',
},
],
global: false, // 缺省为 false
},
{
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 1,
color: '#011126',
},
{
offset: 0,
color: '#7bb249',
},
],
global: false, // 缺省为 false
},
],
xAxis: {
// type: 'category',
data: [],
nameTextStyle: {
color: '#fff',
fontSize: 14,
},
axisLabel: {
interval: 0,
color: '#fff',
fontSize: 14,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
},
dataZoom: [
{
type: 'slider',
show: false,
startValue: 0,
endValue: 3,
},
],
grid: {
left: 5,
// right: 60,
bottom: 30,
},
legend: {
show: false
},
yAxis: {
show: false,
type: 'value',
},
series: [],
};
if (data && data.length) {
const xAxisData = data.map((item: any) => item.cause);
const series = [{
type: 'bar',
barGap: 0,
label: {
show: true,
position: 'top',
color: '#fff',
},
data: data.map((item: any) => item.ct),
}];
option.xAxis.data = xAxisData;
option.series = series;
}
console.log('option', option)
return option;
};
const Main: React.FC<ProcessOutProps> = ({ data, setting }) => {
const chartRef = useRef<HTMLDivElement>(null);
const [isModalOpen, setIsModalOpen] = useState(false);
const closeModal = () => setIsModalOpen(false);
const [chartData, setChartData] = useState<KANBAN.ProductionComprehens.PassRateTrendChart[]>([]);
const openModal = async () => {
if (!kanbanId) {
return;
const [processParams, setProcessParams] = useState({
dataRange: 1,
processName: '',
current: 1,
pageSize: 10,
kanbanSettingId: '',
});
useEffect(() => {
// Initialize chart
let chart: ECharts | undefined;
if (chartRef.current !== null) {
chart = echarts.init(chartRef.current);
}
const { data: cData } = await queryCountWeldingPassRateTrendChart({
kanbanSettingId: kanbanId,
});
setChartData(cData);
setIsModalOpen(true);
};
// Add chart resize listener
// ResizeObserver is leading to a bit janky UX
function resizeChart() {
chart?.resize();
}
window.addEventListener('resize', resizeChart);
// Return cleanup function
return () => {
chart?.off('click');
chart?.dispose();
window.removeEventListener('resize', resizeChart);
};
}, []);
useEffect(() => {
let timer: NodeJS.Timer | null = null;
// Update chart
if (chartRef.current !== null) {
if (timer !== null) clearInterval(timer);
const chart = getInstanceByDom(chartRef.current);
const option = formatOptions(data);
chart?.setOption(option);
chart?.off('click');
chart?.on('click', (p) => {
if (p.seriesName === '完成量') {
console.log(setting.productionComprehensKanbanSettingId, '----');
setProcessParams({
dataRange: setting.dataRange,
processName: p.name,
current: 1,
pageSize: 10,
kanbanSettingId: setting.productionComprehensKanbanSettingId,
});
setIsModalOpen(true);
}
});
// 如果数据工序大于5那么需要自动轮训播放
if (option.xAxis.data.length > 4 && setting.rowMovingTime > 0) {
timer = setInterval(() => {
option.dataZoom[0].startValue++;
if (option.dataZoom[0].endValue++ >= option.xAxis.data.length - 1) {
option.dataZoom[0].startValue = 0;
option.dataZoom[0].endValue = 3;
}
chart?.setOption(option);
}, setting.rowMovingTime * 1000);
}
}
return () => {
if (timer !== null) clearInterval(timer);
};
}, [data, setting]);
return (
<>
<Modal
title={'焊接一次通过率'}
visible={isModalOpen}
footer={null}
width={'70%'}
onCancel={closeModal}
>
<PassingRateChart data={chartData} />
</Modal>
<div
className={styles.rightTopBottomItem}
onClick={openModal}
style={{ background: '#040f24' }}
>
<p>整台</p>
<div style={{ height: '150px' }}>
<PassTower data={data.wholeSetPassRate} />
</div>
</div>
<div className={styles.rightTopBottomItem} style={{ marginRight: '0px' }}>
<p>按片</p>
<div style={{ height: '150px' }}>
<PassSlice data={data.piecePassRate} />
</div>
</div>
<div ref={chartRef} style={{ height: '260px' }} />
</>
);
};
export default PassingRate;
export default Main;
\ No newline at end of file
......@@ -106,10 +106,9 @@ const formatOptions = (data: any) => {
};
if (data && data.length) {
const lenged = [
{ label: '基准率', field: 'standRatio' },
{ label: '未通过率', field: 'defectRatio' },
{ label: '合格率', field: 'qualifiedRate' }
];
const xAxisData = data.map((item: any) => item.stepName);
const xAxisData = data.map((item: any) => item.processName);
const series = lenged.map((item) => {
return {
type: 'bar',
......@@ -215,7 +214,7 @@ const Main: React.FC<ProcessFailProps> = ({ data, setting }) => {
return (
<>
<Modal
title={proName + '工序当月一次未通过率'}
title={proName + '当月工序合格率'}
visible={isModalOpen}
footer={null}
width={'70%'}
......
......@@ -121,9 +121,9 @@ const formatOptions = (data: any) => {
const lenged = [
{ label: '计划量', field: 'planQuantity' },
{ label: '完成量', field: 'finishQuantity' },
{ label: '手持量', field: 'handQuantity' },
{ label: '合格量', field: 'qualifiedQuantity' },
];
const xAxisData = data.map((item: any) => item.stepName);
const xAxisData = data.map((item: any) => item.processName);
const series = lenged.map((item) => {
return {
type: 'bar',
......
......@@ -82,7 +82,7 @@ const SettingForm: React.FC<SettingFormProps> = (props) => {
min={1}
fieldProps={{ precision: 0 }}
/>
<ProFormSelect
{/* <ProFormSelect
name="productionComprehensKanbanSettingId"
label="看板设置"
required
......@@ -109,7 +109,7 @@ const SettingForm: React.FC<SettingFormProps> = (props) => {
{ label: '排产计划量', value: 2 },
]}
/>
</ProForm.Group>
</ProForm.Group> */}
</DrawerForm>
);
};
......
......@@ -214,8 +214,8 @@
}
}
.rightTopBottomContainer {
display: flex;
justify-content: space-between;
width: 100%;
background: #040f24;
margin-top: 5px;
}
.rightTopBottomItem {
......
......@@ -10,12 +10,7 @@ import type { Setting } from './components/SettingForm';
import SettingForm from './components/SettingForm';
import {
queryProductionComprehensProcessOutputData,
queryProcessDefectRatioData,
queryWorkOrderMonthlyIndexData1,
queryComprehensiveQualityEcpData,
queryComprehensiveDeviceEcpData,
queryComprehensiveProdEcpData,
queryCountWeldingPassRate,
currentMonthStat,
findAbnormalOverdueSetting,
} from './services/api';
......@@ -42,11 +37,10 @@ const Main: React.FC = () => {
{
startOnTimeRatio: 0, //上线准时率
endOnTimeRatio: 0, //下线准时率
stockInOnTimeRatio: 0, //入库准时率
periodicAccordRatio: 0, //周期符合
qualifiedRatio: 0, //产品合格率
hisPendingQuantity: 0, //历史月待完工
monthPlanQuantity: 0, //月计划
accuDailyPlanQuantity: 0, //累计日计划量
expireFinishQuantity: 0, //超期完工
actualFinishQuantity: 0, //实际完工
monthPlanConcludeRatio: 0, //月计划达成率
},
......@@ -61,83 +55,70 @@ const Main: React.FC = () => {
const [processYieldData, setProcessYieldData] = useState<ProcessYieldData>([]);
// 工序未通过率
const [processDefectRatioData, setProcessDefectRatioData] = useState<ProcessDefectRatioData>([]);
// 焊接通过率
const [countWeldingPassRate, setCountWeldingPassRate] = useState<CountWeldingPassRate>({
wholeSetPassRate: 0,
longitudinalJointRate: 0,
transverseJointRate: 0,
piecePassRate: 0,
selectionRate: 0,
longitudinalJointBasicRate: 0,
selectionBasicRate: 0,
transverseJointBasicRate: 0,
});
// 不合格分布
const [countWeldingPassRate, setCountWeldingPassRate] = useState<Array<any>>([]);
// 设备异常
const [abnormalDeviceData, setAbnormalDeviceData] = useState<ComprehensiveDeviceEcpDataCount>({
createIssueNumber: 0,
beyondNumber: 0,
currentMonthNumber: 0,
deviceEcpNumber: 0,
deviceNorNumber: 0,
unCloseCt: 0,
expireUnClose: 0,
totalCt: 0,
equipErrorCt: 0,
equipCt: 0,
});
// 生产异常
const [abnormalProdData, setAbnormalProdData] = useState<ComprehensiveDataCount>({
createIssueNumber: 0, //未关闭
beyondNumber: 0, //超期
currentMonthNumber: 0, //当月异常
unCloseCt: 0, //未关闭
expireUnClose: 0, //超期
totalCt: 0, //当月异常
});
// 质量异常
const [abnormalQualityData, setAbnormalQualityData] = useState<ComprehensiveDataCount>({
createIssueNumber: 0, //未关闭
beyondNumber: 0, //超期
currentMonthNumber: 0, //当月异常
});
const [abnormalQualityData, setAbnormalQualityData] = useState<Array<Number>>([]);
const [settingFormVisible, setSettingFormVisible] = useState(false);
useEffect(() => {
// console.log('sadas执行' )
let t: NodeJS.Timer | null = null;
const { productionComprehensKanbanSettingId, dataRange, planSource, intervalTime } = setting;
if (!productionComprehensKanbanSettingId) {
// 清除定时器
if (t !== null) {
clearInterval(t);
}
// 重制图标
setProcessYieldData([]);
setProcessDefectRatioData([]);
setMonthData({
startOnTimeRatio: 0, //上线准时率
endOnTimeRatio: 0, //下线准时率
stockInOnTimeRatio: 0, //入库准时率
periodicAccordRatio: 0, //周期符合
hisPendingQuantity: 0, //历史月待完工
monthPlanQuantity: 0, //月计划
accuDailyPlanQuantity: 0, //累计日计划量
actualFinishQuantity: 0, //实际完工
monthPlanConcludeRatio: 0, //月计划达成率
});
setCountWeldingPassRate({
wholeSetPassRate: 0,
longitudinalJointRate: 0,
transverseJointRate: 0,
piecePassRate: 0,
selectionRate: 0,
longitudinalJointBasicRate: 0,
selectionBasicRate: 0,
transverseJointBasicRate: 0,
});
const tmp = {
createIssueNumber: 0, //未关闭
beyondNumber: 0, //超期
currentMonthNumber: 0,
};
setAbnormalQualityData(tmp);
setAbnormalProdData(tmp);
setAbnormalDeviceData({ ...tmp, deviceEcpNumber: 0, deviceNorNumber: 0 });
return;
}
// if (!productionComprehensKanbanSettingId) {
// // 清除定时器
// if (t !== null) {
// clearInterval(t);
// }
// // 重制图标
// setProcessYieldData([]);
// setProcessDefectRatioData([]);
// setMonthData({
// startOnTimeRatio: 0, //上线准时率
// endOnTimeRatio: 0, //下线准时率
// qualifiedRatio: 0, //产品合格率
// hisPendingQuantity: 0, //历史月待完工
// monthPlanQuantity: 0, //月计划
// expireFinishQuantity: 0, //超期完工
// actualFinishQuantity: 0, //实际完工
// monthPlanConcludeRatio: 0, //月计划达成率
// });
// setCountWeldingPassRate({
// wholeSetPassRate: 0,
// longitudinalJointRate: 0,
// transverseJointRate: 0,
// piecePassRate: 0,
// selectionRate: 0,
// longitudinalJointBasicRate: 0,
// selectionBasicRate: 0,
// transverseJointBasicRate: 0,
// });
// const tmp = {
// unCloseCt: 0, //未关闭
// expireUnClose: 0, //超期
// totalCt: 0,
// };
// setAbnormalQualityData(tmp);
// setAbnormalProdData(tmp);
// setAbnormalDeviceData({ ...tmp, equipErrorCt: 0, equipCt: 0 });
// return;
// }
// 查询工序产量
const queryProcessYieldData1 = async () => {
const body = {
......@@ -145,73 +126,57 @@ const Main: React.FC = () => {
dataRange: dataRange,
planSource: planSource,
};
const { data } = await queryProductionComprehensProcessOutputData(body);
setProcessYieldData(data);
};
// 查询工序未通过率
const requestProcessDefectRatioData = async (kanbanSettingId: string) => {
const { data } = await queryProcessDefectRatioData({ kanbanSettingId });
setProcessDefectRatioData(data);
};
// 月度计划指标
const requestWorkOrderMonthlyIndexData1 = async (kanbanSettingId: string) => {
const { data } = await queryWorkOrderMonthlyIndexData1({ kanbanSettingId });
const { data: { outputList, processMonthlyIndexDto, qualifiedRateList } } = await queryProductionComprehensProcessOutputData(body);
setProcessYieldData(outputList);
setProcessDefectRatioData(qualifiedRateList);
//相关准时率留整数
data.endOnTimeRatio = Math.round(data.endOnTimeRatio);
data.monthPlanConcludeRatio = Math.round(data.monthPlanConcludeRatio);
data.periodicAccordRatio = Math.round(data.periodicAccordRatio);
data.startOnTimeRatio = Math.round(data.startOnTimeRatio);
data.stockInOnTimeRatio = Math.round(data.stockInOnTimeRatio);
setMonthData(data);
processMonthlyIndexDto.endOnTimeRatio = Math.round(processMonthlyIndexDto.endOnTimeRatio);
processMonthlyIndexDto.monthPlanConcludeRatio = Math.round(processMonthlyIndexDto.monthPlanConcludeRatio);
processMonthlyIndexDto.startOnTimeRatio = Math.round(processMonthlyIndexDto.startOnTimeRatio);
processMonthlyIndexDto.qualifiedRatio = Math.round(processMonthlyIndexDto.qualifiedRatio);
setMonthData(processMonthlyIndexDto);
};
// 异常分布
const requestAbnormal = async (settingId: string) => {
// 异常超期天数获取
const abnormalOverdueSettingList = await findAbnormalOverdueSetting();
// const abnormalOverdueSettingList = await findAbnormalOverdueSetting();
const tt: AbnormalOverdueSetting = {
diffDayEquipment: 0,
diffDayQuality: 0,
diffDayProduction: 0,
};
abnormalOverdueSettingList.forEach((s) => {
if (s.werks === setting.productionComprehensKanbanSetting?.werks) {
if (s.type.id == 1) {
//生产
tt.diffDayProduction = s.overdueDays;
} else if (s.type.id == 2) {
//质量
tt.diffDayQuality = s.overdueDays;
} else if (s.type.id == 3) {
//设备
tt.diffDayEquipment = s.overdueDays;
}
}
});
// abnormalOverdueSettingList.forEach((s) => {
// if (s.werks === setting.productionComprehensKanbanSetting?.werks) {
// if (s.type.id == 1) {
// //生产
// tt.diffDayProduction = s.overdueDays;
// } else if (s.type.id == 2) {
// //质量
// tt.diffDayQuality = s.overdueDays;
// } else if (s.type.id == 3) {
// //设备
// tt.diffDayEquipment = s.overdueDays;
// }
// }
// });
setAbnormalOverdueSetting(tt);
// 质量异常
const { data: quality } = await queryComprehensiveQualityEcpData({ settingId });
// 设备异常
const { data: device } = await queryComprehensiveDeviceEcpData({ settingId });
// 生产异常
const { data: prod } = await queryComprehensiveProdEcpData({ settingId });
setAbnormalDeviceData(device);
setAbnormalProdData(prod);
setAbnormalQualityData(quality);
// 当月异常分布数据
const { data: {equipAbnormal, productAbnormal, equipErrorArr, equipCt, equipErrorCt, abnormalCauseData} } = await currentMonthStat({ settingId });
setAbnormalDeviceData({
equipCt,
equipErrorCt,
...equipAbnormal
});
setAbnormalProdData(productAbnormal);
setAbnormalQualityData(equipErrorArr);
setCountWeldingPassRate(abnormalCauseData);
};
// 焊接通过率
const queryPassRate = async (settingId: string) => {
const { data } = await queryCountWeldingPassRate({ settingId });
setCountWeldingPassRate(data);
};
const refresh = () => {
queryProcessYieldData1();
requestWorkOrderMonthlyIndexData1(productionComprehensKanbanSettingId);
requestProcessDefectRatioData(productionComprehensKanbanSettingId);
requestAbnormal(productionComprehensKanbanSettingId);
queryPassRate(productionComprehensKanbanSettingId);
};
refresh();
......@@ -279,44 +244,18 @@ const Main: React.FC = () => {
<div className={styles.rightContainer}>
{/* 焊接一次通过率 */}
<div className={styles.rightTopContainer}>
<div className={styles.rightTopTitle}>焊接一次通过率(按台)</div>
<div className={styles.rigthTopItemContainer}>
<div className={styles.rightTopItem}>
<p>
基准值:<span>{countWeldingPassRate.longitudinalJointBasicRate}%</span>
</p>
<p>
纵缝:<span>{countWeldingPassRate.longitudinalJointRate}%</span>
</p>
</div>
<div className={styles.rightTopItem}>
<p>
基准值:<span>{countWeldingPassRate.transverseJointBasicRate}%</span>
</p>
<p>
环缝:<span>{countWeldingPassRate.transverseJointRate}%</span>
</p>
</div>
<div className={styles.rightTopItem} style={{ marginRight: '0px' }}>
<p>
基准值:<span>{countWeldingPassRate.selectionBasicRate}%</span>
</p>
<p>
合拢缝:<span>{countWeldingPassRate.selectionRate}%</span>
</p>
</div>
</div>
<div className={styles.rightTopTitle}>不合格分布</div>
<div className={styles.rightTopBottomContainer}>
<PassingRate
data={countWeldingPassRate}
kanbanId={setting.productionComprehensKanbanSettingId}
setting={setting}
/>
</div>
</div>
{/* 工序当月一次未通过率 */}
{/* 当月工序合格率 */}
<div className={styles.rightBottomContainer}>
<div className={styles.rightBottomContent}>
<div className={styles.rightBottomTitle}>工序当月一次未通过</div>
<div className={styles.rightBottomTitle}>当月工序合格</div>
<div style={{ padding: '0 20px', height: '376px' }}>
<ProcessFail data={processDefectRatioData} setting={setting} />
</div>
......
......@@ -45,7 +45,7 @@ export async function queryProductionComprehensKanbanData() {
}
export async function queryProductionComprehensProcessOutputData(body: ProcessOutputParams) {
return request<Api.ServiceResult<ProcessYieldData[]>>('/api/processYieldData1/kanbanData', {
return request<Api.ServiceResult<ProcessYieldData[]>>('/api/kanban/task/currentMonthStat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
......@@ -53,57 +53,11 @@ export async function queryProductionComprehensProcessOutputData(body: ProcessOu
data: body,
});
}
export async function queryProcessDefectRatioData(body: { kanbanSettingId: string }) {
return request<Api.ServiceResult<ProcessDefectRatioData[]>>(
'/api/processDefectRatioData/kanbanData',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
},
);
}
export async function queryWorkOrderMonthlyIndexData1(body: { kanbanSettingId: string }) {
return request<Api.ServiceResult<WorkOrderMonthlyIndexData>>(
'/api/workOrderMonthlyIndexData1/kanbanData',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
},
);
}
// 设备异常
export async function queryComprehensiveDeviceEcpData(body: { settingId: string }) {
return request<Api.ServiceResult<ComprehensiveDeviceEcpDataCount>>(
'/api/comprehensiveDeviceEcpData/count',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: body,
},
);
}
// 生产异常
export async function queryComprehensiveProdEcpData(body: { settingId: string }) {
return request<Api.ServiceResult<ComprehensiveDataCount>>('/api/comprehensiveProdEcpData/count', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: body,
});
}
// 质量异常
export async function queryComprehensiveQualityEcpData(body: { settingId: string }) {
export async function currentMonthStat(body: { settingId: string }) {
return request<Api.ServiceResult<ComprehensiveDataCount>>(
'/api/comprehensiveQualityEcpData/count',
'/api/kanban/abnormal/currentMonthStat',
{
method: 'POST',
headers: {
......@@ -113,16 +67,6 @@ export async function queryComprehensiveQualityEcpData(body: { settingId: string
},
);
}
// 焊接通过率
export async function queryCountWeldingPassRate(body: { settingId: string }) {
return request<Api.ServiceResult<CountWeldingPassRate>>('/api/batchInfo/countWeldingPassRate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: body,
});
}
// 焊接通过率趋势图
export async function queryCountWeldingPassRateTrendChart(data: { kanbanSettingId: string }) {
return request<Api.ServiceResult<PassRateTrendChart[]>>(
......
......@@ -23,14 +23,14 @@ declare namespace KANBAN.ProductionComprehens {
};
type ProcessYieldData = {
stepName: string;
processName: string;
finishQuantity: number;
planQuantity: number;
handQuantity: number;
qualifiedQuantity: number;
};
type ProcessDefectRatioData = {
stepName: string;
processName: string;
standRatio: number;
defectRatio: number;
};
......@@ -38,27 +38,26 @@ declare namespace KANBAN.ProductionComprehens {
type WorkOrderMonthlyIndexData = {
startOnTimeRatio: number;
endOnTimeRatio: number;
stockInOnTimeRatio: number;
periodicAccordRatio: number;
qualifiedRatio: number;
hisPendingQuantity: number;
monthPlanQuantity: number;
accuDailyPlanQuantity: number;
expireFinishQuantity: number;
actualFinishQuantity: number;
monthPlanConcludeRatio: number;
};
type ComprehensiveDeviceEcpDataCount = {
createIssueNumber: number;
beyondNumber: number;
currentMonthNumber: number;
deviceEcpNumber: number;
deviceNorNumber: number;
unCloseCt: number;
expireUnClose: number;
totalCt: number;
equipErrorCt: number;
equipCt: number;
};
type ComprehensiveDataCount = {
createIssueNumber: number;
beyondNumber: number;
currentMonthNumber: number;
totalCt: number;
expireUnClose: number;
unCloseCt: number;
};
type CountWeldingPassRate = {
......
......@@ -41,11 +41,11 @@ const Abnormal: React.FC<{
<div className={styles.bottomContainer}>
<div className={styles.bottomItem}>
<p>设备正常数:</p>
<h2 onClick={() => openModal(1)}>{abnormalDeviceData.deviceNorNumber}</h2>
<h2>{abnormalDeviceData.deviceNorNumber}</h2>
</div>
<div className={styles.bottomItemRight} style={{ marginLeft: '10px' }}>
<p>设备异常数:</p>
<h2 onClick={() => openModal(2)}>{abnormalDeviceData.deviceEcpNumber}</h2>
<h2>{abnormalDeviceData.deviceEcpNumber}</h2>
</div>
</div>
......
......@@ -121,9 +121,9 @@ const formatOptions = (data: any) => {
const lenged = [
{ label: '计划量', field: 'planQuantity' },
{ label: '完成量', field: 'finishQuantity' },
{ label: '手持量', field: 'handQuantity' },
{ label: '合格量', field: 'qualifiedQuantity' },
];
const xAxisData = data.map((item: any) => item.stepName);
const xAxisData = data.map((item: any) => item.processName);
const series = lenged.map((item) => {
return {
type: 'bar',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment