Commit 13928607c2e96de05c6414b5a3db9f8b21b18755

Authored by
1 parent c0409581

fix: 修复利润分析表下载bug,优化搜索全选效果,修正搜索复选bug

src/views/project/config/index.vue
... ... @@ -18,19 +18,19 @@
18 18 <Tabs.TabPane key="4" tab="邮件发送配置" v-if="role !== ROLE.FINANCE"
19 19 ><EmailPanel
20 20 /></Tabs.TabPane>
21   - <Tabs.TabPane key="5" tab="最后汇款日期">
  21 + <Tabs.TabPane key="5" tab="最后汇款日期" v-if="role !== ROLE.FINANCE">
22 22 <TablePanel :searchInfo="{ relationCode: 'orderHodTime' }" :column="5" />
23 23 </Tabs.TabPane>
24   - <Tabs.TabPane key="6" tab="提成成本配置">
  24 + <Tabs.TabPane key="6" tab="提成成本配置" v-if="role !== ROLE.FINANCE">
25 25 <TablePanel :searchInfo="{ relationCode: 'costSettingItem', relationName: currentYear }" :column="6" />
26 26 </Tabs.TabPane>
27 27 <Tabs.TabPane key="7" tab="销售额配置" v-if="role !== ROLE.FINANCE">
28 28 <TablePanel :searchInfo="{ relationCode: 'salesAmount' }" :column="7" />
29 29 </Tabs.TabPane>
30   - <Tabs.TabPane key="8" tab="生产科应付日期">
  30 + <Tabs.TabPane key="8" tab="生产科应付日期" v-if="role !== ROLE.FINANCE">
31 31 <TablePanel :searchInfo="{ relationCode: 'produHodTime' }" :column="8" />
32 32 </Tabs.TabPane>
33   - <Tabs.TabPane key="9" tab="生产科固定成本">
  33 + <Tabs.TabPane key="9" tab="生产科固定成本" v-if="role !== ROLE.FINANCE">
34 34 <TablePanel :searchInfo="{ relationCode: 'ProduceSettingItem', relationName: currentYear }" :column="9" />
35 35 </Tabs.TabPane>
36 36 <Tabs.TabPane key="10" tab="客户公司" v-if="role !== ROLE.FINANCE">
... ...
src/views/project/finance/financeList/index.vue
... ... @@ -25,7 +25,7 @@
25 25 <a-button
26 26 type="primary"
27 27 danger
28   - v-if="role == ROLE.ADMIN || role == ROLE.FINANCE"
  28 + v-if="role == ROLE.ADMIN"
29 29 :style="{ borderRadius: '5px 5px 5px 5px' }"
30 30 >
31 31 设置为已完成
... ...
src/views/project/finance/financeProfit/ProductProfit/InnerData/index.vue
1 1 <template>
2 2 <div>
3   - <BasicTable @register="registerTable" :bordered="true">
  3 + <BasicTable @register="registerTable" :bordered="true" @field-value-change="handleFieldValueChange">
4 4 <template #headerTop>
5 5 <a-alert type="info" show-icon>
6 6 <template #message>
... ... @@ -116,11 +116,47 @@
116 116 message.value = '';
117 117 }
118 118 };
119   - const [registerTable, { reload, setSelectedRowKeys, getForm, setProps }] = useTable({
  119 + const [registerTable, { reload, getSelectRowKeys, getDataSource, setSelectedRowKeys, setProps, getForm }] = useTable({
  120 + title: '',
120 121 api: getInnerProfit,
121 122 bordered: true,
122 123 columns: COLUMNS,
123 124 rowKey: 'orderId',
  125 + formConfig: {
  126 + labelWidth: 120,
  127 + schemas: searchFormSchema,
  128 + autoSubmitOnEnter: true,
  129 + resetFunc: async () => {
  130 + localStorage.removeItem('isAllSelected');
  131 + },
  132 + },
  133 + // 处理查询参数,确保项目号数组正确传递
  134 + handleSearchInfoFn: (searchInfo) => {
  135 + // 获取表单实例
  136 + const formInstance = getForm();
  137 + if (formInstance) {
  138 + const formValues = formInstance.getFieldsValue();
  139 +
  140 + // 强制覆盖searchInfo,确保使用表单中的值
  141 + if (formValues.projectNo && formValues.projectNo.length > 0) {
  142 + // 确保传递的是数组而不是Proxy对象,并去重
  143 + const projectNoArray = [...new Set(formValues.projectNo)];
  144 + // 强制覆盖,不使用原始值
  145 + searchInfo = {
  146 + ...searchInfo,
  147 + projectNo: projectNoArray
  148 + };
  149 + } else {
  150 + // 如果表单中没有项目号,清空查询条件
  151 + searchInfo = {
  152 + ...searchInfo,
  153 + projectNo: []
  154 + };
  155 + }
  156 + }
  157 +
  158 + return searchInfo;
  159 + },
124 160 customRow: () => {
125 161 return {
126 162 onClick: (e) => {
... ... @@ -138,11 +174,6 @@
138 174 onSelectAll: onSelectAll,
139 175 checkStrictly: true,
140 176 },
141   - formConfig: {
142   - labelWidth: 120,
143   - schemas: searchFormSchema,
144   - autoSubmitOnEnter: true,
145   - },
146 177 useSearchForm: true,
147 178 showTableSetting: true,
148 179 showIndexColumn: false,
... ... @@ -516,17 +547,9 @@
516 547 return;
517 548 }
518 549  
519   - // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
520 550 try {
521   - // 提示用户查询成功
522   - createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
523   -
524   - // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
525   - setProps({
526   - searchInfo: {
527   - projectNo: allProjectNos
528   - }
529   - });
  551 + // 提示用户全选成功
  552 + createMessage.success(`已全选 ${allProjectNos.length} 个项目号`);
530 553  
531 554 // 获取表单实例并设置表单值,将项目号填入搜索框
532 555 const formInstance = getForm();
... ... @@ -536,13 +559,36 @@
536 559 });
537 560 }
538 561  
539   - // 重新加载表格数据,回到第一页
  562 + // 将allProjectNoOptions更新为已勾选的项目号数组,这样用户取消勾选时数组会同步更新
  563 + allProjectNoOptions.value = allProjectNos.map(projectNo => ({
  564 + label: projectNo,
  565 + value: projectNo
  566 + }));
  567 +
  568 + // 标记为全选状态
  569 + localStorage.setItem('isAllSelected', 'true');
  570 + } catch (error) {
  571 + console.error('全选失败:', error);
  572 + createMessage.error('全选失败,请检查网络连接!');
  573 + }
  574 + }
  575 +
  576 + // 监听表单字段变化
  577 + function handleFieldValueChange(field: string, value: any) {
  578 + // 如果是项目号字段变化且处于全选状态,同步更新查询条件
  579 + if (field === 'projectNo' && localStorage.getItem('isAllSelected') === 'true') {
  580 + // 确保value是数组格式,并去重
  581 + const projectNoArray = Array.isArray(value) ? [...new Set(value)] : [];
  582 +
  583 + // 强制重新加载表格,使用新的查询条件
540 584 reload({
541   - page: 1
  585 + searchInfo: {
  586 + projectNo: projectNoArray
  587 + }
542 588 });
543   - } catch (error) {
544   - console.error('查询失败:', error);
545   - createMessage.error('查询失败,请检查网络连接!');
  589 +
  590 + // 同时更新detailProjectNoKeys数组
  591 + detailProjectNoKeys.value = projectNoArray;
546 592 }
547 593 }
548 594 </script>
... ...
src/views/project/finance/financeProfit/ProductProfit/InnerProduce/index.vue
1 1 <template>
2 2 <div>
3   - <BasicTable @register="registerTable" :bordered="true">
  3 + <BasicTable @register="registerTable" :bordered="true" @field-value-change="handleFieldValueChange">
4 4 <template #headerTop>
5 5 <a-alert type="info" show-icon>
6 6 <template #message>
... ... @@ -115,11 +115,47 @@
115 115 message.value = '';
116 116 }
117 117 };
118   - const [registerTable, { reload, setSelectedRowKeys, setProps, getForm }] = useTable({
  118 + const [registerTable, { reload, getSelectRowKeys, getDataSource, setSelectedRowKeys, setProps, getForm }] = useTable({
  119 + title: '',
119 120 api: getInnerProduceProfit,
120 121 bordered: true,
121 122 columns: COLUMNS,
122 123 clickToRowSelect: false,
  124 + formConfig: {
  125 + labelWidth: 120,
  126 + schemas: searchFormSchema,
  127 + autoSubmitOnEnter: true,
  128 + resetFunc: async () => {
  129 + localStorage.removeItem('isAllSelected');
  130 + },
  131 + },
  132 + // 处理查询参数,确保项目号数组正确传递
  133 + handleSearchInfoFn: (searchInfo) => {
  134 + // 获取表单实例
  135 + const formInstance = getForm();
  136 + if (formInstance) {
  137 + const formValues = formInstance.getFieldsValue();
  138 +
  139 + // 强制覆盖searchInfo,确保使用表单中的值
  140 + if (formValues.projectNo && formValues.projectNo.length > 0) {
  141 + // 确保传递的是数组而不是Proxy对象,并去重
  142 + const projectNoArray = [...new Set(formValues.projectNo)];
  143 + // 强制覆盖,不使用原始值
  144 + searchInfo = {
  145 + ...searchInfo,
  146 + projectNo: projectNoArray
  147 + };
  148 + } else {
  149 + // 如果表单中没有项目号,清空查询条件
  150 + searchInfo = {
  151 + ...searchInfo,
  152 + projectNo: []
  153 + };
  154 + }
  155 + }
  156 +
  157 + return searchInfo;
  158 + },
123 159 rowKey: (record) => record.projectNoPrefix || record.id || record.serialNumber,
124 160 rowSelection: {
125 161 type: 'checkbox',
... ... @@ -127,11 +163,6 @@
127 163 onSelect: onSelect,
128 164 onSelectAll: onSelectAll,
129 165 },
130   - formConfig: {
131   - labelWidth: 120,
132   - schemas: searchFormSchema,
133   - autoSubmitOnEnter: true,
134   - },
135 166 useSearchForm: true,
136 167 showTableSetting: true,
137 168 showIndexColumn: false,
... ... @@ -439,17 +470,9 @@
439 470 return;
440 471 }
441 472  
442   - // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
443 473 try {
444   - // 提示用户查询成功
445   - createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
446   -
447   - // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
448   - setProps({
449   - searchInfo: {
450   - projectNo: allProjectNos
451   - }
452   - });
  474 + // 提示用户全选成功
  475 + createMessage.success(`已全选 ${allProjectNos.length} 个项目号`);
453 476  
454 477 // 获取表单实例并设置表单值,将项目号填入搜索框
455 478 const formInstance = getForm();
... ... @@ -459,13 +482,36 @@
459 482 });
460 483 }
461 484  
462   - // 重新加载表格数据,回到第一页
  485 + // 将allProjectNoOptions更新为已勾选的项目号数组,这样用户取消勾选时数组会同步更新
  486 + allProjectNoOptions.value = allProjectNos.map(projectNo => ({
  487 + label: projectNo,
  488 + value: projectNo
  489 + }));
  490 +
  491 + // 标记为全选状态
  492 + localStorage.setItem('isAllSelected', 'true');
  493 + } catch (error) {
  494 + console.error('全选失败:', error);
  495 + createMessage.error('全选失败,请检查网络连接!');
  496 + }
  497 + }
  498 +
  499 + // 监听表单字段变化
  500 + function handleFieldValueChange(field: string, value: any) {
  501 + // 如果是项目号字段变化且处于全选状态,同步更新查询条件
  502 + if (field === 'projectNo' && localStorage.getItem('isAllSelected') === 'true') {
  503 + // 确保value是数组格式,并去重
  504 + const projectNoArray = Array.isArray(value) ? [...new Set(value)] : [];
  505 +
  506 + // 强制重新加载表格,使用新的查询条件
463 507 reload({
464   - page: 1
  508 + searchInfo: {
  509 + projectNo: projectNoArray
  510 + }
465 511 });
466   - } catch (error) {
467   - console.error('查询失败:', error);
468   - createMessage.error('查询失败,请检查网络连接!');
  512 +
  513 + // 同时更新detailProjectNoKeys数组
  514 + detailProjectNoKeys.value = projectNoArray;
469 515 }
470 516 }
471 517 </script>
... ...
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/index.vue
1 1 <template>
2 2 <div>
3   - <BasicTable @register="registerTable" :bordered="true">
  3 + <BasicTable @register="registerTable" :bordered="true" @field-value-change="handleFieldValueChange">
4 4 <template #headerTop>
5 5 <a-alert type="info" show-icon>
6 6 <template #message>
... ... @@ -120,16 +120,48 @@
120 120 message.value = '';
121 121 }
122 122 };
123   - const [registerTable, { reload, setSelectedRowKeys, getForm, setProps }] = useTable({
  123 + const [registerTable, { reload, getSelectRowKeys, getDataSource, setSelectedRowKeys, setProps, getForm }] = useTable({
  124 + title: '',
124 125 api: getPackageProfit,
125 126 bordered: true,
126 127 columns: COLUMNS,
127   - rowKey: (record) => record.orderId,
  128 + clickToRowSelect: false,
128 129 formConfig: {
129 130 labelWidth: 120,
130 131 schemas: searchFormSchema,
131 132 autoSubmitOnEnter: true,
  133 + resetFunc: async () => {
  134 + localStorage.removeItem('isAllSelected');
  135 + },
  136 + },
  137 + // 处理查询参数,确保项目号数组正确传递
  138 + handleSearchInfoFn: (searchInfo) => {
  139 + // 获取表单实例
  140 + const formInstance = getForm();
  141 + if (formInstance) {
  142 + const formValues = formInstance.getFieldsValue();
  143 +
  144 + // 强制覆盖searchInfo,确保使用表单中的值
  145 + if (formValues.projectNo && formValues.projectNo.length > 0) {
  146 + // 确保传递的是数组而不是Proxy对象,并去重
  147 + const projectNoArray = [...new Set(formValues.projectNo)];
  148 + // 强制覆盖,不使用原始值
  149 + searchInfo = {
  150 + ...searchInfo,
  151 + projectNo: projectNoArray
  152 + };
  153 + } else {
  154 + // 如果表单中没有项目号,清空查询条件
  155 + searchInfo = {
  156 + ...searchInfo,
  157 + projectNo: []
  158 + };
  159 + }
  160 + }
  161 +
  162 + return searchInfo;
132 163 },
  164 + rowKey: (record) => record.orderId,
133 165 // Add custom row props to prevent selection when clicking rows
134 166 customRow: () => {
135 167 return {
... ... @@ -510,17 +542,9 @@
510 542 return;
511 543 }
512 544  
513   - // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
514 545 try {
515   - // 提示用户查询成功
516   - createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
517   -
518   - // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
519   - setProps({
520   - searchInfo: {
521   - projectNo: allProjectNos
522   - }
523   - });
  546 + // 提示用户全选成功
  547 + createMessage.success(`已全选 ${allProjectNos.length} 个项目号`);
524 548  
525 549 // 获取表单实例并设置表单值,将项目号填入搜索框
526 550 const formInstance = getForm();
... ... @@ -530,13 +554,36 @@
530 554 });
531 555 }
532 556  
533   - // 重新加载表格数据,回到第一页
  557 + // 将allProjectNoOptions更新为已勾选的项目号数组,这样用户取消勾选时数组会同步更新
  558 + allProjectNoOptions.value = allProjectNos.map(projectNo => ({
  559 + label: projectNo,
  560 + value: projectNo
  561 + }));
  562 +
  563 + // 标记为全选状态
  564 + localStorage.setItem('isAllSelected', 'true');
  565 + } catch (error) {
  566 + console.error('全选失败:', error);
  567 + createMessage.error('全选失败,请检查网络连接!');
  568 + }
  569 + }
  570 +
  571 + // 监听表单字段变化
  572 + function handleFieldValueChange(field: string, value: any) {
  573 + // 如果是项目号字段变化且处于全选状态,同步更新查询条件
  574 + if (field === 'projectNo' && localStorage.getItem('isAllSelected') === 'true') {
  575 + // 确保value是数组格式,并去重
  576 + const projectNoArray = Array.isArray(value) ? [...new Set(value)] : [];
  577 +
  578 + // 强制重新加载表格,使用新的查询条件
534 579 reload({
535   - page: 1
  580 + searchInfo: {
  581 + projectNo: projectNoArray
  582 + }
536 583 });
537   - } catch (error) {
538   - console.error('查询失败:', error);
539   - createMessage.error('查询失败,请检查网络连接!');
  584 +
  585 + // 同时更新detailProjectNoKeys数组
  586 + detailProjectNoKeys.value = projectNoArray;
540 587 }
541 588 }
542 589 </script>
... ...
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/data.tsx
... ... @@ -60,7 +60,13 @@ export const searchFormSchema = [
60 60 onSearch: async (value) => {
61 61 const result = await queryNoOptions('projectNo', value);
62 62 projectNoOptions.value = result;
63   - allProjectNoOptions.value = result;
  63 + allProjectNoOptions.value = projectNoOptions.value;
  64 + },
  65 + onChange: (value) => {
  66 + // 当项目号选择变化时,更新查询条件
  67 + if (localStorage.getItem('isAllSelected') === 'true') {
  68 +
  69 + }
64 70 },
65 71 },
66 72 },
... ... @@ -322,11 +328,13 @@ export const COLUMNS = [
322 328 axios
323 329 .post(
324 330 '/basic-api/project/businessProfit/export',
325   - {}, // 请求体为空
326 331 {
327   - params: {
328   - projectNoPrefix: column.record.projectNoPrefix, // 将参数放到查询字符串中
329   - },
  332 + ProjectNo:column.record.detailProjectNo
  333 + }, // 请求体为空
  334 + {
  335 + // params: {
  336 + // projectNoPrefix: column.record.projectNoPrefix, // 将参数放到查询字符串中
  337 + // },
330 338 headers: {
331 339 Authorization: `${token}`, // 去掉引号
332 340 },
... ...
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/index.vue
1 1 <template>
2 2 <div>
3   - <BasicTable @register="registerTable" :bordered="true">
  3 + <BasicTable @register="registerTable" :bordered="true" @field-value-change="handleFieldValueChange">
4 4 <template #headerTop>
5 5 <a-alert type="info" show-icon>
6 6 <template #message>
... ... @@ -89,6 +89,49 @@
89 89 labelWidth: 120,
90 90 schemas: searchFormSchema,
91 91 autoSubmitOnEnter: true,
  92 + resetFunc: async () => {
  93 + localStorage.removeItem('isAllSelected');
  94 + setProps({
  95 + searchInfo: {
  96 + projectNo: []
  97 + }
  98 + });
  99 + },
  100 + },
  101 + handleSearchInfoFn: (searchInfo) => {
  102 + console.log('=== handleSearchInfoFn 开始 ===');
  103 + console.log('原始 searchInfo:', searchInfo);
  104 +
  105 + // 获取表单实例
  106 + const formInstance = getForm();
  107 + if (formInstance) {
  108 + const formValues = formInstance.getFieldsValue();
  109 + console.log('表单值:', formValues);
  110 +
  111 + // 强制覆盖searchInfo,确保使用表单中的值
  112 + if (formValues.projectNo && formValues.projectNo.length > 0) {
  113 + // 确保传递的是数组而不是Proxy对象,并去重
  114 + const projectNoArray = [...new Set(formValues.projectNo)];
  115 + // 强制覆盖,不使用原始值
  116 + searchInfo = {
  117 + ...searchInfo,
  118 + projectNo: projectNoArray
  119 + };
  120 + console.log('强制使用表单中的项目号:', projectNoArray);
  121 + } else {
  122 + // 如果表单中没有项目号,清空查询条件
  123 + searchInfo = {
  124 + ...searchInfo,
  125 + projectNo: []
  126 + };
  127 + console.log('清空项目号查询条件');
  128 + }
  129 + }
  130 +
  131 + console.log('处理后的 searchInfo:', searchInfo);
  132 + console.log('=== handleSearchInfoFn 结束 ===');
  133 +
  134 + return searchInfo;
92 135 },
93 136 rowKey: (record) => record.detailProjectNo || record.id || record.serialNumber,
94 137 rowSelection: {
... ... @@ -168,6 +211,34 @@
168 211 await orderStore.getDict();
169 212 });
170 213  
  214 + // 监听表单字段变化
  215 + function handleFieldValueChange(field: string, value: any) {
  216 + // 如果是项目号字段变化且处于全选状态,同步更新查询条件
  217 + if (field === 'projectNo' && localStorage.getItem('isAllSelected') === 'true') {
  218 + console.log('=== handleFieldValueChange 开始 ===');
  219 + console.log('field:', field);
  220 + console.log('value:', value);
  221 +
  222 + // 确保value是数组格式,并去重
  223 + const projectNoArray = Array.isArray(value) ? [...new Set(value)] : [];
  224 +
  225 + console.log('处理后的项目号数组:', projectNoArray);
  226 +
  227 + // 强制重新加载表格,使用新的查询条件
  228 + reload({
  229 + searchInfo: {
  230 + projectNo: projectNoArray
  231 + }
  232 + });
  233 +
  234 + // 同时更新detailProjectNoKeys数组
  235 + detailProjectNoKeys.value = projectNoArray;
  236 +
  237 + console.log('更新后的查询条件:', projectNoArray);
  238 + console.log('=== handleFieldValueChange 结束 ===');
  239 + }
  240 + }
  241 +
171 242 function handleFinanceEdit(record) {
172 243 openFinanceEdit(true, {
173 244 data: record,
... ... @@ -407,17 +478,9 @@
407 478 return;
408 479 }
409 480  
410   - // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
411 481 try {
412   - // 提示用户查询成功
413   - createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
414   -
415   - // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
416   - setProps({
417   - searchInfo: {
418   - projectNo: allProjectNos
419   - }
420   - });
  482 + // 提示用户全选成功
  483 + createMessage.success(`已全选 ${allProjectNos.length} 个项目号`);
421 484  
422 485 // 获取表单实例并设置表单值,将项目号填入搜索框
423 486 const formInstance = getForm();
... ... @@ -427,13 +490,17 @@
427 490 });
428 491 }
429 492  
430   - // 重新加载表格数据,回到第一页
431   - reload({
432   - page: 1
433   - });
  493 + // 将allProjectNoOptions更新为已勾选的项目号数组,这样用户取消勾选时数组会同步更新
  494 + allProjectNoOptions.value = allProjectNos.map(projectNo => ({
  495 + label: projectNo,
  496 + value: projectNo
  497 + }));
  498 +
  499 + // 标记为全选状态
  500 + localStorage.setItem('isAllSelected', 'true');
434 501 } catch (error) {
435   - console.error('查询失败:', error);
436   - createMessage.error('查询失败,请检查网络连接!');
  502 + console.error('全选失败:', error);
  503 + createMessage.error('全选失败,请检查网络连接!');
437 504 }
438 505 }
439 506 </script>
... ...