Commit a749ec69 authored by 沈翠玲's avatar 沈翠玲

临时提交第三个看板

parent 0caeee7d
......@@ -53,7 +53,8 @@ export default {
'原因': 'เหตุผล',
'状态': 'สถานะ',
'产线选择': 'การเลือกสายการผลิต',
'日产出': 'นิสสัน'
'日产出': 'นิสสัน',
'生产计划看板': 'แผนการผลิต Kanban'
}
;
\ No newline at end of file
......@@ -9,7 +9,7 @@ export default {
'menu.common.pwd': 'เปลี่ยนรหัสผ่าน',
'menu.kanban': 'กระดาน',
'menu.kanban.jiejingProduction': 'กระดานความคืบหน้าการผลิตที่สะอาด',
'menu.kanban.productionProgressKanban': 'กระดานความคืบหน้าการผลิต',
'menu.kanban.productionProgressKanban': 'แผนการผลิต Kanban',
'menu.kanban.productionComprehensKanban': 'กระดานการผลิตรวม',
'menu.kanban.deviceStatusKanban': 'การผลิตอุปกรณ์ที่ครอบคลุมของวัน Kanban',
'menu.kanban.materialSynthesisKanban': 'กระดานสังเคราะห์วัสดุ',
......
......@@ -53,6 +53,7 @@ export default {
'原因': '原因',
'状态': '状态',
'产线选择': '产线选择',
'日产出': '日产出'
'日产出': '日产出',
'生产计划看板': '生产计划看板'
};
\ No newline at end of file
......@@ -9,7 +9,7 @@ export default {
'menu.common.pwd': '修改密码',
'menu.kanban': '看板',
'menu.kanban.jiejingProduction': '洁净生产进度看板',
'menu.kanban.productionProgressKanban': '生产进度看板',
'menu.kanban.productionProgressKanban': '生产计划看板',
'menu.kanban.productionComprehensKanban': '生产综合看板',
'menu.kanban.deviceStatusKanban': '当日设备生产综合看板',
'menu.kanban.materialSynthesisKanban': '物料综合看板',
......
......@@ -9,7 +9,7 @@ export type Setting = {
autoResize: boolean;
intervalTime: number;
rowMovingTime: number;
productProgressKanbanSetting?: ProductProgressKanbanSetting;
lineName: string;
};
export type SettingFormProps = {
......
......@@ -13,18 +13,39 @@ type ProductionProgressKanbanData = KANBAN.ProductionProgress.ProductionProgress
type ProductionProgressKanbanSetting = KANBAN.ProductionProgress.ProductionProgressKanbanSetting;
type ProgressTableProps = {
setting: ProductionProgressKanbanSetting;
lineName: string;
data: ProductionProgressKanbanData[];
conditionKey: string;
rowMovingTime: number;
};
const ProgressTable: React.FC<ProgressTableProps> = ({
setting,
lineName,
data,
conditionKey,
rowMovingTime,
}) => {
data = {
"taskPlanDayList": [
{
"productList": [
{
"itemCode": "",
"planQuantity": "",
"processList": [
{
"processName": "",
"qualifiedRate": 0,
"qualifyQuantity": 0,
"reportQuantity": 0
}
]
}
],
"startDate": ""
}
]
}
const rowHight = 60;
const displayCount = 13;
......@@ -33,19 +54,6 @@ const ProgressTable: React.FC<ProgressTableProps> = ({
const [lastConditionKey, setLastConditionKey] = useState('');
const [pause, setPause] = useState(false);
const [scollOnce, setScollOnce] = useState(false);
//去掉步骤中的重复步骤名
let tempStepName = '';
setting.progress.steps = setting.progress.steps.filter((s) => {
if (tempStepName == s.name) {
return false;
}
tempStepName = s.name;
return true;
});
const row_segment2_section_width = useMemo(
() => (100 / setting.progress.steps.length).toFixed(4) + '%',
[setting],
);
const updateDisplayData = (da: number, sData: ProductionProgressKanbanData[]) => {
let endAt1 = da + displayCount;
......@@ -93,47 +101,14 @@ const ProgressTable: React.FC<ProgressTableProps> = ({
};
}, [rowMovingTime, scoll]);
const [isModalOpen, setIsModalOpen] = useState(false);
const [isModalOpen2, setIsModalOpen2] = useState(false);
const [criteria, setCriteria] = useState({} as ErrorDetailCriteria);
const closeModal = () => setIsModalOpen(false);
const closeModal2 = () => setIsModalOpen2(false);
const [productionDetailParams, setProductionDetailParams] = useState({
kanbanSettingId: '',
aufnr: '',
processName: '',
});
const openModal = (data, step) => {
if (!setting.id) return;
if (data.stepData.length) {
setProductionDetailParams({
kanbanSettingId: setting.id,
aufnr: data.aufnr,
processName: step.name,
});
setIsModalOpen(true);
}
};
const openModal2 = (zgh: string) => {
setCriteria({
workshopName: '',
zgh: zgh,
status: '1,2,3,4,5',
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,
});
if (!setting.id) return;
setIsModalOpen2(true);
};
useEffect(() => {
if (scollOnce) {
......@@ -149,25 +124,17 @@ const ProgressTable: React.FC<ProgressTableProps> = ({
<div
className={`${styles.row_segment1_section1} ${styles.no_top_border} ${styles.no_left_border}`}
>
<div className={styles.cell}>施工号</div>
<div className={styles.cell}>日期</div>
</div>
<div className={`${styles.row_segment1_section2} ${styles.no_top_border}`}>
<div className={styles.cell}>数量</div>
<div className={styles.cell}>产品</div>
</div>
<div className={`${styles.row_segment1_section2} ${styles.no_top_border}`}>
<div className={styles.cell}>计划数</div>
</div>
<div className={`${styles.row_segment1_section2} ${styles.no_top_border} ${styles.no_right_border}`}>
<div className={styles.cell}>工序</div>
</div>
</div>
<div className={styles.row_segment2}>
{setting.progress.steps.map((step, i) => (
<div
className={
`${styles.row_section} ${styles.no_top_border} ` +
(i + 1 === setting.progress.steps.length && styles.no_right_border)
}
style={{ width: row_segment2_section_width }}
key={step.code}
>
<div className={styles.cell}>{step.name}</div>
</div>
))}
</div>
</div>
<NodeGroup
......@@ -215,53 +182,32 @@ const ProgressTable: React.FC<ProgressTableProps> = ({
opacity: node.state.opacity,
}}
>
<div className={styles.row_segment1}>
{/* <div className={styles.row_segment1}>
<div
className={styles.row_segment1_section1}
onClick={() => openModal2(node.data[setting.sgNoSourceType.code])}
>
<div className={styles.cell}>{node.data[setting.sgNoSourceType.code]}</div>
<div className={styles.cell}>{node.data[lineName.sgNoSourceType.code]}</div>
</div>
<div className={styles.row_segment1_section2}>
<div className={styles.cell}>{node.data.planQuantity}</div>
</div>
</div>
<div className={styles.row_segment2}>
{setting.progress.steps.map((step) => (
{lineName.progress.steps.map((step) => (
<div
className={styles.row_section}
style={{ width: row_segment2_section_width }}
key={step.code}
onClick={() => openModal(node.data, step)}
>
<StepCell step={step} data={node.data} setting={setting} />
<StepCell step={step} data={node.data} lineName={lineName} />
</div>
))}
</div>
</div> */}
</div>
))}
</div>
)}
</NodeGroup>
<Modal
title={'批次完工'}
visible={isModalOpen}
footer={null}
width={'70%'}
onCancel={closeModal}
>
<ProductionDetail params={productionDetailParams} />
</Modal>
<Modal
title={'生产异常'}
visible={isModalOpen2}
footer={null}
width={'70%'}
onCancel={closeModal2}
>
<ProductionAbnormal values={criteria} />
</Modal>
</div>
);
};
......
import React, { useRef, useState } from 'react';
import { DrawerForm, ProFormCheckbox, ProFormDigit, ProFormSelect } from '@ant-design/pro-form';
import { useIntl } from 'umi';
import ProForm, {
DrawerForm,
ProFormCheckbox,
ProFormDigit,
ProFormRadio,
ProFormSelect,
} from '@ant-design/pro-form';
import type { ProFormInstance } from '@ant-design/pro-form';
import { queryProductionProgressKanbanSetting } from '../../services/api';
import { queryProductionComprehensKanbanData } from '../../services/api';
type KanbanSetting = KANBAN.ProductionComprehens.ProductionComprehensKanbanDataDto;
type ProductionProgressKanbanSetting = KANBAN.ProductionProgress.ProductionProgressKanbanSetting;
type FormSettingDto = {
autoResize: boolean;
intervalTime: number;
rowMovingTime: number;
dataRange: number;
planSource: number;
productionComprehensKanbanSettingId: string;
};
export type Setting = {
autoResize: boolean;
intervalTime: number;
rowMovingTime: number;
productionProgressKanbanSetting?: ProductionProgressKanbanSetting;
dataRange: number;
planSource: number;
lineName?: string;
};
export type SettingFormProps = {
......@@ -21,43 +38,40 @@ export type SettingFormProps = {
const SettingForm: React.FC<SettingFormProps> = (props) => {
const formRef = useRef<ProFormInstance>();
const [productionProgressKanbanSettings, setProductionProgressKanbanSettings] = useState<
ProductionProgressKanbanSetting[]
const intl = useIntl();
const [lineName, setLineName] = useState<
KanbanSetting[]
>([]);
return (
<DrawerForm
formRef={formRef}
title="设置"
title={intl.formatMessage({id: '设置'})}
width={600}
submitter={{
searchConfig: {
resetText: intl.formatMessage({id: '取消'}),
submitText: intl.formatMessage({id: '确认'}),
}
}}
visible={props.visible}
onVisibleChange={(visible: boolean) => {
if (visible) {
formRef?.current?.setFieldsValue({
...props.values,
productionProgressKanbanSettingId: props.values.productionProgressKanbanSetting?.id,
...props.values
});
}
props.onVisibleChange(visible);
}}
onFinish={async (values: {
autoResize: boolean;
intervalTime: number;
rowMovingTime: number;
productionProgressKanbanSettingId: string;
}) => {
const productionProgressKanbanSetting = productionProgressKanbanSettings
.filter((a) => a.id === values.productionProgressKanbanSettingId)
.pop();
productionProgressKanbanSetting?.progress.steps.sort((a, b) => a.ordinal - b.ordinal);
props.onSubmitting({ ...values, productionProgressKanbanSetting });
onFinish={async (values: FormSettingDto) => {
props.onSubmitting({ ...values });
props.onVisibleChange(false);
}}
>
<ProFormCheckbox name="autoResize" label="适配窗口" width="xl" />
<ProFormCheckbox name="autoResize" label={intl.formatMessage({id: '适配窗口'})} width="xl" />
<ProFormDigit
name="intervalTime"
label="刷新时间间隔(秒)"
label={intl.formatMessage({id: '刷新时间间隔(秒)'})}
required
width="xl"
min={10}
......@@ -65,24 +79,26 @@ const SettingForm: React.FC<SettingFormProps> = (props) => {
/>
<ProFormDigit
name="rowMovingTime"
label="内容滚动(秒)"
label={intl.formatMessage({id: '内容滚动(秒)'})}
required
width="xl"
min={1}
fieldProps={{ precision: 0 }}
/>
<ProFormSelect
name="productionProgressKanbanSettingId"
label="看板设置"
name="lineName"
label={intl.formatMessage({id: '产线选择'})}
required
width="xl"
request={async () => {
const data = await queryProductionProgressKanbanSetting();
setProductionProgressKanbanSettings(data);
return data.map((a) => ({
label: `${a.werks}-${a.fevor}-${a.subTitle1}-${a.subTitle2}`,
value: a.id,
}));
const { data } = await queryProductionComprehensKanbanData();
if (Array.isArray(data)) {
data.unshift(intl.formatMessage({
id: '全厂'
}))
}
setLineName(data);
return data.map((a) => ({ label: a, value: a }));
}}
/>
</DrawerForm>
......
......@@ -7,15 +7,19 @@ import Crust1 from '../components/FHD1080P/Crust1';
import ProgressTable from './components/ProgressTable';
import { queryProductionProgressKanbanData } from './services/api';
import moment from 'moment';
import { useIntl } from 'umi';
type ProductionProgressKanbanData = KANBAN.ProductionProgress.ProductionProgressKanbanDataDto;
const Main: React.FC = () => {
const intl = useIntl();
const [setting, setSetting] = useState<Setting>({
autoResize: true,
intervalTime: 600,
rowMovingTime: 5,
productionProgressKanbanSetting: undefined,
lineName: intl.formatMessage({
id: '全厂'
}),
});
const [conditionKey, setConditionKey] = useState('');
......@@ -23,22 +27,15 @@ const Main: React.FC = () => {
const [settingFormVisible, setSettingFormVisible] = useState(false);
useEffect(() => {
const { intervalTime, productionProgressKanbanSetting } = setting;
if (!!!productionProgressKanbanSetting) {
setConditionKey(Date.now().toString());
setData([]);
return;
}
const { intervalTime } = setting;
let changeConditionKey = true;
const refresh = () => {
const now = Date.now();
const gstrpFrom = moment(now).startOf('month');
const gstrpTo = moment(now).endOf('month');
queryProductionProgressKanbanData({
productionProgressKanbanSettingId: productionProgressKanbanSetting.id,
gstrpFrom: gstrpFrom.format('YYYY-MM-DD HH:mm:ss'),
gstrpTo: gstrpTo.format('YYYY-MM-DD HH:mm:ss'),
lineName: setting?.lineName === intl.formatMessage({
id: '全厂'
}) ? null : setting?.lineName
})
.then((value) => {
setData(value.data);
......@@ -61,27 +58,15 @@ const Main: React.FC = () => {
return (
<>
<KanbanStyle
headerText="生产进度看板"
subTitle={setting.productionProgressKanbanSetting?.subTitle1}
headerText={intl.formatMessage({id:'生产计划看板'})}
subTitle={setting?.lineName}
autoResize={setting.autoResize}
onHeaderClick={() => {
setSettingFormVisible(true);
}}
>
<div className={styles.main}>
<div className={styles.title}>
<div className={styles.title_left}>
<div
className={
setting.productionProgressKanbanSetting?.subTitle2
? styles.title_left_legend
: styles.title_left_legend_hidden
}
/>
<div className={styles.title_left_text}>
{setting.productionProgressKanbanSetting?.subTitle2}
</div>
</div>
{/* <div className={styles.title}>
<div className={styles.title_center} />
<div className={styles.title_right}>
<div className={styles.itle_right_legend_intime} />
......@@ -91,13 +76,13 @@ const Main: React.FC = () => {
<div className={styles.itle_right_legend_outtime} />
<div className={styles.title_right_text}>超期一天以上完成</div>
</div>
</div>
</div> */}
<div className={styles.content}>
<Crust1 className={styles.crust}>
<div className={styles.content_usable}>
{setting.productionProgressKanbanSetting && (
{setting.lineName && (
<ProgressTable
setting={setting.productionProgressKanbanSetting}
lineName={setting.lineName}
data={data}
conditionKey={conditionKey}
rowMovingTime={setting.rowMovingTime}
......
......@@ -8,7 +8,8 @@ type ProductionProgressKanbanDataDto = KANBAN.ProductionProgress.ProductionProgr
type ProductionProgressKanbanDataCriteria =
KANBAN.ProductionProgress.ProductionProgressKanbanDataCriteria;
type ProductionProgressKanbanSetting = KANBAN.ProductionProgress.ProductionProgressKanbanSetting;
type ProductionComprehensKanbanDataDto =
KANBAN.ProductionComprehens.ProductionComprehensKanbanDataDto;
const productionProgressKanbanSettingGraphqlString =
'query{productionProgressKanbanSetting{id,subTitle1,subTitle2,werks,fevor,overdueNone,overdueWarn,overdueSeverity,sgNoSourceType{id,code},progress{steps{code,ordinal,name}}}}';
......@@ -17,7 +18,7 @@ export async function queryProductionProgressKanbanData(
options?: { [key: string]: any },
) {
return request<Api.ServiceResult<ProductionProgressKanbanDataDto[]>>(
'/api/productionProgressKanban/data',
'/kanban/task/taskPlanStat',
{
method: 'POST',
headers: {
......@@ -55,3 +56,15 @@ export async function queryProductionProgressKanbanDetail(body: {
data: body,
});
}
export async function queryProductionComprehensKanbanData() {
return request<Api.ServiceResult<ProductionComprehensKanbanDataDto[]>>(
'/md/workunit/selectGroupLineName',
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
},
);
}
\ No newline at end of file
......@@ -26,8 +26,7 @@ export type Setting = {
rowMovingTime: number;
dataRange: number;
planSource: number;
productionComprehensKanbanSettingId?: string;
productionComprehensKanbanSetting?: KanbanSetting;
lineName?: string;
};
export type SettingFormProps = {
......@@ -102,24 +101,6 @@ const SettingForm: React.FC<SettingFormProps> = (props) => {
return data.map((a) => ({ label: a, value: a }));
}}
/>
{/*
<ProFormRadio.Group
label="工序产量"
name="dataRange"
options={[
{ label: '按日', value: 1 },
{ label: '按月', value: 2 },
]}
/>
<ProForm.Group>
<ProFormRadio.Group
name="planSource"
options={[
{ label: '手动导入', value: 1 },
{ label: '排产计划量', value: 2 },
]}
/>
</ProForm.Group> */}
</DrawerForm>
);
};
......
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