Commit 2301ee406eb50dd09fd2fd07ca848ea89d937fe1

Authored by Min
1 parent 10463348

1.增加项目资料一键下载功能,项目合同、项目实施 都有可能传附件,需要将项目相关上传的文件 一键下载成一个压缩包

2.消息点击待办跳转到研发工单,发现研发工单审批流没有右边 转办 同意 这个栏
3.系统修改按钮返回-1时,代表禁止修改,则按钮状态返回修改前的状态,界面不可编辑
4.修复keyUp调用extractTableNames报错
src/components/Common/ToolBar/ToolBarNew.js
@@ -400,7 +400,7 @@ class ToolBarComponent extends Component { @@ -400,7 +400,7 @@ class ToolBarComponent extends Component {
400 bShown = statusObj.bShown; 400 bShown = statusObj.bShown;
401 } 401 }
402 402
403 - let { masterData, formRoute } = this.props; 403 + let { masterData, formRoute, enabled } = this.props;
404 404
405 // 主表数据是当前表格已选中数据 405 // 主表数据是当前表格已选中数据
406 if (formRoute === "/indexPage/commonListLeft") { 406 if (formRoute === "/indexPage/commonListLeft") {
@@ -411,7 +411,8 @@ class ToolBarComponent extends Component { @@ -411,7 +411,8 @@ class ToolBarComponent extends Component {
411 } 411 }
412 412
413 const { sortEnabled } = this.props; 413 const { sortEnabled } = this.props;
414 - const { enabled, adDisabled, sModelsType, masterConfig, activeKey, sModelsId } = this.props; 414 + const { sUseInfo, adDisabled, sModelsType, masterConfig, activeKey, sModelsId } = this.props;
  415 +
415 if (commonUtils.isEmptyObject(masterData)) { 416 if (commonUtils.isEmptyObject(masterData)) {
416 masterData = {}; 417 masterData = {};
417 } 418 }
@@ -425,6 +426,9 @@ class ToolBarComponent extends Component { @@ -425,6 +426,9 @@ class ToolBarComponent extends Component {
425 } else { 426 } else {
426 bBtnCheck = false; 427 bBtnCheck = false;
427 } 428 }
  429 + if(commonUtils.isNotEmptyObject(sUseInfo)) {
  430 + enabled = false;
  431 + }
428 if (location.pathname === "/indexPage/commonClassify") { 432 if (location.pathname === "/indexPage/commonClassify") {
429 /* 通用分类 若配置没有审核按钮 则默认bCheck不为空 */ 433 /* 通用分类 若配置没有审核按钮 则默认bCheck不为空 */
430 if (iIndex === -1) { 434 if (iIndex === -1) {
@@ -2254,6 +2258,45 @@ class ToolBarComponent extends Component { @@ -2254,6 +2258,45 @@ class ToolBarComponent extends Component {
2254 this.props.onSaveState({ 2258 this.props.onSaveState({
2255 visibleFilfile: true, 2259 visibleFilfile: true,
2256 }); 2260 });
  2261 + }else if (key.indexOf("BtnDownloadBacth") > -1) {
  2262 + /* 一键下载功能 */
  2263 + const { slaveSelectedRowKeys, slaveData, app } = this.props;
  2264 +
  2265 + // 检查是否选中数据
  2266 + if (commonUtils.isEmptyArr(slaveSelectedRowKeys)) {
  2267 + message.warning("请先选择数据");
  2268 + return;
  2269 + }
  2270 +
  2271 + // 获取选中数据的文件路径
  2272 + const savePathArr = [];
  2273 + const dataSelect = slaveData.filter(item => slaveSelectedRowKeys.includes(item.sSlaveId) || slaveSelectedRowKeys.includes(item.sId));
  2274 +
  2275 + if (commonUtils.isNotEmptyArr(dataSelect)) {
  2276 + dataSelect.forEach(item => {
  2277 + // 假设文件路径字段为sFilePath,根据实际数据结构调整
  2278 + if (item.sPicturePath) {
  2279 + savePathArr.push(item.sPicturePath);
  2280 + }
  2281 + });
  2282 + }
  2283 +
  2284 + // 如果没有找到文件路径,提示用户
  2285 + if (commonUtils.isEmptyArr(savePathArr)) {
  2286 + message.warning("选中的数据没有文件路径");
  2287 + return;
  2288 + }
  2289 +
  2290 + // 获取菜单名称作为压缩包文件名
  2291 + const menuName = commonUtils.isNotEmptyArr(dataSelect) ? dataSelect[0].sZipFileName : '下载文件';
  2292 + const savePathStr = savePathArr.join(",");
  2293 + // savePathStr = 'D:/xlyweberp/printPreviewPdf/192116811110017394976081060_采购订单_标准A4_CGDD25020036.xlsx,D:/xlyweberp/printPreviewPdf/19211681211917497873921861_估价单.pdf';
  2294 + const zipFileName = `${menuName}`;
  2295 +
  2296 + // 调用下载接口
  2297 + const downloadUrl = `${commonConfig.file_host}file/downloadBacth`;
  2298 + this.handleOpenPostBatch(downloadUrl, savePathStr, zipFileName);
  2299 +
2257 } else if (key.indexOf("BtnEvent") > -1 || key.indexOf("BtnBatchSubmit") > -1 || key.indexOf("BtnSubmit") > -1) { 2300 } else if (key.indexOf("BtnEvent") > -1 || key.indexOf("BtnBatchSubmit") > -1 || key.indexOf("BtnSubmit") > -1) {
2258 const { 2301 const {
2259 slaveSelectedRowKeys, 2302 slaveSelectedRowKeys,
@@ -2691,7 +2734,20 @@ class ToolBarComponent extends Component { @@ -2691,7 +2734,20 @@ class ToolBarComponent extends Component {
2691 callback(); 2734 callback();
2692 } 2735 }
2693 }; 2736 };
2694 - 2737 +// 在handleOpenPost方法后添加批量下载方法
  2738 + handleOpenPostBatch = (url, savePathStr, zipFileName) => {
  2739 + console.log('222', {url, savePathStr, zipFileName})
  2740 + const newWin = window.open();
  2741 + let formStr = "";
  2742 + formStr =
  2743 + `<form style="visibility:hidden;" method="POST" action="${url}">` +
  2744 + `<input type="hidden" name="savePathStr" value='${savePathStr}' />` +
  2745 + `<input type="hidden" name="zipFileName" value='${zipFileName}' />` +
  2746 + "</form>";
  2747 + newWin.document.body.innerHTML = formStr;
  2748 + newWin.document.forms[0].submit();
  2749 + return newWin;
  2750 + };
2695 handleSubmit = () => { 2751 handleSubmit = () => {
2696 // 保存前手机号、邮箱校验 2752 // 保存前手机号、邮箱校验
2697 let checkResult = true; 2753 let checkResult = true;
src/components/Common/commonBusiness.js
@@ -994,7 +994,7 @@ export function getCalculateMoneyByLossMoney(app, type, masterData, tableDataRow @@ -994,7 +994,7 @@ export function getCalculateMoneyByLossMoney(app, type, masterData, tableDataRow
994 return tableDataRow; 994 return tableDataRow;
995 } 995 }
996 996
997 -export function extractTableNames(expression) { 997 +export function extractTableNames1(expression) {
998 // 1. 定义需要识别的表名列表(与tableSelectedData的key一一对应) 998 // 1. 定义需要识别的表名列表(与tableSelectedData的key一一对应)
999 const targetTables = ['master', 'slave', 'control', 'materialsRow', 'processRow', 'slaveChildRow']; 999 const targetTables = ['master', 'slave', 'control', 'materialsRow', 'processRow', 'slaveChildRow'];
1000 1000
@@ -1040,6 +1040,37 @@ function formatTableData(originObj) { @@ -1040,6 +1040,37 @@ function formatTableData(originObj) {
1040 return newObj; 1040 return newObj;
1041 } 1041 }
1042 1042
  1043 +
  1044 +/**
  1045 + * 从字段表达式中提取表名
  1046 + * @param {string} sAssignField - 字段表达式,如 "control.dSumMachineQty"
  1047 + * @returns {string[]} 提取的表名数组
  1048 + */
  1049 +export function extractTableNames(sAssignField) {
  1050 + const targetTables = ['master', 'slave', 'control', 'materialsRow', 'processRow', 'slaveChildRow'];
  1051 +
  1052 + // 入参校验:非字符串直接返回空数组
  1053 + if (typeof sAssignField !== 'string' || sAssignField.trim() === '') {
  1054 + return [];
  1055 + }
  1056 +
  1057 + // 2. 构建正则:匹配「表名.任意属性」的格式(仅捕获表名)
  1058 + const tableNamePattern = targetTables.join('|');
  1059 + // \b 确保表名是独立单词(避免匹配control123这种)
  1060 + // 正则匹配:master/slave/control等 + 点号 + 任意属性名
  1061 + const regex = new RegExp (`\\b(${tableNamePattern})\\.\\w+`, 'g');
  1062 +
  1063 + // 3. 匹配所有符合规则的片段,提取表名
  1064 + const matches = sAssignField.match(regex) || [];
  1065 + const tableNames = matches.map(match => {
  1066 + // 拆分 "control.dSumMachineQty" → 取前面的表名部分
  1067 + return match.split('.')[0];
  1068 + });
  1069 +
  1070 + // 4. 去重并返回纯表名数组
  1071 + return [...new Set (tableNames)];
  1072 +}
  1073 +
1043 /* 自定义onChange事件 */ 1074 /* 自定义onChange事件 */
1044 export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRow, isWait, dataCollection, dataSelected, app) { 1075 export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDataRow, isWait, dataCollection, dataSelected, app) {
1045 let tableDataRowNew = {}; 1076 let tableDataRowNew = {};
@@ -1500,7 +1531,7 @@ export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDa @@ -1500,7 +1531,7 @@ export function getKeyUpEvent(name, sFieldName, tableConfig, masterData, tableDa
1500 || sAssignField?.includes('process.') 1531 || sAssignField?.includes('process.')
1501 || sAssignField?.includes('master.')); 1532 || sAssignField?.includes('master.'));
1502 1533
1503 - const tableNames = this.extractTableNames(sAssignField); 1534 + const tableNames = extractTableNames(sAssignField);
1504 // 生成新的tableSelectedData 1535 // 生成新的tableSelectedData
1505 const newTableSelectedMap = formatTableData(dataSelected); 1536 const newTableSelectedMap = formatTableData(dataSelected);
1506 const datasetMap = bCrossTable ? newTableSelectedMap : newCopyTo; 1537 const datasetMap = bCrossTable ? newTableSelectedMap : newCopyTo;
src/components/IndexCenter/IndexCenter.js
@@ -810,16 +810,20 @@ class IndexCenter extends Component { @@ -810,16 +810,20 @@ class IndexCenter extends Component {
810 <div> 810 <div>
811 <Button id="btnOpenDetail" style={{ display: 'none' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>待办</Button> 811 <Button id="btnOpenDetail" style={{ display: 'none' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>待办</Button>
812 <Button id="btnOpenDetailHand" style={{ display: 'none' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>办理</Button> 812 <Button id="btnOpenDetailHand" style={{ display: 'none' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>办理</Button>
813 - {/*<input id="sFormId" value="12710101117015057281870" style={{ width:'300px', display: ' block' }} />*/}  
814 - {/*<input id="sBillId" value="17363836790006274411376581212000" style={{ width:'300px', display: 'block' }} />*/}  
815 - {/*<Input id="sFormId" placeholder="12710101117015057281870" style={{ width:'300px', display: ' block' }} />*/}  
816 - {/*<Input id="sBillId" placeholder="17363836790006274411376581212000" style={{ width:'300px', display: 'block' }} />*/}  
817 <input id="sFormId" value="" style={{ display: ' none' }} /> 813 <input id="sFormId" value="" style={{ display: ' none' }} />
818 <input id="sBillId" value="" style={{ display: ' none' }} /> 814 <input id="sBillId" value="" style={{ display: ' none' }} />
819 - {/*<input id="sFormId" value="12012615914116395420093200" style={{ width:'300px', display: ' block' }} />*/}  
820 - {/*<input id="sBillId" value="17349248560001229998153008542200" style={{ width:'300px', display: ' block' }} />*/}  
821 <input id="bFlow" value="" style={{ width: '300px', display: 'none' }} /> 815 <input id="bFlow" value="" style={{ width: '300px', display: 'none' }} />
822 <textarea id='sFlowData' rows="10" cols="30" style={{ width: '300px', display: 'none' }} /> 816 <textarea id='sFlowData' rows="10" cols="30" style={{ width: '300px', display: 'none' }} />
  817 +
  818 + {/*<Button id="btnOpenDetail" style={{ display: 'block' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>待办</Button>*/}
  819 + {/*<Button id="btnOpenDetailHand" style={{ display: 'block' }} type="primary" icon={<BankOutlined />} loading={loadings} onClick={() => this.handleOpenTab('', '')}>办理</Button>*/}
  820 +
  821 + {/*<input id="sFormId" value="12710101117014147688950" style={{ display: ' block' }} />*/}
  822 + {/*<input id="sBillId" value="17657164930008384898449554260000" style={{ display: ' block' }} />*/}
  823 +
  824 + {/*<input id="bFlow" value="true" style={{ width: '300px', display: 'block' }} />*/}
  825 + {/*<textarea id='sFlowData' rows="10" cols="30" style={{ width: '300px', display: 'block' }} />*/}
  826 +
823 {/* eslint-disable-next-line jsx-a11y/iframe-has-title */} 827 {/* eslint-disable-next-line jsx-a11y/iframe-has-title */}
824 <iframe id="iframe1" src={iframeUrl} style={{ width: '100%', height: '85vh' }} frameBorder="0" /> 828 <iframe id="iframe1" src={iframeUrl} style={{ width: '100%', height: '85vh' }} frameBorder="0" />
825 </div> : 829 </div> :
src/components/Manufacture/CommonPackEvent.js
@@ -1231,34 +1231,34 @@ const CommonPackEvent = props =&gt; { @@ -1231,34 +1231,34 @@ const CommonPackEvent = props =&gt; {
1231 1231
1232 const CommonModal = props => { 1232 const CommonModal = props => {
1233 return ( 1233 return (
1234 - <>  
1235 - /** 工艺指导书弹窗组件 */  
1236 - <PartsInfoModal {...props} />  
1237 - /** 选择工序弹窗组件 */  
1238 - <ProcessChooseModal {...props} />  
1239 - /** 选择成品工序弹窗组件 */  
1240 - <ProductProcessChooseModal {...props} />  
1241 - /** 选择成品材料弹窗组件 */  
1242 - <ProductMaterialsChooseModal {...props} />  
1243 - /** 选择材料弹窗组件 */  
1244 - <MaterialsChooseModal {...props} />  
1245 - /** 选择工艺参数弹窗(旧) */  
1246 - <ParamsChooseModal {...props} />  
1247 - /** 选择工艺参数弹窗(新) */  
1248 - <ParamsChooseNewModal {...props} />  
1249 - /* 选择合版部件弹窗 */  
1250 - <CombinePartsChooseModal {...props} />  
1251 - /* 部件行选择合版信息弹窗 */  
1252 - <ProductCombinationModal {...props} />  
1253 - /* 复制从弹窗 */  
1254 - <CopyFromModal {...props} />  
1255 - /* Ctrl+R全部更新弹窗 */  
1256 - <ModifyAllModal {...props} />  
1257 - /* 工作流弹窗 */  
1258 - <WorkFlowModal {...props} />  
1259 - /* 选择色序弹窗 */  
1260 - <SisColorModal {...props} />  
1261 - </> 1234 + <div>
  1235 + {/* 工艺指导书弹窗组件 */}
  1236 + <PartsInfoModal {...props} />
  1237 + {/* 选择工序弹窗组件 */}
  1238 + <ProcessChooseModal {...props} />
  1239 + {/* 选择成品工序弹窗组件 */}
  1240 + <ProductProcessChooseModal {...props} />
  1241 + {/* 选择成品材料弹窗组件 */}
  1242 + <ProductMaterialsChooseModal {...props} />
  1243 + {/* 选择材料弹窗组件 */}
  1244 + <MaterialsChooseModal {...props} />
  1245 + {/* 选择工艺参数弹窗(旧) */}
  1246 + <ParamsChooseModal {...props} />
  1247 + {/* 选择工艺参数弹窗(新) */}
  1248 + <ParamsChooseNewModal {...props} />
  1249 + {/* 选择合版部件弹窗 */}
  1250 + <CombinePartsChooseModal {...props} />
  1251 + {/* 部件行选择合版信息弹窗 */}
  1252 + <ProductCombinationModal {...props} />
  1253 + {/* 复制从弹窗 */}
  1254 + <CopyFromModal {...props} />
  1255 + {/* Ctrl+R全部更新弹窗 */}
  1256 + <ModifyAllModal {...props} />
  1257 + {/* 工作流弹窗 */}
  1258 + <WorkFlowModal {...props} />
  1259 + {/* 选择色序弹窗 */}
  1260 + <SisColorModal {...props} />
  1261 + </div>
1262 ); 1262 );
1263 }; 1263 };
1264 1264
src/components/Manufacture/WorkOrderPackTableTreeNew/index.js
@@ -18,6 +18,7 @@ import StaticEditTable from &quot;@/components/Common/CommonTable&quot;; @@ -18,6 +18,7 @@ import StaticEditTable from &quot;@/components/Common/CommonTable&quot;;
18 import CommonViewDragable from "@/components/Common/CommonViewDragable"; 18 import CommonViewDragable from "@/components/Common/CommonViewDragable";
19 import AntdDraggableModal from "@/components/Common/AntdDraggableModal"; 19 import AntdDraggableModal from "@/components/Common/AntdDraggableModal";
20 import styles from "./index.less"; 20 import styles from "./index.less";
  21 +import CommonExamInfo from "../../Common/CommonExamInfo";
21 22
22 const { Panel } = Collapse; 23 const { Panel } = Collapse;
23 24
@@ -4081,17 +4082,25 @@ const WorkOrderPackTableTreeNewComponent = Form.create({ @@ -4081,17 +4082,25 @@ const WorkOrderPackTableTreeNewComponent = Form.create({
4081 if (!props.currentForm) { 4082 if (!props.currentForm) {
4082 props.setForm(props.form); 4083 props.setForm(props.form);
4083 } 4084 }
4084 - 4085 + const { currentPane } = props.app;
  4086 + const bFlow = true ; /* 是否需要展示审批流程信息 */
4085 return ( 4087 return (
4086 - <div className={`xly-workorder-list ${styles.WorkOrderPackTableTreeNew}`}> 4088 + <div className={`xly-workorder-list ${styles.WorkOrderPackTableTreeNew}`} style={{ display: bFlow ? 'flex':'block' }} >
4087 <ToolBarComponent {...props} /> 4089 <ToolBarComponent {...props} />
4088 - <div className={styles.content}> 4090 + <div className={styles.content} style={{ width: bFlow ? '75%':'100%' }}>
4089 <AvatarComponent {...props} /> 4091 <AvatarComponent {...props} />
4090 <MasterComponent {...props} /> 4092 <MasterComponent {...props} />
4091 <SlaveComponent {...props} /> 4093 <SlaveComponent {...props} />
4092 <ControlComponent {...props} /> 4094 <ControlComponent {...props} />
4093 <OtherComponent {...props} /> 4095 <OtherComponent {...props} />
4094 </div> 4096 </div>
  4097 + {
  4098 + bFlow ?
  4099 + <div id='examInfo' style={{ float:'left', width:'25%', textAlign:'center', height:'900px', maxHeight: 'calc(100vh - 130px)' , backgroundColor:'#f0f0f0'}}>
  4100 + <CommonExamInfo {...props} />
  4101 + </div>
  4102 + : ''
  4103 + }
4095 <CommonModal {...props} /> 4104 <CommonModal {...props} />
4096 </div> 4105 </div>
4097 ); 4106 );