Commit c04095817ac95f5535acf30ceb77484583ceae80

Authored by
1 parent fe947a0f

fix: 净利润分析四个页面新增搜索时全选搜索结果功能,首次打开页面日期选择器失效bug修改

src/views/project/finance/financeProfit/ProductProfit/InnerData/data.tsx
@@ -9,6 +9,8 @@ import { useOrderInfo } from '/@/hooks/component/order'; @@ -9,6 +9,8 @@ import { useOrderInfo } from '/@/hooks/component/order';
9 9
10 const innerNoOptions = ref([]); 10 const innerNoOptions = ref([]);
11 const projectNoOptions = ref([]); 11 const projectNoOptions = ref([]);
  12 +const allProjectNoOptions = ref([]);
  13 +export { allProjectNoOptions };
12 const orderStore = useOrderStoreWithOut(); 14 const orderStore = useOrderStoreWithOut();
13 const { 15 const {
14 customerCode, 16 customerCode,
@@ -38,11 +40,10 @@ export const searchFormSchema = [ @@ -38,11 +40,10 @@ export const searchFormSchema = [
38 showSearch: true, 40 showSearch: true,
39 mode: 'multiple', 41 mode: 'multiple',
40 onSearch: async (value: any) => { 42 onSearch: async (value: any) => {
41 - projectNoOptions.value = await queryNoOptions('projectNo', value); 43 + const result = await queryNoOptions('projectNo', value);
  44 + projectNoOptions.value = result;
  45 + allProjectNoOptions.value = result;
42 }, 46 },
43 - // onSearch: async (value: any) => {  
44 - // projectNoOptions.value = await queryNoOptions('projectNo', value);  
45 - // },  
46 }, 47 },
47 }, 48 },
48 { 49 {
src/views/project/finance/financeProfit/ProductProfit/InnerData/index.vue
@@ -46,6 +46,11 @@ @@ -46,6 +46,11 @@
46 :style="{ borderRadius: '5px 5px 5px 5px' }" 46 :style="{ borderRadius: '5px 5px 5px 5px' }"
47 >导出</a-button 47 >导出</a-button
48 > 48 >
  49 + <a-button
  50 + type="primary"
  51 + @click="handleAllProjectNoQuery"
  52 + style="margin-left: 8px;position: fixed;right: 29%;top: 107.5px;"
  53 + >全选</a-button>
49 </template> 54 </template>
50 </BasicTable> 55 </BasicTable>
51 <!-- <BasicModal 56 <!-- <BasicModal
@@ -68,7 +73,7 @@ @@ -68,7 +73,7 @@
68 <script setup lang="ts"> 73 <script setup lang="ts">
69 import { BasicTable, useTable, TableAction } from '/@/components/Table'; 74 import { BasicTable, useTable, TableAction } from '/@/components/Table';
70 import { getInnerProfit, setInnerStatus } from '@/api/project/invoice'; 75 import { getInnerProfit, setInnerStatus } from '@/api/project/invoice';
71 - import { searchFormSchema, COLUMNS } from './data'; 76 + import { searchFormSchema, COLUMNS, allProjectNoOptions } from './data';
72 import { BasicModal, useModal } from '/@/components/Modal'; 77 import { BasicModal, useModal } from '/@/components/Modal';
73 import { useMessage } from '/@/hooks/web/useMessage'; 78 import { useMessage } from '/@/hooks/web/useMessage';
74 import { onMounted, ref, computed } from 'vue'; 79 import { onMounted, ref, computed } from 'vue';
@@ -111,7 +116,7 @@ @@ -111,7 +116,7 @@
111 message.value = ''; 116 message.value = '';
112 } 117 }
113 }; 118 };
114 - const [registerTable, { reload, setSelectedRowKeys, getForm }] = useTable({ 119 + const [registerTable, { reload, setSelectedRowKeys, getForm, setProps }] = useTable({
115 api: getInnerProfit, 120 api: getInnerProfit,
116 bordered: true, 121 bordered: true,
117 columns: COLUMNS, 122 columns: COLUMNS,
@@ -485,5 +490,60 @@ @@ -485,5 +490,60 @@
485 } 490 }
486 setSelectedRowKeys(checkedKeys.value as any); 491 setSelectedRowKeys(checkedKeys.value as any);
487 } 492 }
  493 +
  494 + function handleAllProjectNoQuery() {
  495 + // 检查是否有项目号选项
  496 + if (!allProjectNoOptions.value || allProjectNoOptions.value.length === 0) {
  497 + createMessage.warn('没有可查询的项目号!');
  498 + return;
  499 + }
  500 +
  501 + // 获取所有项目号的value值
  502 + const allProjectNos = allProjectNoOptions.value.map(item => {
  503 + // 处理不同的数据结构
  504 + if (typeof item === 'string') {
  505 + return item;
  506 + } else if (item && typeof item === 'object' && 'value' in item) {
  507 + return item.value;
  508 + } else if (item && typeof item === 'object' && 'label' in item) {
  509 + return item.label;
  510 + }
  511 + return item;
  512 + }).filter(Boolean); // 过滤掉空值
  513 +
  514 + if (allProjectNos.length === 0) {
  515 + createMessage.warn('没有有效的项目号!');
  516 + return;
  517 + }
  518 +
  519 + // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
  520 + try {
  521 + // 提示用户查询成功
  522 + createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
  523 +
  524 + // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
  525 + setProps({
  526 + searchInfo: {
  527 + projectNo: allProjectNos
  528 + }
  529 + });
  530 +
  531 + // 获取表单实例并设置表单值,将项目号填入搜索框
  532 + const formInstance = getForm();
  533 + if (formInstance && formInstance.setFieldsValue) {
  534 + formInstance.setFieldsValue({
  535 + projectNo: allProjectNos
  536 + });
  537 + }
  538 +
  539 + // 重新加载表格数据,回到第一页
  540 + reload({
  541 + page: 1
  542 + });
  543 + } catch (error) {
  544 + console.error('查询失败:', error);
  545 + createMessage.error('查询失败,请检查网络连接!');
  546 + }
  547 + }
488 </script> 548 </script>
489 <style></style> 549 <style></style>
src/views/project/finance/financeProfit/ProductProfit/InnerProduce/data.tsx
@@ -27,6 +27,8 @@ const userStore = useUserStoreWithOut(); @@ -27,6 +27,8 @@ const userStore = useUserStoreWithOut();
27 // ]; 27 // ];
28 const innerNoOptions = ref([]); 28 const innerNoOptions = ref([]);
29 const projectNoOptions = ref([]); 29 const projectNoOptions = ref([]);
  30 +const allProjectNoOptions = ref([]);
  31 +export { allProjectNoOptions };
30 const orderStore = useOrderStoreWithOut(); 32 const orderStore = useOrderStoreWithOut();
31 const { 33 const {
32 customerCode, 34 customerCode,
@@ -56,11 +58,10 @@ export const searchFormSchema = [ @@ -56,11 +58,10 @@ export const searchFormSchema = [
56 showSearch: true, 58 showSearch: true,
57 mode: 'multiple', 59 mode: 'multiple',
58 onSearch: async (value: any) => { 60 onSearch: async (value: any) => {
59 - projectNoOptions.value = await queryNoOptions('projectNo', value); 61 + const result = await queryNoOptions('projectNo', value);
  62 + projectNoOptions.value = result;
  63 + allProjectNoOptions.value = result;
60 }, 64 },
61 - // onSearch: async (value: any) => {  
62 - // projectNoOptions.value = await queryNoOptions('projectNo', value);  
63 - // },  
64 }, 65 },
65 }, 66 },
66 { 67 {
src/views/project/finance/financeProfit/ProductProfit/InnerProduce/index.vue
@@ -49,6 +49,11 @@ @@ -49,6 +49,11 @@
49 :style="{ borderRadius: '5px 5px 5px 5px' }" 49 :style="{ borderRadius: '5px 5px 5px 5px' }"
50 >导出</a-button 50 >导出</a-button
51 > 51 >
  52 + <a-button
  53 + type="primary"
  54 + @click="handleAllProjectNoQuery"
  55 + style="margin-left: 8px;position: fixed;right: 29%;top: 107.5px;"
  56 + >全选</a-button>
52 </template> 57 </template>
53 </BasicTable> 58 </BasicTable>
54 <!-- <BasicModal 59 <!-- <BasicModal
@@ -71,7 +76,7 @@ @@ -71,7 +76,7 @@
71 <script setup lang="ts"> 76 <script setup lang="ts">
72 import { BasicTable, useTable, TableAction } from '/@/components/Table'; 77 import { BasicTable, useTable, TableAction } from '/@/components/Table';
73 import { getInnerProduceProfit, setInnerProfitSetStatus } from '@/api/project/invoice'; 78 import { getInnerProduceProfit, setInnerProfitSetStatus } from '@/api/project/invoice';
74 - import { searchFormSchema, COLUMNS } from './data'; 79 + import { searchFormSchema, COLUMNS, allProjectNoOptions } from './data';
75 import { BasicModal, useModal } from '/@/components/Modal'; 80 import { BasicModal, useModal } from '/@/components/Modal';
76 import { useMessage } from '/@/hooks/web/useMessage'; 81 import { useMessage } from '/@/hooks/web/useMessage';
77 import { onMounted, ref, computed } from 'vue'; 82 import { onMounted, ref, computed } from 'vue';
@@ -110,7 +115,7 @@ @@ -110,7 +115,7 @@
110 message.value = ''; 115 message.value = '';
111 } 116 }
112 }; 117 };
113 - const [registerTable, { reload, setSelectedRowKeys }] = useTable({ 118 + const [registerTable, { reload, setSelectedRowKeys, setProps, getForm }] = useTable({
114 api: getInnerProduceProfit, 119 api: getInnerProduceProfit,
115 bordered: true, 120 bordered: true,
116 columns: COLUMNS, 121 columns: COLUMNS,
@@ -408,5 +413,60 @@ @@ -408,5 +413,60 @@
408 handleClearChoose(); 413 handleClearChoose();
409 reload(); 414 reload();
410 } 415 }
  416 +
  417 + function handleAllProjectNoQuery() {
  418 + // 检查是否有项目号选项
  419 + if (!allProjectNoOptions.value || allProjectNoOptions.value.length === 0) {
  420 + createMessage.warn('没有可查询的项目号!');
  421 + return;
  422 + }
  423 +
  424 + // 获取所有项目号的value值
  425 + const allProjectNos = allProjectNoOptions.value.map(item => {
  426 + // 处理不同的数据结构
  427 + if (typeof item === 'string') {
  428 + return item;
  429 + } else if (item && typeof item === 'object' && 'value' in item) {
  430 + return item.value;
  431 + } else if (item && typeof item === 'object' && 'label' in item) {
  432 + return item.label;
  433 + }
  434 + return item;
  435 + }).filter(Boolean); // 过滤掉空值
  436 +
  437 + if (allProjectNos.length === 0) {
  438 + createMessage.warn('没有有效的项目号!');
  439 + return;
  440 + }
  441 +
  442 + // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
  443 + try {
  444 + // 提示用户查询成功
  445 + createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
  446 +
  447 + // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
  448 + setProps({
  449 + searchInfo: {
  450 + projectNo: allProjectNos
  451 + }
  452 + });
  453 +
  454 + // 获取表单实例并设置表单值,将项目号填入搜索框
  455 + const formInstance = getForm();
  456 + if (formInstance && formInstance.setFieldsValue) {
  457 + formInstance.setFieldsValue({
  458 + projectNo: allProjectNos
  459 + });
  460 + }
  461 +
  462 + // 重新加载表格数据,回到第一页
  463 + reload({
  464 + page: 1
  465 + });
  466 + } catch (error) {
  467 + console.error('查询失败:', error);
  468 + createMessage.error('查询失败,请检查网络连接!');
  469 + }
  470 + }
411 </script> 471 </script>
412 <style></style> 472 <style></style>
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/data.tsx
@@ -9,6 +9,8 @@ import { useOrderInfo } from &#39;/@/hooks/component/order&#39;; @@ -9,6 +9,8 @@ import { useOrderInfo } from &#39;/@/hooks/component/order&#39;;
9 9
10 const innerNoOptions = ref([]); 10 const innerNoOptions = ref([]);
11 const projectNoOptions = ref([]); 11 const projectNoOptions = ref([]);
  12 +const allProjectNoOptions = ref([]);
  13 +export { allProjectNoOptions };
12 const orderStore = useOrderStoreWithOut(); 14 const orderStore = useOrderStoreWithOut();
13 const { 15 const {
14 customerCode, 16 customerCode,
@@ -38,11 +40,10 @@ export const searchFormSchema = [ @@ -38,11 +40,10 @@ export const searchFormSchema = [
38 showSearch: true, 40 showSearch: true,
39 mode: 'multiple', 41 mode: 'multiple',
40 onSearch: async (value: any) => { 42 onSearch: async (value: any) => {
41 - projectNoOptions.value = await queryNoOptions('projectNo', value); 43 + const result = await queryNoOptions('projectNo', value);
  44 + projectNoOptions.value = result;
  45 + allProjectNoOptions.value = result;
42 }, 46 },
43 - // onSearch: async (value: any) => {  
44 - // projectNoOptions.value = await queryNoOptions('projectNo', value);  
45 - // },  
46 }, 47 },
47 }, 48 },
48 { 49 {
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/index.vue
@@ -49,6 +49,11 @@ @@ -49,6 +49,11 @@
49 :style="{ borderRadius: '5px 5px 5px 5px' }" 49 :style="{ borderRadius: '5px 5px 5px 5px' }"
50 >导出</a-button 50 >导出</a-button
51 > 51 >
  52 + <a-button
  53 + type="primary"
  54 + @click="handleAllProjectNoQuery"
  55 + style="margin-left: 8px;position: fixed;right: 29%;top: 107.5px;"
  56 + >全选</a-button>
52 </template> 57 </template>
53 </BasicTable> 58 </BasicTable>
54 <!-- <BasicModal 59 <!-- <BasicModal
@@ -71,7 +76,7 @@ @@ -71,7 +76,7 @@
71 <script setup lang="ts"> 76 <script setup lang="ts">
72 import { BasicTable, useTable, TableAction } from '/@/components/Table'; 77 import { BasicTable, useTable, TableAction } from '/@/components/Table';
73 import { getPackageProfit, setPackStatus } from '@/api/project/invoice'; 78 import { getPackageProfit, setPackStatus } from '@/api/project/invoice';
74 - import { searchFormSchema, COLUMNS } from './data'; 79 + import { searchFormSchema, COLUMNS, allProjectNoOptions } from './data';
75 import { BasicModal, useModal } from '/@/components/Modal'; 80 import { BasicModal, useModal } from '/@/components/Modal';
76 import { useMessage } from '/@/hooks/web/useMessage'; 81 import { useMessage } from '/@/hooks/web/useMessage';
77 import { onMounted, ref, computed } from 'vue'; 82 import { onMounted, ref, computed } from 'vue';
@@ -115,7 +120,7 @@ @@ -115,7 +120,7 @@
115 message.value = ''; 120 message.value = '';
116 } 121 }
117 }; 122 };
118 - const [registerTable, { reload, setSelectedRowKeys, getForm }] = useTable({ 123 + const [registerTable, { reload, setSelectedRowKeys, getForm, setProps }] = useTable({
119 api: getPackageProfit, 124 api: getPackageProfit,
120 bordered: true, 125 bordered: true,
121 columns: COLUMNS, 126 columns: COLUMNS,
@@ -479,5 +484,60 @@ @@ -479,5 +484,60 @@
479 } 484 }
480 setSelectedRowKeys(checkedKeys.value as any); 485 setSelectedRowKeys(checkedKeys.value as any);
481 } 486 }
  487 +
  488 + function handleAllProjectNoQuery() {
  489 + // 检查是否有项目号选项
  490 + if (!allProjectNoOptions.value || allProjectNoOptions.value.length === 0) {
  491 + createMessage.warn('没有可查询的项目号!');
  492 + return;
  493 + }
  494 +
  495 + // 获取所有项目号的value值
  496 + const allProjectNos = allProjectNoOptions.value.map(item => {
  497 + // 处理不同的数据结构
  498 + if (typeof item === 'string') {
  499 + return item;
  500 + } else if (item && typeof item === 'object' && 'value' in item) {
  501 + return item.value;
  502 + } else if (item && typeof item === 'object' && 'label' in item) {
  503 + return item.label;
  504 + }
  505 + return item;
  506 + }).filter(Boolean); // 过滤掉空值
  507 +
  508 + if (allProjectNos.length === 0) {
  509 + createMessage.warn('没有有效的项目号!');
  510 + return;
  511 + }
  512 +
  513 + // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
  514 + try {
  515 + // 提示用户查询成功
  516 + createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
  517 +
  518 + // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
  519 + setProps({
  520 + searchInfo: {
  521 + projectNo: allProjectNos
  522 + }
  523 + });
  524 +
  525 + // 获取表单实例并设置表单值,将项目号填入搜索框
  526 + const formInstance = getForm();
  527 + if (formInstance && formInstance.setFieldsValue) {
  528 + formInstance.setFieldsValue({
  529 + projectNo: allProjectNos
  530 + });
  531 + }
  532 +
  533 + // 重新加载表格数据,回到第一页
  534 + reload({
  535 + page: 1
  536 + });
  537 + } catch (error) {
  538 + console.error('查询失败:', error);
  539 + createMessage.error('查询失败,请检查网络连接!');
  540 + }
  541 + }
482 </script> 542 </script>
483 <style></style> 543 <style></style>
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/FinanceEdit.vue
@@ -25,10 +25,24 @@ @@ -25,10 +25,24 @@
25 /> 25 />
26 <div style="margin: 16px 0"></div> 26 <div style="margin: 16px 0"></div>
27 <div style="font-size: 15px">项目开始时间</div> 27 <div style="font-size: 15px">项目开始时间</div>
28 - <a-date-picker v-model:value="input3" :disabled="status3 === 'LOCKED'" auto-size /> 28 + <a-date-picker
  29 + v-model:value="input3"
  30 + :disabled="status3 === 'LOCKED'"
  31 + auto-size
  32 + placeholder="请选择项目开始时间"
  33 + format="YYYY-MM-DD"
  34 + value-format="YYYY-MM-DD"
  35 + />
29 <div style="margin: 16px 0"></div> 36 <div style="margin: 16px 0"></div>
30 <div style="font-size: 15px">项目结束时间</div> 37 <div style="font-size: 15px">项目结束时间</div>
31 - <a-date-picker v-model:value="input4" :disabled="status4 === 'LOCKED'" auto-size /> 38 + <a-date-picker
  39 + v-model:value="input4"
  40 + :disabled="status4 === 'LOCKED'"
  41 + auto-size
  42 + placeholder="请选择项目结束时间"
  43 + format="YYYY-MM-DD"
  44 + value-format="YYYY-MM-DD"
  45 + />
32 <div style="margin: 16px 0"></div> 46 <div style="margin: 16px 0"></div>
33 <div style="font-size: 15px">西班牙已发提成¥</div> 47 <div style="font-size: 15px">西班牙已发提成¥</div>
34 <a-input 48 <a-input
@@ -59,11 +73,14 @@ @@ -59,11 +73,14 @@
59 import { defineComponent, ref, computed, unref, toRaw, reactive } from 'vue'; 73 import { defineComponent, ref, computed, unref, toRaw, reactive } from 'vue';
60 import { getServiceEdit } from '@/api/project/invoice'; 74 import { getServiceEdit } from '@/api/project/invoice';
61 import { useMessage } from '/@/hooks/web/useMessage'; 75 import { useMessage } from '/@/hooks/web/useMessage';
  76 + import { useUserStoreWithOut } from '/@/store/modules/user';
62 import { ROLE } from './type.d'; 77 import { ROLE } from './type.d';
63 import type { Dayjs } from 'dayjs'; 78 import type { Dayjs } from 'dayjs';
64 import dayjs from 'dayjs'; 79 import dayjs from 'dayjs';
65 80
66 const emit = defineEmits(['success']); 81 const emit = defineEmits(['success']);
  82 + const userStore = useUserStoreWithOut();
  83 + const user = userStore.getUserInfo;
67 const role = computed(() => { 84 const role = computed(() => {
68 return user?.roleSmallVO?.code; 85 return user?.roleSmallVO?.code;
69 }); 86 });
@@ -141,8 +158,8 @@ @@ -141,8 +158,8 @@
141 158
142 const input1 = ref(); 159 const input1 = ref();
143 const input2 = ref(); 160 const input2 = ref();
144 - const input3 = ref();  
145 - const input4 = ref(); 161 + const input3 = ref<Dayjs | null>(null);
  162 + const input4 = ref<Dayjs | null>(null);
146 163
147 const input5 = ref(); 164 const input5 = ref();
148 const id = ref(); 165 const id = ref();
@@ -177,11 +194,23 @@ @@ -177,11 +194,23 @@
177 status5.value = data?.data?.lockFields?.paidRmbCommission; 194 status5.value = data?.data?.lockFields?.paidRmbCommission;
178 } 195 }
179 id.value = data?.data?.projectNoPrefix; 196 id.value = data?.data?.projectNoPrefix;
180 - input1.value = data?.data?.developmentCopyRmbTotalPrice.toFixed(2);  
181 - input2.value = data?.data?.spainPaidRmbCommission.toFixed(2);  
182 - input3.value = dayjs(formatDateToDateOnly(data?.data?.projectStartTime));  
183 - input4.value = dayjs(formatDateToDateOnly(data?.data?.projectEndTime));  
184 - input5.value = data?.data?.paidRmbCommission.toFixed(2); 197 + input1.value = data?.data?.developmentCopyRmbTotalPrice?.toFixed(2) || '';
  198 + input2.value = data?.data?.spainPaidRmbCommission?.toFixed(2) || '';
  199 +
  200 + // 确保日期值正确设置
  201 + if (data?.data?.projectStartTime) {
  202 + input3.value = dayjs(formatDateToDateOnly(data.data.projectStartTime));
  203 + } else {
  204 + input3.value = null;
  205 + }
  206 +
  207 + if (data?.data?.projectEndTime) {
  208 + input4.value = dayjs(formatDateToDateOnly(data.data.projectEndTime));
  209 + } else {
  210 + input4.value = null;
  211 + }
  212 +
  213 + input5.value = data?.data?.paidRmbCommission?.toFixed(2) || '';
185 214
186 resetFields(); 215 resetFields();
187 setDrawerProps({ confirmLoading: false }); 216 setDrawerProps({ confirmLoading: false });
@@ -217,8 +246,8 @@ @@ -217,8 +246,8 @@
217 if (!visible) { 246 if (!visible) {
218 input1.value = ''; 247 input1.value = '';
219 input2.value = ''; 248 input2.value = '';
220 - input3.value = '';  
221 - input4.value = ''; 249 + input3.value = null;
  250 + input4.value = null;
222 input5.value = ''; 251 input5.value = '';
223 } 252 }
224 } 253 }
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/data.tsx
@@ -27,6 +27,8 @@ const userStore = useUserStoreWithOut(); @@ -27,6 +27,8 @@ const userStore = useUserStoreWithOut();
27 // ]; 27 // ];
28 const innerNoOptions = ref([]); 28 const innerNoOptions = ref([]);
29 const projectNoOptions = ref([]); 29 const projectNoOptions = ref([]);
  30 +const allProjectNoOptions = ref([]);
  31 +export { allProjectNoOptions };
30 const orderStore = useOrderStoreWithOut(); 32 const orderStore = useOrderStoreWithOut();
31 const { 33 const {
32 customerCode, 34 customerCode,
@@ -55,12 +57,11 @@ export const searchFormSchema = [ @@ -55,12 +57,11 @@ export const searchFormSchema = [
55 options: projectNoOptions, 57 options: projectNoOptions,
56 showSearch: true, 58 showSearch: true,
57 mode: 'multiple', 59 mode: 'multiple',
58 - onSearch: async (value: any) => {  
59 - projectNoOptions.value = await queryNoOptions('projectNo', value); 60 + onSearch: async (value) => {
  61 + const result = await queryNoOptions('projectNo', value);
  62 + projectNoOptions.value = result;
  63 + allProjectNoOptions.value = result;
60 }, 64 },
61 - // onSearch: async (value: any) => {  
62 - // projectNoOptions.value = await queryNoOptions('projectNo', value);  
63 - // },  
64 }, 65 },
65 }, 66 },
66 // { 67 // {
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/index.vue
@@ -36,6 +36,11 @@ @@ -36,6 +36,11 @@
36 :style="{ borderRadius: '5px 5px 5px 5px' }" 36 :style="{ borderRadius: '5px 5px 5px 5px' }"
37 >导出</a-button 37 >导出</a-button
38 > 38 >
  39 + <a-button
  40 + type="primary"
  41 + @click="handleAllProjectNoQuery"
  42 + style="margin-left: 8px;position: fixed;right: 29%;top: 107.5px;"
  43 + >全选</a-button>
39 </template> 44 </template>
40 </BasicTable> 45 </BasicTable>
41 <CheckDetail @register="checkModalRegister" :onGoFormDetail="handleGoFormDetail" /> 46 <CheckDetail @register="checkModalRegister" :onGoFormDetail="handleGoFormDetail" />
@@ -46,7 +51,8 @@ @@ -46,7 +51,8 @@
46 <script setup lang="ts"> 51 <script setup lang="ts">
47 import { BasicTable, useTable, TableAction } from '/@/components/Table'; 52 import { BasicTable, useTable, TableAction } from '/@/components/Table';
48 import { getServiceProfit, setBusinessProfitSetStatus } from '@/api/project/invoice'; 53 import { getServiceProfit, setBusinessProfitSetStatus } from '@/api/project/invoice';
49 - import { searchFormSchema, COLUMNS } from './data'; 54 + import { saveConfig } from '@/api/sys/config';
  55 + import { searchFormSchema, COLUMNS, allProjectNoOptions } from './data';
50 import axios from 'axios'; 56 import axios from 'axios';
51 import { useMessage } from '/@/hooks/web/useMessage'; 57 import { useMessage } from '/@/hooks/web/useMessage';
52 import { onMounted, ref, computed, unref } from 'vue'; 58 import { onMounted, ref, computed, unref } from 'vue';
@@ -73,7 +79,7 @@ @@ -73,7 +79,7 @@
73 const role = computed(() => { 79 const role = computed(() => {
74 return user?.roleSmallVO?.code; 80 return user?.roleSmallVO?.code;
75 }); 81 });
76 - const [registerTable, { reload, getSelectRowKeys, getDataSource, setSelectedRowKeys }] = useTable({ 82 + const [registerTable, { reload, getSelectRowKeys, getDataSource, setSelectedRowKeys, setProps, getForm }] = useTable({
77 title: '', 83 title: '',
78 api: getServiceProfit, 84 api: getServiceProfit,
79 bordered: true, 85 bordered: true,
@@ -192,13 +198,23 @@ @@ -192,13 +198,23 @@
192 198
193 async function handleStatus(record, status) { 199 async function handleStatus(record, status) {
194 try { 200 try {
  201 + // 检查必要参数是否存在
  202 + if (!record.customerCode || !record.projectNoPrefix) {
  203 + createMessage.error('缺少必要的参数:客户编码或项目号');
  204 + return;
  205 + }
  206 +
195 await setBusinessProfitSetStatus({ 207 await setBusinessProfitSetStatus({
196 customerCode: record.customerCode, 208 customerCode: record.customerCode,
197 projectNo: record.projectNoPrefix, 209 projectNo: record.projectNoPrefix,
  210 + status: status // 添加状态参数
198 }); 211 });
  212 +
  213 + createMessage.success('状态更新成功!');
199 reload(); 214 reload();
200 } catch (error) { 215 } catch (error) {
201 console.error('Error updating status:', error); 216 console.error('Error updating status:', error);
  217 + createMessage.error('状态更新失败:' + (error.message || '未知错误'));
202 } 218 }
203 } 219 }
204 220
@@ -365,5 +381,60 @@ @@ -365,5 +381,60 @@
365 } 381 }
366 setSelectedRowKeys(checkedKeys.value as any); 382 setSelectedRowKeys(checkedKeys.value as any);
367 } 383 }
  384 + // 6/25未完成工作:全选查询
  385 + function handleAllProjectNoQuery() {
  386 + // 检查是否有项目号选项
  387 + if (!allProjectNoOptions.value || allProjectNoOptions.value.length === 0) {
  388 + createMessage.warn('没有可查询的项目号!');
  389 + return;
  390 + }
  391 +
  392 + // 获取所有项目号的value值
  393 + const allProjectNos = allProjectNoOptions.value.map(item => {
  394 + // 处理不同的数据结构
  395 + if (typeof item === 'string') {
  396 + return item;
  397 + } else if (item && typeof item === 'object' && 'value' in item) {
  398 + return item.value;
  399 + } else if (item && typeof item === 'object' && 'label' in item) {
  400 + return item.label;
  401 + }
  402 + return item;
  403 + }).filter(Boolean); // 过滤掉空值
  404 +
  405 + if (allProjectNos.length === 0) {
  406 + createMessage.warn('没有有效的项目号!');
  407 + return;
  408 + }
  409 +
  410 + // 使用setProps方法持久化设置searchInfo,这样分页时不会丢失查询条件
  411 + try {
  412 + // 提示用户查询成功
  413 + createMessage.success(`正在查询 ${allProjectNos.length} 个项目号的数据...`);
  414 +
  415 + // 使用setProps持久化设置searchInfo,这样分页时会保持查询条件
  416 + setProps({
  417 + searchInfo: {
  418 + projectNo: allProjectNos
  419 + }
  420 + });
  421 +
  422 + // 获取表单实例并设置表单值,将项目号填入搜索框
  423 + const formInstance = getForm();
  424 + if (formInstance && formInstance.setFieldsValue) {
  425 + formInstance.setFieldsValue({
  426 + projectNo: allProjectNos
  427 + });
  428 + }
  429 +
  430 + // 重新加载表格数据,回到第一页
  431 + reload({
  432 + page: 1
  433 + });
  434 + } catch (error) {
  435 + console.error('查询失败:', error);
  436 + createMessage.error('查询失败,请检查网络连接!');
  437 + }
  438 + }
368 </script> 439 </script>
369 <style></style> 440 <style></style>