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.

1685 lines
46 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { useState, useEffect } from 'react';
import React, { useMemo, useReducer } from 'react';
import { request } from '@/utils';
import {
Input,
Button,
Row,
Col,
Form,
DatePicker,
Collapse,
message,
Table,
Space,
Modal,
Card,
Tooltip,
Tabs,
Select,
} from 'antd';
import {
CheckCircleOutlined,
FormOutlined,
MinusCircleOutlined,
PlusCircleOutlined,
PrinterOutlined,
SearchOutlined,
UndoOutlined,
CopyTwoTone,
ZoomInOutlined,
SplitCellsOutlined,
ExclamationCircleOutlined,
DownloadOutlined,
} from '@ant-design/icons';
import moment from 'moment';
import ReactEcharts from 'echarts-for-react';
import Dictionary from '@/components/Dictionary';
import { exportTable } from '@/utils/exportTable';
import styles from './index.less';
import useARH from '@minko-fe/use-antd-resizable-header';
import 'antd/dist/antd.css';
import '@minko-fe/use-antd-resizable-header/dist/index.css';
import { KeepAlive } from 'umi';
import { ColumnsType } from 'antd/lib/table/interface';
import { ITableHeader, StudentInfo } from '@/types';
import * as ExcelJs from 'exceljs';
import {
addHeaderStyle,
DEFAULT_COLUMN_WIDTH,
DEFAULT_ROW_HEIGHT,
generateHeaders,
getColumnNumber,
mergeColumnCell,
mergeRowCell,
saveWorkbook,
} from '@/utils/indexs';
import { Worksheet } from 'exceljs';
interface MultiHeaderProps { }
const formRow = 1;
const SubHistory = () => {
const { Item } = Form;
const { Panel } = Collapse;
const nowDate = new Date();
const nowStartDate = parseInt(
new Date(nowDate.setDate(nowDate.getDate() - 2)).getTime().toString(),
); // 当前时间-1天
const nowEndDate = parseInt(new Date().getTime().toString()); // 当前时间
const print = nowDate.toLocaleTimeString();
const [dataSource, setDataSource] = useState([]);
const [dataSource1, setDataSource1] = useState([]);
const [Visible, setVisible] = useState(false);
const [action, setAction] = useState('');
const [loading, setLoading] = useState(false);
const [numOption, setNumOption] = useState({});
const [rateOption, setRateOption] = useState({});
const [activeKey, setActiveKey] = useState('');
const { TabPane } = Tabs;
const [form] = Form.useForm();
const [formData] = Form.useForm();
const [selectedRow, setselectedRow] = useState([]);
const [selectedKey, setselectedkey] = useState(0);
const [list, setList] = useState<StudentInfo[]>([]);
const [begin, setBegin] = useState('');
const [end, setEnd] = useState('');
const dateFormat = 'YYYY-MM-DD';
const { RangePicker } = DatePicker;
const [OPTIONS, setOptions] = useState([]);
const [selectedItems, setSelectedItems] = useState<string[]>([]);
const [selectedItems1, setSelectedItems1] = useState<string[]>([]);
const filteredOptions = OPTIONS.filter((o) => !selectedItems.includes(o));
const [CUVOPTIONS, setCuvOptions] = useState([]);
const filteredOptions1 = CUVOPTIONS.filter((o) => !selectedItems1.includes(o));
const [, forceRender] = useReducer((s) => s + 1, 0);
const [deps, setDeps] = useState(0);
// const [selectedRowKeys, setSelectedRowKeys] = useState([])
// const onSelectChange = (selectedRowKeys:any, selectedRows:any) => {
// //setSelectedRows(selectedRows)
// setSelectedRowKeys(selectedRowKeys) PROFIT
// }
//导出操作
const onExportClick = () => {
if (dataSource.length == 0) {
message.error('暂无数据,请确认后重试!');
return;
}
exportTable(columns, dataSource, '余材替代历史信息.xlsx');
};
useEffect(() => {
generateData();
ts();
onSearchClick();
iniClick();
cuvClick();
}, []);
function generateData() {
let arr: StudentInfo[] = [];
for (let i = 0; i < 5; i++) {
arr.push({
id: i,
name: ``,
age: 8 + i,
gender: i % 2 === 0 ? '' : '',
english: 80 + i,
math: 60 + i,
physics: 70 + i,
comment: ``,
});
}
setList(arr);
}
function onExportMultiHeaderExcel() {
// 创建工作簿
const workbook = new ExcelJs.Workbook();
// 添加sheet
const worksheet = workbook.addWorksheet('sheet');
// 设置 sheet 的默认行高
worksheet.properties.defaultRowHeight = 20;
// 解析 AntD Table 的 columns
const headers = generateHeaders(columns);
console.log({ headers });
// 第一行表头
const names1: string[] = [];
// 第二行表头
const names2: string[] = [];
// 用于匹配数据的 keys
const headerKeys: string[] = [];
headers.forEach((item) => {
if (item.children) {
// 有 children 说明是多级表头header name 需要两行
item.children.forEach((child) => {
names1.push(item.header);
names2.push(child.header);
headerKeys.push(child.key);
});
} else {
const columnNumber = getColumnNumber(item.width);
for (let i = 0; i < columnNumber; i++) {
names1.push(item.header);
names2.push(item.header);
headerKeys.push(item.key);
}
}
});
handleHeader(worksheet, headers, names1, names2);
// 添加数据
addData2Table(worksheet, headerKeys, headers);
// 给每列设置固定宽度
worksheet.columns = worksheet.columns.map((col) => ({ ...col, width: DEFAULT_COLUMN_WIDTH }));
// 导出
saveWorkbook(workbook, print + '-' + '余材替代历史信息.xlsx');
}
function handleHeader(
worksheet: Worksheet,
headers: ITableHeader[],
names1: string[],
names2: string[],
) {
// 判断是否有 children, 有的话是两行表头
const isMultiHeader = headers?.some((item) => item.children);
if (isMultiHeader) {
// 加表头数据
const rowHeader1 = worksheet.addRow(names1);
const rowHeader2 = worksheet.addRow(names2);
// 添加表头样式
addHeaderStyle(rowHeader1, { color: 'dff8ff' });
addHeaderStyle(rowHeader2, { color: 'dff8ff' });
mergeColumnCell(headers, rowHeader1, rowHeader2, names1, names2, worksheet);
return;
}
// 加表头数据
const rowHeader = worksheet.addRow(names1);
// 表头根据内容宽度合并单元格
mergeRowCell(headers, rowHeader, worksheet);
// 添加表头样式
addHeaderStyle(rowHeader, { color: 'dff8ff' });
}
function addData2Table(worksheet: Worksheet, headerKeys: string[], headers: ITableHeader[]) {
dataSource?.forEach((item: any) => {
const rowData = headerKeys?.map((key) => item[key]);
const row = worksheet.addRow(rowData);
mergeRowCell(headers, row, worksheet);
row.height = DEFAULT_ROW_HEIGHT;
// 设置行样式, wrapText: 自动换行
row.alignment = { vertical: 'middle', wrapText: false, shrinkToFit: false };
row.font = { size: 11, name: '微软雅黑' };
});
}
//数据源,字典查询
const iniClick = () => {
const sd = {
CD_MANA_NO: 'TDZT',
};
const res = request.post(`/ipdApi/basic/getBasicCode`, sd).then((res) => {
if (res.data.code == '1') {
if (res.data.data) {
const array = res.data.data.map((item: any) => {
return item.CD;
});
setOptions(array);
}
}
});
};
const cuvClick = () => {
const sd = {
CD_MANA_NO: 'CKKB',
};
const res = request.post(`/ipdApi/basic/getBasicCode`, sd).then((res) => {
if (res.data.code == '1') {
if (res.data.data) {
const array = res.data.data.map((item: any) => {
return item.CD;
});
setCuvOptions(array);
}
}
});
};
//添加按钮打开添加Modal页面
const onAddClick = () => {
formData.resetFields();
setVisible(true);
setAction('新增');
};
//复制新增按钮按下时操作
const onCopyAddClick = () => {
if (dataSource.length == 0 || selectedRow.length != 1) {
message.warn('请先选中一条数据');
return;
}
formData.setFieldsValue(selectedRow[0]);
setVisible(true);
setAction('复制新增');
};
//修改按钮按下时操作
const onEditClick = () => {
formData.resetFields();
if (dataSource.length == 0 || selectedRow.length != 1) {
message.warn('请先选中一条数据');
return;
}
formData.setFieldsValue(selectedRow[0]);
setVisible(true);
setAction('修改');
};
//导出操作
// const onExportClick = () => {
// if (dataSource.length == 0) {
// message.error('暂无数据,请确认后重试!');
// return;
// }
// exportTable(columns, dataSource, '压缩比规范.xlsx');
// };
// 新增、复制新增、修改功能
const modalSubmit = () => {
const postData = formData.getFieldsValue();
if (action == '新增' || action == '复制新增') {
const res = request.post(`/ipdApi/hotRoll/addCompressionRatio`, postData).then((res) => {
if (res.data.code == '1') {
message.success('操作成功!');
setVisible(false);
onSearchClick();
// setselectedkey(0)
} else {
message.error(res.data.msg);
}
});
} else if (action == '修改') {
// 因数据库表结构设计多主键,所以更新操作传值时需要将未修改前的数据与修改后的数据一并传到后台处理
const requestData = selectedRow.map((item: any, index: any) => ({
...item,
}));
requestData.push(postData);
const res = request.post(`/ipdApi/hotRoll/updCompressionRatio`, requestData).then((res) => {
if (res.data.code == '1') {
message.success('操作成功!');
setselectedkey(0);
setVisible(false);
// onSearchClick();
} else {
message.error(res.data.msg);
setVisible(false);
}
onSearchClick();
});
}
};
// 删除按钮按下时操作
const onDeleteClick = () => {
if (dataSource.length == 0 || selectedRow.length != 1) {
message.warn('请选择要删除的数据!');
return;
}
Modal.confirm({
title: '确定要删除吗?',
icon: <ExclamationCircleOutlined />,
onOk: async () => {
const res = request
.post(`/ipdApi/hotRoll/delCompressionRatio`, selectedRow[0])
.then((res) => {
if (res.data.code == '1') {
message.success('操作成功!');
setselectedkey(0);
setVisible(false);
onSearchClick();
} else {
message.error(res.data.msg);
setVisible(false);
}
});
},
});
};
const onTabChange = (key: any) => {
if (key === '1') {
setDataSource;
}
setActiveKey(key);
};
//容器头按钮
const headerButtons = () => (
<Space size={8}>
<Button
type="primary"
size="small"
icon={<SearchOutlined />}
onClick={(event) => {
ts();
event.stopPropagation();
onSearchClick();
}}
disabled={loading ? true : false}
>
</Button>
<Button
type="primary"
danger
size="small"
icon={<UndoOutlined />}
onClick={(event) => {
event.stopPropagation();
handleRest();
}}
>
</Button>
<Button
type="primary"
size="small"
icon={<DownloadOutlined />}
onClick={(event) => {
event.stopPropagation();
onExportMultiHeaderExcel();
}}
>
</Button>
</Space>
);
const columns = [
{
title: '序号',
dataIndex: 'NO',
key: 'NO',
render: (text: any, record: any, index: any) => <div>{index + 1}</div>,
width: 50,
fixed: 'left',
},
// {
// title: '序号',
// dataIndex: 'ID',
// key: 'ID',
// width: 70,
// },
{
title: '钢板号',
dataIndex: 'PLATE_NO',
key: 'PLATE_NO',
width: 130,
ellipsis: true,
fixed: 'left',
className: 'last_lt',
},
{ title: '替代成材率', dataIndex: 'EFF_RATE', key: 'EFF_RATE', width: 90, ellipsis: true },
{
title: '替代价值',
dataIndex: 'ALTERNATIVE_PRICE',
key: 'ALTERNATIVE_PRICE',
width: 90,
ellipsis: true,
},
{
title: '现货价值',
dataIndex: 'GENUINE_PRICE',
key: 'GENUINE_PRICE',
width: 90,
ellipsis: true,
},
{
title: '损耗费',
dataIndex: 'BREAKAGE_COSTS',
key: 'BREAKAGE_COSTS',
width: 90,
ellipsis: true,
},
{
title: '切割费',
dataIndex: 'CUTTING_COSTS',
key: 'CUTTING_COSTS',
width: 90,
ellipsis: true,
},
{
title: '运输费',
dataIndex: 'TRANSPORT_COSTS',
key: 'TRANSPORT_COSTS',
width: 90,
ellipsis: true,
},
{
title: '检验费',
dataIndex: 'INSPECT_COSTS',
key: 'INSPECT_COSTS',
width: 90,
ellipsis: true,
},
{ title: '牌号价格', dataIndex: 'PRICE', key: 'PRICE', width: 90, ellipsis: true },
{ title: '废钢价格', dataIndex: 'SCRAP_PRICE', key: 'SCRAP_PRICE', width: 90, ellipsis: true },
{ title: '现货价格', dataIndex: 'SPOT_PRICE', key: 'SPOT_PRICE', width: 90, ellipsis: true },
{ title: '增效', dataIndex: 'PROFIT', key: 'PROFIT', width: 90, ellipsis: true },
{ title: '是否小尺板', dataIndex: 'IS_SMALL_PLATE', key: 'IS_SMALL_PLATE', width: 90, ellipsis: true },
{ title: '替代成材率', dataIndex: 'EFF_RATE', key: 'EFF_RATE', width: 100, ellipsis: true },
{
title: '钢板利用率',
dataIndex: 'SUB_RATE',
key: 'SUB_RATE',
width: 90,
},
{
title: '确认时间',
dataIndex: 'CON_TIME',
key: 'CON_TIME',
width: 102,
ellipsis: true,
},
{ title: '替代类型', dataIndex: 'IS_FULL', key: 'IS_FULL', width: 83, ellipsis: true },
{
title: '处理结果',
dataIndex: 'HAN_STATE',
key: 'HAN_STATE',
width: 75,
ellipsis: true,
},
{
title: '处理内容',
dataIndex: 'HAN_CON',
key: 'HAN_CON',
width: 100,
ellipsis: true,
},
{
title: '当前状态',
dataIndex: 'PROC_CD_NOW',
key: 'PROC_CD_NOW',
width: 90,
ellipsis: true,
},
{
title: '当前仓库',
dataIndex: 'CURRENT_CUR_INV',
key: 'CURRENT_CUR_INV',
width: 90,
ellipsis: true,
},
{
title: '当前货位',
dataIndex: 'CURRENT_LOC',
key: 'CURRENT_LOC',
width: 100,
ellipsis: true,
},
{
title: '订单材/余材',
dataIndex: 'ORD_FL',
key: 'ORD_FL',
width: 100,
},
{
title: '原始钢板信息',
ellipsis: true,
dataIndex: 'age5',
key: 'age5',
children: [
{
title: '厚度',
dataIndex: 'GP_Y_THK',
key: 'GP_Y_THK',
width: 60,
},
{
title: '宽度',
dataIndex: 'GP_Y_WID',
key: 'GP_Y_WID',
width: 60,
},
{
title: '长度',
dataIndex: 'GP_Y_LEN',
key: 'GP_Y_LEN',
width: 60,
},
{
title: '重量',
dataIndex: 'GP_Y_WGT',
key: 'GP_Y_WGT',
width: 60,
},
],
},
{
title: '替代前物料信息',
ellipsis: true,
dataIndex: 'age1',
key: 'age1',
className: 'hisPlaColor',
children: [
{
title: '标准号',
dataIndex: 'GP_APLY_STDSPEC',
key: 'GP_APLY_STDSPEC',
width: 160,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '厚度',
dataIndex: 'GP_THK',
key: 'GP_THK',
width: 60,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '宽度',
dataIndex: 'GP_WID',
key: 'GP_WID',
width: 60,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '长度',
dataIndex: 'GP_LEN',
key: 'GP_LEN',
width: 60,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '重量',
dataIndex: 'GP_WGT',
key: 'GP_WGT',
width: 60,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '状态',
dataIndex: 'PROC_STATE',
key: 'PROC_STATE',
width: 75,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '表面等级',
dataIndex: 'GP_SURF_GRD',
key: 'GP_SURF_GRD',
width: 90,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '仓库',
dataIndex: 'GP_CUR_INV',
key: 'GP_CUR_INV',
width: 90,
ellipsis: true,
className: 'hisPlaColor',
},
{
title: '货位',
dataIndex: 'LOC',
key: 'LOC',
width: 100,
ellipsis: true,
className: 'hisPlaColor',
},
],
},
{
title: '替代后订单',
ellipsis: true,
dataIndex: 'age2',
key: 'age2',
className: 'hisEndColor',
children: [
{
title: '订单号',
dataIndex: 'BOI_ORD_NO',
key: 'BOI_ORD_NO',
width: 110,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '序列号',
dataIndex: 'BOI_ORD_ITEM',
key: 'BOI_ORD_ITEM',
width: 70,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '厚度',
dataIndex: 'BOI_ORD_THK',
key: 'BOI_ORD_THK',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '宽度',
dataIndex: 'BOI_ORD_WID',
key: 'BOI_ORD_WID',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '长度',
dataIndex: 'BOI_ORD_LEN',
key: 'BOI_ORD_LEN',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '重量',
dataIndex: 'BOB_WGT',
key: 'BOB_WGT',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '标准',
dataIndex: 'BOI_STDSPEC',
key: 'BOI_STDSPEC',
width: 160,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '欠重',
dataIndex: 'SUB_LACK_WGT',
key: 'SUB_LACK_WGT',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '订单重',
dataIndex: 'ORD_WGT',
key: 'ORD_WGT',
width: 80,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '欠量',
dataIndex: 'SUB_LACK_NUM',
key: 'SUB_LACK_NUM',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '欠缓',
dataIndex: 'SLAB_LACK_NUM',
key: 'SLAB_LACK_NUM',
width: 60,
ellipsis: true,
className: 'hisEndColor',
},
{
title: '客户名称',
dataIndex: 'BOI_CUST_CD',
key: 'BOI_CUST_CD',
width: 90,
ellipsis: true,
className: 'hisEndColor',
},
// {
// title: '订单用途',
// dataIndex: 'BOI_ENDUSE_CD',
// key: 'BOI_ENDUSE_CD',
// width: 100,
// ellipsis: true,
// },
{
title: '订单种类',
dataIndex: 'BOI_ORD_KND',
key: 'BOI_ORD_KND',
width: 90,
ellipsis: true,
className: 'hisEndColor',
},
],
},
{
title: '替代前订单',
dataIndex: 'age3',
key: 'age3',
ellipsis: true,
className: 'hisStColor',
children: [
{
title: '订单号',
dataIndex: 'BOB_ORD_NO',
key: 'BOB_ORD_NO',
width: 110,
ellipsis: true,
className: 'hisStColor',
},
{
title: '序列号',
dataIndex: 'BOB_ORD_ITEM',
key: 'BOB_ORD_ITEM',
width: 70,
ellipsis: true,
className: 'hisStColor',
},
{
title: '厚度',
dataIndex: 'BOB_ORD_THK',
key: 'BOB_ORD_THK',
width: 60,
ellipsis: true,
className: 'hisStColor',
},
{
title: '宽度',
dataIndex: 'BOB_ORD_WID',
key: 'BOB_ORD_WID',
width: 60,
ellipsis: true,
className: 'hisStColor',
},
{
title: '长度',
dataIndex: 'BOB_ORD_LEN',
key: 'BOB_ORD_LEN',
width: 60,
ellipsis: true,
className: 'hisStColor',
},
{
title: '重量',
dataIndex: 'BOB_WGT_UNIT',
key: 'BOB_WGT_UNIT',
width: 60,
ellipsis: true,
className: 'hisStColor',
},
{
title: '客户名称',
dataIndex: 'BOB_CUST_CD',
key: 'BOB_CUST_CD',
width: 90,
ellipsis: true,
className: 'hisStColor',
},
{
title: '订单用途',
dataIndex: 'BOB_ENDUSE_CD',
key: 'BOB_ENDUSE_CD',
width: 90,
ellipsis: true,
className: 'hisStColor',
},
{
title: '订单种类',
dataIndex: 'BOB_ORD_KND',
key: 'BOB_ORD_KND',
width: 100,
ellipsis: true,
className: 'hisStColor',
},
{
title: '表面等级',
dataIndex: 'GP_SURF_GRD',
key: 'GP_SURF_GRD',
width: 90,
ellipsis: true,
className: 'hisStColor',
},
],
},
{
title: '用户交货期',
dataIndex: 'BOI_DEL_FR_DATE',
key: 'BOI_DEL_FR_DATE',
width: 100,
ellipsis: true,
},
//{ title: '替代人员', dataIndex: 'SUB_USER', key: 'SUB_USER', width: 100, ellipsis: true },
{
title: '替代时间',
dataIndex: 'DATA_TIME',
key: 'DATA_TIME',
width: 100,
ellipsis: true,
},
{
title: '处理时间',
dataIndex: 'HAN_DATE',
key: 'HAN_DATE',
width: 136,
ellipsis: true,
},
{
title: '产品备注',
dataIndex: 'SUR_PRO_REM',
key: 'SUR_PRO_REM',
width: 100,
ellipsis: true,
},
{ title: '轧制工厂', dataIndex: 'GP_PLT', key: 'GP_PLT', width: 100, ellipsis: true },
{ title: '余材原因', dataIndex: 'CD_NAME', key: 'CD_NAME', width: 100, ellipsis: true },
{ title: '替代块数', dataIndex: 'SUB_NUM', key: 'SUB_NUM', width: 100, ellipsis: true },
{ title: '排列方向', dataIndex: 'SUB_DIR', key: 'SUB_DIR', width: 100, ellipsis: true },
{
title: '切割点X坐标',
dataIndex: 'SUB_CUT_X',
key: 'SUB_CUT_X',
width: 100,
ellipsis: true,
},
{
title: '切割点Y坐标',
dataIndex: 'SUB_CUT_Y',
key: 'SUB_CUT_Y',
width: 100,
ellipsis: true,
},
{
title: '替代损失重量',
dataIndex: 'SUB_LOS_WGT',
key: 'SUB_LOS_WGT',
width: 100,
ellipsis: true,
},
{ title: '是否强制替代', dataIndex: 'SUB_FOR', key: 'SUB_FOR', width: 100, ellipsis: true },
{
title: '仓库',
dataIndex: 'CUR_INV',
key: 'CUR_INV',
width: 60,
ellipsis: true,
},
{
title: '备注原因',
dataIndex: 'SUR_REM_REA',
key: 'SUR_REM_REA',
width: 100,
ellipsis: true,
},
{ title: '切边', dataIndex: 'GP_TRIM_FL', key: 'GP_TRIM_FL', width: 50, ellipsis: true },
{ title: '定尺', dataIndex: 'SIZE_KND', key: 'SIZE_KND', width: 50, ellipsis: true },
{ title: '订单备注', dataIndex: 'ORD_REM', key: 'ORD_REM', width: 90, ellipsis: true },
{
title: '探伤',
dataIndex: 'GP_UST_RLT_CD',
key: 'GP_UST_RLT_CD',
width: 100,
ellipsis: true,
},
{ title: '切割', dataIndex: 'GP_GAS_FL', key: 'GP_GAS_FL', width: 100, ellipsis: true },
{ title: '矫直', dataIndex: 'GP_CL_FL', key: 'GP_CL_FL', width: 100, ellipsis: true },
{ title: '热处理', dataIndex: 'GP_HTM_CNT', key: 'GP_HTM_CNT ', width: 100, ellipsis: true },
{
title: '标识标准',
dataIndex: 'GP_APLY_STDSPEC',
key: 'GP_APLY_STDSPEC',
width: 148,
ellipsis: true,
},
{ title: '标识钢种', dataIndex: 'GP_STLGRD', key: 'GP_STLGRD', width: 120, ellipsis: true },
{
title: '客户表面要求',
dataIndex: 'BOI_SURFACE_REQUESTS',
key: 'BOI_SURFACE_REQUESTS',
width: 100,
ellipsis: true,
},
{
title: '加喷内容',
dataIndex: 'BOI_VESSEL_NO',
key: 'BOI_VESSEL_NO',
width: 100,
ellipsis: true,
},
{
title: '侧喷加喷',
dataIndex: 'BOI_SIDEMARK',
key: 'BOI_SIDEMARK',
width: 100,
ellipsis: true,
},
{
title: '表喷次数',
dataIndex: 'BOI_FACEPAINT',
key: 'BOI_FACEPAINT',
width: 100,
ellipsis: true,
},
{
title: '是否钢印',
dataIndex: 'BOI_SEALMEMO',
key: 'BOI_SEALMEMO',
width: 100,
ellipsis: true,
},
{
title: '钢印加冲',
dataIndex: 'BOI_SEALMEMO',
key: 'BOI_SEALMEMO',
width: 100,
ellipsis: true,
},
{
title: '综判时间',
dataIndex: 'BOI_ORD_PROD_END_TIME',
key: 'BOI_ORD_PROD_END_TIME',
width: 100,
ellipsis: true,
},
{ title: '产品', dataIndex: 'BOI_PROD_CD', key: 'BOI_PROD_CD', width: 100, ellipsis: true },
// {
// title: '替代分类',
// dataIndex: 'BOI_DOME_FL',
// key: 'BOI_DOME_FL',
// width: 100,
// ellipsis: true,
// },
{
title: '是否全部替代',
dataIndex: 'SUB_FULL',
key: 'SUB_FULL',
width: 100,
ellipsis: true,
},
{
title: '替代缺失内容',
dataIndex: 'SUB_LACK_CON',
key: 'SUB_LACK_CON',
width: 165,
ellipsis: true,
},
// {
// title: '处理时间',
// dataIndex: 'HAN_DATE',
// key: 'HAN_DATE',
// width: 136,
// ellipsis: true,
// },
{
title: '替代人员',
dataIndex: 'CON_USER',
key: 'CON_USER',
width: 100,
ellipsis: true,
},
{
title: '产品等级',
dataIndex: 'PROD_GRD',
key: 'PROD_GRD',
width: 100,
ellipsis: true,
},
{
title: '是否接受',
dataIndex: 'STATE',
key: 'STATE',
width: 100,
ellipsis: true,
},
{
title: '理论替代余材信息',
dataIndex: 'age4',
key: 'age4',
ellipsis: true,
className: 'sciColor',
children: [
{
title: '厚度',
dataIndex: 'CUTTING_THK',
key: 'CUTTING_THK',
width: 100,
ellipsis: true,
className: 'sciColor',
},
{
title: '宽度',
dataIndex: 'CUTTING_WID',
key: 'CUTTING_WID',
width: 100,
ellipsis: true,
className: 'sciColor',
},
{
title: '长度',
dataIndex: 'CUTTING_LEN',
key: 'CUTTING_LEN',
width: 100,
ellipsis: true,
className: 'sciColor',
},
{
title: '重量',
dataIndex: 'CUTTING_WGT',
key: 'CUTTING_WGT',
width: 100,
ellipsis: true,
className: 'sciColor',
},
],
},
//理论替代余材信息应为替代时的余材信息
// {
// title: '理论替代余材信息',
// dataIndex: 'age4',
// key: 'age4',
// ellipsis: true,
// className: 'sciColor',
// children: [
// {
// title: '厚度',
// dataIndex: 'GP_THK',
// key: 'GP_THK',
// width: 100,
// ellipsis: true,
// className: 'sciColor',
// },
// {
// title: '宽度',
// dataIndex: 'GP_WID',
// key: 'GP_WID',
// width: 100,
// ellipsis: true,
// className: 'sciColor',
// },
// {
// title: '长度',
// dataIndex: 'GP_LEN',
// key: 'GP_LEN',
// width: 100,
// ellipsis: true,
// className: 'sciColor',
// },
// {
// title: '重量',
// dataIndex: 'GP_WGT',
// key: 'GP_WGT',
// width: 100,
// ellipsis: true,
// className: 'sciColor',
// },
// ],
// },
{
title: '废钢重量',
dataIndex: 'STEEL_SCRAP_WGT',
key: 'STEEL_SCRAP_WGT',
width: 100,
ellipsis: true,
},
{
title: '剩余钢板重量',
dataIndex: 'SUB_PLATE_WGT',
key: 'SUB_PLATE_WGT',
width: 120,
ellipsis: true,
},
{
title: '终结订单',
dataIndex: 'IS_END',
key: 'IS_END',
width: 100,
ellipsis: true,
},
{
title: '是否分板',
dataIndex: 'DIVISION',
key: 'DIVISION',
width: 100,
ellipsis: true,
},
{
title: '降级',
dataIndex: 'DOWN',
key: 'DOWN',
width: 100,
ellipsis: true,
},
];
const columns1 = [
{
title: '序号',
render: (text: any, record: any, index: any) => <div>{index + 1}</div>,
},
{
title: '钢板号',
dataIndex: 'PLATE_NO',
key: 'PLATE_NO',
},
{
title: '钢种',
dataIndex: 'STLGRD',
key: 'STLGRD',
},
{
title: '替代日期',
dataIndex: 'SUPERSED_TIME',
key: 'SUPERSED_TIME',
},
{
title: '钢板规格',
dataIndex: 'PLATE_SIZE',
key: 'PLATE_SIZE',
},
{
title: '钢板重量',
dataIndex: 'ORD_WGT',
key: 'ORD_WGT',
},
{
title: '成材率',
dataIndex: 'YIELD_RATIO',
key: 'YIELD_RATIO',
},
{
title: '替代率',
dataIndex: 'AVE_SUP_RATE',
key: 'AVE_SUP_RATE',
},
{
title: '替代块数',
dataIndex: 'SUP_NUM',
key: 'SUP_NUM',
},
];
// 点击重置按钮
const handleRest = (): any => {
form.resetFields();
};
const ts = () => {
message.info('数据查询中,请勿重复点击~', 2);
};
const onSearchClick = (): any => {
setLoading(true);
const pro = form.getFieldsValue();
const obj = { START_TIME: begin, END_TIME: end };
const sd = Object.assign(pro, obj);
sd.PROC_CD = sd.PROC_CD && sd.PROC_CD.join(',');
sd.GP_CUR_INV = sd.GP_CUR_INV && sd.GP_CUR_INV.join(',');
const res = request.post(`/ipdTestApi/getSupersedeConfiram`, sd).then((res) => {
if (res.data.code == '1' && res.data.data.length !== 0) {
const result = res.data.data.map((item: any, index: any) => ({
...item,
ID: index,
}));
setDataSource(result);
message.success('数据查询完成!', 1);
setLoading(false);
} else {
setDataSource([]);
message.warn(res.data.msg);
setLoading(false);
}
});
//获取趋势分析表格数据
const res1 = request.post(`/ipdPsApi/getTrendAnalysis`, sd).then((res) => {
if (res.data.code == '1') {
const result = res.data.data.map((item: any, index: any) => ({
...item,
ID: index,
}));
setDataSource1(result);
} else {
setDataSource1([]);
}
});
//const param = form.getFieldsValue();
//const obj = { START_TIME: begin, END_TIME: end };
//const sd = Object.assign(pro, obj);
const hisDataTol = request.post(`/ipdTestApi/GetHisDataTol`, sd).then((res) => {
if (res.data.code == '1') {
const xData = res.data.data.map((item: any) => {
return item.SUB_DATE;
});
const yData = res.data.data.map((item: any) => {
return item.SUB_NUM;
});
//替代块数趋势图option
setNumOption({
title: {
left: 'center',
text: '替代块数变化趋势图',
textStyle: {
color: '#ffa218',
fontSize: 16,
},
},
xAxis: {
type: 'category',
data: xData,
axisLine: {
show: true,
symbol: ['none', 'arrow'],
lineStyle: {
color: '#1890ff',
width: 2,
type: 'solid',
},
},
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#bbbb15',
},
},
},
grid: {
top: '32px',
left: '32px',
bottom: '32px',
right: '32px',
containLabel: true,
},
yAxis: {
type: 'value',
axisLabel: {
formatter: '{value} 块',
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
lineStyle: {
color: '#1890ff',
width: 2,
type: 'solid',
},
},
},
series: [
{
data: yData,
type: 'line',
},
],
});
}
});
const hisDataRate = request.post(`/ipdTestApi/GetHisDataRate`, sd).then((res) => {
if (res.data.code == '1') {
const xData = res.data.data.map((item: any) => {
return item.SUB_DATE;
});
const yData = res.data.data.map((item: any) => {
return item.SUB_RATE;
});
const minNum = Math.min.apply(null, yData) - 5;
setRateOption({
title: {
left: 'center',
text: '替代率变化趋势图',
textStyle: {
color: '#ffa218',
fontSize: 16,
},
},
xAxis: {
type: 'category',
data: xData,
axisLine: {
show: true,
symbol: ['none', 'arrow'],
lineStyle: {
color: '#1890ff',
width: 2,
type: 'solid',
},
},
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#bbbb15',
},
},
},
grid: {
top: '32px',
left: '32px',
bottom: '32px',
right: '32px',
containLabel: true,
},
yAxis: {
type: 'value',
min: minNum,
axisLabel: {
formatter: '{value} %',
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
lineStyle: {
color: '#1890ff',
width: 2,
type: 'solid',
},
},
},
series: [
{
data: yData,
type: 'line',
},
],
});
}
});
};
const onRangeChange = (value: any, dateString: any) => {
setBegin(dateString[0]);
setEnd(dateString[1]);
};
const { components, resizableColumns, tableWidth, ...others } = useARH({
columns: useMemo(() => columns, [deps]),
minConstraints: 50,
});
// 点击整行选择
// const onSelectRow = (record:any) => {
// const selectedList = [...selectedRowKeys];
// if (selectedList[0] === record.id){
// return
// selectedList[0] = record.id
// }
// //setSelectedRows([record])
// setSelectedRowKeys(selectedList)
// }
return (
<>
<Card>
<Row gutter={[16, 0]}>
<Col span={24}>
<Form
labelCol={{ span: 6 }}
wrapperCol={{ span: 18 }}
form={form}
onFinish={onSearchClick}
>
<Collapse defaultActiveKey={['1']}>
<Panel key="1" header="查询条件" extra={headerButtons()}>
<Row gutter={[16, 8]} justify="start" wrap={false}>
<Col span={5} style={{ marginLeft: '-18px' }}>
<Item label="钢板号" name="PLATE_NO">
<Input
prefix={<SearchOutlined />}
style={{ color: '#ccc', width: 174 }}
allowClear
defaultValue=""
placeholder="请输入"
/>
</Item>
</Col>
<Col span={4} style={{ marginLeft: '-55px' }}>
<Item
label="订单号"
name="ORD_NO"
style={{ marginLeft: '-8px', maxWidth: '232px' }}
>
<Input
prefix={<SearchOutlined />}
style={{ color: '#ccc' }}
allowClear
defaultValue=""
placeholder="请输入"
/>
</Item>
</Col>
<Col span={4}>
<Item label="序列号" name="ORD_ITEM" style={{ marginLeft: -44 }}>
<Input
prefix={<SearchOutlined />}
style={{ color: '#ccc', width: 100 }}
allowClear
defaultValue=""
placeholder="请输入"
/>
</Item>
</Col>
<Col span={5} style={{ marginLeft: '-128px' }}>
<Form.Item label="替代时间" name="">
<RangePicker
onChange={onRangeChange}
style={{ width: 226 }}
defaultValue={[moment(nowStartDate), moment(nowEndDate)]}
/>
</Form.Item>
</Col>
<Col span={3} style={{ marginLeft: '-12px' }}>
<Item label={`结果`} name="HAN_STATE">
<Dictionary
style={{ width: 100 }}
placeholder="请选择"
dict="CLJG"
form={form}
valueName="HAN_STATE"
labelName="HAN_STATE"
/>
</Item>
</Col>
<Col span={3} style={{ marginLeft: '-68px' }}>
<Item
label="替代类型"
name="IS_FULL"
style={{ marginLeft: '26px', width: 300 }}
>
<Dictionary
placeholder="请选择"
dict="TDLX"
form={form}
valueName="IS_FULL"
labelName="IS_FULL"
/>
</Item>
</Col>
<Col span={4}>
<Item label="状态" name="PROC_CD" style={{ marginLeft: '-25px' }}>
<Select
mode="multiple"
showArrow={true}
placeholder="请选择"
value={selectedItems}
allowClear
onChange={setSelectedItems}
style={{ width: '174px' }}
>
{filteredOptions.map((item) => (
<Select.Option key={item} value={item}>
{item}
</Select.Option>
))}
</Select>
</Item>
</Col>
</Row>
<Row
gutter={[16, 8]}
style={{ marginBottom: '-25px', marginTop: -16 }}
justify="start"
>
<Col span={5} style={{ marginLeft: '-18px' }}>
<Item label="处理内容" name="HAN_CON">
<Input
prefix={<SearchOutlined />}
style={{ color: '#ccc', width: 174 }}
allowClear
defaultValue=""
placeholder="请输入"
/>
</Item>
</Col>
<Col span={4} style={{ marginLeft: '-57px' }}>
<Item label="仓库" name="GP_CUR_INV" style={{ width: 207 }}>
<Select
mode="multiple"
showArrow={true}
placeholder="请选择"
value={selectedItems1}
allowClear
onChange={setSelectedItems1}
style={{ width: '100%' }}
>
{filteredOptions1.map((item: any) => (
<Select.Option key={item} value={item}>
{item}
</Select.Option>
))}
</Select>
</Item>
</Col>
<Col span={3} style={{ marginLeft: '-71px' }}>
<Item
label="是否分板"
name="DIVISION"
style={{ marginLeft: '26px', width: 300 }}
>
<Dictionary
placeholder="请选择"
dict="SFFB"
form={form}
valueName="DIVISION"
labelName="DIVISION"
/>
</Item>
</Col>
</Row>
</Panel>
</Collapse>
</Form>
</Col>
</Row>
</Card>
<Card style={{ marginTop: 20 }}>
<Tabs onChange={onTabChange} defaultActiveKey="1" type="card">
<TabPane tab="替代历史信息" key="1" forceRender={true}>
<Table
bordered
components={components}
columns={resizableColumns}
className={styles.benchtable}
loading={loading}
dataSource={dataSource}
size="small"
pagination={{ defaultPageSize: 100 }}
onRow={(record: any) => {
return {
};
}}
rowSelection={{
columnWidth: '40px',
type: 'radio',
onChange: (selectedRowKeys: any, selectedRows: any) => {
setselectedRow(selectedRows), setselectedkey(selectedRowKeys);
},
}}
rowKey="ID"
scroll={{ x: tableWidth, y: 550 }}
></Table>
</TabPane>
{/* <TabPane tab="替代趋势分析" key="2" forceRender={true}>
<Col span={24}>
<Collapse defaultActiveKey={['1']} expandIconPosition="right">
<Collapse.Panel header="替代块数" key="1">
<Row>
<Col span={24}>
<div style={{ height: '300px', fontSize: '30px' }}>
<ReactEcharts theme="light" option={numOption} />
</div>
</Col>
</Row>
</Collapse.Panel>
</Collapse>
</Col>
<Col span={24}>
<Collapse defaultActiveKey={['1']} expandIconPosition="right">
<Collapse.Panel header="替代率" key="1">
<Row>
<Col span={24}>
<div style={{ height: '300px', fontSize: '30px' }}>
<ReactEcharts theme="light" option={rateOption} />
</div>
</Col>
</Row>
</Collapse.Panel>
</Collapse>
</Col>
</TabPane> */}
</Tabs>
</Card>
<Modal
title={`${action}`}
forceRender={true}
maskClosable={false}
centered
width="800px"
visible={Visible}
onOk={modalSubmit}
onCancel={() => {
setVisible(false);
}}
>
<Form
form={formData}
labelCol={{ span: 4 }}
wrapperCol={{ span: 18 }}
onFinish={(values) => {
console.log('values', values);
}}
>
<Row gutter={[20, 0]}>
<Col span={24 / formRow}>
<Form.Item label="工厂" name="PLT" rules={[{ required: true, message: '必填' }]}>
<Dictionary
placeholder="请输入"
dict="B0033"
form={formData}
valueName="PLT"
labelName="PLT"
/>
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
</>
);
};
//export default SubHistory;
export default function () {
return (
<KeepAlive>
<SubHistory />
</KeepAlive>
);
}