import React, { useEffect, useRef, useState } from "react"; import moment from "moment"; import ShowType from "@/components/Common/CommonComponent"; import { operationFetch } from "../../productionExec/productionExecMain/operationFetch"; import * as commonUtils from "@/utils/utils"; import * as commonFunc from "@/components/Common/commonFunc"; import * as commonBusiness from "@/components/Common/commonBusiness"; import StaticEditTable from "@/components/Common/CommonTable"; import costomPageFun from "@/mes/costomPageFun"; import * as commonConfig from "@/utils/config"; import MesToolbar from "./MesToolbar"; import styles from "./index.less"; import { Button, Space, Input, Modal, Dropdown, Popconfirm } from "antd"; import { ScanOutlined } from "@ant-design/icons"; const useCommonOperationBarComponentEvent = props => { const { sName, [`${sName}SearchValue`]: defaultSearchValue } = props; const [searchValue, setSearchValue] = useState(defaultSearchValue); const [productNameValue, setProductNameValue] = useState(undefined); const [scanCodeModalVisible, setScanCodeModalVisible] = useState(false); useEffect( () => { props.onSaveState({ [`${sName}SearchValue`]: searchValue }); }, [searchValue] ); // // 开工事件 const handleStartWork = async params => { const { sModelsId, token, app } = props; const { name, record, config, iFlag } = params; const { sAssignField } = config; const allTableData = { [name]: record }; let rowData = {}; // commonFunc.getDefaultData(config, allTableData); // 取默认值 rowData = { ...rowData, ...commonFunc.getAssignFieldValue(sAssignField, record, allTableData), handleType: "add", sId: commonUtils.createSid(), sTeamId: app.sTeamNameSId, sMachineId: app.sMachineNameSId, sParentId: record.sId, tCreateDate: new Date() }; const valuesNew = {}; valuesNew.data = []; valuesNew.data.push( commonBusiness.mergeData(name, "plc_machinedata", [rowData], []) ); if ((iFlag || Object.is(iFlag, 0)) && valuesNew.data[0]) { valuesNew.data[0].iFlag = iFlag; } const BtnSave = commonFunc.showMessage( app.commonConst, "BtnSave" ); /* 保存 */ params.optName = BtnSave; params.sClientType = "1"; const returnData = await commonBusiness.saveData({ token, value: valuesNew, sModelsId, bMachineTask: true }); return returnData; }; // 按钮点击事件 const clickRef = useRef(null); const handleBtnClick = async (config, searchField) => { // 限制半秒内只能点一次 if (clickRef.current) return; clickRef.current = true; setTimeout(() => { clickRef.current = false; }, 500); await props.awaitPromiseReturn(); const { sName } = props; const { sActiveId, sButtonParam, sInstruct, sControlName } = config; const delayedOvertime = commonFunc.showLocalMessage(props, 'delayedOvertime', '延迟加班'); const cancelDelayedOvertime = commonFunc.showLocalMessage(props, 'cancelDelayedOvertime', '取消延迟加班'); // 走工具栏功能逻辑 if (MesToolbar({ ...props, btnConfig: config })) { return; } // 自定义按钮事件 if ( costomPageFun({ props, tableName: sName, sFieldName: sControlName, actionName: "mesBtnClick" }) ) return; // 通用按钮处理 const { showName = "", sActiveKey = "" } = config; // 通用按钮->全局 if (showName.trim() === "全部") { setSearchValue(undefined); props.onSaveState({ [`${sName}SelectedBtn`]: "全部", [`${sName}Filter`]: undefined, refreshTableList: [sName] }); return; } else if (showName.trim() === "未打标签") { setSearchValue(undefined); props.onSaveState({ [`${sName}Filter`]: undefined, untaggedTableName: props.sName, untaggedFilterFields: sActiveKey.split(",").filter(item => item) }); return; } else if ( [ "近2天", "近两天", "近7天", "近七天", "近一月", "近三月", "近半年", "近一年" ].includes(showName.trim()) ) { const tomorrowDate = moment() .add(1, "days") .format("YYYY-MM-DD"); let oneMonthAgo; switch (showName.trim()) { case "近2天": case "近两天": oneMonthAgo = moment() .subtract(2, "days") .format("YYYY-MM-DD"); break; case "近7天": case "近七天": oneMonthAgo = moment() .subtract(7, "days") .format("YYYY-MM-DD"); break; case "近一月": oneMonthAgo = moment() .subtract(1, "months") .format("YYYY-MM-DD"); break; case "近三月": oneMonthAgo = moment() .subtract(3, "months") .format("YYYY-MM-DD"); break; case "近半年": oneMonthAgo = moment() .subtract(6, "months") .format("YYYY-MM-DD"); break; case "近一年": oneMonthAgo = moment() .subtract(12, "months") .format("YYYY-MM-DD"); break; default: break; } setSearchValue(undefined); props.onSaveState({ [`${sName}SelectedBtn`]: showName.trim(), [`${sName}Filter`]: [ { bFilterCondition: "between", bFilterName: sActiveKey || searchField.sName, bFilterValue: `${oneMonthAgo},${tomorrowDate}` } ], refreshTableList: [sName] }); return; } else if (showName.trim() === "扫码上料") { props.onSaveState({ scanCodeModalData: [] }, () => { setScanCodeModalVisible(true); }); return; } else if (showName.trim() === "保存") { // 保存前校验 const { [`${sName}Config`]: tableConfig = {}, [`${sName}Data`]: tableData = [] } = props; const validateData = Array.isArray(tableData) ? tableData : [tableData]; const validateResult = commonBusiness.validateTable( tableConfig, validateData, props ); if (!validateResult) return; } else if (sControlName === "BtnRight.showProduct") { // 选择版材 根据工单产品直接过滤 const globalData = commonUtils.getAppData("globalData"); const bFilter = [ { bFilterCondition: "=", bFilterName: "sProductId", bFilterValue: globalData.currentWorkOrderInfo?.sProductId } ]; props.onSaveState({ [`${sName}Filter`]: bFilter, refreshTableList: [sName] }); } else if (sControlName === "BtnRight.DelayWork") { const { bDelayedOvertime } = commonUtils.getAppData("userinfo"); const { app } = props; const { sMachineNameSId: sMachineGuid, sTeamNameSId: sTeamGuid } = app; props.onExecInstructSet({ nextProps: { ...props, temp0Data: [ { iOperateType: bDelayedOvertime ? 0 : 1, sMachineGuid, sTeamGuid } ] }, btnConfig: { sId: config.sId, showName: !bDelayedOvertime ? delayedOvertime : cancelDelayedOvertime, sInstruct: JSON.stringify([ { opr: "procedure", config: { sproName: "Sp_mes_workOvertime", inMap: "temp0.iOperateType,temp0.sMachineGuid,temp0.sTeamGuid", staticData: { sOperate: "start" } } } ]) }, inscallback: () => { const userInfoNew = commonUtils.getAppData("userinfo"); userInfoNew.bDelayedOvertime = !bDelayedOvertime; localStorage.setItem( `${commonConfig.prefix}userlogin`, JSON.stringify(userInfoNew) ); props.dispatch({ type: "app/saveUserinfo", payload: userInfoNew }); } }); } // 处理特殊按钮 const btnType = sControlName.split(".")[0].toLowerCase(); const btnName = sControlName.split(".")[1].toLowerCase(); const specialBtnTypeList = ["btntablecopyto"]; const specialBtnNameList = ["edit"]; if ( specialBtnNameList.includes(btnName) || specialBtnTypeList.includes(btnType) ) { // handleSpecialBtn(btnType, btnName, config); // return; } // 调用指令集 if (sInstruct) { props.onExecInstructSet({ ...props, btnConfig: config }); if (["BtnRight.confirmNextStartWork"].includes(sControlName)) { handleStartWork({ name: "slave0", record: commonUtils.isNotEmptyArr(props.slave0Data) ? {} : props.slave0Data[0], config }); } return; } // 弹窗 if (sActiveId) { handleOpenCommonModal(config); } if (["BtnLeft.setUpStart"].includes(sControlName)) { if (props.sStatusNameProcess) { if (typeof props.sStatusNameProcess.onClick === "function") { props.setPagesLoading(true); props.sStatusNameProcess.onClick(config).finally(() => { props.onRefresh(); }); } return; } else { props.setPagesLoading(true); operationFetch(props, config, "begin").finally(() => { props.onRefresh(); }); return; } } // 调用存储过程 if (sButtonParam) { handleProcedureCall(config); } }; // const handleSearchValueChange = (name, sFieldName, changeValue) => { setSearchValue(changeValue[sFieldName]); }; const handleSearchProductNameChange = ( name, sFieldName, changeValue, bDefaultSelected = false ) => { const { sName, formData, bCostom } = props; const currentWorkOrderInfo = commonUtils.convertStrToObj( localStorage.xlybusinessglobalData ).currentWorkOrderInfo; let config = ""; if (bCostom) { // 非公用组件调用 config = props[`${sName}Config`]; } else { // 公用组件调用 config = formData.find(item => item.sGrd === sName); } if (!config) return ""; const { gdsconfigformslave } = config; const searchProductConfig = gdsconfigformslave.filter( item => item.sName === "sSearchProductName" ); if ( commonUtils.isNotEmptyObject(currentWorkOrderInfo) && commonUtils.isNotEmptyArr(searchProductConfig) ) { props.dispatch({ type: "app/saveGlobalData", payload: { currentWorkOrderInfo: { ...currentWorkOrderInfo, sSearchProductId: changeValue.sSearchProductId } } }); setProductNameValue(changeValue.sSearchProductNo); // 默认选中行时不触发指令集 if (bDefaultSelected) return; const { sOnChangeInstruct } = searchProductConfig[0]; const sInstruct = commonUtils.convertStrToObj(sOnChangeInstruct, {}); const { ["changeafter"]: instructType } = sInstruct; props.onExecInstructSet({ // nextProps, btnConfig: { sInstruct: JSON.stringify(instructType), showName: "变化" } }); } }; // 处理特殊按钮事件 const handleSpecialBtn = (btnType, btnName, config) => { if (btnName === "edit") { props.onSaveState({ enabled: true }); } else if (btnType.includes("copyto")) { // props.onCopyTo({ // tableName, // config, // record // }); } }; // 弹窗 const handleOpenCommonModal = config => { const { sActiveId, sActiveName } = config; const copyTo = handleGetCopyTo(config); // 获取sqlCondition值 const sParentConditions = props.getSqlCondition(config); // 弹窗展示 props.onOpenCommonModal({ type: "commonModal", sActiveId, title: sActiveName, copyTo, sParentConditions, parentProps: props, onOk: data => { console.log("=====onOk", data); }, onCancel: () => { console.log("=====onCancel"); } }); }; // 获取copyTo数据 const handleGetCopyTo = config => { const copyTo = {}; return copyTo; }; // 调用存储过程 const handleProcedureCall = config => { props.onSaveState({ loadingBtnConfig: config }); props.onProcedureCall({ btnConfig: config, onSuccess: () => { props.onSaveState({ loadingBtnConfig: {} }); if (config.sActiveKey) { props.onSaveState( { [`${config.sActiveKey}SelectedRowKeys`]: [] }, () => { props.onRefresh && props.onRefresh(); } ); } else { props.onRefresh && props.onRefresh(); } }, onConfirm: () => { props.onSaveState({ loadingBtnConfig: {} }); }, onError: () => { props.onSaveState({ loadingBtnConfig: {} }); } }); }; // 获取按钮配置 const handleGetBtnPropps = (config, searchField) => { const defaultProps = { type: "primary", size: "large", onClick: handleBtnClick.bind(this, config, searchField) }; const { sDefault, sControlName } = config; const delayedOvertime = commonFunc.showLocalMessage(props, 'delayedOvertime', '延迟加班'); const cancelDelayedOvertime = commonFunc.showLocalMessage(props, 'cancelDelayedOvertime', '取消延迟加班'); // 根据sDefault配置控制按钮是否可以操作 if (sDefault && sDefault.includes("${")) { // 当前页面全部数据 const allTableData = commonFunc.getAllTableData(props); // 当前页面所有选中数据(为空时默认获取第一条) const [allTableSelectedData, allTableSelectedOneData] = Object.keys( allTableData ).reduce( ([result, result1], tableName) => { let tableData = allTableData[tableName] || []; tableData = Array.isArray(tableData) ? tableData : [tableData]; const { [`${tableName}SelectedRowKeys`]: selectedRowKeys = [] } = props; let filterData = tableData.filter( item => selectedRowKeys.includes(item.sSlaveId) || selectedRowKeys.includes(item.sId) ); if (!filterData.length && tableData.length) { filterData = [tableData[0]]; } result = { ...result, [tableName]: filterData }; result1 = { ...result1, [tableName]: filterData[0] || {} }; return [result, result1]; }, [{}, {}] ); const globalData = commonUtils.getAppData("globalData"); const { currentSelectedMachineTask, currentStartWorkMachineTask, currentWorkOrderInfo } = globalData; const commonData = { userinfo: commonUtils.getAppData("userinfo"), currentSelectedMachineTask, currentStartWorkMachineTask, currentWorkOrderInfo }; const tempData = { ...commonData, ...allTableSelectedOneData }; // 将变量fordosetName替换 let strNew = sDefault; let result = ""; try { // 截取字符串中 ${tableName@all.fieldName.判断符号.判断内容} 格式的内容 const reg1 = /\$\{[^{}@]+@[^{}\.]+\.[^{}\.]+\.[^{}\.]+\.[^{}\.]*\}/g; strNew = strNew.replace(reg1, matchStr => { const matchStrNew = matchStr.substring(2, matchStr.length - 1); const [tableName, restStr] = matchStrNew.split("@"); const [ filterType, sFileName, conditionStr, conditionValue ] = restStr.split("."); let matchResult = matchStr; const selectedData = allTableData[tableName] || []; if (commonUtils.isEmptyObject(selectedData)) return false; if (filterType === "all") { matchResult = !selectedData.some( rowData => !handleMatchResult( rowData, sFileName, conditionStr, conditionValue ) ); } else if (filterType === "one") { matchResult = selectedData.some(rowData => handleMatchResult( rowData, sFileName, conditionStr, conditionValue ) ); } return matchResult; }); Object.keys(tempData).forEach(key => { const reg = new RegExp(`${key}\.`, "g"); strNew = strNew.replace(reg, `tempData["${key}"].`); }); // 将conditionNew中的变量赋值 const evalStr = eval("`" + strNew + "`"); // 执行判断条件 result = eval(evalStr); defaultProps.disabled = !result; } catch (error) { console.log("=====err", { tempData, str: sDefault, strNew, error }); } } else if (props.bMesBill) { const btnName = sControlName.replace('BtnLeft.', '').replace('BtnRight.', '').toLowerCase(); if (props.enabled) { if (["btnupd"].includes(btnName)) { defaultProps.disabled = true; } } else { if (["btnsave", "btnscanface"].includes(btnName)) { defaultProps.disabled = true; } } } const { sColor } = config; let style = {}; if (sColor && !defaultProps.disabled) { const [background, color] = sColor.split(","); if (background) { style.background = background; style.borderColor = background; } if (color) { style.color = color; } defaultProps.style = style; } // 隐藏salveWydm2表的新增托盘 if (props.sName === "salveWydm2" && config.sControlName === "BtnLeft.Add") { defaultProps.style = defaultProps.style || {}; defaultProps.style.opacity = 0; defaultProps.style.zIndex = -1; defaultProps.id = "salveWydm2Add"; } else if ( props.sName === "salveWydm2" && config.sControlName === "BtnRight.Print1" ) { defaultProps.id = "salveWydm2Print1"; } else if ( props.sName === "salveWydm2" && config.sControlName === "BtnRight.Print2" ) { defaultProps.id = "salveWydm2Print2"; } else if ( props.sName === "salveWydm2" && config.sControlName === "BtnRight.Print3" ) { defaultProps.id = "salveWydm2Print3"; } else if ( props.sName === "slaveWypj2" && config.sControlName === "BtnRight.Print1" ) { defaultProps.id = "slaveWypj2Print1"; } else if ( props.sName === "salveWybz2" && config.sControlName === "BtnRight.Print" ) { defaultProps.id = "salveWybz2Print1"; } else if (config.sControlName === "BtnRight.DelayWork") { const { bDelayedOvertime } = commonUtils.getAppData("userinfo"); config.showName = bDelayedOvertime ? cancelDelayedOvertime : delayedOvertime; let style = { width: "150px" }; defaultProps.style = style; } const { loadingBtnConfig = {} } = props; if (loadingBtnConfig.sId === config.sId) { defaultProps.loading = true; } const { [`${sName}SelectedBtn`]: sleectedBtn } = props; if (config.showName?.trim() === sleectedBtn) { const { style = {} } = defaultProps; style.backgroundColor = "#ffcc4e"; style.borderColor = "#ffcc4e"; style.color = "#000"; defaultProps.style = style; } return defaultProps; }; // 判断是否满足条件 const handleMatchResult = ( rowData, sFileName, conditionStr, conditionValue ) => { let rowDataValue = rowData[sFileName]; try { if ( rowDataValue === undefined || rowDataValue === null || rowData === "null" ) { rowDataValue = ""; } else { rowDataValue = rowDataValue.toString(); } } catch (error) { } switch (conditionStr) { case "===": return rowDataValue === conditionValue; case "==": return rowDataValue === conditionValue; case ">=": return rowDataValue >= conditionValue; case "<=": return rowDataValue <= conditionValue; case ">": return rowDataValue > conditionValue; case "<": return rowDataValue < conditionValue; case "!=": return rowDataValue != conditionValue; case "!==": return rowDataValue !== conditionValue; default: throw new Error("conditionStr is not valid"); } }; const allTableData = commonFunc.getAllTableData(props); return { ...props, allTableData, onGetBtnPropps: handleGetBtnPropps, // 获取按钮配置 searchValue, // 搜索值 productNameValue, setProductNameValue, onSearchValueChange: handleSearchValueChange, // 设置搜索栏值 onSearchProductNameChange: handleSearchProductNameChange, // 设置搜索栏值 scanCodeModalVisible, // 扫描条码弹窗 setScanCodeModalVisible // 设置扫描条码弹窗状态 }; }; const CommonOperationBarComponent = basProps => { if (basProps.belongsToForm && basProps.costomFormOperationBar) return basProps.costomFormOperationBar; const props = useCommonOperationBarComponentEvent(basProps); const { sName, formData, bCostom, belongsToForm, sStatusNameProcess } = props; let config = ""; if (bCostom) { // 非公用组件调用 config = props[`${sName}Config`]; } else { // 公用组件调用 config = formData.find(item => item.sGrd === sName); } if (!config) return ""; const { gdsconfigformslave } = config; const searchFieldList = gdsconfigformslave.filter( item => item.bVisible && item.bFind ); let searchField = {}; if (searchFieldList.length === 1) { searchField = searchFieldList[0]; } else if (searchFieldList.length > 1) { searchField = { sId: commonUtils.createSid(), showName: searchFieldList.map(item => item.showName).join("/"), sName: "sSearchName" }; } // 弹窗底部按钮 const btnFooterConfig = gdsconfigformslave.filter( item => item.bVisible && item.sControlName.includes("BtnFooter.") ); // 设置弹窗底部按钮 if (btnFooterConfig.length && props.setExtraBtns) { const extraBtns = btnFooterConfig.map(item => { return ; }); props.setExtraBtns(extraBtns); } const btnLeftConfig = gdsconfigformslave.filter( item => item.bVisible && item.sControlName.includes("BtnLeft.") ); // 将扫码上料放到最后 const scanCodeToLoadMaterialsIndex = btnLeftConfig.findIndex( item => item.showName === "扫码上料" ); if (scanCodeToLoadMaterialsIndex !== -1) { const scanCodeToLoadMaterialsConfig = btnLeftConfig.splice( scanCodeToLoadMaterialsIndex, 1 ); btnLeftConfig.push(scanCodeToLoadMaterialsConfig[0]); } if (props.sModelType === "/indexMes/productionExec") { const valueIndex = btnLeftConfig.findIndex( i => i && i.sControlName === "BtnLeft.setUpStart" ); if (valueIndex >= 0 && btnLeftConfig[valueIndex]) { if (sStatusNameProcess) { const showName = sStatusNameProcess.showName; btnLeftConfig[valueIndex].showName = showName; } else { btnLeftConfig.splice(valueIndex, 1); } } } // console.log(btnLeftConfig[0].btnBgColor = 'red') if (btnLeftConfig.length !== 0) { btnLeftConfig[0].btnBgColor = "red"; } const btnRightConfig = gdsconfigformslave.filter( item => item.bVisible && item.sControlName.includes("BtnRight.") ); if (!searchField && !btnRightConfig.length) return ""; const { app, form, sModelsId, searchValue } = props; let showTypeProps = {}; if (commonUtils.isNotEmptyObject(searchField)) { if (sModelsId === "12710101117203990977610") { const { gdsconfigformslave } = config; const workOrderConfig = gdsconfigformslave.filter( item => item.sName === "sWorkOrderNo" ); searchField.placeholder = workOrderConfig[0].showName; } else { searchField.placeholder = searchField.showName; } if (searchField.sName.substring(0, 1) == "t") { searchField.sDateFormat = "YYYY-MM-DD"; } showTypeProps = { app, record: {}, sId: searchField.sId /* 修改当前编号(数据格式:字符串) */, name: "slave", form, formId: sModelsId, getFloatNum: props.getFloatNum, onChange: props.onSearchValueChange, showConfig: searchField, formItemLayout: {}, textArea: false, enabled: true, dataValue: searchValue, bTable: true, getSqlDropDownData: props.getSqlDropDownData, getSqlCondition: props.getSqlCondition, handleSqlDropDownNewRecord: props.handleSqlDropDownNewRecord, // getFloatNum: props.getFloatNum, formRoute: props.formRoute, getDateFormat: props.getDateFormat, bNoMesBlue: true }; if (props.sName === "slaveWyrj1") { showTypeProps.componentStyle = { width: 180 }; } } let searchProductProps = {}; const searchProductConfig = gdsconfigformslave.filter( item => item.sName === "sSearchProductName" ); if (commonUtils.isNotEmptyArr(searchProductConfig)) { searchProductConfig[0].placeholder = searchProductConfig[0].showName; searchProductProps = { app, key: props.refreshMachineDataFlag || "1221", record: {}, sId: searchField.sId /* 修改当前编号(数据格式:字符串) */, name: "slave", form, formId: sModelsId, getFloatNum: props.getFloatNum, onChange: (...args) => { props.onSearchProductNameChange(args[0], args[1], args[2]); }, showConfig: searchProductConfig[0], formItemLayout: {}, textArea: false, enabled: true, dataValue: props.productNameValue, bTable: true, getSqlDropDownData: props.getSqlDropDownData, getSqlCondition: props.getSqlCondition, handleSqlDropDownNewRecord: props.handleSqlDropDownNewRecord, // getFloatNum: props.getFloatNum, formRoute: props.formRoute, getDateFormat: props.getDateFormat, bNoMesBlue: true, getDefaultDropDownData: result => { const { dropDownData = [] } = result; if (!dropDownData.length) return; const { sName, [`${sName}Data`]: tableData = [] } = props; let iIndex = 0; const tableLength = tableData.length; if (tableLength) { iIndex = dropDownData.findIndex( item => item.sProductId === tableData[tableLength - 1].sProductId ); iIndex = iIndex === -1 ? 0 : iIndex; } const changeData = dropDownData[iIndex]; const { sAssignField, bCanInput, sName: sName1 } = searchProductConfig[0]; const returnValue = {}; if (!commonUtils.isEmpty(sAssignField)) { /* 赋值数组 */ const sAssignFieldObj = sAssignField.split(","); if (commonUtils.isNotEmptyObject(changeData)) { for (const child of sAssignFieldObj) { if (child.indexOf(":") > -1) { const sFieldName = child.split(":")[0].trim() === "self" ? sName1 : child.split(":")[0].trim(); const sValueName = child.split(":")[1].trim(); returnValue[sFieldName] = changeData[sValueName] === 0 ? 0 : changeData[sValueName] || changeData.value; } } } else if (!bCanInput) { // 下拉选择空时,需要, bCanInput一定要为false不然印件名称输入时也被置空了 for (const child of sAssignFieldObj) { if (child.indexOf(":") > -1) { const sFieldName = child.split(":")[0].trim() === "self" ? sName1 : child.split(":")[0].trim(); returnValue[sFieldName] = ""; } } } } props.onSearchProductNameChange( "slave", "sSearchProductName", returnValue, !!tableLength ); } }; if (props.sName === "slaveWyrj1") { searchProductProps.componentStyle = { width: 230 }; } } const handleBtnSearch = () => { const { sModelsId } = props; const bExactMatch = searchField.sControlName ?.toLowerCase() .includes("exactmatch"); let bFilter; // 标签补打 单独搜索工单号 托盘号使用表格中的小搜索 if (sModelsId === "12710101117203990977610") { bFilter = searchValue !== undefined && searchValue !== "" ? [ { bFilterCondition: bExactMatch ? "=" : "like", bFilterName: "sWorkOrderNo", bFilterValue: searchValue } ] : undefined; } else { bFilter = searchValue !== undefined && searchValue !== "" ? [ { bFilterCondition: bExactMatch ? "=" : "like", bFilterName: searchField.sName, bFilterValue: searchValue } ] : undefined; } props.onSaveState({ [`${sName}SelectedBtn`]: undefined, [`${sName}Filter`]: bFilter, refreshTableList: [sName] }); }; if ( !btnLeftConfig.length && !btnRightConfig.length && commonUtils.isEmptyObject(searchField) && !config?.gdsconfigformslave?.find(item => item.sControlName === "ScanCode") ) { return ""; } const btnSearch = commonFunc.showLocalMessage(props, 'BtnSearch', '查询'); return (
{btnLeftConfig.map(item => { if (item.showName === "扫码上料") { return ( ) } ] }} placement="bottom" >
···
); } return ( ); })}
{Object.keys(searchProductProps).length > 0 ? ( ) : ( "" )} {btnRightConfig.map(item => { // 整体下班 if (item.sControlName === 'BtnRight.EndWork') { const btnProps = props.onGetBtnPropps(item, searchField); if (!btnProps.disabled) { return ( ); } } return ( ); })} {!belongsToForm && commonUtils.isNotEmptyObject(searchField) && ( <> )}
); }; // 生产执行-胶印条形码 const BarcodeComponent = props => { const { sName, [`${sName}Config`]: config } = props; // 如果配置了扫码指令,才会显示条形码框 const scanCodeConfig = config?.gdsconfigformslave?.find( item => item.sControlName === "ScanCode" ); // 扫码指令(手动输入) const scanCode1Config = config?.gdsconfigformslave?.find( item => item.sControlName === "ScanCode1" ); if (!scanCodeConfig) return ""; const [value, setValue] = useState(""); const scanEventTime = useRef(-1); // 执行扫码枪指令 const handleScanCodeInstructs = (value, bCostom) => { scanEventTime.current = -1; // 获取当前工单信息数据 const currentWorkOrderInfo = commonUtils.convertStrToObj( localStorage.xlybusinessglobalData ).currentWorkOrderInfo; const valueNew = bCostom && currentWorkOrderInfo?.sWorkOrderNo ? `${currentWorkOrderInfo.sWorkOrderNo}-${value}` : value; const btnConfig = bCostom && scanCode1Config ? scanCode1Config : scanCodeConfig; const { gdsconfigformslave } = config; const searchProductConfig = gdsconfigformslave.filter( item => item.sName === "sSearchProductName" ); props.onExecInstructSet({ btnConfig, nextProps: { scanCodeData: [{ value: valueNew }] }, callback: () => { if (commonUtils.isNotEmptyArr(searchProductConfig)) { props.onSaveState({ refreshMachineDataFlag: new Date().getTime(), productionTableList: [sName] }); } } // inscallback: nextProps => { // if (commonUtils.isNotEmptyArr(searchProductConfig)) { // const { machinedataData } = nextProps; // if (commonUtils.isNotEmptyArr(machinedataData)) { // const { // sProductId, // sProductNo, // sSearchProductId = sProductId, // sSearchProductNo = sProductNo // } = machinedataData[0]; // nextProps.onSaveState( // { // workOrderInfoData: machinedataData, // sSearchProductId: sSearchProductId // }, // nextPropsNew => { // props.onSearchProductNameChange( // "", // "", // { // sSearchProductId, // sSearchProductNo // }, // true // ); // } // ); // } // } // } }); }; // 判断是否扫码枪输入 const isScannerInput = event => { const thresholdMs = 50; // 扫码枪输入间隔时间阈值(毫秒) const lastInputTime = event.timeStamp; if (!event.repeat) { if (!("lastInputTime" in window)) { window.lastInputTime = lastInputTime; scanEventTime.current = 0; return false; } const timeDiff = lastInputTime - window.lastInputTime; window.lastInputTime = lastInputTime; if (timeDiff <= thresholdMs) { scanEventTime.current += 1; return true; } } scanEventTime.current = 0; return false; }; const timer = useRef(null); // const timerNew = useRef(null); useEffect( () => { if (value === "") return; // 10s后清空数据 clearTimeout(timer.current); timer.current = setTimeout(() => { setValue(""); }, 10000); // 扫码枪扫码后出发事件 // clearTimeout(timerNew.current); // timerNew.current = setTimeout(() => { // if (scanEventTime.current > 5) { // handleScanCodeInstructs(value); // } // }, 100); }, [value] ); const scannedData = useRef(""); const scannedDataTimer = useRef(null); useEffect(() => { const keypressEvent = event => { if ( ["textarea", "input"].includes( document.activeElement.tagName.toLowerCase() ) ) return; if (document.activeElement.tagName.toLowerCase() === "button") { document.querySelectorAll("button").forEach(btn => { btn.blur(); }); } // 获取按键的字符值 const keyValue = event.key; // 检查是否为可打印字符 if (keyValue.length === 1) { // 添加到已扫描的数据字符串 scannedData.current += keyValue; } else if (event.key === "Enter") { // 如果扫码枪以回车键结束,则处理已扫描的数据 setValue(scannedData.current); handleScanCodeInstructs(scannedData.current, false); // 清空已扫描的数据 scannedData.current = ""; } clearTimeout(scannedDataTimer.current); scannedDataTimer.current = setTimeout(() => { scannedData.current = ""; }, 200); }; // 监听 keypress 事件 document.body.addEventListener("keypress", keypressEvent); return () => { // 在组件卸载时移除事件监听 document.body.removeEventListener("keypress", keypressEvent); }; }, []); return (
{ if (value && scanEventTime.current === -1) { setValue(event.target.value[event.target.value.length - 1]); isScannerInput(event); } else { isScannerInput(event); setValue(event.target.value); } }} onPressEnter={() => { handleScanCodeInstructs(value, scanEventTime.current < 5); }} suffix={ } />
); }; // 扫码上料弹窗 const ScanCodeToLoadMaterials = props => { const { scanCodeModalVisible, sName, scanCodeModalData = [] } = props; if (!scanCodeModalVisible) return ""; const { [`${sName}Config`]: configOld = {} } = props; const config = JSON.parse(JSON.stringify(configOld)); config.bisMutiSelect = false; config.gdsconfigformslave?.forEach(item => { if (!["sBoardName", "sIndexNo"].includes(item.sName)) { item.bVisible = false; } else { item.iFitWidth = 220; } }); config.gdsconfigformslave?.unshift({ sName: "iRowNum", showName: "#", bVisible: true, iFitWidth: 80 }); const headerColumn = commonFunc.getHeaderConfig(config); const baseProps = commonBusiness.getTableTypes(sName, props); const tableProps = { ...baseProps, name: "scanCodeModal", config, headerColumn, data: scanCodeModalData, tableBtnsConfig: [{ showName: "撤销", btnBgColor: "#faad14" }], onTableBtnClick: params => { const { index } = params; const data = [...scanCodeModalData]; data.splice(index, 1); props.onSaveState({ scanCodeModalData: data }); } }; const handleCancel = () => { props.setScanCodeModalVisible(false); }; const okConfig = config.gdsconfigformslave.find( item => item.sControlName === "ScanCodeModalOk" ); const handleOk = () => { props.onExecInstructSet({ btnConfig: okConfig }); props.setScanCodeModalVisible(false); }; const [value, setValue] = useState(""); const [valueNew, setValueNew] = useState(""); const inputRef = useRef(null); const timer = useRef(null); const tempFirstValue = useRef(""); const bHover = useRef(false); // 执行扫码枪指令 const scanCodeConfig = config.gdsconfigformslave.find( item => item.sControlName === "ScanCodeModal" ); const handleScanCodeInstructs = value => { const data = [...scanCodeModalData]; data.push({ sId: commonUtils.createSid(), sBoardName: data.length }); props.onSaveState({ scanCodeModalData: data }); props.onExecInstructSet({ btnConfig: scanCodeConfig, nextProps: { scanCodeData: [{ value }] } }); }; // 判断是否扫码枪输入 const isScannerInput = event => { const thresholdMs = 50; // 扫码枪输入间隔时间阈值(毫秒) const lastInputTime = event.timeStamp; if (!event.repeat) { if (!("lastInputTime" in window)) { window.lastInputTime = lastInputTime; return false; } const timeDiff = lastInputTime - window.lastInputTime; window.lastInputTime = lastInputTime; if (timeDiff <= thresholdMs) { return true; } } return false; }; useEffect(() => { if (!inputRef.current) return; const keydownFunc = event => { if (!bHover.current) return; let { key } = event; if (isScannerInput(event)) { if (event.keyCode !== 13 && key.length === 1) { if (tempFirstValue.current !== "") { key = tempFirstValue.current + key; tempFirstValue.current = ""; } setValue(pre => pre + key); } } else { tempFirstValue.current = key; if (value.length < 3) { setValue(""); } } }; document.addEventListener("keydown", keydownFunc); return () => { document.removeEventListener("keydown", keydownFunc); }; }, []); useEffect( () => { if (value === "") return; clearTimeout(timer.current); timer.current = setTimeout(() => { if (value.length < 3) { setValue(""); } else { setValueNew(value); setValue(""); handleScanCodeInstructs(value); } }, 500); }, [value] ); // 10s后清空数据 const timerNew = useRef(null); useEffect( () => { if (valueNew === "") return; clearTimeout(timerNew.current); timerNew.current = setTimeout(() => { setValueNew(""); }, 10000); }, [valueNew] ); return ( } onCancel={handleCancel} >
{ bHover.current = true; }} onBlur={() => { bHover.current = false; }} // onPressEnter={() => { // handleScanCodeInstructs(); // }} ref={inputRef} />
); }; export default CommonOperationBarComponent;