Commit 6fda7d6ad4df62af576119dbe1e39d01d107b41b

Authored by 柏杨
1 parent a45593e0

feat: 手动开票

src/pages/Order/OrderList/ApplyForInvoicingModal.tsx
1 import { RESPONSE_CODE } from '@/constants/enum'; 1 import { RESPONSE_CODE } from '@/constants/enum';
2 -import { postServiceOrderApplyInvoicing } from '@/services'; 2 +import {
  3 + postServiceOrderApplyInvoicing,
  4 + postServiceOrderQueryServiceOrder,
  5 +} from '@/services';
3 import { FloatAdd, enumToSelect, getAliYunOSSFileNameFromUrl } from '@/utils'; 6 import { FloatAdd, enumToSelect, getAliYunOSSFileNameFromUrl } from '@/utils';
4 import { 7 import {
5 ModalForm, 8 ModalForm,
@@ -36,6 +39,7 @@ export default ({ @@ -36,6 +39,7 @@ export default ({
36 const [receivingCompanyOptions, setReceivingCompanyOptions] = useState< 39 const [receivingCompanyOptions, setReceivingCompanyOptions] = useState<
37 SelectOption[] 40 SelectOption[]
38 >([]); 41 >([]);
  42 + const [additionalMainOrders, setAdditionalMainOrders] = useState<any[]>([]);
39 43
40 let ids = subOrders?.map((item) => { 44 let ids = subOrders?.map((item) => {
41 return item.id; 45 return item.id;
@@ -49,13 +53,46 @@ export default ({ @@ -49,13 +53,46 @@ export default ({
49 availableAmount: number; 53 availableAmount: number;
50 } 54 }
51 55
  56 + // 解析输入框内容,识别格式如 "23123,2507310003"
  57 + const parseInputContent = (content: string): string[] => {
  58 + if (!content) return [];
  59 + return content
  60 + .split(',')
  61 + .map((id) => id.trim())
  62 + .filter((id) => id);
  63 + };
  64 +
  65 + // 查询未选择的订单数据
  66 + const queryMissingOrders = async (missingIds: string[]) => {
  67 + try {
  68 + const { data } = await postServiceOrderQueryServiceOrder({
  69 + // @ts-ignore
  70 + data: {
  71 + current: 1,
  72 + pageSize: 10,
  73 + id: missingIds,
  74 + condition: 0,
  75 + sorted: false,
  76 + isDeleteQueryOrder: false,
  77 + },
  78 + });
  79 +
  80 + if (data?.data) {
  81 + setAdditionalMainOrders(data.data);
  82 + }
  83 + } catch (error) {
  84 + console.error('查询订单失败:', error);
  85 + message.error('查询订单数据失败');
  86 + }
  87 + };
  88 +
52 // 获取唯一的主订单ID及其相关金额信息 89 // 获取唯一的主订单ID及其相关金额信息
53 const getUniqueMainOrderIds = (): MainOrderData[] => { 90 const getUniqueMainOrderIds = (): MainOrderData[] => {
54 console.log(subOrders, mainOrders); 91 console.log(subOrders, mainOrders);
55 const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId); 92 const mainOrderIds = subOrders?.map((item: any) => item.mainOrderId);
56 const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean); 93 const uniqueIds = [...new Set(mainOrderIds)].filter(Boolean);
57 94
58 - return uniqueIds.map((id) => { 95 + const result = uniqueIds.map((id) => {
59 // 获取该主订单的数据 96 // 获取该主订单的数据
60 const mainOrder = mainOrders 97 const mainOrder = mainOrders
61 ? mainOrders.find((item: any) => item.id === id) 98 ? mainOrders.find((item: any) => item.id === id)
@@ -97,6 +134,19 @@ export default ({ @@ -97,6 +134,19 @@ export default ({
97 availableAmount, 134 availableAmount,
98 }; 135 };
99 }); 136 });
  137 +
  138 + // 添加额外查询到的订单数据
  139 + const additionalOrders = additionalMainOrders.map((order) => ({
  140 + value: String(order.id),
  141 + totalPayment: order.totalPayment || 0,
  142 + invoiceIssuedAmount: order.invoiceIssuedAmount || 0,
  143 + availableAmount: Math.max(
  144 + 0,
  145 + (order.totalPayment || 0) - (order.invoiceIssuedAmount || 0),
  146 + ),
  147 + }));
  148 +
  149 + return [...result, ...additionalOrders];
100 }; 150 };
101 151
102 let mainIdSet = new Set(); 152 let mainIdSet = new Set();
@@ -134,23 +184,54 @@ export default ({ @@ -134,23 +184,54 @@ export default ({
134 invoiceType: string; // 新增发票类型字段 184 invoiceType: string; // 新增发票类型字段
135 }>(); 185 }>();
136 186
  187 + // 处理备注内容变化
  188 + const handleNotesChange = async (value: string) => {
  189 + const inputIds = parseInputContent(value);
  190 + const selectedMainOrderIds = Array.from(mainIdSet).map((id) => String(id));
  191 +
  192 + console.log('输入的订单ID:', inputIds);
  193 + console.log('已选择的主订单ID:', selectedMainOrderIds);
  194 +
  195 + // 找出输入框中存在但未选择的订单ID
  196 + const missingIds = inputIds.filter(
  197 + (id) => !selectedMainOrderIds.includes(id),
  198 + );
  199 +
  200 + console.log('缺失的订单ID:', missingIds);
  201 +
  202 + if (missingIds.length > 0) {
  203 + await queryMissingOrders(missingIds);
  204 + } else {
  205 + // 如果没有缺失的订单,清空额外的订单数据
  206 + setAdditionalMainOrders([]);
  207 + }
  208 + };
  209 +
137 useEffect(() => { 210 useEffect(() => {
138 //显示拼接的主订单id 211 //显示拼接的主订单id
139 form.setFieldValue('applyInvoicingNotes', mainIds); 212 form.setFieldValue('applyInvoicingNotes', mainIds);
140 213
141 - // 设置每个主订单的可开票金额初始值 214 + // 转换收款单位选项并保存
  215 + const options = enumToSelect(PAYEE_OPTIONS);
  216 + setReceivingCompanyOptions(options);
  217 + }, []);
  218 +
  219 + useEffect(() => {
  220 + // 当额外的主订单数据变化时,设置可开票金额初始值
142 const mainOrders = getUniqueMainOrderIds(); 221 const mainOrders = getUniqueMainOrderIds();
143 mainOrders.forEach((order) => { 222 mainOrders.forEach((order) => {
144 - form.setFieldValue( 223 + // 只为新添加的订单设置初始值,避免覆盖用户已输入的值
  224 + const currentValue = form.getFieldValue(
145 `invoiceAvailableAmount_${order.value}`, 225 `invoiceAvailableAmount_${order.value}`,
146 - order.availableAmount,  
147 ); 226 );
  227 + if (currentValue === undefined || currentValue === null) {
  228 + form.setFieldValue(
  229 + `invoiceAvailableAmount_${order.value}`,
  230 + order.availableAmount,
  231 + );
  232 + }
148 }); 233 });
149 -  
150 - // 转换收款单位选项并保存  
151 - const options = enumToSelect(PAYEE_OPTIONS);  
152 - setReceivingCompanyOptions(options);  
153 - }, []); 234 + }, [additionalMainOrders]);
154 235
155 return ( 236 return (
156 <ModalForm<{ 237 <ModalForm<{
@@ -180,7 +261,26 @@ export default ({ @@ -180,7 +261,26 @@ export default ({
180 }} 261 }}
181 submitTimeout={2000} 262 submitTimeout={2000}
182 onFinish={async (values) => { 263 onFinish={async (values) => {
183 - values.subIds = ids; 264 + // 收集所有相关的子订单ID,包括额外查询到的主订单下的子订单
  265 + const allSubIds = [...ids]; // 原始选择的子订单ID
  266 +
  267 + console.log('原始子订单ID:', ids);
  268 + console.log('额外查询的主订单:', additionalMainOrders);
  269 +
  270 + // 添加额外查询到的主订单下的子订单ID
  271 + additionalMainOrders.forEach((mainOrder: any) => {
  272 + if (mainOrder.subOrderInformationLists) {
  273 + mainOrder.subOrderInformationLists.forEach((subOrder: any) => {
  274 + if (subOrder.id && !allSubIds.includes(subOrder.id)) {
  275 + console.log('添加子订单ID:', subOrder.id);
  276 + allSubIds.push(subOrder.id);
  277 + }
  278 + });
  279 + }
  280 + });
  281 +
  282 + console.log('最终子订单ID列表:', allSubIds);
  283 + values.subIds = allSubIds;
184 //附件处理 284 //附件处理
185 values.filePaths = values.filePaths?.map((item) => { 285 values.filePaths = values.filePaths?.map((item) => {
186 return { url: item.response.data[0] }; 286 return { url: item.response.data[0] };
@@ -216,11 +316,16 @@ export default ({ @@ -216,11 +316,16 @@ export default ({
216 ); 316 );
217 const receivingCompanyName = selectedOption ? selectedOption.label : ''; 317 const receivingCompanyName = selectedOption ? selectedOption.label : '';
218 318
  319 + // 构建包含所有订单的mainOrderIds字符串
  320 + const allMainOrderIds = getUniqueMainOrderIds()
  321 + .map((item) => item.value)
  322 + .join(',');
  323 +
219 // 添加到请求数据中 324 // 添加到请求数据中
220 const reqData = { 325 const reqData = {
221 ...values, 326 ...values,
222 receivingCompanyName, // 添加收款单位名称 327 receivingCompanyName, // 添加收款单位名称
223 - mainOrderIds: mainIds, // 使用已有的主订单ID字符串 328 + mainOrderIds: allMainOrderIds, // 使用包含所有订单的ID字符串
224 invoiceOrderAmounts, 329 invoiceOrderAmounts,
225 }; 330 };
226 const res = await postServiceOrderApplyInvoicing({ data: reqData }); 331 const res = await postServiceOrderApplyInvoicing({ data: reqData });
@@ -253,6 +358,12 @@ export default ({ @@ -253,6 +358,12 @@ export default ({
253 0, 358 0,
254 item.totalPayment - item.invoiceIssuedAmount, 359 item.totalPayment - item.invoiceIssuedAmount,
255 ); 360 );
  361 +
  362 + // 检查是否是额外查询到的订单
  363 + const isAdditionalOrder = additionalMainOrders.some(
  364 + (order) => String(order.id) === String(item.value),
  365 + );
  366 +
256 return ( 367 return (
257 <div 368 <div
258 key={index} 369 key={index}
@@ -261,9 +372,15 @@ export default ({ @@ -261,9 +372,15 @@ export default ({
261 marginBottom: 8, 372 marginBottom: 8,
262 padding: '8px 0', 373 padding: '8px 0',
263 borderBottom: '1px solid #f0f0f0', 374 borderBottom: '1px solid #f0f0f0',
  375 + backgroundColor: isAdditionalOrder ? '#f6ffed' : 'transparent', // 浅绿色背景表示新查询的订单
  376 + border: isAdditionalOrder ? '1px solid #b7eb8f' : 'none',
  377 + borderRadius: isAdditionalOrder ? '4px' : '0',
264 }} 378 }}
265 > 379 >
266 - <div style={{ flex: 25 }}>{item.value}</div> 380 + <div style={{ flex: 25 }}>
  381 + {item.value}
  382 + {isAdditionalOrder}
  383 + </div>
267 <div style={{ flex: 18, textAlign: 'right' }}> 384 <div style={{ flex: 18, textAlign: 'right' }}>
268 ¥ {item.totalPayment.toFixed(2)} 385 ¥ {item.totalPayment.toFixed(2)}
269 </div> 386 </div>
@@ -309,12 +426,9 @@ export default ({ @@ -309,12 +426,9 @@ export default ({
309 name="applyInvoicingNotes" 426 name="applyInvoicingNotes"
310 key="applyInvoicingNotes" 427 key="applyInvoicingNotes"
311 placeholder="请输入备注" 428 placeholder="请输入备注"
312 - onMetaChange={(val) => {  
313 - console.log(val);  
314 - }}  
315 - proFieldProps={{  
316 - onchange: () => {  
317 - message.info('change'); 429 + fieldProps={{
  430 + onChange: (e) => {
  431 + handleNotesChange(e.target.value);
318 }, 432 },
319 }} 433 }}
320 /> 434 />